目标检测——YOLOv4(七)

简介:
随着深度学习的发展,目前已经出现了很多算法(或者训练技巧,tricks)来提升神经网络的准确率。在实际测试中评价一个算法的好坏优劣主要看两点,一是能否在大规模的数据集中work,二是是否有理论依据。
YOLOv4论文主要针对各种可以提升精度的trick进行了整合,加入YOLOv3中,最终在coco上面达到了43.5%AP ,在Tesla V100 上达到了65FPS。
原论文地址:https://arxiv.org/pdf/2004.10934.pdf

主要贡献:

  1. 分析验证了目标检测中的Bag-ofFreebies 和Bag-of-Specials 方法在训练过程中的影响。
  2. 对SOTA方法进行改进(含CBN、PAN,SAM),使YOLOV4更适应于单GPU训练,大大降低了训练门槛。

网络结构:

改编自知乎大佬的一张图:
在这里插入图片描述
YOLOv4:CSPDarknet-53 + SPP + PANet + Yolov3-head

目标检测的Tricks:

  1. Bag of freebies :
    “仅仅改变训练策略,只需增加训练成本,不增加预测成本的改进,称为Bag of freebies”
    (1)全像素调整:光照失真,几何失真;
    (2)遮挡:Random Erase、Cutout、Hide-and-Seek,Drpout、DropBlock等正则;
    (3)用多张图片组合增强:Mixup、CutMix;
    (4)生成对抗网络:Style Transfer GAN;
    (5)数据分布不均衡时:Focal Loss等;
    (6)one-hot类别之间没有关联:Lable Smoothing将硬标签转换为软标签、知识蒸馏;
    (7)BBox回归:IoU loss、DIoU loss、GIoU loss、CIoU loss。

  2. Bag of spedials:
    “仅增加少量预测成本,但可以显着提高检测精度的方法,称为Bag of specials”
    (1)提升模型感受野:SPP、RFB、ASPP;
    (2)注意力机制:SE、SAM、modified SAM;
    (3)特征融合模块:Skip-connection、Hyper Column、FPN系列;
    (4)激活函数:ReLU、LReLU、PReLU、SELU、Swish、Hard Swish、Mish;
    (5)后处理方法:NMS(greedy NMS、Soft NMS、DIoU NMS)。

创新点:

1、Input:
(1)Mosaic数据增强:
随机使用4张图片,随机缩放,再随机分布进行拼接,混合具有不同语义信息的图片。
不仅丰富了数据集,还可以让检测器检测超出常规语境的目标,来增强模型的鲁棒性,并且还增加了很多小目标;
由于BN是从四张图片计算得到的,所以可以减少对大的mini-batch的依赖。
在这里插入图片描述

(2)self-Adversarial Training:
自对抗训练也是一种新的数据增强方法,可以一定程度上抵抗对抗攻击。其包括两个阶段,每个阶段进行一次前向传播和一次反向传播。
第一阶段,CNN通过反向传播改变图片信息,而不是改变网络权值。通过这种方式,CNN可以进行对抗性攻击,改变原始图像,造成图像上没有目标的假象;
第二阶段,对修改后的图像进行正常的目标检测。

(3)CmBN:
Cross-Iteration BN(CBN)指出小batch size(<16)会直接降低BN的有效性,在这种情况下利用前k个均值和方差来提高统计质量。而CmBN处于BN和CBN(k=3)之间,把单个迭代计算(calculate)替换成了多个迭代计算(accumulate),将参与计算的迭代数量限制在一个batch里,很明显做了折中,减少了CBN计算量,另外,在CBN论文中曾提及近似误差的累积使得CBN效果略受影响,CmBN的改进有没有减轻这种累积的可能。

2、BackBones:
(1)CSPDarknet53:
CSPNet全称是Cross Stage Paritial Network,作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的,因此采用CSP模块先将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。
因此采用CSPDarknet53网络结构主要有三个方面的优点:增强CNN的学习能力,使得在轻量化的同时保持准确性;降低计算瓶颈;降低内存成本。

(2)Mish激活函数:
Yolov4的Backbone中都使用了Mish激活函数,而后面的网络则还是使用leaky_relu函数。
在这里插入图片描述

(3)Dropblock:
DropBlock 由原本的Dropout的随机丢弃点改变为丢弃整个块,如上图所述。该论文认为随机丢弃的像素点(其实是特征图的一个点)可能会由他附近的点的关联信息所表示出来,这样就起不到原本想要的正则效果,因此直接丢弃一个块。

3、Neck:
(1)SPP模块:
同Yolov3中一样,在SPP模块中,使用k={11,55,99,1313}的最大池化的方式,再将不同尺度的特征图进行Concat操作。

(2)FPN+PAN结构:
这部分除了使用FPN外,还在此基础上使用了PAN结构:
在这里插入图片描述
注意原PANet网络的PAN结构中,两个特征图结合是采用shortcut操作,而Yolov4中则采用concat操作。

4、Head:
(1)CIoU_Loss:
目标检测任务的损失函数一般由Classificition Loss(分类损失函数)和Bounding Box Regeression Loss(回归损失函数)两部分构成。
回归损失函数近些年的发展过程是:
Smooth L1 Loss → IoU Loss(2016)→ GIoU Loss(2019)→ DIoU Loss(2020)→ CIoU Loss(2020)
IOU_Loss:主要考虑检测框和目标框重叠面积。
GIOU_Loss:在IOU的基础上,解决边界框不重合时的问题。
DIOU_Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息。
CIOU_Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。

(2)DIoU_NMS:
当两个不同物体挨得很近时,由于IOU值比较大,往往经过NMS处理后,只剩下一个检测框,这样导致漏检的错误情况发生。
DIOU-NMS不仅仅考虑IOU,还考虑两个框中心点之间的距离。如果两个框之间IOU比较大,但是两个框的距离比较大时,可能会认为这是两个物体的框而不会被过滤掉。

代码:

这里有Tianxiaomo的Pytorch版本代码:pytorch-YOLOv4
权重文件直接下载:yolov4.weights
测试指令:

# 指令需要传入cfg文件路径,权重文件路径,图像路径
python demo.py cfg/yolov4.cfg yolov4.weights data/dog.jpg

在这里插入图片描述

总结:

Yolov4涉及到了非常非常多的trick, 最终的结果也很不错,要深入挖一下里面的知识点,对研究目标检测算法有很大的参考价值。

系列传送门:
目标检测——R-CNN(一)
目标检测——Fast R-CNN(二)
目标检测——Faster R-CNN(三)
目标检测——Mask R-CNN(四)
目标检测——R-FCN(五)
目标检测——YOLOv3(六)

猜你喜欢

转载自blog.csdn.net/qq_42823043/article/details/107339766