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 训练。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容