同济子豪兄讲述YOLOv1学习笔记

news/2024/7/10 0:03:12 标签: 目标检测, 计算机视觉, 深度学习

YOLO算法

一、 YOLO就是解决目标检测(Object Detection)的计算机视觉算法

1.1计算机视觉能解决哪些问题――分类、检测、分割

在这里插入图片描述

①Classification就是输入一张图片,算法能告诉我们图片中有什么类别,如猫、狗。但不能告诉我们类别所在的位置。

②Classification+Localization称为分类和定位,就是把单独物体框出来并做分类

③Object Detection:如何图片中有多个类别和物体,需要用矩形框把每一个物体框出来,并识别框里的类别

④Segmentation做更细化的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3Ck5YU1-1679017126919)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315171419320.png)]

a、分类:输出类别

b、目标检测:输出矩形框(位置)和类别

c、语义分割:把每个像素的类别输出,但不区分不同物体的像素

d、实例分割:可以区分同一类别不同物体的像素。无人驾驶要对全景做实例分割。

1.2 目标检测的两个阶段—单阶段和双阶段

单阶段(One-stage detector)

双阶段(Two-stage detector)

​ 先从图像中提取若干个候选框,再逐一对这个候选框进行分类和甄别,以及调整他们的坐标,最后得出结果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qk3fw2xp-1679017126920)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315172014447.png)]

1.3 YOLO模型

YOLO是单阶段一步到位的模型。直接把图片输入到模型,然后模型直接输出目标检测的结果,不需要复杂的上下游产业协同。不需要对每一个功能训练和优化,是一个端到端完整的统一的框架。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-71Ee9fA5-1679017126921)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315172653152.png)]

二、 YOLOV1的具体实现—预测阶段(前向推断)

已经训练好模型之后,输入待测图像进行前向推断获得目标检测结果的过程。

1、预测阶段

在模型训练完成之后,输入未知图片,对未知图片进行预测或叫测试,这个时候不需要训练,不需要反向传播,而是需要前向推断,运行这个模型。

如图1所示,该模型训练出来是一个深度卷积神经网络,上面是一个基准YOLO模型,下面是一个比较小的YOLO模型(小的话,速度就快)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sMgGL3Si-1679017126922)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315191911306.png)]

图1

如图2所示,输入是一个大小为448×448×3的图像,先过若干个卷积层,过池化层,过1×1卷积层,3×3卷积层,最后变成一个7×7×1024维的feature map,把7×7×1024的数据拉平输入到一个4096个神经元的全连接层,输出4096维的向量,再把4096维的向量输入到1470个神经元的全连接层,输出1470维的向量,相当于1470个数字,然后把这些数字reshape成7×7×30的feature map,这个黑箱子就算是做好了。

在预测阶段,这个YOLO就是一个黑箱子,输入的是448×448×3的图像,7×7×30维的张量tensor。这些tensor中就包含了所有预测框的坐标、置信度和类别结果,最后只需要解析7×7×30维的张量就可以获得目标检测的结果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W2qkilH9-1679017126923)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315191828084.png)]

图2
为什么是7×7×30呢?

因为网络把图像划分成s×s个grid cell(网格),在YOLOv1中s=7,所以是7×7的网格,如图3中最左边的图展示的。每个grid cell又可以预测出B个bounding box(就是B个预测框,预测框包含了x,y,h,w,c五个参数。x,y,h,w四个定位坐标,中心店坐标和框的宽高,因此就可以确定框的位置。图中置信度由框的线粗细表示,c表示置信度,粗的表示置信度比较高,如图3所示。),在YOLOv1中B=2,就是每个grid cell预测出2个预测框,这2个预测框可能很大也可能很小,无论怎样只要bounding box的中心点落在grid cell里面就行,就能代表这个bounding box是由这个grid cell生成的。

每个grid cell还可以生成所有类别的条件概率。假设它已经包含物体的情况下,是某一个类别的概率,生成图3中的彩色的图。把每个bounding box的置信度×类别的条件概率就可以获得每一个bounding box的各类别的概率。结合bounding box的信息和该grid cell的类别信息就可以获得最后的预测结果。这些信息都是从7×7×30的张量获取的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FbYxQ9FB-1679017126924)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315193405217.png)]

图3
7×7×30的30怎么来的?

她包含两个预测框,每个预测框有5个参数,在Pascal VOC里面包含20个类别,则2×5+20=30,

30维的向量就是一个grid cell的信息,总共是7×7个grid cell,所以最后是7×7×30维的张量。

图3中的紫色就是第一个bounding box,置信度,中心点的x、y坐标,框的高度和高度。绿色是第二个bounding box。后面20维(11th-30th)是20个类别的条件概率,假设包含物体的情况下是猫的概率(条件概率),假设包含物体的情况下是鸟的概率…置信度×条件概率就是某个类别的真正概率。

YOLO模型就是一个黑箱子,输入是448×448×3的图像,输出是1470个数字。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hjeLDwAb-1679017126925)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315195007911.png)]

图4

2、后处理-----置信度过滤、非极大值抑制

对于YOLO而言,后处理就是把预测出来的复杂的98个预测框进行筛选、过滤,把重复的预测框只保留一个,最终获得目标检测的结果。就是把7×7×30的张量变成最后目标检测的结果。

包含把低置信度、重复的预测框去掉,只保留一个,这个过程称为非极大值抑制NMS。如果阈值设置的非常低则NMS非常强,两个框稍微有一点重合都会把低概率的框去掉。如果阈值非常高则NMS性能很低。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJ9gjxWi-1679017126926)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315203713990.png)]

预测框×条件概率=预测框全类别的全概率(黄色竖条)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ha76x9a6-1679017126927)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315204028705.png)]

每个bounding box有两个预测框。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SoUlF9OC-1679017126929)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315204122140.png)]

设置一个阈值,把小于阈值的值设为0,把概率高的放前面,0放后面。再对排序后的值进行非极大值抑制。把每一个和最高的做比较。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mk3YbNOC-1679017126930)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315204503950.png)]

假如黄框和绿框的交并比IOU>0.5,则表示他们是在重复识别了一个物体,那就把低概率的去掉(绿框),把绿框设置为0,打入冷宫。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-akh3gx7Z-1679017126930)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315204745211.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wWBqI3um-1679017126931)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315204812084.png)]

假如蓝框和黄框的交并比IOU<0.5,则把蓝框留下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ssij5w9N-1679017126931)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230315204846175.png)]

第一轮就是把所有的都和最高的(bb47)进行比较。

第二轮把所有的和第二高的进行比较,由于bb20已结被设置为0,所以第二高的是bb15,也就是说第二轮把其他的和bb15进行比较。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Tao94ED-1679017126931)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230316095235370.png)]

上述操作只是对狗这一个类别的操作。实际应该对每一个类别都这样操作,最后输出才是目标检测的结果。

有20个类别则进行20次NMS。

只有在预测阶段需要NMS,训练阶段不需要。否则会影响损失函数。

三、YOLOV1的训练阶段(反向传播)

损失函数

每个grid cell预测出的两个bounding box的中心点都落在grid cell里面,虽然这两个bounding box可以很大,但是它们的中心点始终都在grid cell里面,也就是说7×7=49个grid cell生成98个bounding box的中心点都落在所属的grid cell里面,因此可以构建出YOLOv1的损失函数,损失函数包含5项。

第一项是负责检测bounding box的中心点定位误差,实际就是负责预测物体的框要和groundtruth从横纵坐标、宽高上尽量一致,所以损失给它们构造了一个残差平方和这么一个回归问题(预测出一个连续的值,把这个值和标注值进行比较,这两个值越接近越好)的损失函数。这5项其实都是回归问题的损失函数,YOLO就是把目标检测问题当做回归问题解决,

第二项是负责检测物体的bbox宽高定位误差。

第三项是检测物体的bbox confidence(置信度)误差。预测出的置信度和IOU越接近越好。

第四项是不负责检测物体的bbox confidence误差,就是所有被打入冷宫的bbox,它们预测出的置信度越低(接近0)越好。

第五项负责检测物体的grid cell分类误差,条件概率越接近1越好。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ixuP01B-1679017126932)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230316101947033.png)]

四、YOLOv1论文细节

YOLO在PASCAL2数据集上训练的,该数据集有20个类别,有些类别非常大,有些非常小,不同类别的性能不一样,YOLO对小类别的性能比较差。

1、YOLOv1与其它目标检测方法比较

在实时目标检测方法中是最准的,在非实时目标检测方法是最快的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3zoZYVyR-1679017126933)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230316152847978.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j4f5GF48-1679017126933)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230316153214095.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RI9H7TyQ-1679017126935)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230316153322261.png)]

下图展示了VOC 2012测试集的各个类别的性能和各个模型的排行榜。可以看到YOLO对于瓶子和羊这些小物体性能比较差,对于火车这样的大物体性能比较好。把YOLO和Fast R-CNN结合可以显著提升排名,并且提升mAP(是20个类别的AP平均值),

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fAqBb4hN-1679017126935)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230316153343309.png)]

由于YOLO是可以看见全图的,可以捕获全图信息,因此它的学习能力、泛化和迁移能力很强,在自然图片上训练出的YOLO模型放在艺术图片上依然可以得到好的结果。

左图表示在毕加索数据集上对行人这个类别的pr曲线,pr曲线围成的面积越大说明性能越好,可以得出YOLO比其他性能要好。

右边的表格表示在自然图像训练的模型放在艺术数据集上进行预测,可以看到性能相差不大。但两阶段模型R-CNN和DPM在两个数据集上性能相差较大。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HtoL5qNh-1679017126936)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20230316153825202.png)]

2、论文You Only Look Once: Unified, Real-Time Object Detection

论文地址:https://arxiv.org/abs/1506.02640

在B站看同济子豪兄的讲解https://www.bilibili.com/video/BV15w411Z7LG/?p=11&spm_id_from=pageDriver&vd_source=4f67898e2b4507b9469b30d33789bb78


http://www.niftyadmin.cn/n/159328.html

相关文章

EA画图中常见的问题

EA画图中常见的问题 5.1如何保存EA中的图 5.2如何取消消息中的括号 当消息没有参数的时候如何进行取消 1.步骤1 2.步骤2 5.3通信图中如何添加消息 5.4通信图中如何设置消息的顺序 1.方式1 创建一个新的消息的时候可以点击“start new 。。。。。” 2.方式2 比较推荐的使用的方式…

Crazy Binary String( 0、1出现次数相等的最长子串(前缀和d[i]==0或者d[j]==d[i])

Crazy Binary String( 0、1出现次数相等的最长子串和最长子序列&#xff09; 首先明白子串和子序列的区别&#xff0c;子串要求是原字符串中一段连续的元素&#xff0c;子序列是原字符串中若干个保持原来相对次序的元素 对于子序列肯定好说&#xff0c;直接就是0和1取个最大值…

Logback配置文件

SpringBoot 默认使用 logback 作为日志框架&#xff0c;可在 resources 文件夹下添加 logback.xml 文件进行配置。 一个简单的示例文件内容如下 <?xml version"1.0" encoding"UTF-8" ?><configuration scan"true" scanPeriod"6…

python数据分析中常用的库

Python是数据处理常用工具&#xff0c;可以处理数量级从几K至几T不等的数据&#xff0c;具有较高的开发效率和可维护性&#xff0c;还具有较强的通用性和跨平台性。Python可用于数据分析&#xff0c;但其单纯依赖Python本身自带的库进行数据分析还是具有一定的局限性的&#xf…

推荐一款FPGA lattice 深力科电子LCMXO3LF-4300C-5BG324C 使得您的控制PLD和桥接设计能够跟上技术发展

推荐一款FPGA lattice 深力科电子LCMXO3LF-4300C-5BG324C 使得您的控制PLD和桥接设计能够跟上技术发展 FPGA lattice深力科电子LCMXO3LF-4300C-5BG324C MachXO3系列具备非易失性、瞬时启动、每I/O成本超低、功能丰富等特性&#xff0c;可为服务器、存储和网络系统领域中的各类…

QT CTK插件框架 (一 下载编译)

CTK 为支持生物医学图像计算的公共开发包&#xff0c;其全称为 Common Toolkit。为医学成像提供一组统一的基本功能&#xff1b;促进代码和数据的交互及结合&#xff1b;避免重复开发&#xff1b;在工具包&#xff08;医学成像&#xff09;范围内不断扩展到新任务&#xff0c;而…

数据别愁!机器学习、深度学习数据集汇总

数据集汇总寻找一个好用的数据集需要注意以下几点&#xff1a;数据集不混乱&#xff0c;否则要花费大量时间来清理数据&#xff1b;数据集不应包含太多行或列&#xff0c;否则会难以使用&#xff1b;数据越干净越好&#xff0c;清理大型数据集可能非常耗时&#xff1b;应该预设…

微服务实战05-服务链路追踪

在前面的例子里&#xff0c;我们有两个微服务&#xff0c;分别是订单服务和物流服务&#xff0c;随着业务的增加&#xff0c;就会有越来越多的微服务存在&#xff0c;他们之间也会有更加复杂的调用关系。 这个调用关系&#xff0c;仅仅通过观察代码&#xff0c;会越来越难以识…