【yolov1】详解yolov1理论 代码

目标检测要解决的3大问题:

1、有没有?

图片中是否有要检测的物体?(检测物体,判定前景背景)

2、是什么?

这些物体分别是什么?(检测到的物体是什么)

3、在哪里?

这些物体在哪里?(画框,描边,变色都行)

yolov1模型图

在这里插入图片描述

一.预测阶段

1.2 预测阶段后处理

在这里插入图片描述
把7x7x2=98个预测框进行筛选过滤,重复的预测框只保留一个。最终得到预测结果。
包括:

1.过滤掉置信度低的框
2.非极大值抑制

在这里插入图片描述
选出一个grid cell,它有30个值。每个grid cell预测两个预测框,用10个值表示。后面20个值是条件概率,即在该grid中存在目标的情况下,是某一个类的概率。

在这里插入图片描述

  用置信度与后面20个类的条件概率相乘得到每一个类的概率。
将全概率p() 拆分成 p(该 grid cell 存在目标的概率) x p(| 该grid cell 存在目标的概率)。
这样本来需要40个维度才能表示的概率,变成两个置信度和一个20维的条件概率即可。

在这里插入图片描述

将置信度 x 条件概率后,每个框生成两个20维的向量,表示每一个类的概率。
一共生成 7x7x2 = 9820维度的向量。

在这里插入图片描述

7x7x30的信息,可视化获得了中间图的结果。

1.2 后处理

在这里插入图片描述

把7x7x30的张量,变成目标检测结果。

在这里插入图片描述

假如第一行是dog类
1.设置dog类的概率如果<0.2,则置为0.
2.将dog类按照值进行排序。概率高的放在前面。
3.对排序之后的结果进行NMS。

1.3 NMS

取置信度值最大的框,bb47,它的框是黄色的部分。
在这里插入图片描述

先把第一个框跟第二框比较。如果他们的IOU>一个阈值,那么认为他们两个重复识别了一个目标。(可能一个图像上有多只猫,7x7个gred cell 每个都对猫预测了两个框,共有98个预测框,这98个预测框,可能有好些个预测的不是图像上的同一个猫)
就把低置信度的框过滤掉。 (即将它设置为0

在这里插入图片描述

用bb47与其它框做IOU计算,过滤掉一些框之后,从第二个值非0的框,开始让它与其它非0的框再做一个IOU计算。

对每个类重复上面的结果。

最后得到一个稀疏的矩阵。
把不为0的索引找出来,表示类别。把分数值也取出来,可视化。

在这里插入图片描述

二.训练阶段

训练阶段没有NMS,
如下:训练阶段有个Ground True ,是人工标注的真实框。

我们的算法是为了拟合这个框,让损失函数最小化。
真实的框在哪个grid cell,就让这个grid cell预测的一个bodding box去拟合这个框。
两个预测框具体让哪一个框预测要看这两个预测框与真实框的IOU。
另一个框和其它Grid cell 预测的框只需要让他们置信度越来越小即可。

在这里插入图片描述

在这里插入图片描述

https://www.bilibili.com/video/BV15w411Z7LG?p=5&vd_source=ebc47f36e62b223817b8e0edff181613

每个预测框对应 维度为2x5 + 20 = 30的向量。 
20代表:yolov1用的数据有20个类别。这20个类别用独热编码表示,是哪个类别就让该类别标记为1.
5代表 : 4个坐标和一个置信度。
置信度计算的是预测边框 与 真实边框的 IOU,IOU用来选择哪个边框作为预测边框。

损失函数的设计:
要让与预测框 与 真实框的Loss变的很小。

负责预测物体的框,要与真实框Ground truth从坐标和宽高上都尽量一致。

在这里插入图片描述

1.计算预测中心点与真实中心点的损失。
2.计算预测的宽高与真实宽高的损失。用根号,是使得小框对误差更敏感。

第三项负责计算置信度的误差

标签值是预测框真实框的IOU,作为标签值。

第四项是不负责检测目标的框,让它们的Loss值越小越好。让他们的权重小一些,因为他们比较多。

第五项:负责检测物体那个框的分类误差。比如真实框类别标注是狗,那么预测的类别是狗的概率让它越来越接近1。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

预测结果

在这里插入图片描述

当物体中心落到某个网格中,该网格就负责预测这个物体。
每个网络会生成两个预测框,所以yolov1共有 7x7x2=98个预测框,相对于fast-rcnn成百上千个预测框,yolov1少了很多。

参考:https://zhuanlan.zhihu.com/p/595221376

损失函数

在这里插入图片描述

1.对坐标进行预测,坐标损失

预测第i个网格,的第j个bbox是否有该object。 方法是计算每个网格的两个bbox与真实框的IOU,IOU最大bbox对应的网格中包含这个object。

在这里插入图片描述
在这里插入图片描述
如果不用根号,则是个线性关系 w越大,该物体与小物体的loss就越大。模型的学习会收到它的影响,主要去满足大物体去了。

超参数 λ_coord 默认是5,是为了平衡非物体(背景)的bbox过多的影响。因为目标对于背景来说是很小的,损失函数占比的权重就很小。

置信度损失

在这里插入图片描述
此时加入了一个非物体的置信度和权重 λnoobj=0.5,如果 让一个网络去学习n个类别的分类,那么必须让网络学习n+1个类别的分类。1是背景。背景占比比较多,所以调小它的权重。

对类别进行预测

判断是否有object的中心落入网格中,网格中包含有object的中心,就负责预测该object的类别概率。
在这里插入图片描述
直接预测类别-真实类别,这个方法不好,后面Yolo对它改进。

在这里插入图片描述
拥挤物体的中心,会跑到一个网格中去,那么一个网络就会预测两个物体。很不好。
对小物体检测也不好,小物体权重小。
对不规则物体(长宽比不正常)

voc数据集

以PASCAL VOC2017为例,它包含如下5个文件夹:

Annotations
JPEGImages
ImageSets
SegmentationClass
SegmentationObject

JPEGImages

PASCAL VOC提供的所有的图片,其中包括训练图片,测试图片。

Annotations

xml格式的标签文件,每个xml对应JPEGImage中的一张图片。各个目标的位置和类别。以(x,y)的格式不保存坐标点。
<annotation>  <folder>VOC2012</folder>                             <filename>2007_000392.jpg</filename> //文件名  <source>                             //图像来源(不重要)  <database>The VOC2007 Database</database>  <annotation>PASCAL VOC2007</annotation>  <image>flickr</image>  </source>  <size>                              //图像尺寸(长宽以及通道数)                        <width>500</width>  <height>332</height>  <depth>3</depth>  </size>  <segmented>1</segmented>            //是否用于分割(在图像物体识别中01无所谓)  <object>                            //检测到的物体  <name>horse</name>              //物体类别  <pose>Right</pose>              //拍摄角度  <truncated>0</truncated>        //是否被截断(0表示完整)  <difficult>0</difficult>        //目标是否难以识别(0表示容易识别)  <bndbox>                        //bounding-box(包含左下角和右上角xy坐标)  <xmin>100</xmin>  <ymin>96</ymin>  <xmax>355</xmax>  <ymax>324</ymax>  </bndbox>  </object>  <object>              //检测到多个物体  <name>person</name>  <pose>Unspecified</pose>  <truncated>0</truncated>  <difficult>0</difficult>  <bndbox>  <xmin>198</xmin>  <ymin>58</ymin>  <xmax>286</xmax>  <ymax>197</ymax>  </bndbox>  </object>  
</annotation> 

ImageSets

训练要用到的:

1.train.txt:训练集 (注意,均为图片名,没有后缀。以train.txt为例,分为两列,第一列为图像名如00012;第二列为-11-1表示目标在对应的图像没有出现,1则表示出现。)
2.val.txt:验证集
3.trainval.txt:训练和验证集
# 训练用不到的其它内容
Action:人的动作
Layout:人体的具体部位
Main: 图像物体识别的数据,总共20, 需要保证train val没有交集。
Segmentation:用于分割的数据
验证集(val)与测试集(test)是有区别的。
验证集:val是validation的简称,验证是否过拟合、以及用来调节训练参数等。
测试集:当模型训练完成后,用于检测模型的准确性。

https://blog.csdn.net/weixin_43570470/article/details/123659793

write_txt.py

'''读取XML文件信息
'''import xml.etree.ElementTree as ET
import os
import randomVOC_CLASSES = (  # 定义所有的类名'aeroplane', 'bicycle', 'bird', 'boat','bottle', 'bus', 'car', 'cat', 'chair','cow', 'diningtable', 'dog', 'horse','motorbike', 'person', 'pottedplant','sheep', 'sofa', 'train', 'tvmonitor')   # 使用其他训练集需要更改
# 创建两个文件用于存放
train_set = open('voctrain.txt', 'w')
test_set = open('voctest.txt', 'w')
Annotations = 'VOCdevkit/VOC2017/Annotations'
# 返回Annotations文件下的所有文件名 (里面是所有xml文件,一个图片对应一个xml文件,是对图片的标注)
xml_files = os.listdir(Annotations)
# 打乱数据集
random.shuffle(xml_files)train_num = int(len(xml_files) * 0.7) # 设置训练集个数
train_lists= xml_files[:train_num] # 训练集列表
test_lists= xml_files[train_num:] # 测试集列表def parse_rec(filename): # 输入xml文件名tree = ET.parse(filename)objects = []# 读取xml文件中的 <object></object>下的内容'''<object>                            //检测到的物体  <name>horse</name>              //物体类别  <pose>Right</pose>              //拍摄角度  <truncated>0</truncated>        //是否被截断(0表示完整)  <difficult>0</difficult>        //目标是否难以识别(0表示容易识别)  <bndbox>                        //bounding-box(包含左下角和右上角xy坐标)  <xmin>100</xmin>  <ymin>96</ymin>  <xmax>355</xmax>  <ymax>324</ymax>  </bndbox>  </object>  '''for obj in tree.findall('object'):# 创建一个结构体obj_struct = {}# 获取到 difficult元素,如果值为1,表示目标难以识别,则跳过difficult = int(obj.findall('difficult').text)if difficult ==1:continueobj_struct['name'] = obj.find('name').textbbox = obj.find('bndbox')obj_struct['bbox'] = [int(float(bbox.find('xmin').text)),int(float(bbox.find('ymin').text)),int(float(bbox.find('xmax').text)),int(float(bbox.find('ymax').text))]objects.append(obj_struct)return objectsdef write_txt():count = 0for train_list in train_lists: # 生成训练集txtcount += 1image_name = train_list.split('.')[0] + '.jpg'  # 图片文件名results = parse_rec(Annotations + train_list)if len(results) == 0:print(train_list)continuetrain_set.write(image_name)for result in results:class_name = result['name']bbox = result['bbox']class_name = VOC_CLASSES.index(class_name)train_set.write(' ' + str(bbox[0]) +' ' + str(bbox[1]) +' ' + str(bbox[2]) +' ' + str(bbox[3]) +' ' + str(class_name))train_set.write('\n')train_set.close()for test_list in test_lists:   # 生成测试集txtcount += 1image_name = test_list.split('.')[0] + '.jpg'  # 图片文件名results = parse_rec(Annotations + test_list)if len(results) == 0:print(test_list)continuetest_set.write(image_name)for result in results:class_name = result['name']bbox = result['bbox']class_name = VOC_CLASSES.index(class_name)test_set.write(' ' + str(bbox[0]) +' ' + str(bbox[1]) +' ' + str(bbox[2]) +' ' + str(bbox[3]) +' ' + str(class_name))test_set.write('\n')test_set.close()if __name__ == '__main__':write_txt()

最终生成的训练集和数据集标签如下:
红框中前四个数是左上和右下角坐标,第五个数是类别。
一个图片可能否有多个目标,所有可能会有多个红框。
在这里插入图片描述

yoloData.py

encoder结果是7x7x30 = 7x7x(20+5+5)
20是这个数据集有20类,两个5是因为让这7x7个格子,每个格式产生两个候选框。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vuereact质检工具(eslint)安装使用总结

1、ESLint ESLint工具主要类似java中的checkStyle和findbugs&#xff0c;是检查代码样式和逻辑规范的工具。 1.1、ESLint安装流程 打开VSCode软件&#xff0c;打开扩展中心&#xff0c;下载ESLint插件 图1.1 点击后面的install按进行安装&#xff0c;如图1.2所示&#xff1…

单元测试

一、什么是单元测试 二、Junit单元测试框架 三、如何使用Junit单元测试框架 package study.StringUtils;public class StringUtil {public static void printNumber(String name){if (namenull){System.out.println ("名字的长度是&#xff1a;0");return;}System.ou…

性能测试监控-java分析工具Arthas

Arthas监控docker中的jvm_ray_my的博客-CSDN博客 Quick Start | arthas arthas是什么 Arthas是阿里巴巴开源的Java诊断工具&#xff0c;它可以帮助开发人员快速、方便地定位和解决Java应用的问题。 Arthas主要包括以下功能&#xff1a; 诊断Java应用中的性能问题&#xff…

天眼查询企业信息API接口

"天眼"一般是指"天眼查"&#xff0c;这是一个提供全国企业信息查询的API接口。天眼查以"天眼"作为用户logo&#xff0c;基于人工智能算法的数据采集和分析技术&#xff0c;为企业和个人提供全量、精准、实时、权威的企业信息查询服务。 天眼查A…

国产5G手机20天销量不及苹果一天,被iPhone15按在地上摩擦

iPhone15的上市销售&#xff0c;最大竞争对手无疑是国产5G手机&#xff0c;如今iPhone15上市首日的销量数据也已经出炉&#xff0c;高达200万台&#xff0c;这比国产5G手机卖20天的销量还要多&#xff0c;iPhone15让国产手机领教了什么叫遥遥领先。 据了解苹果对iPhone15的预期…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 A: 子 2023

[蓝桥杯 2023 国 B] 子 2023 试题 A: 子 2023 【问题描述】 小蓝在黑板上连续写下从 1 1 1 到 2023 2023 2023 之间所有的整数&#xff0c;得到了一个数字序列&#xff1a; S 12345678910111213 ⋯ 20222023 S 12345678910111213\cdots 20222023 S12345678910111213⋯2…

[React] React高阶组件(HOC)

文章目录 1.Hoc介绍2.几种包装强化组件的方式2.1 mixin模式2.2 extends继承模式2.3 HOC模式2.4 自定义hooks模式 3.高阶组件产生初衷4.高阶组件使用和编写结构4.1 装饰器模式和函数包裹模式4.2 嵌套HOC 5.两种不同的高阶组件5.1 正向的属性代理5.2 反向的继承 6.如何编写高阶组…

第5章 网络编程

5.1 OSI模型有哪几层?以及各自的作用 难度:★ 重点:★ 白话解析 无它,唯记尔;实在记不住也需要有个印象。 参考答案 OSI(Open System Interconnection):开放式系统互联参考模型。它分为7层,自顶而下分别是:应用层、表示层、会话层、传输层、网络层、数据链路层和物…

【数据结构与算法】 - 时间复杂度和空间复杂度、二分查找、线性查找

数据结构与算法 1. 数据结构的定义2. 二分查找2.1 二分查找的定义2.2 二分查找分析2.3 二分查找实现2.4 二分查找算法图解2.5 二分算法引发的问题2.6 二分算法改良版2.7 二分算法改良版解析2.8 二分算法改良版图解2.9 二分算法改良版注意事项 3. 时间复杂度3.1 时间复杂度的概念…

【c语言中数组和指针的联系】

C语言中的数组和指针之间存在紧密的联系&#xff0c;因为数组名本质上就是指向数组首元素的指针。这种联系使得在处理数组时可以像处理指针一样操作&#xff0c;同时也使得数组和指针可以互相转换。 下面详细说明数组和指针之间的联系&#xff0c;并提供一些示例来演示这种联系…

LeetCode算法二叉树—226. 翻转二叉树

目录 226. 翻转二叉树 代码&#xff1a; 运行结果&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入…

OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列

OpenCV读取RGB图像 在OpenCV中&#xff0c;读取的图片默认是HWC格式&#xff0c;即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C&#xff0c;因此最小颗粒度是C。 例如&#xff0c;一张形状为2562563的RGB图像&#xff0c;在OpenCV中读取后的格式…

IDEA 启动 java web 老项目

背景&#xff1a;一套 java web 老代码&#xff0c;使用 eclipse 工具开发。内网&#xff0c;无 eclipse 开发工具&#xff0c;只有 IDEA。 代码目录结构如下&#xff1a; demo/.settings/* demo/src/com/demo/controller/* demo/webapp/js/* demo/webapp/jsp/* demo/webapp/M…

MySQL学习笔记18

MySQL的备份与恢复&#xff1a; 制定数据库备份策略进行备份&#xff0c;并且把数据导入到测试环境。 核心技术&#xff1a; 1&#xff09;掌握MySQL的备份工具使用及各自特点&#xff1b; 2&#xff09;熟悉Shell脚本&#xff1b; 3&#xff09;熟悉MySQL数据的导入导出&a…

数据计算-第15届蓝桥杯第一次STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第154讲。 第15届蓝桥杯第1次STEMA测评已于2023年8月20日落下帷幕&#xff0c;编程题一共有6题&#xff0c;分别如下&a…

浅谈安科瑞ADL系列导轨式多功能仪表在迪拜楼宇EMS中的应用

摘要&#xff1a;用户端消耗着整个电网80%的电能&#xff0c;用户端智能化用电管理对用户可靠、安全、节约用电有十分重要的意义。构建智能用电服务体系&#xff0c;推广用户端智能多功能仪表、智能用电管理终端等设备用电管理解决方案&#xff0c;实现电网与用户的双向良性互动…

计算机网络 - 应用层

计算机网络 - 应用层 计算机网络 - 应用层 域名系统文件传送协议动态主机配置协议远程登录协议电子邮件协议 1. SMTP2. POP33. IMAP 常用端口Web 页面请求过程 1. DHCP 配置主机信息2. ARP 解析 MAC 地址3. DNS 解析域名4. HTTP 请求页面 域名系统 DNS 是一个分布式数据库&a…

ChatGPT批量写作文章软件

什么是ChatGPT批量写作文章。简单来说&#xff0c;它是一种使用ChatGPT技术的方法&#xff0c;可以帮助您批量生成各种类型的文章和内容。无论您是需要新闻报道、博客文章、产品描述、社交媒体帖子还是其他类型的内容&#xff0c;ChatGPT都能满足您的需求。它可以在极短的时间内…

BabelEdit 5.0.1 Crack

BabelEdit加强软件本地化。BabelEdit 是处理 json、yaml、php、arb、vue、properties、resx 或 xliff 翻译文件的可靠解决方案。 旨在使开发过程更加简化和高效。 下载BabelEdit 5.0.0 对于Windows 也适用于macOS 和 Linux BabelEdit - 适用于 Web 和应用程序的翻译编辑器 (…

关键点检测 HRNet网络详解笔记

关键点检测 HRNet网络详解笔记 0、COCO数据集百度云下载地址1、背景介绍2、HRNet网络结构3、预测结果&#xff08;heatmap&#xff09;的可视化3、COCO数据集中标注的17个关键点4、损失的计算5、评价准则6、数据增强7、模型训练 论文名称&#xff1a; Deep High-Resolution Rep…