YOLOV4简介

网络结构图


Yolov4的结构和Yolov3相比,多了CSP结构,PAN结构。
Yolov4的5个基本组件:

1.CBM: Yolov4网络结构中最小的组件,由Conv+Bn+Mish激活函数三者组成
2.CBL:由Conv+Bn+Leaky_relu激活函数三者组成。
3.Res unit: 借鉴Resnet网络中的残差结构,让网络可以构建的更深。
4.CSPX:借鉴CSPNet网络结构,由三个卷积层和 X个Res unit模块Concate组成。
5.SPP: 采用1x1,5x5,9x9,13x13的最大池化的方式,进行多尺度融合。

其他基础操作:

1.Concat: 张量拼接,维度会扩充。
2.Add:张量相加,不会扩充维度。

便于分析,将Yolov4 的整体结构拆分四大板块:


(1)输入端:训练时对输入端的改进,主要包括Mosaic数据增强,cmBN,SAT自对抗训练。
(2)BackBone主干网络:将各种新的方式结合起来,包括:CSPDarknet53,Mish激活函数,Dropblock。
(3)Neck:目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如Yolov4的SPP模块,FPN+PAN结构。
(4)Prediction:输出层的锚框机制和Yolov3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms。

输入端的创新

(1)Mosaic数据增强。
Yolov4中使用的Mosaic是参考2019年提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放,随机裁剪,随机排布的方式进行拼接。


优点:

丰富数据集:随机使用4张图片,随机缩放,在随机分布进行拼接,大大丰富了检测数据集。特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。
减少GPU:可能会有人说,随机缩放,普通的数据增强也可以做,但作者考虑到很多人可能只有一个GPU。
因此Mosaic增强训练时,可以直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果。
此外,发现另一研究者的训练方式也值得借鉴,采用的数据增强和Mosaic比较类似,也是使用4张图片(不是随机分布),但训练计算loss时,采用“缺啥补啥”的思路:
如果上一个iteration中,小物体产生的loss不足(比如小于某一个阈值),则下一个iteration就用拼接图;否则就用正常图片训练。

BackBone创新

(1)CSPDarknet53
CSPDarknet53是在Yolov3主干网络Darknet53的基础上,借鉴2019年的CSPNet的经验,产生的Backbone结构,其中包含了5个CSP模块。


Backbone中卷积层的数量:

每个CSPX中包含3+2 × X个卷积层,因此整个主干网络Backbone中一共包含
2+(3+2×1)+2+(3+2×2)+2+(3+2×8)+2+(3+2×8)+2+(3+2×4)+1=72。

每个CSP模块前面的卷积核大小都是3x3,步长为2,因此可以起到下采样的作用。
因为Backbone有5个CSP模块,输入图像是608 x 608,所以特征图的变化规律是:608->304->152->76->38->19
经过5次CSP模块后得到19*19大小的特征图。
而且作者只在Backbone中采用Mish激活函数,网络后面任然采用Leaky_relu激活函数。


Mish激活函数
Mish=x * tanh(ln(1+e^x))
pytorch实现

CSPNet的作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。
因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将他们合并,在减少计算量的同时可以保证准确率。
因此Yolov4在主干网络Backbone采用CSPDarknet53网络结构,主要是有三个方面的优点:

1.增强CNN的学习能力,使得在轻量化的同时保持准确性。
2.降低计算瓶颈。
3.降低内存成本。

Dropblock

Yolov4中使用的Dropblock,其实和常见网络中的Dropout功能类似,也是一种缓解过拟合的一种正则化方式。
传统的Dropout很简单:随机删除减少神经元的数量,使网络变得更简单。


Dropblock和Dropout相似,比如下图:

中间Dropout的方式会随机的删减丢弃一些信息,但Dropblock的研究者认为,卷积层对于这种随机丢弃并不敏感。因为卷积层通常是三层连用:卷积+激活+池化层,池化层本身就是对相邻单元起作用。
而且即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息。因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。
所以右图Dropblock则干脆整个局部区域进行删减丢弃。

这种方式其实是借鉴2017年的Cutout数据增强的方式,cutout是将输入图像的部分区域清零,而Dropblock则是将Cutout应用到每一个特征图。而且并不是用固定的归零比率,而是在训练时以一个小的比率开始,随着训练过程线性的增加这个比率。


DropblockCutout数据增强对训练效果进行对比验证时,发现几个优点:

1.Dropblock的效果优于Cutout。
2.cutout只能作用于输入层,而Dropblock则是将Cutout应用到网络中的每一个特征图上。
3.Dropblock可以定制各种组合,在训练的不同阶段可以修改删减的概率,从空间层面和时间层面,和cutout相比都有更精细的改进。

Neck创新

在目标检测领域,为了更好的提取融合特征,通常在Backbone和输出层,会插入一些层,这个部分称为Neck。
Yolov4的Neck结构主要采用了SPP模块,FPN+PAN的方式。
(1)SPP模块
SPP模块在Backbone的主干网络之后:


作者在SPP模块中,使用k={1x1,5x5,9x9,13x13}的最大池化的方式,再将不同尺度的特征图进行Concat操作。
注意:这里最大池化层采用padding操作,移动的步长为1,比如13x13的输入特征图,使用5x5大小的池化核池化,padding=2,因此池化后的特征图任然是13x13大小。

(2)FPN+PAN
PAN结构是借鉴2018年图像分割领域PANet的创新点
看下Yolov3和Yolov4中是如何设计的。

Yolov3各个网络结构

可以看到经过几次下采样,三个紫色箭头指向的地方,输出分别是76x76,38x38,19x19。
以及最后的Prediction中用于预测的三个特征图①19×19×255、②38×38×255、③76×76×255 [注:255表示80类别(1+4+80)x3=255]
我们将Neck部分用立体图画出来,更直观的看下两部分之间是如何通过FPN结构融合的。

如图所示,FPN是自顶向下的,将高层的特征信息通过上采样的方式进行传递融合,得到进行预测的特征图。
Yolov4各个网络结构
而Yolov4中Neck这部分处了使用FPN外,还在此基础上使用了PAN结构。

前面CSPDarknet53中讲到,每个CSP模块前面的卷积核都是3x3大小,想当于下采样操作。
因此可以看到三个紫色箭头处的特征图是76x76,38x38,19x19。
以及最后Prediction中用于预测的三个特征图:①76×76×255,②38×38×255,③19×19×255。
我们也看下Neck部分的立体图像,看下两部分是如何通过FPN+PAN结构进行融合的。


和Yolov3的FPN层不同,Yolov4在FPN层的后面还添加了一个自底向上的特征金字塔。
其中包含两个PAN结构。
这样结合操作,FPN层自顶向下传达强语义特征,而特征金字塔则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行特征聚合

不过这里需要注意几点:
注意一:

Yolov3的FPN层输出的三个大小不一的特征图①②③直接进行预测。
但Yolov4的FPN层,只使用最后的一个76x76的特征图①,而经过两次PAN结构,输出预测的特征图②和③。

注意二:

原本的PANet网络的PAN结构中,两个特征图结合是采用shortcut操作,而Yolov4中则采用concat 操作,特征图融合后的尺寸发生了变化。


Prediction创新

(1)CIOU_loss
目标检测任务的损失函数一般由Classificition Loss(分类损失函数)和Bounding Box Regeression Loss(回归损失函数)两部分构成。
Bounding Box Regeression的Loss近些年的发展过程是:Smooth L1 Loss-> IoU Loss(2016)-> GIoU Loss(2019)-> DIoU Loss(2020)->CIoU Loss(2020)
从最常用的IOU_Loss开始,进行对比拆解分析,看下Yolov4为啥要选择CIOU_Loss

-------------------------------------------------------IOU_loss------------------------------


可以看到IOU的loss其实很简单,主要是交集/并集,但其实也存在两个问题。

问题一:即状态1的情况,当预测框和目标框不相交时,IOU=0,无法反应两个框距离的远近,此时损失函数不可导,IOU_Loss无法优化两个框不相交的情况。
问题二:即状态2和状态3的情况,当两个预测框大小相同,两个IOU也相同,IOU_Loss无法区分两者相交情况的不同。
因此2019年出现了GIOU_Loss来进行改进。

-------------------------------------------------------GIOU-------------------------------------

GIOU指的是假设现在有两个任意的bbox A和B,我们要找到一个最小的封闭形状C,让C可以将A和B包围在里面,然后我们计算C中没有覆盖A和B的面积占C总面积的比例,然后用A和B的IOU值减去这个比值。


看到上图的GIOU_loss中,增加了相交尺度的衡量方式,缓解了单纯IOU_Loss时的尴尬。
但为什么仅仅说缓解呢?因为还存在一种不足:


问题: 状态1、2、3都是预测框在目标框内部且预测框大小一致的情况,这时预测框和目标框的差集都是相同的,因此这三种状态的GIOU值也都是相同的,这时GIOU退化成了IOU,无法区分相对位置关系。

基于这个问题,2020年的AAAI又提出了DIOU_Loss

------------------------------------------------DIOU_Loss------------------------------------------------------------

好的目标框回归函数应该考虑三个重要的几何因素:重叠面积,中心点距离,长宽比。
针对IOU和GIOU存在的问题,作者从两个方面进行考虑
一:如何最小化预测框和目标框之间的归一化距离?
二:如何在预测框和目标框重叠时,回归的更准确?
针对第一个问题,作者提出了DIOU_Loss


DIOU_Loss考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量2个框的距离,因此DIOU_Loss收敛的更快。
但就像前面好的目标框回归函数说所的,这时并没考虑到长宽比。

问题:比如上面三种状态,目标框包裹预测框,本来DIOU_Loss可以起作用。
但预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。
针对这个问题,又提出了CIOU_Loss

-----------------------------------------------------------CIOU_Loss-----------------------------------------------------

CIOU_LossDIOU_Loss前面的公式都是一样的,不过在此基础上还增加了一个影响因子,将预测框和目标框的长宽比都考虑了进去。


其中v是衡量长宽比一致性的参数,我们也可以定义为:

这样CIOU_Loss就将目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比全都考虑进去了。
再来综合的看下各个Loss函数的不同点:

IOU_Loss:主要考虑检测框和目标框重叠面积。
GIOU_Loss:在IOU的基础上,解决了边界框不重合的问题。
DIOU_Loss: 在IOU和GIOU的基础上,考虑了边界框中心点距离的信息。
CLOU_Loss: 在DIOU的基础上,考虑边界框宽高比的尺度信息。

DIOU_nms

nms主要用于预测框的筛选,YOLOV4将其中计算IOU的部分替换成DIOU的方式

在上图重叠的摩托车检测中,中间的摩托车因为考虑边界框中心点的位置信息,也可以回归出来。
因此在重叠目标的检测中,DIOU_nms的效果优于传统的nms。

注意:为什么不用CIOU_nms,而用DIOU_nms?
因为前面讲到的CIOU_loss,实在DIOU_loss的基础上,添加的影响因子,包含groundtruth标注框的信息,在训练时用于回归。
但在测试过程中,并没有groundtruth的信息,不用考虑影响因子,因此直接用DIOU_nms即可。

你可能感兴趣的:(YOLOV4简介)