☀️教程:霹雳吧啦Wz
☀️链接:https://www.bilibili.com/video/BV1yi4y1g7ro?p=1&vd_source=c7e390079ff3e10b79e23fb333bea49d
一、YOLO v1
针对于two-stage目标检测算法普遍存在的运算速度慢的缺点,YOLO创造性的提出了one-stage目标检测算法。也就是将物体的定位和物体的分类在一个步骤中完成。该模型在的性能为45FPS,并在PASCAL VOC2007数据集的测试集上mAP为63.4,虽然相比Faster R-CNN的73.2mAP低很多,但大大加快了推理速度。
1.1 YOLO v1思想
(1)首先将一副图像划分成S×S个网格,如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。这里每个网格只预测一个object。
(2)网络输出:每个网格要预测B个bounding box,每个bounding box除了要预测位置之外,还要附带一个confidence值。另外,每个网格还要预测C个类别的分数。
在YOLO v1中,B一般取2,即每个网格单元预测两个边界框,每个边界框包括5个预测值: x , y , w , h x,y,w,h x,y,w,h,和置信度confidence。其中, x , y x,y x,y表示预测边界框的中心坐标(相对网格来说,值在0到1之间), w , h w,h w,h表示预测边界框的宽和高(相对图片来说,值在0到1之间),confidence的定义为 P r ( O b j e c t ) × I O U p r e d t r u t h Pr(Object)×IOU_{pred}^{truth} Pr(Object)×IOUpredtruth,即边界框内存在对象的概率乘以预测边界框和真实边界框之间的交并比。除此之外,每个网格单元还会预测 C C C个条件类别概率。所以最终网络的输出如下:
如图所示,输出为一个7×7×30的特征矩阵,沿深度方向的每一行都是一个网格的输出结果,其中包含两个预测框的共十个预测值和属于20分类中每一个类别的概率。
在测试的时候,对检测到的每一个目标的confidence定义为 P r ( C l a s s i ∣ O b j e c t ) × P r ( O b j e c t ) × I O U p r e d t r u t h Pr(Class_i|Object)×Pr(Object)×IOU_{pred}^{truth} Pr(Classi∣Object)×Pr(Object)×IOUpredtruth,即类别概率与上面的置信度乘积。所以最终的confidence既包含了为某个目标的概率,也包含了预测的目标边界框和真实目标边界框的重合程度。
1.2 YOLO v1网络结构
网络输入:YOLOv1网络处理固定大小的输入图像,通常是448×448像素,这是为了适应网络中全连接层的固定输入尺寸。
卷积层和池化层:YOLOv1包含24个卷积层,使用1x1卷积和3x3卷积交替出现的方式来提取特征。1x1卷积层通常用来进行通道数的减少,从而降低参数数量和计算复杂度,而3x3卷积则负责提取空间特征。并且网络中使用了多个最大池化层,这些层通常跟在3x3的卷积层后面,用于降低特征图的空间维度,增加特征的局部感受野。
全连接层:在经过多个卷积层和池化层提取特征之后,YOLOv1网络使用了两个全连接层来进一步处理特征。第一个全连接层输出维度为4096,目的是为了保留足够的信息以供最终的检测任务使用。第二个全连接层根据输出需求计算而来,即7×7×30=1470,最终reshape为7×7×30形状。
NMS筛选层:筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box。这样就得到了最终的最合适的几个box和他们的类别。
1.3 YOLO v1损失函数
YOLO v1的损失函数分为三部分
边界框定位损失:对于每个网格单元中负责预测的那些边界框(即真实对象的中心落在该单元内的边界框),YOLOv1使用均方误差(MSE)来惩罚预测的边界框位置和尺寸与真实边界框的差异。具体来说,YOLOv1对边界框的中心坐标 ( x , y ) (x,y) (x,y)和宽高的平方根 ( w , h ) (\sqrt{w},\sqrt{h}) (w,h)进行回归。使用平方根是为了减小大框和小框在损失中的不均衡影响,因为较大的框对于相同的位置或尺寸误差更不敏感,如下图所示:
损失函数中还引入了一个系数 λ c o o r d \lambda_{coord} λcoord(通常设置为5),以增大定位损失在总损失中的比重,从而强调对边界框位置精度的重视。
置信度损失:YOLOv1的置信度损失包括对象存在的置信度损失和对象不存在的置信度损失两部分。对于每个网格单元预测的边界框,如果该框是“负责”对象的,其置信度损失是预测置信度(预测框与实际框的交并比IOU)与1之间差值的平方;如果不是“负责”对象的,其置信度损失是预测置信度与0之间差值的平方。对于没有对象的边界框,还引入了一个权重 λ n o o b j \lambda_{noobj} λnoobj(通常小于1,如0.5),减小这部分损失对总损失的贡献,因为负样本(没有对象的框)通常远多于正样本。
类别损失:对于每个网格单元,YOLOv1使用平方误差来惩罚预测的类别概率和真实类别标签之间的差异。只有当网格单元内确实存在对象时,类别损失才会被计算,这部分损失的目的是确保正确分类网格单元中的对象。
1.4 YOLO v1总结
YOLO算法开创了one-stage检测的先河,它将物体分类和物体检测网络合二为一,都在全连接层完成。所以它大大降低了目标检测的耗时,提高了实时性。但它的缺点也十分明显:
- 每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果很差。
- 原始图片只划分为7x7的网格,当两个物体靠的很近时,效果很差
- 最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。
- 对于图片中比较小的物体,效果很差。这其实是所有目标检测算法的通病,SSD对它有些优化,我们后面再看。
YOLO v1是没有采用Anchor的,它是直接预测出的位置信息,而不是基于Anchor来调整位置。
二、YOLO v2
YOLO v2是YOLO系列的第二代目标检测模型,相较于YOLO v1,YOLO v2在性能和准确性上有了显著提升,重点解决YOLO v1召回率和定位精度方面的不足。其在PASCAL VOC2007数据集的测试集上mAP最高可以达到78.6,相比YOLO v1提高了将近15个百分点,并且针对544×544的图片能达到40fps。
原论文名叫做YOLO9000是因为,该模型使用PASCAL VOC数据集和ImageNet数据集进行联合训练,最终模型能检测超过9000个类别。
2.1 YOLO v2思想
YOLO v2是在YOLO v1的基础上做了一系列的改进与尝试。
(1)Batch Normalization—批量归一化
CNN在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,YOLO v2对网络的每一层的输入(每个卷积层后)都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会更快,同时提高了2%以上的mAP。Batch Normalization 也有助于规范化模型,可以在舍弃dropout优化后依然不会过拟合。
(2)High Resolution Classifier—高分辨率分类器
YOLO v1中预训练使用的是分类数据集,大小是224×224 ,然后迁移学习,微调时使用YOLO模型做目标检测的时候才将输入变成448 × 448。这样改变尺寸,网络就要多重新学习一部分,会带来性能损失。
YOLO v2在预训练时就使用448×448的高分辨率下对分类网络进行训练,并且后续用同样的尺寸在目标检测网络中微调,使网络能够更好地适应更高分辨率的输入,从而提高了近4%的mAP。
(3)Convolutional With Anchor Boxes—带有Anchor Boxes的卷积
YOLO v1中是使用全连接层来直接预测边界框,其中边界框的坐标是相对于每个网格的,宽与高是相对于整张图片。由于各个图片中存在不同尺度和长宽比的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。
Faster R-CNN则不是直接预测目标边界框,而是使用手工挑选的先验Anchor Boxes。利用RPN预测的边界框是相对于Anchor Boxes的坐标和高宽的偏移offset。RPN在特征图的每个位置预测Anchor Box偏移量而不是坐标,简化了问题,使得网络更容易学习。
YOLO v2删掉了分类网络的全连接层和最后一个pooling层,使得最后的卷积层可以有更高分辨率的特征,缩小网络操作的输入图像为416×416,并且使用了Anchor Boxes。使用了Anchor之后,模型的mAP值从69.5降到了69.2,下降了约0.3,而召回率却从81%提高到了88%。
如图所示,YOLO v2在使用Anchor之后,类别概率是属于box的,每个box对应一个类别概率,而不是由网格决定,因此每个box对应25个预测值。每个网格携带的是 25 × 5 =125个信息,25是 xywh+置信度+分类数,5就是5个Anchor。
(4)Dimension Clusters—维度聚类(K-means聚类确定Anchor初始值)
Anchor Boxes的尺寸是手工指定了长宽比和尺寸,相当于一个超参数,这违背了YOLO对于目标检测模型的初衷,因为如果指定了Anchor的大小就没办法适应各种各样的物体了。
所以,YOLO v2在训练集的边界框上运行K-means聚类训练bounding boxes,可以自动找到更好的boxes宽高维度。
(5)Direct location prediction—直接的位置预测
在使用Anchor之后,模型不稳定,特别是在早期迭代期间。大多数不稳定性来自于对边框(x, y)位置的预测。根据RPN中的位置预测方法:
x
=
(
t
x
∗
w
a
)
+
x
a
x = (t_x * w_a)+x_a
x=(tx∗wa)+xa
y
=
(
t
y
∗
h
a
)
+
y
a
y = (t_y*h_a)+y_a
y=(ty∗ha)+ya
这个公式是不受约束的,因此任何锚框可以出现在图像中的任何位置。在随机初始化的情况下,模型需要很长时间才能稳定到预测合理的偏移量。
YOLO v2改进为预测边界框中心点相对于对应网格左上角位置的相对偏移值。将网格归一化为1×1,坐标控制在每个网格内,同时配合sigmod函数将预测值转换到0~1之间的方法,做到每一个Anchor只负责检测周围正负一个单位以内的目标box。这样使模型更容易稳定训练,mAP值提升了约5%。
(6)Fine-Grained Features—细粒度的特征
YOLO v2提取了Darknet-19(backbone)最后一个maxpooling层的输入,得到26×26×512的特征图。经过1×1×64的卷积以降低特征图的维度,得到26×26×64的特征图,然后经过pass through层的处理变成13x13x256的特征图(抽取原特征图每个2x2的局部区域组成新的channel,即原特征图大小降低4倍,channel增加4倍),再与13×13×1024大小的特征图连接,变成13×13×1280的特征图,最后在这些特征图上做预测。
此操作最终使模型提升了1%的mAP。
(7)Multi-Scale Training—多尺度的训练
YOLOv2模型只使用了卷积和池化层,所以可以动态调整输入大小。每隔几次迭代就改变网络,而不是固定输入图像的大小。
具体操作为网络每10批训练后随机选择一个新的图像尺寸大小。由于模型下采样了32倍,从以下32的倍数{320,352,…,608}作为图像维度的选择。将网络输入调整到那个维度,并继续训练。这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在输入size较大时,训练速度较慢,在输入size较小时,训练速度较快,而multi-scale training又可以提高准确率,因此算是准确率和速度都取得一个不错的平衡。
(8)Darknet19—全新的backbone
大多数检测框架依赖于VGG-16作为基本的特征提取器。VGG-16是一个强大、精确的分类网络,但是它计算复杂。Darknet19与VGG模型类似,主要使用3×3的卷积,并在每个池化步骤后加倍通道数。使用全局平均池进行预测,并使用1×1卷积压缩特征图通道数以降低模型计算量和参数,每个卷积层后使用BN层以加快模型收敛同时防止过拟合,最后用Average pooling层代替全连接层进行预测,整个网络共19个卷积层。注意在目标检测网络中使用时要去掉红框部分。
2.2 YOLO v2网络结构
如图所示,YOLO v2的网络结构首先由Darknet19来提取特征,其中的每个Convolutional都包含一个卷积+BN+Leaky ReLU。将Darknet19的最后一层删除掉并增加了三个3×3的卷积层,每个卷积层有1024个卷积核,最后一个1×1的卷积层输出该网络需要输出的结果。例如,对于PASCAL VOC数据集,预测5个Anchor,每个Anchor有xywh+置信度+分类数共25个信息,所以最后输出结果的深度为125。此外,还将backbone中最后一个3×3×512的卷积层经过PassThrough Layer融合进了目标检测网络的倒数第2和第3个卷积层之间,来让模型使用细粒度特征。
2.3 YOLO v2总结
YOLO v2对比YOLO v1做了许多改进,其性能在各种检测数据集上比其他检测系统更快。此外,它可以在各种图像大小下运行,以在速度和精度之间提供平滑的折中。
对比YOLO v1,其所做改进包括:
- 加了BN(卷积后,激活函数前)。
- 加了高分辨率分类器。
- 加了anchor(聚类得到个数,1个gird cell 生成5个anchor);
- 限制预测框。
- 加入细粒度特征(类似于concat的残差)加入对尺度训练。
- 改进骨干网络(GoogleNet 变darknet-19)。
- 通过WordTree将不同数据集结合联合训练,用一种新颖的方法扩充了数据集。
三、YOLO v3
YOLO v3在YOLO v2的基础上改良了网络的主干,利用多尺度特征图进行检测,改进了多个独立的Logistic regression分类器来取代softmax来预测类别分类。该篇论文是Joseph Redmon关于YOLO系列的最后一篇。
3.1 YOLO v3思想
YOLO v3中的几点改进:
(1)全新的backbone—Darknet53
YOLO v3修改了backbone,由Darknet19变为Darknet53。
Darknet53中包含了53个卷积层,与ResNet差不多,都是堆叠了一系列的残差结构,但不同的是Darknet53中是没有池化层的,而是通过卷积层的步长来对特征图进行尺度压缩。其主要改进如下:
-
没有采用最大池化层,转而采用步长为2的卷积层进行下采样。
-
为了防止过拟合,在每个卷积层之后加入了一个BN层和一个Leaky ReLU。
-
引入了残差网络的思想,目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。
-
将网络的中间层和后面某一层的上采样进行张量拼接,达到多尺度特征融合的目的。
(2)多尺度融合
然后,YOLOv3借鉴了FPN的方法,采用多尺度的特征图对不同大小的物体进行检测,以提升小物体的预测能力。YOLOv3采用了3个不同尺度的特征图(三个不同卷积层提取的特征),通过下采样32倍、16倍和8倍得到3个不同尺度的特征图。例如输入416X416的图像,则会得到13X13 (416/32),26X26(416/16) 以及52X52(416/8)这3个尺度的特征图,不同尺度下的预测方法也不同。注意,在不同尺度融合的时候与FPN采用的对应维度相加不同,YOLO v2采用的是在深度方向上进行拼接。
下图给出了三个预测层的特征图大小以及每个特征图上预设边界框的尺寸(这些预设边界框尺寸都是作者根据COCO数据集聚类得到的):
由于在每个尺度上预测三个Anchor,所以最终的张量深度为 N × N × [ 3 ∗ ( 4 + 1 + 80 ) ] N×N×[3 * (4+1+80)] N×N×[3∗(4+1+80)],80为COCO数据集的类别个数。
(3)目标边界框的预测
(4)正负样本的匹配
如图所示,在实际实现的时候是计算每一个GT(Ground Truth)的三个AT模板的IoU,选择大于阈值的AT即可,这样有助于扩充正样本,而不是像论文一样只选择最大的IoU。
3.2 YOLO v3网络结构
3.3 YOLO v3损失函数
如图所示,YOLO v3损失的计算由置信度损失、分类损失和定位损失三部分组成。
置信度损失:
分类损失:
定位损失:
3.4 YOLO v3总结
四、YOLO v3 SPP
YOLO v3 SPP主要在YOLO v2的基础上增加了很多trick,涉及了很多篇论文。其中最主要的有三个trick:
- Mosaic图像增强
- SPP模块
- CIoU Loss
4.1 Mosaic图像增强
Mosaic图像增强就是将多张图片组合在一起,使网络进行训练的方法。Mosaic 数据增强算法参考 CutMix数据增强算法。CutMix数据增强算法使用两张图片进行拼接,而 Mosaic 数据增强算法一般使用四张进行拼接,但两者的算法原理是非常相似的。它的优点有:
-
增加数据多样性,随机选取四张图像进行组合,组合得到图像个数比原图个数要多。
-
增强模型鲁棒性,混合四张具有不同语义信息的图片,可以让模型检测超出常规语境的目标。
-
加强批归一化层(Batch Normalization)的效果。当模型设置 BN 操作后,训练时会尽可能增大批样本总量(BatchSize),因为 BN 原理为计算每一个特征层的均值和方差,如果批样本总量越大,那么 BN 计算的均值和方差就越接近于整个数据集的均值和方差,效果越好。
-
Mosaic 数据增强算法有利于提升小目标检测性能。Mosaic 数据增强图像由四张原始图像拼接而成,这样每张图像会有更大概率包含小目标。
4.2 SPP模块
YOLO v3 SPP中的SPP模块借鉴了上面的SPP-Net论文,其模块结构如下:
YOLO v3 SPP与YOLO v3不同之处就是在第一个预测特征层之前的Convolutional Set中间加入了上图所示的SPP模块。该模块最终的输出由四部分Concat而来,第一部分为模块的输入,第二部分为输入经过一个5×5的下采样,第三部分为输入经过一个9×9的下采样,第四部分为输入经过一个13×13的下采样。这四部分在channel方向上进行拼接,使得输出的channel数比输入的channel翻了4倍。经过此操作,实现了不同尺度的特征融合。
4.3 CIoU Loss
在之前的YOLO v3中,定位损失采用的是L2损失。然而L2损失不能很好的反应两个边界框重合的程度。那么在YOLO v3 SPP中将引入CIoU Loss,该损失函数是从IoU Loss发展而来。
IoU Loss:最基本的度量方法,计算预测框与真实框的交集和并集的比例。其主要缺点是当两个框不重叠时,IOU为0,这导致无法提供梯度更新。
GIoU Loss:在IOU的基础上增加了一个衡量两个框“最小闭合区域”的概念,解决了非重叠框的梯度问题,但仍未考虑框的形状差异和中心点偏移。
DIoU Loss:除了包含GIOU的所有优点外,还添加了一个度量预测框和真实框中心点距离的项。这有助于更快的收敛速度,尤其是在中心点偏移显著的情况下。
CIoU Loss:在DIOU的基础上进一步增加了一个关于宽高比(aspect ratio)的度量,这使得损失函数不仅考虑了框的重叠区域和中心距离,还考虑了框的形状差异。
4.4 YOLO v3 SPP网络结构
参考链接
[1] https://www.cnblogs.com/jins-note/p/11209384.html
[2] https://blog.csdn.net/weixin_43334693/article/details/129087464
[3] https://blog.csdn.net/weixin_43334693/article/details/129143961
[4] https://space.bilibili.com/18161609/channel/seriesdetail?sid=244160
[5] https://blog.csdn.net/dgvv4/article/details/123988282