Yolov4

论文:https://arxiv.org/abs/2004.10934
代码:https://github.com/AlexeyAB/darknet
https://github.com/Tianxiaomo/pytorch-YOLOv4

1 简介

YoloV4的主要贡献有:

  • 实现了高效准确的目标检测,可以在单块1080Ti或2080Ti显卡上完成高效准确的目标检测器的训练;
  • 验证了目标检测模型训练过程中诸多trick的有效性;
  • 修改了当前模型,使其更加适合于在单显卡上进行训练且训练效果更高。
    在这里插入图片描述

2 相关工作

2.1 目标检测模型

当前的目标检测器一般由两个组件组成,一是在ImageNet上预训练的骨干网络,另一个是头部网络用于目标的类别判定和bounding box的回归。

骨干网络
在GPU上使用的骨干网络,可以是VGG、ResNet、ResNext或DenseNet;
在CPU上使用的骨干网络,可以是轻量型的网络,如SqueezeNet、MobileNet和ShuffleNet。

头部网络
分为两类,一阶段目标检测和两阶段目标检测。
两阶段目标检测:RCNN系列,如Fast RCNN、Faster RCNN、R-FCN、Libra R-CNN以及anchor free类的两阶段检测算法RepPoints;
一阶段目标检测:Yolo、SSD和RetinaNet以及anchor free类的一阶段目标检测算法CenterNet、CornerNet和FCOS。

跨层的特征融合
近年来的目标检测算法,在骨干网络和头部网络之间加入了一些新的层,这些层一般是用于处理多尺度的特征,作者将这些层称之为目标检测器的瓶颈层。一般瓶颈层都包含了网络的跨层特征连接。具有瓶颈层的算法包括了FPN、PAN、BiFPN和NAS-FPN。

新的目标检测算法
包括了DetNet、DETNASA、SpineNet和HitDetector。

总结而言,目标检测器由下列组件组成:
在这里插入图片描述

2.2 Bag of freebies

通常目标检测器都是离线训练,从而可以使得检测模型具有更高的准确率且不会增加模型的推理时间。作者将单纯修改训练策略或单纯增加训练代价的措施叫做“bag of freebies”。

图像增广
图像增广是最常用的改善训练效果的措施,图像增广的目的是增加输入图像的多样性,从而提升模型对于不同类型的输入图像的鲁棒性。成像扰动和几何扰动是最常用图像增广手段,成像扰动包括了改变图像的亮度、对比度、色度、饱和度和添加噪声;几何扰动包括了随机缩放、裁剪、翻转和旋转。

其他的图像扰动手段包括了random erase和cutout是从输入图像中随机选择矩形区域,区域中的部分像素甚至全部像素用0代替,而hide-and-seek和grid mask则从图像中选取多个矩形区域全部用0填充。这类似于对feature map应用dropout、dropconnect和dropblock。也可以对多个输入图像应用图像聚合完成图像增广,例如MixUP是对两幅图像进行加权求和,同样对图像的label也进行加权求和。CutMix则是用另一幅图像中的矩形块代替覆盖本图的矩形区域,根据混合区域的大小调整图像的label。除上述方法外,style transfer GAN也可以用于图像增广。

数据分布不均衡
在两阶段的目标检测算法中,可以通过难例挖掘或在线难例挖掘解决不同类别训练数据的不均衡。但对一阶段目标检测算法而言,因为其属于密集预测类的算法,无法使用难例挖掘,因此其他论文提出了focal loss方法以改善不同类别训练样本的不均衡。使用硬one-hot编码难以表示不同类数据之间的关系,可以使用label smoothing方法将硬one-hot编码转换成软one-hot编码,提升模型的鲁棒性。也可以使用知识蒸馏网络设计label修正网络。

BBox回归
最常用的bbox回归是计算预测框与真实框中心点及宽高或box左上角及右下角之间的MSE损失,基于anchor的检测算法中,计算的多是中心点及宽高的偏移量或box左上角及右下角的偏移量。这些方法把每个点当成了独立的点,没有考虑目标的完整性。针对这个问题,出现了IOU loss,IOU具有尺度不变性,另外最小化MSE loss并不等价于最大化预测框与真实框之间的IOU,因此IOU loss改善了目标的定位精度。但IOU loss在预测框和真实框无重叠的情况下无法进行有效的模型训练,因此又出现了GIOU loss以解决该问题。DIOU loss在GIOU的基础上考虑了预测框和真实框中心点的距离,CIOU loss在DIOU的基础上又进一步考虑了预测框和真实框的形状,经过这些改善,CIOU给出了BBOX回归问题的高效准确的解决方案。

2.3 Bag of specials

作者将应用于模型推理阶段用于改善目标检测效果的措施称为"Bag of specials",这些措施包括增大感受野、引入注意力机制和增强特征的聚合能力等。

增强感受野的措施包括SPP、ASPP和RFB。原始的SPP是在检测时对不同大小的roi区域使用尺寸可变的池化核已得到固定大小的输出,但由于其输出是一维向量,不适合于在FCN网络中使用。在YoloV3中,作者将SPP层用在最大池化层的后面,最大池化层的池化核大小为 { 1 , 5 , 9 , 13 } \{1,5,9,13\} {1,5,9,13},stride=1。这种设计有效增加了backbone的feature map的感受野尺寸。ASPP则是使用了多个空洞为k的3 * 3卷积,stride=1.RFB则进一步空洞数为k,大小为k * k,stride=1的空洞卷积。RFB仅仅多使用了7%的推理时间,就把SSD在MS COCO上的 A P 50 AP_{50} AP50提升了5.7%.

YoloV3-SPP:
在这里插入图片描述
其结构如上所示,内部采用不同大小的kernel size和strdie实现不同感受野特征输出,然后concat即可.

注意力机制应用于目标检测时可以分为channel-wise attention和point-wise attention,SE(Squeeze-and-Excitation)和SAM(Spatial Attention Model)是这两种方式的代表方案。SE和ResNet50结合,可以以2%的计算增加量将ImageNet的top1分类准确率提升1%,但是在GPU上其会将推理时间增加10%以上,所以其更适用于移动式设备。SAM只需要0.1%的计算量提升就可以将ResNet50-SE的ImageNettop1分类准确率提升0.5%,其不影响网络在GPU上的整体推理速度。

特征聚合领域,目前常用的是SFAM、ASFF和BiFPN,SFAM使用SE模块对多尺度的特征进行channel维度的重新加权,ASFF则是使用softmax进行point-wise维度的重新加权,BiFPN则是进行scale维度的重新加权。

激活函数:Relu改善了使用sigmoid和tanh时经常遇到的梯度弥散问题。后来陆续出现了LReLU、PReLU、ReLU6、SELU、Swish、hard-Swish和Mish进一步解决了梯度弥散问题。LReLU、PReLU主要是解决ReLU在输入为负时梯度为0的问题,ReLU6和hard-swish是为量化网络设计的,SELU是为自归一化网络设计的,Swish和Mish是连续可微的激活函数。

检测后处理NMS:NMS是最常用的检测后处理过程,Soft NMS可以减少密集目标时的漏检,DIOU NMS借鉴了Soft NMS的思路考虑了两个相邻框的中心点间的距离。对于anchor-free类的检测算法,都不需要检测后处理过程。

3 方法论

作者以实际的模型推理速度为评价指标,而不是使用理论上的计算量(BFLOPS)作为度量标准。

3.1 网络架构

网络架构的选择主要是想在模型的输入分辨率、网络卷积层数、网络参数量和网络输出层数之间取得最佳平衡。

另一个目标是选择附加网络块以增加网络的感受野和找到不同尺度特征的最佳聚合方法,例如FPN、PAN、ASFF和BiFPN。

适合于分类的模型不一定适合于目标检测,检测模型需要具有下述性质:

  • 输入分辨率更大,以便于检测小目标;
  • 具有更多的网络层,以具有更大的感受野;
  • 更多的参数,以便于检测出不同尺寸的目标。

基于上面三点理论,具有更大感受野的模型(包含大量的3 * 3的卷积层)和参数量更大的模型更适合于用做检测网络的backbone。表1给出了CSPResNext50,CSPDarknet53和EfficientNet-B3的对比结果,作者判定CSPDarkNet53是更合适的目标检测骨干网络。
在这里插入图片描述作者使用了SPP block以增大感受野,使用PANet进行多尺度的特征聚合。

最终,作者使用CSPDarkNet53做骨干网络、使用了SPP block、PANet特征聚合、YoloV3的网络头构成了YoloV4的结构。

3.2 选择BOF和BOS

为提高目标检测效果,CNN一般会使用下列组件:

在这里插入图片描述
激活函数的选择上,由于PReLU和SELU难以训练,ReLU6是针对量化模型设计的,所以将这三个从候选列表中移除;

正则化方面由于DropBlock的优异性能,直接使用DeopBlcok;

归一化方面,由于作者的目标是在单显卡上进行训练,因此syncBN不予考虑。

3.3 额外的优化手段

  • 作者提出了新的图像增广手段,Mosaic和SAT(Self-Adversarial Training);
  • 使用遗传算法选择最优超参数;
  • 作者使用修改版SAM和修改版PAN以及跨mini-batch归一化(CmBN)实现高效率的训练和检测。

Mosaic
马赛克表示一种新的数据增广手段,将4副图像整合到一起,从而使得网络可以检测常规区域外的目标。同时,使用这种数据增强方法时,batch normalization计算每一层四副不同图像的激活值的统计值,减少了对大的mini-batch的要求。

在这里插入图片描述
Self-Adversarial Training,SAT
自对抗训练也是一种新的数据增强手段,应用在两次的前向-反向训练过程中。第一次训练中修改的不是网络的权重而是输入图像,就是让网络执行一次自对抗的训练以造成图像中没有关注的目标的假象。第二次训练则是在修改后的图像上以正常的方式进行模型的训练。

CmBN
在这里插入图片描述
在训练yolo中,常用的一个技巧是设置mini batch和batch,即网络前向batch/ mini batch次,然后再进行一次梯度更新,也是为了变相扩大batch size,但是其缺点是bn操作无法实现等价的扩大N倍。这也就是上图中BN的处理过程。这个技巧在训练yolo时还是有一些效果的,如果涉及到读卡的数据并行训练,还是应该使用SyncBN。可参考:https://zhuanlan.zhihu.com/p/40496177

CBN则是跨越多轮迭代进行权重和系数的更新,上图所示,每轮迭代都收集相邻四次迭代的均值和方差进行规范化处理,相当于进行了大小为4*batchsize的规范化。CBN的更多细节可参考:https://blog.csdn.net/cdknight_happy/article/details/108001637

CmBN可以看作是BN和CBN的结合,将每一个batch的数据分为四份,训练第一份的时候使用的是只有第一个mini-batch的均值和方差,第二份的时候使用的是前两个mini-batch的均值和方差,以此类推。在第四次迭代,也就是当前batch的最后一个mini-batch时,累计的是四个mini-batch迭代过程中的均值和方差,然后进行了基于该batch数据的权重和BN系数的更新操作。CmBN可以看作是BN和CBN的结合。

modified SAM
在这里插入图片描述
SAM可参考https://blog.csdn.net/cdknight_happy/article/details/107964019,作者是对SAM的修改,可以提升处理效率。

modified PAN
在这里插入图片描述

3.4 YoloV4

在这里插入图片描述

4 实验

4.1 分类实验

使用CutMix、Mosaic、class label smoothing和Mish激活函数取得了最好的分类结果。
在这里插入图片描述
在这里插入图片描述

4.2 检测实验

S:消除网格敏感度,YoloV3中进行目标位置预测时使用公式 b x = σ ( t x ) + c x , b y = σ ( t y ) + c y b_x = \sigma(t_x)+c_x,b_y = \sigma(t_y) + c_y bx=σ(tx)+cx,by=σ(ty)+cy c x , c y c_x,c_y cx,cy为整数。如果想 c x , c y c_x,c_y cx,cy接近于 b x , b y b_x,b_y bx,by,就需要 t x , t y t_x,t_y tx,ty的绝对值很大。作者通过给sigmoid函数乘以一个大于1的系数,降低对位于网格附近的目标的预测难度。

M:训练中使用Mosaic数据增广;

IT:IOU阈值 - 多个anchor对应同一个ground truth;

LS:class label smoothing;

CBN:CmBN;

CA:学习率采样Cosine衰减;

DM:动态的Mini-Batch Size,对于小尺寸的训练图像增大mini-batch的大小;

OA:使用最佳anchors;

GIOU、CIOU、DIOU、MSE:不同类型的损失函数。

在这里插入图片描述最佳训练组合是:S+M+IT+GA+LS+GIOU/CIOU

在这里插入图片描述最佳测试组合:SPP + PAN + SAM

4.3 不同骨干网络和预训练模型对检测训练的影响

在这里插入图片描述
适合于分类的模型不一定适合于检测;

4.4 检测器训练过程中不同mini-batch大小的影响

在这里插入图片描述
使用了作者介绍的这些trick之后,不同的mini-batch对检测效果的影响很小,因此作者认为使用这些trick之后可以用普通的GPU进行yolov4的模型训练。

5 总体检测结果

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

参考:
yolov3 https://blog.csdn.net/leviopku/article/details/82660381
yolov4 https://zhuanlan.zhihu.com/p/143747206

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:原理与源码解析》,课程链接 https://edu.csdn.net/course/detail/29865【为什么要学习这门课】 Linux创始人Linus Torvalds有一句名言:Talk is cheap. Show me the code. 冗谈不够,放码过来!  代码阅读是从基础到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。YOLOv4是最近推出的基于深度学习的端到端实时目标检测方法。YOLOv4的实现darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。【课程内容与收获】 本课程将解析YOLOv4的实现原理和源码,具体内容包括:- YOLOv4目标检测原理- 神经网络及darknet的C语言实现,尤其是反向传播的梯度求解和误差计算- 代码阅读工具及方法- 深度学习计算的利器:BLAS和GEMM- GPU的CUDA编程方法及在darknet的应用- YOLOv4的程序流程- YOLOv4各层及关键技术的源码解析本课程将提供注释后的darknet的源码程序文件。【相关课程】 除本课程《YOLOv4目标检测:原理与源码解析》外,本人推出了有关YOLOv4目标检测的系列课程,包括:《YOLOv4目标检测实战:训练自己的数据集》《YOLOv4-tiny目标检测实战:训练自己的数据集》《YOLOv4目标检测实战:人脸口罩佩戴检测》《YOLOv4目标检测实战:中国交通标志识别》建议先学习一门YOLOv4实战课程,对YOLOv4的使用方法了解以后再学习本课程。【YOLOv4网络模型架构图】 下图由白勇老师绘制  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值