目标检测学习--yolo v4

论文地址:

《YOLOv4: Optimal Speed and Accuracy of Object Detection》

 读完论文的感受就像是一篇目标检测tricks综述,疯狂叠buff就完事了。

先来论文tricks的截图:

Backbones-Neck-Heads的tricks:

目标检测学习--yolo v4_第1张图片

Activations、bbox回归、数据增强、正则化、归一化、跨域连接的tricks:

目标检测学习--yolo v4_第2张图片

YOLOv4: 

目标检测学习--yolo v4_第3张图片

1. 目标检测器通用框架:

除了输入,一般one-stage的目标检测算法通常由提取特征的backbone、传输到检测网络的Neck部分和负责检测的Head部分。而two-stage的算法通常还包括空间预测部分;

作为one-stageYOLO网络主要由三个主要组件组成:

  • Backbone -在不同图像细粒度上聚合并形成图像特征的卷积神经网络;

  • Neck:一系列混合和组合图像特征的网络层,并将图像特征传递到预测层;

  • Head:对图像特征进行预测,生成边界框和并预测类别;

yolo v4作为yolo系列的网络改进,也是基于上述几个方面进行改进的,作者对目标检测的tricks进行了简单介绍,并改进了部分buff,形成了最终的yolo v4网络;

2. yolo v4的网络结构:

网图侵删

Input:

trick1:Mosaic数据增强

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

Mosaic数据增强将4张训练图像合并成一张进行训练的数据增强方法(而不是CutMix中的2张)。这增强了对正常背景(context)之外的对象的检测,丰富检测物体的背景;此外,每个小批包含一个大的变化图像(4倍),因此,减少了估计均值和方差的时需要大mini-batch的要求,降低了训练成本;

trick2:自对抗训练(SAT)

SAT为一种新型数据增强方式。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对其自身进行一种对抗式的攻击,改变原始图像,制造图像上没有目标的假象。在第二阶段,训练神经网络对修改后的图像进行正常的目标检测。

Self-Adversarial Training是在一定程度上抵抗对抗攻击的数据增强技术。CNN计算出Loss, 然后通过反向传播改变图片信息,形成图片上没有目标的假象,然后对修改后的图像进行正常的目标检测。需要注意的是在SAT的反向传播的过程中,是不需要改变网络权值的。 使用对抗生成可以改善学习的决策边界中的薄弱环节,提高模型的鲁棒性。因此这种数据增强方式被越来越多的对象检测框架运用。

BackBone:

trick1:CSPDarknet53 

YOLOv3中特征提取网络使用的是Darknet53,YOLOv4借鉴了CSPNet,其全称是Cross Stage Partial Networks,即跨阶段局部网络;

CSPNet解决了其他大型卷积神经网络框架Backbone中网络优化的梯度信息重复问题,将梯度的变化从头到尾地集成到特征图中,因此减少了模型的参数量和FLOPS数值,既保证了推理速度和准确率,又减小了模型尺寸;CSPNet如下:

trick2:Mish激活函数

Mish是一个平滑的曲线,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化;在负值的时候并不是完全截断,允许比较小的负梯度流入。实验中,随着层深的增加,ReLU激活函数精度迅速下降,而Mish激活函数在训练稳定性、平均准确率(1%-2.8%)、峰值准确率(1.2% - 3.6%)等方面都有全面的提高;

主干网络为什么要用Mish,那当然是炼丹有效果啦。

目标检测学习--yolo v4_第4张图片

trick3:Dropblock 

传统的dropout对FC层效果更好,对conv层效果较差,因为卷积层通常是:卷积+激活+池化层,池化层本身就是对相邻单元起作用,而且即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息;因此,在全连接层上效果很好的Dropout在卷积层上效果并不好,输入的信息仍旧能够被送到下一层,导致网络过拟合;而DropBlock则是将在特征图上去掉一部分相邻的整片的区域(比如头和脚),网络就会去注重学习狗的别的部位的特征,来实现正确分类,从而表现出更好的泛化;

Neck 

trick1:SPP(Spatial Pyramid Pooling Networks)

使用k={1×1,5×5,9×9,13×13}的最大池化的方式,再将不同尺度的特征图进行Concat操作,采用SPP模块的方式,比单纯的使用k×k最大池化的方式,极大地增加感受野,显著的分离了最重要的上下文特征;

trick2:PANet(Path Aggregation Network

PANet论文中融合的时候使用的方法是AddYOLOv4算法将融合的方法由add改为Concate,这是改进的一种特征图融合方式 ;

Prediction 

使用yolo v3的head

other tricks:

trick1:类标签平滑

对于分类特别是多分类问题,常常把标签转换成one-hot向量类别标签,对于损失函数,我们需要用预测概率去拟合真实概率,而拟合one-hot的真实概率函数会带来两个问题:

  • 无法保证模型的泛化能力,容易造成过拟合;
  • 全概率和零概率鼓励所属类别和其他类别之间的差距尽可能加大,而由梯度有界可知,这种情况很难适应,会造成模型过于相信预测的类别;

对预测有100%的信心可能表明模型只是在记忆训练数据,而不是在进行学习:标签平滑处理调整预测的目标上限为一个较低的值,比如0.995。即对分类准确做了一点惩罚,让模型不可以分类的太准确,它将使用这个值而不是1.0来计算loss,这种方法缓解了过拟合;

标签平滑就是一定程度缩小label中min和max的差距,label平滑可以减小过拟合,所以,适当调整label,让两端的极值往中间凑,以增加泛化性能。

trick2:CmBN

传统BN(batch normalization)是仅利用当前迭代时刻信息进行归一化操作,而CBN(cross batch normalization)在计算当前时刻统计量时候会考虑前k个时刻的统计量,从而实现扩大batch size操作;同时CBN操作不会引入比较大的内存开销,训练速度不会影响很多,但是训练时候会慢一些;

CmBN是CBN的改进版本,把大batch内的4个mini batch当做一个整体,对外隔离;CBN在第t时刻,也会考虑前3个时刻的统计量进行汇合,而CmBN操作不会,不再滑动cross,其仅仅在mini batch内部进行汇合操作,保持BN一个batch更新一次可训练参数;

BN:无论每个batch被分割为多少个mini batch,其算法就是在每个mini batch前向传播后统计当前的BN数据(即每个神经元的期望和方差)并进行Normalization,BN数据与其他mini batch的数据无关;

CBN:每次iteration中的BN数据是其之前n次数据和当前数据的和(对非当前batch统计的数据进行了补偿再参与计算),用该累加值对当前的batch进行Normalization,好处在于每个batch可以设置较小的size;

CmBN:只在每个Batch内部使用CBN的方法,如果每个Batch被分割为一个mini batch,则其效果与BN一致;若分割为多个mini batch,则与CBN类似,只是把mini batch当作batch进行计算,其区别在于权重更新时间点不同,同一个batch内权重参数一样,因此计算不需要进行补偿;

trick3:学习率循环余弦衰减 

学习率会先上升再下降,上升的时候使用线性上升,下降的时候模拟cos函数下降,循环执行多次;

目标检测学习--yolo v4_第5张图片

trick4:改进的SAM(空间注意力机制)

空间注意力机制在深度学习中被广泛采用,Convolutional Block Attention Module (CBAM) 表示卷积模块的注意力机制模块,是一种结合了空间(spatial)和通道(channel)的注意力机制模块;

在这里插入图片描述

SAM中,最大值池化和平均池化分别用于输入feature map,创建两组feature map。结果被输入到一个卷积层,接着是一个Sigmoid函数来创建空间注意力;在YOLOv4中,使用修改后的SAM而不应用最大值池化和平均池化; 

目标检测学习--yolo v4_第6张图片

trick5:DIoU-NMS

nms主要用于预测框的筛选,常用的目标检测算法中,一般采用普通的nms的方式;而Yolo v4将其中计算IOU的部分替换成DIOU的方式:

 DIOU被用作非最大值抑制(NMS)的一个因素,该方法在抑制冗余框的同时,采用IoU和两个边界盒中心点之间的距离,这使得它在有遮挡的情况下更加健壮;

关于DIOU等loss的总结,这里可以看看大佬的博客:

关于SIoU的原理和代码实现(回顾IoU、GIoU、DIoU、CIoU) 

trick6:遗传算法优化超参 

遗传算法如何模拟大自然的进化? 

还有一些tricks这里没有全部提到,大家可以看看下面的参考;

小结

YOLO-v4算法是在原有YOLO目标检测架构的基础上,采用了之前CNN领域中最优秀的优化策略,从数据处理、主干网络、网络训练、激活函数、损失函数等各个方面都有着不同程度的优化;

作者把训练的方法分成了两类:

Bag of freebies:只改变训练策略或者只增加训练成本,比如数据增强;

Bag of specials:插件模块和后处理方法,它们仅仅增加一点推理成本,但是可以极大地提升目标检测的精度;

目标检测学习--yolo v4_第7张图片

参考文献

通道注意力

目标检测loss 

深度学习中的规范化 

目标检测算法YOLOv4详解

YOLO V4 — 网络结构和损失函数解析 

推荐一个大佬的代码实现(keras、tf2与torch):

Bubbliiiing:https://blog.csdn.net/weixin_44791964/category_9408229.html?spm=1001.2014.3001.5482

仅为学习记录,侵删!

你可能感兴趣的:(目标检测网络,目标检测,学习,计算机视觉)