YOLOv4 = CSPDarknet53+SPP+PAN+YOLOv3
和YOLO V3对比,主要做了以下改变:
- 相较于YOLO V3的DarkNet53,YOLO V4用了CSPDarkNet53
- 相较于YOLO V3的FPN,YOLO V4用了SPP+PAN
- 马赛克(Mosaic)数据增强
- DropBlock正则化
- 用于backbone的BoF:Mosaic数据增强,DropBlock正则化,Class label smoothing
- 用于backbone的BoS:Mish激活函数,CSP(Cross Stage Partial Network)
- 用于检测器的BoF:CIoU-loss,CmBN,DropBlock正则化,Mosaic数据增强,Self-Adversarial 训练,消除网格敏感性,Cosine annealing scheduler(余弦退火调度器),Random training shapes(随机训练形状,对数据图像进行预处理)
- 用于检测器的Bos:Mish激活函数,SPP,SAM(注意力模块),PAN,DIoU-NMS
输入端:在模型训练阶段,做了一些改进操作,主要包括Mosaic数据增强、cmBN、SAT自对抗训练;
通常包含一个图像预处理阶段,即将输入图像缩放到网络的输入大小,并进行归一化等操作。在网络训练阶段,YOLOv4使用Mosaic数据增强操作提升了模型的训练速度和网络的精度;利用cmBN及SAT自对抗训练来提升网络的泛化性能;
BackBone基准网络:融合其它检测算法中的一些新思路,主要包括:CSPDarknet53、Mish激活函数、Dropblock;
Neck中间层:目标检测网络在BackBone与最后的Head输出层之间往往会插入一些层,Yolov4中添加了SPP模块、FPN+PAN结构;
Neck网络-Neck网络通常位于基准网络和头网络的中间位置,利用它可以进一步提升特征的多样性及鲁棒性。YOLOv4利用SPP模块来融合不同尺度大小的特征图;利用自顶向下的FPN特征金字塔于自底向上的PAN特征金字塔来提升网络的特征提取能力。
Head输出层:输出层的锚框机制与YOLOv3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的DIOU_nms。
Head输出端-Head用来完成目标检测结果的输出。针对不同的检测算法,输出端的分支个数不尽相同,通常包含一个分类分支和一个回归分支。YOLOv4利用CIOU_Loss来代替Smooth L1 Loss函数,并利用DIOU_nms来代替传统的NMS操作,从而进一步提升算法的检测精度。
1.Mish激活函数
该激活函数是在2019年提出的,该函数是在Leaky_relu算法的基础上改进而来的,具体的比较请看下图。
YOLOv4的Backbone中均使用了Mish激活函数,而后面的Neck网络中则使用了leaky_relu激活函数。总而言之,Mish函数更加平滑一些,可以进一步提升模型的精度。
Self-Adversarial 训练
自对抗训练(SAT)也是一种新的数据增强方法,它包括两个阶段。第一个阶段中,神经网络更改原始图像;第二阶段中,训练神经网络以正常方式在修改后的图像上执行目标检测任务。
-
初始化分类器模型:首先,需要初始化一个分类器模型,如卷积神经网络(CNN)。
-
原始样本分类:使用原始样本对分类器进行训练,并计算训练样本的损失值。
-
对抗性样本生成和分类:对原始样本进行对抗性样本生成算法生成对抗性样本,并将其输入到分类器中。计算对抗性样本的损失值。
-
更新分类器参数:根据原始样本和对抗性样本的损失值,使用反向传播算法更新分类器的参数。
-
重复迭代:重复执行步骤2至步骤4,多次迭代训练分类器。每次迭代,都会生成新的对抗性样本并更新分类器参数,以提升分类器的鲁棒性和泛化能力。
分类器能够学习到对不同类型的样本具有更强的鲁棒性和泛化能力。
和对抗神经网络有点不一样,这是通过往原数据中加入噪点实现的。
然后原数据生成扰动数据
Random Training Shapes
为了减小过拟合,在训练过程中每隔多少个epoch就随机的{320, 352, 384, 416, 448, 480, 512, 544, 576, 608}中选择一个新的图片分辨率。
Cosine annealing scheduler
使得学习率按照周期变化,在一个周期内先下降,后上升。
Weighted-Residual-Connections (WRC)
Weighted-Residual可以更好更快的结合不同层传递过来的残差,虽然增加了一些计算量,但是当网络层数从100+增加到1000+时,网络效果更好,收敛速度更快。
WRC的更新公式如下:
Y = X + α * Residual
其中,Y代表输出,X代表网络的输入,Residual代表残差,α为可学习的权重系数。
WRC的优点包括:
- 提升了网络的表示能力:权重系数α可以自适应地控制残差的流动,使得网络能够更好地适应不同样本及问题特征的变化。
- 增强了网络的表达能力:动态调节权重系数可以使网络更有针对性地关注重要的特征和任务,有助于提高模型的性能和泛化能力。
然而,使用WRC也需要注意以下事项:
- 权重系数α的引入增加了额外的参数,需要充分训练来优化这些参数。
- 选择适当的权重系数调整方法非常关键,需要仔细权衡模型的复杂性和训练的效率。
CmBN(Conditional Batch Normalization)
是一种改进的批归一化(Batch Normalization,简称BN)方法,用于深度神经网络中。它在传统的BN基础上引入了条件依赖,允许网络对输入数据的不同条件进行适应和调整归一化。
假设我们有一个数据集,其中包含了两个类别(猫和狗)和两种样式(实际照片和卡通图像)。使用传统的批归一化方法,无法考虑到不同类别和样式的数据在分布上的差异。而通过使用CmBN,我们可以将类别标签和样式编码作为条件信息,并根据这些信息动态地调整归一化的结果,使得模型对不同类别和样式的图像具有更好的适应性和泛化能力。
这是一个简化的例子来说明CmBN的作用。在实际应用中,CmBN可以适用于更复杂的场景和任务,通过引入适当的条件信息,使得模型能够根据不同的条件动态地调整归一化策略,提高性能和鲁棒性。
传统的批归一化方法(BN)在训练过程中对每个小批量数据进行归一化,通过减去均值并除以方差,以使得输入数据在每个批次的范围内保持稳定。这样的归一化过程对于训练过程中充分使用批次信息而言是有效的,但在测试或实际部署时,针对不同条件(如不同类别、样式、光照等)的数据可能无法得到最佳的归一化效果。
CmBN为了解决这个问题,引入了额外的条件信息来依赖性地调整归一化的效果。这个条件信息可以是类别标签、样式编码或其他与任务或数据相关的辅助信息。通过将这个条件信息与BN的均值和方差估计进行结合,CmBN可以动态地缩放和偏移归一化的结果,以适应不同条件下的数据分布。
(这是BN的组成)
具体来说,CmBN的计算过程如下所示:
1. 对于每个批次的输入数据,计算基本的批归一化结果,得到归一化后的特征。
2. 使用额外的条件信息,计算对应的缩放因子和偏移量,以便自适应地调整归一化结果。
3. 将缩放因子和偏移量应用于归一化后的特征,得到最终的CmBN结果。
CmBN的优点包括:
- 对不同条件下的数据具有较好的适应性和可调性,提高模型在不同任务、样式、光照等条件下的性能。
- 引入的条件信息可以通过学习得到,使得模型能够自动地学习和调整归一化策略。
然而,使用CmBN也需要注意以下事项:
- 需要额外的条件信息,这可能需要一些预处理或额外的计算开销。
- 需要适当的设计和选择条件信息,以确保其与任务和数据的关联性。
总之,CmBN是一种在批归一化基础上引入条件依赖的归一化方法。它通过结合额外的条件信息,使得归一化能够动态地适应不同条件下的数据分布,提高了模型的适应性和性能。在特定的任务和数据场景下,CmBN可能会带来更好的效果,但也需要根据具体情况进行实验和调整。
2. BackBone:CSPDarknet53 (backbone)
CSP(Cross-stage partial connections)的darknet53,而是没有选择在imagenet上跑分更高的CSPResNext50
和左图所理解不同的是,实际的结构(右图)在输入后没有按照通道划分成两个部分,而是直接用两路的1x1卷积将输入特征进行变换。
可以理解的是,将全部的输入特征利用两路1x1进行transition,比直接划分通道能够进一步提高特征的重用性,并且在输入到resiudal block之前也确实通道减半,减少了计算量。虽然不知道这是否吻合CSP最初始的思想,但是其效果肯定是比我设想的那种情况更好的。
把数据利用的更充分了,而且也确实使最后输出的结果通道减半了。
CSPDarknet53-它是在YOLOv3主干网络Darknet53的基础上,借鉴了2019年发表的CSPNet算法的经验,所形成的一种Backbone结构,其中包含了5个CSP模块。
CSP模块可以先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并起来,这样不仅减少了计算量,而且可以保证模型的准确率。它的优点包括:
(1)增强CNN网络的学习能力,轻量化模型的同时保持模型的精度;
(2)降低整个模型的计算瓶颈;
(3)降低算法的内存成本。
CBM是Yolov4网络结构中的最小组件,由Conv+BN+Mish激活函数组成,如上图中模块1所示。
CBL模块由Conv+BN+Leaky_relu激活函数组成,如上图中的模块2所示。
Res unit-借鉴ResNet网络中的残差结构,用来构建深层网络,CBM是残差模块中的子模块,如上图中的模块3所示。
CSPX-借鉴CSPNet网络结构,由卷积层和X个Res unint模块Concate组成而成,如上图中的模块4所示。
SPP-采用1×1、5×5、9×9和13×13的最大池化方式,进行多尺度特征融合,如上图中的模块5所示。
SPP模块与FPN+PAN(neck)
为了获得更鲁棒的特征表示,通常会在基准网络和输出层之间插入一些层 。YOLOv4的主要添加了SPP模块与FPN+PAN2种方式。
SPP模块-SPP模块通过融合不同大小的最大池化层来获得鲁棒的特征表示,YOLOv4中的k={1*1,5*5,9*9,13*13}包含这4种形式。这里的最大池化层采用padding操作,移动步长为1,比如输入特征图的大小为13x13,使用的池化核大小为5x5,padding=2,因此池化后的特征图大小仍然是13×13。YOLOv4论文表明:
(1)与单纯的使用k*k最大池化的方式相比,采用SPP模块的方式能够更有效的增加主干特征的接收范围,显著的分离了最重要的上下文特征。
(2)在COCO目标检测任务中,当输入图片的大小为608*608时,只需要额外花费0.5%的计算代价就可以将AP50提升2.7%,因此YOLOv4算法中也采用了SPP模块。
FPN+PAN-所谓的FPN,即特征金字塔网络,通过在特征图上面构建金字塔,可以更好的解决目标检测中尺度问题。PAN则是借鉴了图像分割领域PANet算法中的创新点,它是一种自底向上的结构,它在FPN的基础上增加了两个PAN结构,如下图中的2和3所示。
(1)整个网络的输入图像大小为608*608;然后经过CSP块之后生成一个76*76大小的特征映射,经过下采样操作之后生成38*38的特征映射,经过下采样操作之后生成19*19的特征映射;
(2)接着将其传入FPN结构中,依次对19*19、38*38、76*76执行融合操作,即先对比较小的特征映射层执行上采样操作,将其调整成相同大小,然后将两个同等大小的特征映射叠加起来。通过FPN操作可以将19*19大小的特征映射调整为76*76大小,这样不仅提升了特征映射的大小,可以更好的解决检测中尺度问题,而且增加了网络的深度,提升了网络的鲁棒性。
(3)接着将其传入PAN结构中,PANet网络的PAN结构是将两个相同大小的特征映射执行按位加操作,YOLOv4中使用Concat操作来代替它。经过两个PAN结构,我们将76*76大小的特征映射重新调整为19*19大小,这样可以在一定程度上提升该算法的目标定位能力。FPN层自顶向下可以捕获强语义特征,而PAF则通过自底向上传达强定位特征,通过组合这两个模块,可以很好的完成目标定位的功能。
Dropblock
Dropblock是一种解决模型过拟合的正则化方法,它的作用与Dropout基本相同。
Dropout的主要思路是随机的使网络中的一些神经元失活,从而形成一个新的网络。如下图所示,最左边表示原始的输入图片,中间表示经过Dropout操作之后的结果,它使得图像中的一些位置随机失活。
Dropblock的作者认为:由于卷积层通常是三层结构,即卷积+激活+池化层,池化层本身就是对相邻单元起作用,因而卷积层对于这种随机丢弃并不敏感。除此之外,即使是随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息。因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。最右边表示经过Dropblock操作之后的结果,我们可以发现该操作直接对整个局部区域进行失活(连续的几个位置)。
Dropblock是在Cutout数据增强方式的基础上改进而来的,Cutout的主要思路是将输入图像的部分区域清零,而Dropblock的创新点则是将Cutout应用到每一个特征图上面。而且并不是用固定的归零比率,而是在训练时以一个小的比率开始,随着训练过程线性的增加这个比率。与Cutout相比,Dropblck主要具有以下的优点:
(1)实验效果表明Dropblock的效果优于Cutout;
(2)Cutout只能应用到输入层,而Dropblock则是将Cutout应用到网络中的每一个特征图上面;
(3)Dropblock可以定制各种组合,在训练的不同阶段可以灵活的修改删减的概率,不管是从空间层面还是从时间层面来讲,Dropblock更优一些。
Mosaic数据增强
YOLOv4中在训练模型阶段使用了Mosaic数据增强方法,该算法是在CutMix数据增强方法的基础上改进而来的。CutMix仅仅利用了两张图片进行拼接,而Mosaic数据增强方法则采用了4张图片,并且按照随机缩放、随机裁剪和随机排布的方式进行拼接而成,具体的效果如下图所示。这种增强方法可以将几张图片组合成一张,这样不仅可以丰富数据集的同时极大的提升网络的训练速度,而且可以降低模型的内存需求。
损失函数CIOU_loss
MSE损失函数将检测框中心点坐标和宽高等信息作为独立的变量对待的,但是实际上他们之间是有关系的。从直观上来说,框的中心点和宽高的确存在着一定的关系。所以解决方法是使用IOU损失代替MSE损失。
可以看出,前两行就是用在bounding box regression的对位置x,y的损失函数(采用了BCE),第三行就是对宽高w,h的损失函数(采用了MSE)。
YOLO V4相较于YOLO V3,只在bounding box regression做了创新,用CIOU代替了MSE,其他两个部分没有做实质改变。
目标检测任务的损失函数一般由分类损失函数和回归损失函数两部分构成,回归损失函数的发展过程主要包括:最原始的Smooth L1 Loss函数、2016年提出的IoU Loss、2019年提出的GIoU Loss、2020年提出的DIoU Loss和最新的CIoU Loss函数。
1、IoU Loss-所谓的IoU Loss,即预测框与GT框之间的交集/预测框与GT框之间的并集。这种损失会存在一些问题,具体的问题如下图所示,
(1)如状态1所示,当预测框和GT框不相交时,即IOU=0,此时无法反映两个框之间的距离,此时该 损失函数不可导,即IOU_Loss无法优化两个框不相交的情况。
(2)如状态2与状态3所示,当两个预测框大小相同时,那么这两个IOU也相同,IOU_Loss无法区分两者相交这种情况。
2、GIOU_Loss-为了解决以上的问题,GIOU损失应运而生。GIOU_Loss中增加了相交尺度的衡量方式,缓解了单纯IOU_Loss时存在的一些问题。
让损失变小是目的,所以要让这多的一项趋0才好。即差集越小越好,C是最大的那个框
但是这种方法并不能完全解决这种问题,仍然存在着其它的问题。具体的问题如下所示,状态1、2、3都是预测框在GT框内部且预测框大小一致的情况,这时预测框和GT框的差集都是相同的,因此这三种状态的GIOU值也都是相同的,这时GIOU退化成了IOU,无法区分相对位置关系
3、DIOU_Loss-针对IOU和GIOU损失所存在的问题,DIOU为了解决如何最小化预测框和GT框之间的归一化距离这个问题,DIOU_Loss考虑了预测框与GT框的重叠面积和中心点距离,当GT框包裹预测框的时候,直接度量2个框的距离,因此DIOU_Loss的收敛速度更快一些。
把差集变成了两个中心点之间的距离和最大框对角线距离的比
如下图所示,当GT框包裹预测框时,此时预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。为了解决这个问题,CIOU_Loss应运而生。
4、CIOU_Loss-CIOU_Loss在DIOU_Loss的基础上增加了一个影响因子,将预测框和GT框的长宽比也考虑了进来。具体的计算方法如下式所示,即CIOU_Loss将GT框的重叠面积、中心点距离和
长宽比全都考虑进来了。
又多了一项:高宽角度差距的平方,最大是(pi/2)^2,配个系数使结果限制在(0,1)之间
即,和GD框差距越大,损失越大。
总而言之,IOU_Loss主要考虑了检测框和GT框之间的重叠面积;
GIOU_Loss在IOU的基础上,解决边界框不重合时出现的问题;
DIOU_Loss在IOU和GIOU的基础上,同时考虑了边界框中心点距离信息;
CIOU_Loss在DIOU的基础上,又考虑了边界框宽高比的尺度信息。
DIOU_NMS-如下图所示,对于重叠的摩托车检测任务而言,传统的NMS操作会遗漏掉一些中间的摩托车;
由于DIOU_NMS考虑到边界框中心点的位置信息,因而得到了更准确的检测结果,适合处理密集场景下的目标检测问题。