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
网络。
考虑到几方面的平衡:输入网络分辨率/卷积层数量/参数数量/输出维度。一个模型的分类效果好不见得其检测效果就好,想要检测效果好需要以下几点:
具体改进点:
> 用 Concat 代替 Add,提取更丰富的特征。
之前介绍过 Concat 操作后,特征图的尺寸不变,深度会增加,而 Add 操作后尺寸和深度都不改变,从这个意义上说,用 Concat 代替 Add,就能够提取更丰富的特征。
> 引入 transition layer (1 * 1conv + 2 * 2pooling),提取特征,降低计算量,提升速度。
为什么引入 1 * 1conv,能够降低计算量,提升速度 ?
解答:这里我举一个实例来说明,输入图片大小是 56 * 56 * 256,要求得到输出大小是 28 * 28 * 512,这里就有两种实现方式:
一次卷积方式,它的卷积核参数个数是 117 万;另一种是二次卷积方式,引入了 1 * 1 卷积,它的卷积核参数个数是 62 万,
相比于一次卷积方式,它的卷积核参数个数降低了一倍。
> 将 Base layer 分为两部分进行融合,提取更丰富的特征。
将 Base layer 一分为二,一部分通过类似残差网络得到的输出与另一部分进行 Concat 操作,将操作后的结果通过 Transition Layer。
这样最终的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
dropout 作用:防止过拟合,
dropout 缺点:每次训练时随机去掉的神经元可以通过相邻的神经元来预测,因为随着网络层数的增加,神经元之间的相关性是越来越强。
dropblock:每次训练时随机去掉一整片区域,这样就能组合更多不一样的网络,从而表现出更好的泛化作用。
对于分类问题,特别是多分类问题,常常把向量转换成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
可以在不同数据集的许多深度网络中胜过它们。公式如下:
y=x∗tanh(ln(1+ex))
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
算法是使用最广泛的算法,大部分的检测算法都是使用的这个算法。
LIoU=1−|B∩Bgt||B∪Bgt|
GIoU
考虑到,当检测框和真实框没有出现重叠的时候IoU
的loss
都是一样的,因此GIoU
就加入了C
检测框(C
检测框是包含了检测框和真实框的最小矩形框),这样就可以解决检测框和真实框没有重叠的问题。但是当检测框和真实框之间出现包含的现象的时候GIoU
就和IoU loss
是同样的效果了。
LGIoU=1−IoU+|C−B∪Bgt||C|
其中,C
是指能包含predict box
和Ground Truth box
的最小box
。
DIoU
考虑到GIoU
的缺点,也是增加了C
检测框,将真实框和预测框都包含了进来,但是DIoU
计算的不是框之间的交并,而是计算的每个检测框之间的欧氏距离,这样就可以解决GIoU
包含出现的问题。
LDIoU=1−IoU+ρ2(b,bgt)c2
其中
ρ2
是指predict box
和GT box
中心点的距离的平方,而
c2
是指刚好能包含predict box
和GT box
的最小box
的对角线长度平方。
CIoU
就是在DIoU
的基础上增加了检测框尺度的loss
,增加了长和宽的loss
,这样预测框就会更加的符合真实框。
LDIoU=1−IoU+ρ2(bb,bbgt)c2+αv
实际上,CIOU
只是在DIOU
基础上增加了一项
αv
。 其中:
α=v(1−IoU)+vv=4π2(arctanwgthgt−arctanwh)2
用 CIoU Loss 取代 Iou Loss
IoU loss 中 IoU 交并比,两个框的交集/并集,有两个缺点:
> 无法反应两个的距离
例如 状态 1,两个框不相交,无论怎样移动两个框,IoU = 0。
> 无法区分两者相交的情况
例如 状态 2 和 3,两个框相交的情况完全不一样,但是 IoU 相同。
CIoU Loss 的思想:第一步,在两个框最外层再画一个最小的矩形框,求出这个框的对角线的距离,这个距离就能衡量两个框的距离;
第二步,求出两个框中心点的欧式距离,这欧式距离就能衡量两者的相交情况。
CIoU Loss 数学表达式如上,它能有效的解决 IoU Loss 存在的问题。
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
的计算方式为:
对于
bx=cx
和
bx=cx+1
的情况,我们需要
tx
分别具有很大的负值和正值。但我们可以将
σ
与一个比例因子(>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
中所用到的各种策略,希望对大家有所帮助。