AI入门基础笔记- 5.4:YOLOv4算法的原理及实现(上)

2023-04-24  本文已影响0人  薛东弗斯

2018  Yolov3

2020,Yolo作者发布声明,放弃更新Yolo算法,就在大家都以为再也没有yolo更新之后,俄罗斯的Alexey扛起了Yolov4的大旗,并获得了Yolov3作者的认可

Yolov3网络结构分为4部分。

 第一部分是网络输入部分,416*416*3 大小;

第二部分是主干网络,用于提取图像的网络结构特征。每个RES中因为第一个卷积层步长为2,所以具有下采样的作用。所以可以看到主干网络中经过每个Res网络结构特征图矩阵的变化。比如经过第一个Res1,输入416*416 矩阵大小,经过Res1,长宽都减少一半;经过Res2,长宽又减半;经过Res8,长宽减半;经过Res4,长宽又减半。

第三部分时Neck结构,将主干网络提取的结构进一步如何

第四部分,输出层。 Yolov3 最后输出是3个特侦图。 最后的255,表示80个类别。 (1+4+80)*3=255

YoloV4 多了Mish激活函数,我们把这种卷积层定义为CBM。 下面的残差结构与Yolov3相同。不过其中的卷积层不是CBL方式,而是CBM

此外还多了CSP结构。主要分成2个分支,上面的分支有2个CBM卷积层和X个残差组件构成;下面的分支只有一个CBM卷积层;两个分支传到最后,通过concat结构组合起来,这样就构成了CSP结构

此外还有SPP模块。

Yolov4相比较Yolov3多了几个基础组件,但原理上其实与Yolov3相同。

我们也可以划分成4个部分。

第一部分输入端

第二部分 Backbone。 这里每个CSP前面的卷积层与Yolov3中是一样的,都是步长为2,具有下采样的效果。所以经过第一个下采样卷积以及CSP1结构,可以得到208*208的特征图矩阵;再经过第二个下采样卷积以及CSP2结构,可以得到104*104的特征图矩阵;第三个下采样卷积以及CSP8结构,可以得到52*52的特征图矩阵;第四个下采样卷积以及CSP8结构,可以得到26*26的特征图矩阵;第五个下采样卷积以及CSP4结构,可以得到13*13的特征图矩阵; 这5种特征图中,52*52、26*26、13*13 与最后的3个输出层息息相关,所以重点关注52*52、26*26、13*13这三个部分。

第三部分,就是Neck层。与Yolov3只有FPN结构不同,Yolov4中首先多了SPP模块,此外对FPN结构也进行了改进,增加了两个PAN结构。

第四部分,输出层也是锚框机制,与Yolov3类似。只是其中损失函数与后处理过程与Yolov3稍有不同

Yolov4创新点

1. 训练模型的很多人拥有的GPU数量并不是很多,为了使得再单张GPU上也有不错的效果,因此从输入端进行了改进,比如从数据的角度增加了Mosaic数据增强。从减少内存的角度,增加了cross mini-batch normalization,即cmBN的方式,又从训练的角度增加了SAT子对抗训练的方式。但感觉cmBN和SAT子对抗训练的方式,影响并不是很大。

2. Backbone主干网络中也有很多创新的方式。比如在原本YOLOv3的基础上,采用了CSPDarknet结构,而且在主干网络的所有卷积层中,激活函数都没有采用Leakyrelu的方式,而是采用了Mish激活函数。此外还增加了dropblock方式

3. 在主干网络提取出图像特征之后,和最后的输出层之间,往往会加上一些层,比如Neck结构。Yolov3中主要是FPN结构,而在Yolov4的Neck中一方面增加了SPP模块,另一方面在FPN的基础上,借鉴PANet结构的方式采用的FPN加上了PAN的结构,通过这样的方式让网络的特征更好的融合

4.最后的输出层所采用的锚框机制与Yolov3相同,主要改进的是训练时目标框的损失函数,CIOU_Loss,以及在后处理中,预测框筛选的Nms,变成了DIOU_nms。总体而言,Yolov4对Yolov3的各个部分,都进行了改进。

FPS:每秒可以处理图片的数量

AP:平均精度

上图各种算法比较是基于COCO数据集。 现在目标检测激活都是在这个数据集上进行对比验证。上图红线,同样FPS,对应Yolov4的精度相对于Yolov3 提升近似10个百分点。

通过数据增强可以提升数据集规模,提升精度,减少过拟合。

比如随机选择4张图片,2019年提出的CutMix数据增强,是将两张图片进行拼接,其中一张图片随机缩放,拼接到另一张图片上。如过做目标检测,会根据两者原本标注的信息,计算出拼接后的标注位置。比如中间图片上两个人体的位置信息。

Yolov4中采用的Mosaic数据增强,则更进一步改进。使用4张随机的图片随机缩放,随机裁剪,随机排布,使用这样的方式进行拼接,大大增加了数据的丰富性。比如右图四个人体的位置信息。

为什么要采用这种方式进行数据增强?

首先,很多目标检测算法评比效果,都是在COCO数据集上进行的,但是Coco数据集存在一个问题,就是小目标、中目标、大目标的分布不均衡。 

小目标、中目标、大目标是如何界定的?在2019年发布的论文中对这三者进行了区分,主要是通过目标框的大小来进行界定,比如小目标,长宽是0*0 - 32*32像素之间;中目标32*32 - 96*96 像素之间;大目标96*96像素以上。

在目标检测中,小目标的准确性比中目标、大目标低很多。 大一些的目标更容易被学习与检测。 COCO数据集就存在三种图片不均衡的情况。

COCO数据集,在所有的目标框中小目标占比最高,达到41.4%,比中目标和大目标都高,且并不是每一张图上都有小目标。只有52.3%的图片有小目标;而有中目标的图片是70.7;有大目标图片是83%。 

为了克服分布不均衡的问题,Yolov4采用了Mosaic数据增强的方式。优点有2  

1- 丰富了数据集。 随机采用4张图片,随机缩放,随机分布进行拼接,增加了很多场景图片,特别是随机缩放 增加了很多小的目标,让网络的性能变的更好; 2- 减少GPU数量。用4张图片随机组合,相当于同时对4张图片进行训练,使得训练时 mini-batch的数值并不用设置很大,一个GPU就可以达到很好的效果。

Backbone创新点:CSPDarknet-53,Mish激活函数,Dropblock

YoloV3的主干网络结构时Darknet-53,而Yolov4的主干网络时CSPDarknet-53,从字面上来说,Yolov4相比较Yolov3主要多了CSP模块。

整个主干网络中一共有5个这样的CSP模块。

CSP模块是借鉴2019年的CSPNet,主要从网络结构设计的角度,解决推理时计算量很大的问题。CSPnet作者任务计算量过大是由于网络优化时,梯度信息重复造成的,所有在设计CSP模块时,将基础层的特征,映射划分成两个分支。上面的分支是2个CBL卷积层 + X个残差组件; 下面的分支只有一个CBL卷积层, 最后通过Concat的方式连接起来。在减少计算量的同时,可以保证网络的准确性。 因此Yolov4在主干网络中采用CSPDarnet的结构。

CSP模块的优点:1- 增强CNN卷积神经网络的学习能力,再加深网络的同时,保证轻量化和准确性; 2- 采用CSP模块可以降低计算瓶颈; 3- 降低训练电脑时的内存成本。 当然需要注意的是,每个CSP模块,前面的卷积步长为2,所以都有下采样的效果,因为有5个CSP模块,所以输入端是416*416,经过5次下采样,不同的位置,特征矩阵,大小不断的减半,可以看到,最后三次下采样变成52*52、26*26、13*13,正好和输出层的三个特征图进行对应。

当然接入主干网后,后面的Neck结构还会进行上采样操作,从而连接到输出层。

Yolov3的卷积层中,CBL结构是由卷积层加上BN层,加上Leakyrelu激活函数组成的,而Yolov4中主干网络全部采用CBM的方式,有卷积层+BN层+Mish激活函数组成。两者的不同点在于激活函数不同

Yolov4采用了2019年提出的mish激活函数。从图形看,mish激活函数边界更平滑一些,比如靠近中心点边界的区域。 

作者为什么用mish激活函数?作者刚开始使用CSPDarknet-53的网络结构,在ImageNet数据集上做图像分类测试,发现使用mish激活函数的网络结构,Top1和Top5的精度比没有使用时都会略高一些,而且网络计算量也没有大幅增加,因此在做目标检测时,主干网络中也就采用了mish激活函数,网络的各部分都有略微的改进,总体而言就会有不错的效果,所以有些人将网络优化的过程叫做炼丹,一点点改进。

上一篇 下一篇

猜你喜欢

热点阅读