YOLO学习笔记

YOLO(v1-v8)详解

一.概述

​ YOLO是以CNN为基础的,解决实时性图像识别问题的深度学习算法,是现代图像识别大模型的核心算法。

​ YOLO通过把识别问题化为回归问题,采用"分而治之"的方法。通过把输入图像分为以NxN为基础的网格图,每个网格则只需负责网格内所在的物体的中心单元格

二.YOLOv1(YOLO基础讲解)

​ YOLO把传统的物体分类和物体位置两个问题一并解决了.YOLO检测网络包含24个卷积层和两个全连接层

​ YOLO将输入图像分成SxS 个格子(grid),每个格子(grid)负责检测'落入'该格子的物体。若某个物体的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。如下图所示,图中物体狗的中心点(红色原点)落入第5行、第2列的格子内,所以这个格子负责预测图像中的物体狗。

​ 每个格子(grid)输出B 个bounding box(包含物体的矩形区域)信息,也就是(x,y,w,h,confidence),以及C个物体属于某种类别的概率信息。

​ Bounding box信息包含5个数据值,分别是x,y,w,h,和confidence。其中x,y是指当前格子预测得到的物体的bounding box 的中心位置的坐标。w,h是bounding box的宽度和高度。注意:实际训练过程中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内;x,y是bounding box中心位置相对于当前格子位置的偏移值,并且被归一化到[0,1]。

​ confidence反映当前bounding box是否包含物体以及物体位置的准确性, 请注意,是bounding box,不是所在格子(grid),这一点很重要。confidence的计算方式如下:
c o n f i d e n c e = P r ( O b j e c t ) ∗ I O U confidence=Pr(Object)*IOU confidence=Pr(Object)∗IOU

​ 其中,如果bounding box包含物体,则Pr(Object) =1,否则Pr(Object)=0;IOU(intersection of union)是预测的bounding box与物体真实区域的交集面积,这个值也是在[0,1]之间的。

​ 除了confidence之外,每一个格子(gird)还输出一共C 个该物体属于某种类别的概率信息。也就是说,在给出Pr(Object)的前提下,去求得该物体属于什么类别的概率,也就是条件概率,公式如下:Pr(Class_i|Object)(共有C个概率值)

​ YOLO网络最终的全连接层的输出维度是
S × S × ( B × 5 + C ) S×S×(B×5 + C) S×S×(B×5+C)

inference

1.首先输入图像进入网络,得到7x7x30的tensor。,因为我们的图片也是分成7x7的,所以最后的tensor和我们的图片的格子是一一对应的。

2.我们现在是分析7x7x30的tensor,然后说明这个tensor的值在图片中表示什么。以红色格子为例,7x7x30的tensor也对应到这个位置的格子,那么图片对应到的就是图中的狗那里,图中也标了红框。具体来说是第5行,第2列。取这一行的tensor出来,就有1x30维度的tensor了。前5个数的含义图中有,然后对应到原图像的黄框。

(注:途中红框就是对应的格子,黄色的矩形区域就是bounding box,[x,y]就是中心区域(红色格子)的坐标,[w,h]是bounding box 的大小)

3.接下来看后5个数字,也是代表一个bounding box的x,y,w,h和confidence。

所以,前面十个值对应的是两个bounding box

4.后面还剩20个值,代表是给出Pr(Object)前提下的这个格子中每个类别的概率,如下图:

5.然后因为我们要得到每个bounding box对应类别的分数,论文里也说了,要把confidence和 Pr(Class_i|Object)相乘,得到最后的分数。于是将后面20个值与前面的两个bounding box的confidence分别相乘,得到两个长度为20x1的tensor。如下:

6.对每一个格子这样操作,每一个格子就有两个20x1的bboxes,

最后得到7x7x2 = 98个这样的bboxes:

​ 然后设置一个阈值threah1=0.2, 如果分数小于thresh1的话,就把这个bounding box的分数设为0;然后按照分数从大到小逆序排列;最后用NMS算法将冗余的bounding box的分数也设为0,如下图所示。

NMS

​ NMS会把上一步经过将分数排序,得到分数从大到小顺序的bbox,如下图:

​ 每一个bbox就代表一个框,这里可以具体看看其他的框是怎么样的:

如score为0.3的框:

score为0.2的框:

然后取分数最大的bbox,记为"bbox_max":

将其他的bbox与bbox_max进行比较,其他的bbox记为"bbox_cur",如果IoU(bbox_max, bbox_cur) > 0.5,(两个图像的重合度)那么将bbox_cur的分数设为0。

上图的两个框的IoU>0.5,因此将bbox_cur的分数设为0,如下图:

经过这样的一次迭代,完成了第一次的遍历。然后我们选择第二大分数的bbox,并设为"bbox_max",进行和之前一样的操作,只不过不和分数第一大的bbox比较而已:

然后我们按照同样的方式,对其他19类进行同样的操作

​ 经过上面的操作,每一个类别对应的bbox的分数就会有很多0,然后我们就可以通过bbox选取最大的score,从而确定类别,最后画框了。

最后得到结果

注:虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLOv1方法的一个缺陷。

loss函数定义

YOLO使用均方和误差(sum-squared error)作为loss函数来优化模型参数,即网络输出的SxSx(Bx5 + C)维向量与真实图像的对应SxSx(Bx5 + C)维向量的均方和误差。示例:

但YOLO不是完全按照上面来,上面的公式只是一个模板,具体变动如下:

​ 位置相关误差(坐标、IOU)与分类误差对网络loss的贡献值是不同的,因此YOLO在计算loss时,使用λcoord=5修正coordError

​ 在计算IOU误差时,包含物体的格子与不包含物体的格子,二者的IOU误差对网络loss的贡献值是不同的。若采用相同的权值,那么不包含物体的格子的confidence值近似为0,变相放大了包含物体的格子的confidence误差在计算网络参数梯度时的影响。为解决这个问题,YOLO 使用λnoobj=0.5修正iouError。(注此处的'包含'是指存在一个物体,它的中心坐标落入到格子内)。

​ 对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响。这是因为,相同的位置偏差占大物体的比例远小于同等偏差占小物体的比例。YOLO将物体大小的信息项(w和h)进行求平方根来改进这个问题。(注:这个方法并不能完全解决这个

或者可以理解为:

对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。

loss函数具体为

YOLO采用了多个下采样层,网络学到的物体特征并不精细,因此也会影响检测效果。

YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。

三.YOLOv2(进一步优化与改进)

Batch Normalization(批量归一化)

​ 批量归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果(YOLOv2不再使用dropout),从而能够获得更好的收敛速度和收敛效果。

​ 使用Batch Normalization对网络进行优化,让网络提高了收敛性,同时还消除了对其他形式的正则化(regularization)的依赖。通过对YOLOv2的每一个卷积层增加Batch Normalization,最终使得mAP提高了2%,同时还使model正则化。使用Batch Normalization可以从model中去掉Dropout,而不会产生过拟合。

详见:YOLO拓展-BN(批归一化)-CSDN博客

九.YOLOv8

YOLOv8的结构图如下:

其主要包含三部分:Backbone,Neck,Head

Backbone:

骨干网络和 Neck 部分可能参考了 YOLOv7 ELAN 设计思想,将 YOLOv5 的 C3 结构换成了梯度流更丰富的 C2f 结构,并对不同尺度模型调整了不同的通道数。

属于对模型结构精心微调,不再是无脑一套参数应用所有模型,大幅提升了模型性能。不过这个 C2f 模块中存在 Split 等操作对特定硬件部署没有之前那么友好了

Head: Head部分较yolov5而言有两大改进:1)换成了目前主流的解耦头结构(Decoupled-Head),将分类和检测头分离 2)同时也从 Anchor-Based 换成了 Anchor-Free

Loss :1) YOLOv8抛弃了以往的IOU匹配或者单边比例的分配方式,而是使用了Task-Aligned Assigner正负样本匹配方式。2)并引入了 Distribution Focal Loss(DFL)

Train:训练的数据增强部分引入了 YOLOX 中的最后 10 epoch 关闭 Mosiac 增强的操作,可以有效地提升精度

X.参考文献V

相关推荐
Bechamz3 小时前
大数据开发学习Day27
java·大数据·学习
van久3 小时前
Day21 第三周总结 + 用户模块收官复盘(可直接当学习笔记)
学习
钓了猫的鱼儿3 小时前
【数据集】红外无人机交通车辆目标检测数据集VOC+YOLO格式2371张4类别
yolo·目标检测·无人机
Slow菜鸟3 小时前
Docker 学习篇(五)| Docker 常用命令
学习·docker·容器
动物园猫3 小时前
公共安全打架行为识别数据集分享(适用于YOLO系列深度学习检测任务)
人工智能·深度学习·yolo
AI棒棒牛3 小时前
YOLOv13最新创新改进系列:比闪电还快的医学影像分析!YOLOv13+EMCAD融合实战,改进代码已跑通!cvpr2025最新独家改进!
深度学习·yolo·目标检测·计算机视觉
YJlio3 小时前
8.2Windows 11 如何用 Xbox Game Bar 实时监测电脑性能?CPU、内存、GPU、显存与 FPS 瓶颈判断教程
windows·笔记·学习·chatgpt·架构·电脑·xbox
say_fall3 小时前
装软件慢到崩溃?用户创建总出错?Linux 工具避坑指南
linux·运维·服务器·c++·学习
Komorebi_99993 小时前
大模型学习day6
学习·大模型