YOLOv4是精度速度最优平衡, 各种调优手段是真香,本文主要从以下几个方面进行阐述:
YOLOV4
其实是一个结合了大量前人研究技术,加以组合并进行适当创新的算法,实现了速度和精度的完美平衡。可以说有许多技巧可以提高卷积神经网络(CNN
)的准确性,但是某些技巧仅适合在某些模型上运行,或者仅在某些问题上运行,或者仅在小型数据集上运行;我们来码一码这篇文章里作者都用了哪些调优手段:加权残差连接(WRC
),跨阶段部分连接(CSP
),跨小批量标准化(CmBN
),自对抗训练(SAT
),Mish
激活,马赛克数据增强,CmBN
,DropBlock
正则化,CIoU Loss
等等。经过一系列的堆料,终于实现了目前最优的实验结果:43.5%
的A
P(在Tesla V100
上,MS COCO
数据集的实时速度约为65FPS
)。
YOLOv4
的贡献如下:
1080 Ti
或2080 TiGPU
来训练一个超级快速和准确的目标探测器。Bag-of-Freebies
和Bag-of-Specials
的目标检测方法的影响。GPU
训练,包括CBN
、PAN
、SAM
等。总之一句话:速度差不多的精度碾压;精度差不多的速度碾压。
YOLOV4
论文: https://arxiv.org/pdf/2004.10934.pdf
YOLOV4
代码: https://github.com/AlexeyAB/darknet
我们主要从通用框架,CSPDarknet53
,SPP
结构,PAN
结构和检测头YOLOv3
出发,来一起学习了解下YOLOv4
框架原理。
目前检测器通常可以分为以下几个部分,不管是two-stage
还是one-stage
都可以划分为如下结构,只不过各类目标检测算法设计改进侧重在不同位置:
如上图,除了输入,一般one-stage
的目标检测算法通常由提取特征的backbone
,传输到检测网络的Neck
部分和负责检测的Head
部分。而two-stage
的算法通常还包括空间预测部分。网络中常用的模块为:
而作为one-stage
的YOLO
网络主要由三个主要组件组成:
这里先直接上YOLOv4
的整体原理图(来源网络)如下:
如上图,整体框架跟我们之前学的YOLOv3很是类似。这里先大致看下,接下来我们将逐步分析各个部分,首先,我们先看特征提取网络Backbone
.
我们前面知道在YOLOv3
中,特征提取网络使用的是Darknet53
,而在YOLOv4
中,对Darknet53
做了一点改进,借鉴了CSPNet
,CSPNet
全称是Cross Stage Partial Networks
,也就是跨阶段局部网络。CSPNet
解决了其他大型卷积神经网络框架Backbone
中网络优化的梯度信息重复问题,将梯度的变化从头到尾地集成到特征图中,因此减少了模型的参数量和FLOPS
数值,既保证了推理速度和准确率,又减小了模型尺寸。如下图:
CSPNet
实际上是基于Densnet
的思想,复制基础层的特征映射图,通过dense block
发送副本到下一个阶段,从而将基础层的特征映射图分离出来。这样可以有效缓解梯度消失问题(通过非常深的网络很难去反推丢失信号) ,支持特征传播,鼓励网络重用特征,从而减少网络参数数量。CSPNet
思想可以和ResNet
、ResNeXt
和DenseNet
结合,目前主要有CSPResNext50
和CSPDarknet53
两种改造Backbone
网络。
考虑到几方面的平衡:输入网络分辨率/卷积层数量/参数数量/输出维度。一个模型的分类效果好不见得其检测效果就好,想要检测效果好需要以下几点:
这样最终的CSPDarknet53
结构就如下图:
CSPNet
论文: https://arxiv.org/pdf/1911.11929v1.pdf
为了增大感受野,作者还使用了SPP-block
,使用PANet
代替FPN
进行参数聚合以适用于不同level
的目标检测。
SPP-Net结构我们之前也有学过,SPP-Net
全称Spatial Pyramid Pooling Networks
,当时主要是用来解决不同尺寸的特征图如何进入全连接层的,直接看下图,下图中对任意尺寸的特征图直接进行固定尺寸的池化,来得到固定数量的特征。
如上图,以3
个尺寸的池化为例,对特征图进行一个最大值池化,即一张特征图得取其最大值,得到1*d
(d
是特征图的维度)个特征;对特征图进行网格划分为2x2
的网格,然后对每个网格进行最大值池化,那么得到4*d
个特征;同样,对特征图进行网格划分为4x4
个网格,对每个网格进行最大值池化,得到16*d
个特征。 接着将每个池化得到的特征合起来即得到固定长度的特征个数(特征图的维度是固定的),接着就可以输入到全连接层中进行训练网络了。用到这里是为了增加感受野。
YOLOv4
使用PANet
(Path Aggregation Network
)代替FPN
进行参数聚合以适用于不同level
的目标检测, PANet
论文中融合的时候使用的方法是Addition
,YOLOv4
算法将融合的方法由加法改为Concatenation
。如下图:
是一种特征图融合方式。
对于检测头部分,YOLOv4
继续采用YOLOv3算法的检测头,不再赘述。
这里我们主要从数据增强,DropBlock
正则化,类标签平滑方面来学习下BackBone
训练策略。
YOLOv4
选择用CutMix
的增强方式,CutMix
的处理方式也比较简单,同样也是对一对图片做操作,简单讲就是随机生成一个裁剪框Box
,裁剪掉A图的相应位置,然后用B
图片相应位置的ROI
放到A
图中被裁剪的区域形成新的样本,ground truth
标签会根据patch
的面积按比例进行调整,比如0.6
像狗,0.4
像猫,计算损失时同样采用加权求和的方式进行求解。这里借CutMix
的地方顺带说下几种类似的增强方式:
上图是CutMix
论文中作者对几种增强方式做的对比,结果显而易见,CutMix
的增强方式在三个数据集上的表现都是最优的。其中Mixup
是直接求和两张图,如同附身,鬼影一样,模型很难学到准确的特征图响应分布。Cutout
是直接去除图像的一个区域,这迫使模型在进行分类时不能对特定的特征过于自信。然而,图像的一部分充满了无用的信息,这是一种浪费。在CutMix
中,将图像的一部分剪切并粘贴到另一个图像上,使得模型更容易区分异类。
CutMix论文: https://arxiv.org/pdf/1905.04899v2.pdf
Yolov4
的Mosaic
数据增强是参考CutMix
数据增强,理论上类似。区别在于Mosaic
是一种将4
张训练图像合并成一张进行训练的数据增强方法(而不是CutMix
中的2
张)。这增强了对正常背景(context
)之外的对象的检测,丰富检测物体的背景。此外,每个小批包含一个大的变化图像(4
倍),因此,减少了估计均值和方差的时需要大mini-batch
的要求,降低了训练成本。如下图:
正则化技术有助于避免数据科学专业人员面临的最常见的问题,即过拟合。对于正则化,已经提出了几种方法,如L1
和L2
正则化、Dropout
、Early Stopping
和数据增强。这里YOLOv4
用了DropBlock
正则化的方法。
DropBlock
方法的引入是为了克服Dropout
随机丢弃特征的主要缺点,Dropout
被证明是全连接网络的有效策略,但在特征空间相关的卷积层中效果不佳。DropBlock
技术在称为块的相邻相关区域中丢弃特征。这样既可以实现生成更简单模型的目的,又可以在每次训练迭代中引入学习部分网络权值的概念,对权值矩阵进行补偿,从而减少过拟合。如下图:
DropBlock
论文中作者最终在ImageNet
分类任务上,使用Resnet-50
结构,将精度提升1.6%
个点,在COCO
检测任务上,精度提升1.6%
个点。
DropBlock
论文: https://arxiv.org/pdf/1810.12890.pdf
对于分类问题,特别是多分类问题,常常把向量转换成one-hot-vector
,而one-hot
带来的问题: 对于损失函数,我们需要用预测概率去拟合真实概率,而拟合one-hot
的真实概率函数会带来两个问题:
0
概率鼓励所属类别和其他类别之间的差距尽可能加大,而由梯度有界可知,这种情况很难适应。会造成模型过于相信预测的类别。对预测有100%
的信心可能表明模型是在记忆数据,而不是在学习。标签平滑调整预测的目标上限为一个较低的值,比如0.9
。它将使用这个值而不是1.0
来计算损失。这个概念缓解了过度拟合。说白了,这个平滑就是一定程度缩小label
中min
和max
的差距,label
平滑可以减小过拟合。所以,适当调整label
,让两端的极值往中间凑凑,可以增加泛化性能。
这里主要从Mish
激活函数,MiWRC
策略方面进行阐述BackBone
推理策略。
对激活函数的研究一直没有停止过,ReLU
还是统治着深度学习的激活函数,不过,这种情况有可能会被Mish
改变。Mish
是另一个与ReLU
和Swish
非常相似的激活函数。正如论文所宣称的那样,Mish
可以在不同数据集的许多深度网络中胜过它们。公式如下:
Mish
是一个平滑的曲线,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化;在负值的时候并不是完全截断,允许比较小的负梯度流入。实验中,随着层深的增加,ReLU
激活函数精度迅速下降,而Mish
激活函数在训练稳定性、平均准确率(1%-2.8%
)、峰值准确率(1.2% - 3.6%
)等方面都有全面的提高。如下图:
Mish
论文: https://arxiv.org/pdf/1908.08681.pdf
MiWRC
是Multi-input weighted residual connections
的简称, 在BiFPN
中,提出了用MiWRC
来执行标尺度级重加权,添加不同尺度的特征映射。我们已经讨论了FPN
和PAN
作为例子。下面的图(d
)显示了另一种被称为BiFPN
的neck
设计,根据BiFPN
的论文,该设计具有更好的准确性和效率权衡。
上图中 (a
)FPN
引入自顶向下的路径,将多尺度特征从3
级融合到7
级(P3-P7
);(b
)PANET
在FPN
之上增加一个额外的自下而上的路径;(c
)NAS-FPN
使用神经网络搜索找到一个不规则的特征拓扑网络,然后重复应用同一块拓扑结构;(d
)是这里的BiFPN
,具有更好的准确性和效率权衡。将该neck
放到整个整个网络的连接中如下图:
上图采用EfficientNet
作为骨干网络,BiFPN
作为特征网络,共享class/box
预测网络。 基于不同的资源约束,BiFPN
层和类/盒网层都被重复多次。
BiFPN
论文: https://arxiv.org/pdf/1911.09070.pdf
前面介绍BackBone
训练策略的时候,以及学习过DropBlock
正则化,Mosaic
数据增强的方法了,这两种方法在检测头训练的过程中也有用到这里不在赘述。我们一起看下检测头训练中采用的其他策略。
损失函数给出了如何调整权重以降低loss
。所以在我们做出错误预测的情况下,我们期望它能给我们指明前进的方向。但如果使用IoU
,考虑两个预测都不与ground truth
重叠,那么IoU
损失函数不能告诉哪一个是更好的,或者哪个更接近ground truth
。这里顺带看下常用的几种loss
的形式,如下:
IoU
算法是使用最广泛的算法,大部分的检测算法都是使用的这个算法。
GIoU
考虑到,当检测框和真实框没有出现重叠的时候IoU
的loss
都是一样的,因此GIoU
就加入了C
检测框(C
检测框是包含了检测框和真实框的最小矩形框),这样就可以解决检测框和真实框没有重叠的问题。但是当检测框和真实框之间出现包含的现象的时候GIoU
就和IoU loss
是同样的效果了。
其中,C
是指能包含predict box
和Ground Truth box
的最小box
。
DIoU
考虑到GIoU
的缺点,也是增加了C
检测框,将真实框和预测框都包含了进来,但是DIoU
计算的不是框之间的交并,而是计算的每个检测框之间的欧氏距离,这样就可以解决GIoU
包含出现的问题。
其中
是指predict box
和GT box
中心点的距离的平方,而
是指刚好能包含predict box
和GT box
的最小box
的对角线长度平方。
CIoU
就是在DIoU
的基础上增加了检测框尺度的loss
,增加了长和宽的loss
,这样预测框就会更加的符合真实框。
实际上,CIOU
只是在DIOU
基础上增加了一项
。 其中:
BN
就是仅仅利用当前迭代时刻信息进行norm
,而CBN
在计算当前时刻统计量时候会考虑前k
个时刻统计量,从而实现扩大batch size
操作。同时作者指出CBN
操作不会引入比较大的内存开销,训练速度不会影响很多,但是训练时候会慢一些,比GN
还慢。
CmBN
是CBN
的改进版本,其把大batch
内部的4
个mini batch
当做一个整体,对外隔离。CBN
在第t
时刻,也会考虑前3
个时刻的统计量进行汇合,而CmBN
操作不会,不再滑动cross
,其仅仅在mini batch
内部进行汇合操作,保持BN
一个batch
更新一次可训练参数。
BN
:无论每个batch
被分割为多少个mini batch
,其算法就是在每个mini batch
前向传播后统计当前的BN数据(即每个神经元的期望和方差)并进行Nomalization
,BN
数据与其他mini batch
的数据无关。CBN
:每次iteration
中的BN
数据是其之前n
次数据和当前数据的和(对非当前batch
统计的数据进行了补偿再参与计算),用该累加值对当前的batch
进行Nomalization
。好处在于每个batch
可以设置较小的size
。CmBN
:只在每个Batch
内部使用CBN
的方法,个人理解如果每个Batch
被分割为一个mini batch
,则其效果与BN
一致;若分割为多个mini batch
,则与CBN
类似,只是把mini batch
当作batch
进行计算,其区别在于权重更新时间点不同,同一个batch
内权重参数一样,因此计算不需要进行补偿。
SAT
为一种新型数据增强方式。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对其自身进行一种对抗式的攻击,改变原始图像,制造图像上没有目标的假象。在第二阶段,训练神经网络对修改后的图像进行正常的目标检测。
Self-Adversarial Training
是在一定程度上抵抗对抗攻击的数据增强技术。CNN
计算出Loss
, 然后通过反向传播改变图片信息,形成图片上没有目标的假象,然后对修改后的图像进行正常的目标检测。需要注意的是在SAT的反向传播的过程中,是不需要改变网络权值的。 使用对抗生成可以改善学习的决策边界中的薄弱环节,提高模型的鲁棒性。因此这种数据增强方式被越来越多的对象检测框架运用。
边界框b
的计算方式为:
对于
和
的情况,我们需要
分别具有很大的负值和正值。但我们可以将
与一个比例因子(>1.0
)相乘,从而更轻松地实现这一目标。
如果 IoU(ground truth, anchor) > IoU threshold,则为单个基本真值使用多个锚点。(注:作者没有更多地说明该方法在 YOLOv4 中的作用。)
余弦调度会根据一个余弦函数来调整学习率。首先,较大的学习率会以较慢的速度减小。然后在中途时,学习的减小速度会变快,最后学习率的减小速度又会变得很慢。
这张图展示了学习率衰减的方式(下图中还应用了学习率预热)及其对mAP
的影响。可能看起来并不明显,这种新的调度方法的进展更为稳定,而不是在停滞一段时间后又取得进展。
余弦模拟退火论文: https://arxiv.org/pdf/1608.03983.pdf
关于遗传算法的文章,我们之前也有学过:遗传算法如何模拟大自然的进化?
遗传算法论文: https://arxiv.org/pdf/2004.10934.pdf
许多单阶段目标检测器是在固定的输入图像形状下训练的。为了提高泛化效果,我们可以对不同图像大小的模型进行训练。(在YOLO
中进行多尺度训练)。
在检测头推理中除了用了上面讲的Mish
, SPP
, PAN
技术外,还用了SAM
和DIoU-NMS
,如下:
注意力机制在DL
设计中被广泛采用。在SAM
中,最大值池化和平均池化分别用于输入feature map
,创建两组feature map
。结果被输入到一个卷积层,接着是一个Sigmoid
函数来创建空间注意力。
将空间注意掩模应用于输入特征,输出精细的特征图。
在YOLOv4
中,使用修改后的SAM
而不应用最大值池化和平均池化。
在YOLOv4
中,FPN
概念逐渐被实现/替换为经过修改的SPP
、PAN
和PAN
。
NMS
过滤掉预测相同对象的其他边界框,并保留具有最高可信度的边界框。
DIoU
(前面讨论过的) 被用作非最大值抑制(NMS
)的一个因素。该方法在抑制冗余框的同时,采用IoU
和两个边界盒中心点之间的距离。这使得它在有遮挡的情况下更加健壮。
为了提升准确度,可以针对训练过程进行一些优化,比如数据增强、类别不平衡、成本函数、软标注…… 这些改进不会影响推理速度,可被称为「Bag of freebies
」。另外还有一些改进可称为「bag of specials
」,仅需在推理时间方面做少许牺牲,就能获得优良的性能回报。这类改进包括增大感受野、使用注意力机制、集成跳过连接(skip-connection
)或 FPN
等特性、使用非极大值抑制等后处理方法。
本文从YOLOv4
介绍,YOLOv4
框架原理,BackBone
训练策略,BackBone
推理策略,检测头训练策略,检测头推理策略这几个大方面进行详细的阐述了YOLOv4
中所用到的各种策略,希望对大家有所帮助。