☀️教程:霹雳吧啦Wz
☀️https://space.bilibili.com/18161609/channel/seriesdetail?sid=244160
一、YOLO v4
YOLO v4在2020年的4月发布,YOLO v4结合了大量的前人研究技术加以组合,实现了速度和精度的平衡,该论文包含大量的tricks。最终模型的mAP和FPS相比YOLO v3分别提升了10%和12%。
1.1 YOLO v4思想
YOLO v4的主要改进分为了网络结构的改进和优化策略的改进。
针对网络结构:
(1)Backbone:CSPDarknet-53(部分结构如下图所示)
YOLO v4的Backbone是在Darknet-53基础上引入了CSP结构,CSP结构通过修改传统卷积神经网络中的数据传递路径来优化网络的计算效率和减少网络参数,从而加快处理速度并提高模型性能。CSP结构图如下:
在CSP结构中,输入的特征图会被分成两部分。一部分直接传递到下一阶段,另一部分则通过一系列卷积层进行处理。处理后的特征图与直接传递的部分在深度上进行融合(concatenate)。这种结构能有效减少冗余信息,提高特征利用效率。但在CSPDarknet-53中,其CSP结构中输入特征图是分别用两个1×1的卷积层来实现分割为两部分的。
(2)Neck:SPP,PAN
YOLO v4 在YOLO v3的基础上增加了SPP和PAN结构。
SPP和之前在YOLO v3 SPP中介绍的结构相同,这里就不再进行介绍。
PAN(Path Aggregation Network)是一种用于增强特征层次之间信息传递的神经网络结构,PAN通过创建自顶向下和自底向上的信息流,形成一个封闭的循环,从而改善了特征的信息流动和整合。PAN的结构如下:
图a中对应的结构是FPN(特征金字塔)结构,那么PAN就是在FPN自顶向下融合特征的基础上,增加了一个自底向上融合特征的部分(见图b),形成一个更有效的信息循环。这样做可以使得顶层的高语义信息能够更好地指导底层的详细特征提取,同时使得底层的详细信息能够更好地辅助顶层的语义判断。但在YOLO v4中,特征融合的方式不是采用相加融合的方式,而是采用的在深度上进行拼接的方式。
(3)YOLO v3 Head
YOLO v4网络的预测头部使用的还是YOLO v3 的Head,是一个基于Anchor的Head。
针对优化策略:
(1)消除网格敏感度
如图所示,对于基于anchor的边界框回归参数的预测,在YOLO v3中是基于网格的中心点坐标来预测的,但是当真实目标的中心点恰好位于网格的边缘时,例如假设真实目标中心点在网格左上角,则模型需要预测出的回归参数 t x , t y t_x,t_y tx,ty,在经过Sigmoid激活函数处理后,其值应接近0。这就需要将 t x , t y t_x,t_y tx,ty预测为一个负无穷的数,这是非常困难的。
为了解决以上问题,YOLO v4引入了一个缩放因子scale,变成下图所示的式子:
经过scale的缩放之后,激活函数就更容易的到达0和1的点了,并且偏移的范围由原来的( 0 , 1 )调整到了( − 0.5 , 1.5 ) 。
(2)Mosaic图像增强
Mosaic图像增强就是将多张图片组合在一起,使网络进行训练的方法。Mosaic 数据增强算法参考 CutMix数据增强算法。CutMix数据增强算法使用两张图片进行拼接,而 Mosaic 数据增强算法一般使用四张进行拼接,但两者的算法原理是非常相似的,在YOLO v4中就使用了这样的方法进行训练。
(3)划分正负样本的IoU阈值
为了增加正样本的数量,在YOLO v4中,我们将改进划分正负样本的策略。首先,将AT和GT的左上角对齐来计算IoU,设定一个IoU阈值。接下来将GT映射在Grid网格上,那么在YOLO v4的划分策略中,图中阴影部分的三个Cell对应的AT2都将被划分为正样本,因为在消除网格敏感度的时候,利用改进的公式预测的边界框回归参数不再将预测边界框的中心坐标限制在当前Cell内了。
(4)优化Anchor
YOLO v4中,针对(512×512)的图片重新优化了Anchors:
(5)采用CIOU损失
1.2 YOLO v4网络结构
YOLO v4模型 = CSPDarkNet53 + SPP + PANet+ YOLO v3-Head
1.3 YOLO v4总结
YOLO v4的贡献点:
- 开发了一个高效、强大的目标检测模型。它使每个人都可以使用1080ti或2080ti GPU来训练一个非常快速和准确的目标检测器。
- 验证了最先进的 Bag-of-Freebies和 Bag-of-Specials对象检测在检测器训练时的影响。
- 对现有的方法进行了改进,使其更加高效,更适合于单个GPU的训练,包括CBN,PAN,SAM等。
YOLO v4主要由四个部分组成:
输入端: 训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练
-
Backbone: 各种方法技巧结合起来,包括:CSPDarknet53、Mish激活函数、Dropblock
-
Neck: SPP模块、FPN+PAN、SAM结构
-
Head: 输出层的锚框机制和YOLOv3相同,主要改进的是训练时的回归框位置损失函数CIOU Loss,以及预测框。
YOLO v4的五个基本组件:
- CBM:Yolov4网络结构中的最小组件,由Conv+Bn+Mish激活函数三者组成。
- CBL:由Conv+Bn+Leaky_relu激活函数三者组成。
- Res unit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。
- CSPX:借鉴CSPNet网络结构,由三个卷积层和X个Res unint模块Concate组成。
- SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。
二、YOLO v5
YOLO v5紧跟YOLO v4在2020年的6月发布,其作者并未发表论文,性能与YOLO v4不分上下。
YOLOv5针对不同大小(n, s, m, l, x)的网络整体架构都是一样的,只不过会在每个子模块中采用不同的深度和宽度,分别应对yaml
文件中的depth_multiple
和width_multiple
参数。还需要注意,官方除了n, s, m, l, x版本外还有n6, s6, m6, l6, x6,区别在于后者是针对更大分辨率的图片比如1280x1280,当然结构上也有些差异,后者会下采样64倍,采用4个预测特征层,而前者只会下采样到32倍且采用3个预测特征层。
2.1 YOLO v5思想
同样,将YOLO v5的主要改进分为网络结构的改进和优化策略的改进。
针对网络结构:
(1)Focus结构
Focus模块是在图片进入Backbone之前,对图片进行切片的操作,具体操作如上图所示,在一张图片中每隔一个像素拿一个值,类似于YOLO v2的Pass Through Layer中的相关操作一样,将一张图片切片成了四张互补的图片,长的差不多但是信息没有丢失。这样一来,将W、H信息就集中到了通道空间,输入通道扩充了四倍,即拼接起来的图片相对于原先的RGB三通道模式变成了12个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图。在v6.1的版本中,Focus模块替换成了6×6的普通卷积,两者功能相同,但后者的效率更高。
(2)Neck:SPPF,CSP,FPN+PAN结构
在YOLO v5的Neck部分,首先将原有的SPP结构替换为了SPPF结构,SPPF结构将输入串行通过多个5×5
大小的最大池化层,这里需要注意的是串行两个5x5
大小的MaxPool
层是和一个9x9
大小的MaxPool
层计算结果是一样的,串行三个5x5
大小的MaxPool
层是和一个13x13
大小的MaxPool
层计算结果是一样的,但后者的效率更高。
其次,针对CSP结构,YOLO v5与YOLO v4不同的地方在于,YOLO v4中只有Backbone中使用了CSP结构。而YOLO v5中设计了两种CSP结构。原理相同,详细结构见2.2节YOLO v5l网络结构图。
最后,针对FPN+PAN结构,与YOLO v4中的结构相同,详细结构见2.2节YOLO v5l网络结构图。
(3)YOLO v3 Head
YOLO v5网络的预测头部使用的仍然是YOLO v3 的Head,是一个基于Anchor的Head。
针对优化策略:
(1)数据增强:Mosaic、Copy paste、Random affine、MixUp、Albumentations、Augment HSV、Random horizontal flip
Mosaic:通过将四张训练图像拼接在一个单一图像上的方法。每张图像贡献一个象限。这种方法扩展了模型对多尺度和多对象的识别能力。
Copy-Paste:从一张图像中复制对象并粘贴到另一张图像中。这种方法有助于增加图像中对象的实例,特别是对于那些不常见的类别(只有数据集中有实例分割的标注信息时才能用该方法)。
Random affine:随机仿射变换包括缩放、旋转、平移和倾斜等操作,可以在不改变对象类别的前提下,改变对象的几何和空间关系。
MixUp:通过在像素级别将两张图像线性混合,并同时也混合它们的标签,来创建新的训练样本。这种方法通过创建介于原有类别之间的虚拟训练样本,增强了模型的泛化能力。
Albumentations:是一个快速图像增强库,支持多种图像增强技术,如裁剪、旋转、翻转、亮度调整等。
Augment HSV:通过随机调整图像的色调(Hue)、饱和度(Saturation)和明度(Value)来增强图像数据。这有助于模型学习在不同光照和颜色条件下识别对象。
Random horizontal flip:随机水平翻转图像,是一种简单而有效的数据增强方法,可以提高模型对方向变化的适应性。
这些数据增强方法可以组合使用,提高深度学习模型的性能和泛化能力。
(2)多尺度进行训练
多尺度训练,假设设置输入图片的大小为640 × 640 ,训练时采用尺寸是在0.5 × 640 ∼ 1.5 × 640之间随机取值,注意取值时取得都是32的整数倍(因为网络会最大下采样32倍)。
(3)自适应Anchor计算
在YOLO v5中,初始锚框的选取功能嵌入到了整个训练代码的过程中,在每次训练开始之前,都会根据不同的数据集来自适应计算anchors。
(4)采用EMA更新权重
相当于训练的时候给参数赋予了一个动量,这样更新起来就会更加平滑。
(5)使用amp混合精度训练
能够减少显存的占用并加快训练速度,但是需要GPU的支持。
2.2 YOLO v5网络结构
下图是B站up主霹雳吧啦Wz在他的CSDN中所绘制的yolov5l
网络结构:
2.3 YOLO v5损失函数
平衡不同尺度的损失
这里是指针对三个预测特征层(P3, P4, P5)上的obj损失采用不同的权重。在源码中,针对预测小目标的预测特征层(P3)采用的权重是4.0,针对预测中等目标的预测特征层(P4)采用的权重是1.0,针对预测大目标的预测特征层(P5)采用的权重是0.4,作者说这是针对COCO数据集设置的超参数。
2.4 YOLO v5总结
YOLO v5和之前YOLO系列相比的改进:
- 通过领域的正样本anchor匹配策略增加了正样本的数量
- 通过灵活的配置参数,可以得到不同复杂度的模型
- 通过一些内置的超参数优化策略,提升整体性能
- 应用各种数据增强的组合,提升模型的泛化能力
三、YOLO v6
YOLO v6是美团视觉智能部研发的一款目标检测框架,致力于工业应用。该框架同时专注于检测的精度和推理效率:YOLOv6-nano 在 COCO 上精度可达 35.0% AP,在 T4 上推理速度可达 1242 FPS;YOLOv6-s 在 COCO 上精度可达 43.1% AP,在 T4 上推理速度可达 520 FPS。在部署方面,YOLOv6 支持 GPU(TensorRT)、CPU(OPENVINO)、ARM(MNN、TNN、NCNN)等不同平台的部署,极大地简化工程部署时的适配工作。
3.1 YOLO v6思想
YOLO v6主要是基于硬件感知的思想来做的改进,其中的关键技术改进有三部分:Backbone骨干网络与Neck、高效的解耦头Head、训练策略。
(1)Backbone骨干网络与Neck
YOLO v5使用的Backbone和Neck都基于CSPNet来搭建的,采用了多分支的方式和残差结构。对于GPU等硬件来说,这种结构会一定程度上增加延时,同时减小内存带宽利用率。
YOLO v6基于硬件感知神经网络设计的思想,重新设计了Backbone与Neck,称之为EfficientRep Backbone和Rep-PAN Neck。
下图为EfficientRep Backbone的结构图:
- 将Backbone中步长为2的普通Conv层替换为了步长为2的RepConv层。
- 将原始的CSP-Block重新设计为RepBlock,其中RepBlock的第一个RepConv会做channel维度的变换和对齐。
- 将原始的SPPF优化设计为更加高效的SimSPPF。
如图a所示,表示训练的时候,RepVGG block接一个ReLu。图b表示推理的时候RepVGG block就被替换为了RepConv。图c表示CSPStackRep块的结构, 主要在大模型(m、l)中使用。
YOLO v6参考YOLOv4和v5用的PAN,结合Backbone里的RepBlock或者CSPStackRep,提出了一个Rep-PAN。
Rep-PAN 基于 PAN拓扑方式,用 RepBlock 替换了 YOLOv5 中使用的 CSP-Block,对整体 Neck 中的算子进行了调整。让其在硬件上达到高效推理的同时,保持较好的多尺度特征融合能力。
(2)高效的解耦头Head
原始的YOLO v5的检测头是通过分类和回归分支融合共享的方式来实现的,而YOLOX的检测头则是将分类和回归分支进行解耦,同时新增了两个额外的3×3的卷积层,虽然提升了检测精度,但一定程度上增加了网络延时。
YOLOv6采用混合通道策略来建立了一个更有效的解耦头。具体来说,将中间的3×3卷积层的数量减少到只有一个。头部的宽度由骨干和颈部的宽度乘数共同缩放。这些修改进一步降低了计算成本,以实现更低的推理延迟。
(3)训练策略
Anchor-free无锚范式
由于 Anchor-based检测器需要在训练之前进行聚类分析以确定最佳 Anchor 集合,这会一定程度提高检测器的复杂度 。在一些边缘端的应用中,需要在硬件之间搬运大量检测结果的步骤,也会带来额外的延时。
YOLO v6采用的Anchor-free方案不需要预设参数,同时后处理耗时短。其主要有两种方案:
- point-base (FCOS) ——YOLOv6使用的
- keypoint-based ( CornerNet)
SimOTA标签分配策略
OTA 将目标检测中的标签分配视为最佳传输问题。它从全局角度为每个真实对象定义了正/负训练样本。
SimOTA 是 OTA 的简化版本,它减少了额外的超参数并保持了性能。计算步骤为:
-
计算成对预测框与真值框代价,由分类及回归loss构成
-
计算真值框与前k个预测框IoU,其和为Dynamic k;因此对于不同真值框,其Dynamic k存在差异
-
最后选择代价最小的前Dynamic k个预测框作为正样本
SIoU边界框回归损失
为了进一步提升回归精度,YOLO v6采用了SIoU边界框回归损失函数来监督网络的学习。目标检测网络的训练一般需要至少定义两个损失函数:分类损失和边界框回归损失,而损失函数的定义往往对检测精度以及训练速度产生较大的影响。
近年来,常用的边界框回归损失包括IoU、GIoU、CIoU、DIoU Loss等等,这些损失函数通过考虑预测框与目标框之间的重叠程度、中心点距离、长宽比等因素来衡量两者之间的差距,从而指导网络最小化损失以提升回归精度,但这些方法都没有考虑到预测框与目标框之间方向的匹配性。SIoU损失函数通过引入了所需回归之间的向量角度,重新定义了距离损失,有效降低了回归的自由度,加快网络收敛,进一步提升了回归精度。
SIoU Loss在小模型上提升明显, GIoU Loss在大模型上提升明显,因此选择SIoU (for n/t/s) /GIoU (for m/l) 损失作为回归损失。通过在YOLO v6s上采用SIoU Loss进行实验,对比CIoU Loss,平均检测精度提升0.3%AP。
3.2 YOLO v6网络结构
3.3 YOLO v6总结
YOLO v6在精度和速度上都超过了其他可用的目标检测器。为了方便工业部署,作者还为YOLOv6提供了定制的量化方法,使其成为开箱即用的快速检测器。
YOLO v6解决的问题:
-
RepVGG提出的结构重参数化方法表现良好,但在此之前没有检测模型使用。作者认为RepVGG的block缩放不合理,小模型和大模型
-
没必要保持相似网络结构;小模型使用单路径架构,大模型就不适合在单路径上堆参数量。
-
使用重参数化的方法后,检测器的量化也需要重新考虑,否则因为训练和推理时的结构不同,性能可能会退化。
-
前期工作很少关注部署。前期工作中,推理是在V100等高配机器完成的,但实际使用时往往用T4等低功耗推理gpu,作者更关注后者的性能。
-
针对网络结构的变化,重新考虑标签分配和损失函数。
-
对于部署,可以调整训练策略,在不增加推理成本的情况下提升性能,如使用知识蒸馏。
参考链接
[1] https://www.bilibili.com/video/BV1NF41147So/?spm_id_from=333.999.0.0
[2] https://blog.csdn.net/weixin_43334693/article/details/129232468
[3] https://blog.csdn.net/weixin_43334693/article/details/129312409
[4] https://blog.csdn.net/weixin_43334693/article/details/130444498