YOLOV4-学习知识梳理

参考文章链接:

https://blog.csdn.net/weixin_41560402/article/details/106119774

https://www.cnblogs.com/wujianming-110117/p/13845974.html

https://blog.csdn.net/c2250645962/article/details/106210730/

https://www.cnblogs.com/learningcaiji/p/14100267.htmlhttps://blog.csdn.net/sinat_34686158/article/details/10585652

1 网络结构图

1.1 详细网络结构

Yolov4的网络结构也可以使用netron工具查看,也是对照其展示的可视化流程图绘制的下方网络结构图。

Yolov4的结构图和Yolov3相比,因为多了CSP结构,PAN结构

1.2 Yolov4的五个基本组件

CBMYolov4网络结构中的最小组件,由Conv+Bn+Mish激活函数三者组成。

CBL由Conv+Bn+Leaky_relu激活函数三者组成。

Res unit借鉴Resnet网络中的残差结构,让网络可以构建的更深。

CSPX借鉴CSPNet网络结构,由卷积层和X个Res unit模块Concate组成。

SPP采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。

Concat张量拼接,维度会扩充,和Yolov3中的解释一样,对应于cfg文件中的route操作。

add张量相加,不会扩充维度,对应于cfg文件中的shortcut操作。

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

(1)输入端:这里指的创新主要是训练时对输入端的改进,主要包括Mosaic数据增强、cmBNSAT自对抗训练

(2)BackBone主干网络:将各种新的方式结合起来,包括:CSPDarknet53Mish激活函数、Dropblock

(3)Neck目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如Yolov4中的SPP模块FPN+PAN结构

(4)Prediction输出层的锚框机制和Yolov3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms

输入端创新:比如数据增强MosaiccmBNSAT自对抗训练。

2 Mosaic数据增强

在Yolo-V4、Yolo-V5中,都有一个很重要的技巧,就是Mosaic数据增强,这种数据增强方式简单来说就是把4张图片,通过随机缩放、随机裁减、随机排布的方式进行拼接。根据论文的说法,优点是丰富了检测物体的背景和小目标,并且在计算Batch Normalization的时候一次会计算四张图片的数据,使得mini-batch大小不需要很大,一个GPU就可以达到比较好的效果。

优点:

(1)丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好

(2)减少GPU:直接计算4张图片的数据,使得Mini-batch大小并不需要很大,一个GPU就可以达到比较好的效果

缺点:

如果我们的数据集本身就有很多的小目标,那么Mosaic数据增强会导致本来较小的目标变得更小,导致模型的泛化能力变差。

效果图如下所示:

3 BackBone创新

3.1 CSPDarknet53

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

每个CSP模块前面的卷积核的大小都是3*3,stride=2,因此可以起到下采样的作用。

因为Backbone有5个CSP模块,输入图像是608*608,所以特征图变化的规律是:608->304->152->76->38->19

经过5次CSP模块后得到19*19大小的特征图。

3.2 CSPNet

跨阶段局部网络(CSPNet)解决以往工作中需要大量推理计算的问题。CSPNet易于实现,并且足够通用,可以处理基于ResNet、ResNeXt和DenseNet的体系结构。

主要的作用:提高CNN的学习能力;减少计算时间;减少内存。

每一个block按照特征图的channel维度拆分成两部分;

一部分正常走网络,一部分直接concat到这个block的输出。

CSPNet结构,即增加一个大的残差边将输入数据和最后的输出数据进行堆叠(concatenate)

按照CSP论文中的思路处理如下:

但实际上,一些源码以及darknet配置文件中的网络参数,得到的结构是这样的:

实际的结构在输入后没有按照通道划分成两个部分,而是直接用两路的1x1卷积将输入特征进行变换。可以理解的是,将全部的输入特征利用两路1x1进行transition,比直接划分通道能够进一步提高特征的重用性,并且在输入到resiudal block之前也确实通道减半,减少了计算量。

3.3Darknet53

Darknet53的结构如下图所示,共有5个大残差块,每个大残差块所包含的小残差单元个数为1、2、8、8、4。

3.4CSPDarknet53

CSPDarknet53是在Darknet53的每个大残差块上加上CSP,对应layer 0~layer 104。

(1)Darknet53分块1加上CSP后的结果,对应layer 0~layer 10。其中,layer [0, 1, 5, 6, 7]与分块1完全一样,而 layer [2, 4, 8, 9, 10]属于CSP部分。

 (2)Darknet53分块2加上CSP后的结果,对应layer 11~layer 23。其中,layer [11, 15~20]对应分块2(注意:残差单元中的3 × 3 3 \times 33×3卷积核的深度改变了,由Darknet53分块2中的128改为64,请看layer 16 和 layer 19),其余 layer属于CSP部分。

(3)Darknet53分块3加上CSP后的结果,对应layer 24~layer 54。其中,layer [24, 27~51]对应分块3(注意:残差单元中的3 × 3 3 \times 33×3卷积核的深度改变了,由Darknet53分块3中的256改为128,请看layer 29等),其余 layer属于CSP部分。

(4)Darknet53分块4加上CSP后的结果,对应layer 55~layer 85。其中,layer [55, 58~82]对应分块4(注意:残差单元中的3 × 3 3 \times 33×3卷积核的深度改变了,由Darknet53分块4中的512改为256,请看layer 60等),其余 layer属于CSP部分。

(5)Darknet53分块5加上CSP后的结果,对应layer 86~layer 104。其中,layer [86, 89~101]对应分块5(注意:残差单元中的3 × 3 3 \times 33×3卷积核的深度改变了,由Darknet53分块5中的1024改为512,请看layer 91等),其余 layer属于CSP部分。

而且作者只在Backbone中采用了Mish激活函数,网络后面仍然采用Leaky_relu激活函数。

CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。

因此Yolov4在主干网络Backbone采用CSPDarknet53网络结构,主要有三个方面的优点:

增强CNN的学习能力,使得在轻量化的同时保持准确性。

降低计算瓶颈

降低内存成本

4 Mish激活函数

Mish激活函数是2019年下半年提出的激活函数和Leaky_relu激活函数的图形对比如下:

5 Dropblock

Yolov4中使用的Dropblock,其实和常见网络中的Dropout功能类似,也是缓解过拟合的一种正则化方式。

Dropblock在2018年提出,论文地址:https://arxiv.org/pdf/1810.12890.pdf

传统的Dropout很简单,一句话就可以说的清:随机删除减少神经元的数量,使网络变得更简单。

Dropblock的研究者与Cutout进行对比验证时,发现有几个特点:

DropBlock是适用于卷积层的正则化方法,它作用的对象的特征图。在DropBlock中,特征在一个个block中,当应用DropBlock时,一个feature map中的连续区域会一起被drop掉。那么模型为了拟合数据网络就不得不往别出看以寻找新的证据。

其中(a)是输入到卷积网络的原始图像,(b)和©中的绿色区域包括激活单元,这些激活单元在输入图像中包含语义信息。随机丢弃激活对删除语义信息无效,因为附近的激活包含紧密相关的信息。 相反,删除连续区域可以删除某些语义信息(例如,头或脚),从而强制其余单元学习用于分类输入图像的其它特征,这样就增加了模型的泛化能力。

Dropblock的效果优于Cutout

Cutout只能作用于输入层,而Dropblock则是将Cutout应用到网络中的每一个特征图上

Dropblock可以定制各种组合,在训练的不同阶段可以修改删减的概率,从空间层面和时间层面,和Cutout相比都有更精细的改进。

Yolov4中直接采用了更优的Dropblock,对网络的正则化过程进行了全面的升级改进。

6 Neck创新

在目标检测领域,为了更好的提取融合特征,通常在Backbone输出层,会插入一些层,这个部分称为Neck。相当于目标检测网络的颈部,也是非常关键的。

Yolov4的Neck结构主要采用了SPP模块FPN+PAN的方式。

6.1 SPP模块

在SPP模块中,使用k={1*1,5*5,9*9,13*13}的最大池化的方式,再将不同尺度的特征图进行Concat操作。最大池化的strides越大,代表更关注全局信息,采用不同strides对输入进行最大池化处理,然后通过concatenate,可以很好的融合全局信息和局部信息 :

注意:这里最大池化采用padding操作,移动的步长为1,比如13×13的输入特征图,使用5×5大小的池化核池化,padding=2,因此池化后的特征图仍然是13×13大小。

6.2 PANet实现

PANet 的论文详见这里https://arxiv.org/pdf/1803.01534.pdf,网络结构如下图所示,与FPN相比,PANet 在UpSample之后又加了DownSample的操作。

PANet上采样对应的layer为layer 105到layer 128。

Yolov4结构 PANet上采样对应的layer为layer 105到layer 128。

6.3 Yolov4 Neck

部分的立体图像,看下两部分是如何通过FPN+PAN结构进行融合的:

注意一:

Yolov3的FPN层输出的三个大小不一的特征图①②③直接进行预测

但Yolov4的FPN层,只使用最后的一个76*76特征图①,而经过两次PAN结构,输出预测的特征图②和③。

这里的不同也体现在cfg文件中,这一点有很多同学之前不太明白,

比如Yolov3.cfg最后的三个Yolo层,

第一个Yolo层是最小的特征图19*19,mask=6,7,8,对应最大的anchor box

第二个Yolo层是中等的特征图38*38,mask=3,4,5,对应中等的anchor box

第三个Yolo层是最大的特征图76*76,mask=0,1,2,对应最小的anchor box

而Yolov4.cfg则恰恰相反

第一个Yolo层是最大的特征图76*76,mask=0,1,2,对应最小的anchor box

第二个Yolo层是中等的特征图38*38,mask=3,4,5,对应中等的anchor box

第三个Yolo层是最小的特征图19*19,mask=6,7,8,对应最大的anchor box

7 CIOU_loss损失函数

目标检测任务的损失函数一般由Classificition Loss(分类损失函数)Bounding Box Regeression Loss(回归损失函数)两部分构成。

Bounding Box Regeression的Loss近些年的发展过程是:Smooth L1 Loss-> IoU Loss2016-> GIoU Loss2019-> DIoU Loss2020->CIoU Loss2020

我们从最常用的IOU_Loss开始,进行对比拆解分析,看下Yolov4为啥要选择CIOU_Loss

a.IOU_Loss

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

问题1即状态1的情况,当预测框和目标框不相交时,IOU=0,无法反应两个框距离的远近,此时损失函数不可导,IOU_Loss无法优化两个框不相交的情况。

问题2即状态2和状态3的情况,当两个预测框大小相同,两个IOU也相同,IOU_Loss无法区分两者相交情况的不同。

GIOU_Loss

右图GIOU_Loss中,增加了相交尺度的衡量方式,缓解了单纯IOU_Loss时的尴尬

因为还存在一种不足

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

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

c.DIOU_Loss

好的目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比。

针对IOU和GIOU存在的问题,作者从两个方面进行考虑

一:如何最小化预测框和目标框之间的归一化距离?

二:如何在预测框和目标框重叠时,回归的更准确?

针对第一个问题,提出了DIOU_Loss(Distance_IOU_Loss)

DIOU_Loss考虑了重叠面积中心点距离,当目标框包裹预测框的时候,直接度量2个框的距离,因此DIOU_Loss收敛的更快。

但就像前面好的目标框回归函数所说的,没有考虑到长宽比。

比如上面三种情况,目标框包裹预测框,本来DIOU_Loss可以起作用。

但预测框的中心点的位置都是一样的,因此按照DIOU_Loss的计算公式,三者的值都是相同的。

针对这个问题,又提出了CIOU_Loss,不对不说,科学总是在解决问题中,不断进步!!

d.CIOU_Loss

CIOU_Loss和DIOU_Loss前面的公式都是一样的,不过在此

基础上还增加了一个影响因子,将预测框和目标框的长宽比都考虑了进去。其中v是衡量长宽比一致性的参数,我们也可以定义为:

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

再来综合的看下各个Loss函数的不同点:

IOU_Loss主要考虑检测框和目标框重叠面积。

GIOU_Loss在IOU的基础上,解决边界框不重合时的问题。

DIOU_Loss在IOU和GIOU的基础上,考虑边界框中心点距离的信息。

CIOU_Loss在DIOU的基础上,考虑边界框宽高比的尺度信息。

Yolov4中采用了CIOU_Loss的回归方式,使得预测框回归的速度和精度更高一些。

2DIOU_nms

Nms主要用于预测框的筛选,常用的目标检测算法中,一般采用普通的nms的方式,Yolov4则借鉴上面D/CIOU loss的论文:https://arxiv.org/pdf/1911.08287.pdf

将其中计算IOU的部分替换成DIOU的方式:

再来看下实际的案例

在重叠目标的检测中,DIOU_nms的效果优于传统的nms

注意:有读者会有疑问,这里为什么不用CIOU_nms,而用DIOU_nms?

答:因为前面讲到的CIOU_loss,是在DIOU_loss的基础上,添加的影响因子,包含groundtruth标注框的信息,在训练时用于回归。

但在测试过程中,并没有groundtruth的信息,不用考虑影响因子,因此直接用DIOU_nms即可。

总体来说,YOLOv4的论文称的上良心之作,将近几年关于深度学习领域最新研究的tricks移植到Yolov4中做验证测试,将Yolov3的精度提高了不少。

虽然没有全新的创新,但很多改进之处都值得借鉴,借用Yolov4作者的总结。

Yolov4 主要带来了 3 点新贡献:

(1)提出了一种高效而强大的目标检测模型,使用 1080Ti 或 2080Ti 就能训练出超快、准确的目标检测器。

(2)在检测器训练过程中,验证了最先进的一些研究成果对目标检测器的影响。

(3)改进了 SOTA 方法,使其更有效、更适合单 GPU 训练。

你可能感兴趣的:(YOLOV4-学习知识梳理)