YOLOv4 & scaled YOLOv4
-
- 一、目标检测框架总结
- 二、数据增强
- 三、激活函数
- 四、损失函数 & NMS
-
- 4.1 损失函数
- DIOU-NMS
- 五、模型结构
-
- 5.1 YOLOv4
- 5.2 Scaled YOLOv4
-
- 5.2.1 Backbone
- 5.2.2 CSP结构
- 5.2.3 PAN结构
- 5.2.4 SPP结构
- 六、实验结果
- 七、参考文献
论文地址请见参考文献
一、目标检测框架总结
在YOLOv4论文中,作者首先对当前目标检测领域的模型进行了总结。作者将目标检测模型归纳为下图所示的结构:
作者将模型分为 输入、backbone、neck、预测部分,其中Dense Prediction加前三部分为one-stage检测模型框架,Sparse Predition 加前三部分为two-stage 检测模型框架。这里的Neck部分主要指的是网络中对backbone提取的特征进行多尺度融合(如FPN等)或者进一步处理(注意力机制等)。并且作者也列出来各个部分目前表现较好的方案,俗称“轮子”。
YOLOv4中其实没有提出残差块、FPN等这种很大创新的方案,作者将上面的每个部分中到目前为止表现比较好的方案进行排列组合,进行大量实验,最终选取了最好的组合方式,得到了最后的YOLOv4方案,中间有一些微小的改进,后面会详细说明。
下面就按照论文中的顺序逐一介绍 数据增强、激活函数、损失函数、模型结构以及Scaled YOLOv4结构。Scaled YOLOv4是作者团队在YOLOv4的基础上对模型进行了调整,针对不同的GPU提出了YOLOv4-CSP,YOLOv4-large,YOLOv4-tiny,并且性能较原YOLOv4也有一定的提升。
二、数据增强
论文中提到了上图所列的几种数据增强方式。
(a)常规数据增强方式,如裁剪、旋转、平移、改变色调、饱和度、亮度等。
(b)Mixup,将两张图片以一定的比例进行融合,标注按照比例进行标注,如下面的表格所示。
(c)CutMix,随机剪切一张图片后与另一张图片进行拼接,这样能够迫使模型根据目标的部分特征进行预测
(d)Mosaic,这算是YOLOv4中数据增强的一个亮点(虽然不是作者提出的,但是之前用的比较少)。将四张图片进行随机缩放、随机分布拼接合成一张图片进行训练。Mosaic提出是为了改善COCO数据集中小目标分布不均衡特点,这样进行随机拼接能够增加很多小目标,并且丰富了数据集,能够提升网络鲁棒性。再者这样可以直接计算四张图片,有利于加快训练,不需要太大的mini-batch。
(e)Blur,与CutMix相似,不作过多介绍,并且YOLOv4也并没有用到这个。
(f)SAT,self adversarial training,自对抗训练。源于图像风格转换,利用了生成对抗网络向预测错误的方向对图像进行改动,再将修改后的图片投入模型进行训练,能够增强模型的鲁棒性。
(g)类标签平滑,一个挺新颖的数据增强方式,主要是为了一定程度上减弱训练集中的少量标注错误样本的负面影响而提出的,详情可以见我的另一篇博客:这里。
三、激活函数
YOLOv4中用到了激活函数Mish函数,其公式以及曲线图如上图所示。
从图中可以看出他在负值的时候并不是完全截断,而是允许比较小的负梯度流入从而保证信息流动;和ReLu函数相似,Mish激活函数能够避免梯度消失问题,并且Mish函数也保证了每一点的平滑,从而使得梯度下降效果比Relu要好
四、损失函数 & NMS
4.1 损失函数
YOLOv4中用到了CIOU Loss,该损失函数是在DIOU论文中提出的[3]。DIOU Loss是在IOU的基础上增加考虑了预测框与Gound Truth框的中心距离信息,而CIOU 是在DIOU的基础上增加了边框的宽高比信息。(比较全面,所以叫Complete IOU Loss)
其公式如下所示:
具体信息感兴趣的读者可以去看DIOU的论文。
DIOU-NMS
同样的,DIOU-NMS也是在DIOU的论文中提出的,其主要思想是在进行非极大值抑制处理预测框时考虑DIOU信息,这里贴出其原论文中的片段:
五、模型结构
5.1 YOLOv4
YOLOv4的模型结构如下图所示:(图片来源于其它博客,上面有该大佬信息)
可以看出整体结构与YOLOv3很相似,只是对各个模块都进行了改进,用于预测的head部分没有改动,仍沿用了YOLOv3的head。backbone 使用了添加了CSP结构的darknet53,Neck部分使用了PANet结构,在下面的Scaled YOLOv4结构中可能更清楚。并且在其中也引进了SPP结构,这个来源于2015年左右何凯明大佬团队提出的SPPNet。这几部分后面都会进一步介绍。
5.2 Scaled YOLOv4
如上图所示为Scaled-YOLOv4结构,可分为三个模型,分别为面向云GPU的YOLOv4-large,面向常规GPU的YOLOv4-CSP,面向小型轻量级GPU的YOLOv4-Tiny。
本文将重点介绍YOLOv4-CSP结构中的各个部分。
5.2.1 Backbone
YOLOv4以及Scaled YOLOv4的backbone都采用添加了CSP结构的DarkNet结构,只是其中各块的层数以及规模不同。由结构图可以看到,backbone主要由CSPblock组成,而CSP结构取自于CSPNet论文[4]
5.2.2 CSP结构
如上图所示为一个CSPblock结构,而图中红框区域表示为一个残差块结构[5],图中的 m 表示这个CSPblock中残差块的数量。
前文也提到了CSP来源于CSPNet,这一结构工作原理如上图,输入特征图首先经过一个1×1卷积层,而后将得到的特征图在深度维度上一分为二,一部分输入到后续卷积层中进行处理,而另一部分直接跳层与第一部分多次卷积后的结果进行拼接作为这一block的输出结果。这样做的主要目的是为了减少计算量。通过计算得到相比于DarkNet,CSPDarkNet能够减少约50%的计算量,大幅提高了计算速度,并且实验结果证明准确度并无对准确度并无大幅影响。
值得一提的是,YOLOv4-CSP中的CSP结构并不是直接将特征图分为两部分分别处理,而是设定最初的1×1卷积层的输出通道为c/2(原通道数为c),而后再将其分别输入到后续卷积层以及跳层用于concat操作。
5.2.3 PAN结构
如上图所示为YOLOv4-CSP的网络结构,其中的Neck部分为PAN结构,head部分(图中的灰色部分)沿用YOLOv3的head。
PAN结构如下图所示:
这一结构来源于分割领域的PANet[6],其简要来说是在FPN的基础上增加了一个自底向上的传输路径(Bottom-up Path Augmentaion)。因为底层特征更能提供边缘等细节特征,高层特征更提供深度的语义特征,FPN在传统的卷积网络基础上增加了自上而下的特征融合通道,能够增加高维特征的利用率,因为分割的=需要像素级别的准确度,因此PAN在FPN基础上增加自下而上的通路以提升定位精度。
~
在YOLOv4中,对PAN结构进行了一处小的改进,在不同尺度特征融合时并没有采用原本的直接相加的方式,而是采用了concat方式将特征图进行拼接,如下图所示,左侧为原来的相加融合,右侧为YOLOv4的融合方式:
5.2.4 SPP结构
从结构图中可以发现还有一个CSPSPP块,这是在CSPblock的结构中增加了SPP结构组成的。SPP来源于何凯明团队提出的SPPNet,这篇论文的发表时间还在fast-RCNN之前,并且fast-RCNN也是在其基础上被提出的。
当时神经网络中包含全连接层,进而导致网络输入图片大小必须为固定尺寸,SPP结构最初在SPPNet中被提出就是为了解决此问题而提出的。
SPPNet中SPP结构如下:
可以看到最开始的SPP结构输出为一个一维向量,用于输入到全连接层。其主要工作原理为:将输入特征图在不同尺度上划分为几个区域,例如1×1,2×2,4×4,然后分别对这每一个小块进行最大池化,最后得到1+4+16 长的向量。
在后来的各种全卷积网络中对SPP进行了针对全卷积网络的改进,改进后的结构如下图所示:
在进行池化操作时对特征图首先进行了Padding后再进行步长为1的池化,因此池化后得到的特征图与原特征图大小相同,而后再将这些得到的特征图concat,输入到后面的卷积层中用于计算。
YOLOv4这里引进SPP结构的主要原因是SPP结构能够增大感受野,并且也能够融合不同尺度的特征。
六、实验结果
实验结果如上面几图所示,作者还做了大量的消融实验来验证各个部分的选择是否最优,具体结果各位读者可以在论文原文中看到。
七、参考文献
[1] YOLOv4
[2] Scaled YOLOv4
[3] DIOU
[4] CSPNet
[5] ResNet
[6] PANet
最后,如果文中有错误的地方还请大佬指正