YOLOv4 如何去学习一个目标检测模型

374 阅读4分钟

导言 最近复习了一遍yolov1~yolov5,自己为了应付面试,总是死记硬背八股文。没有思考设计背后的原理。重读了一遍YOLOv4的论文,架构清晰,为我提供了一些以后学习开源算法的思路。

论文的贡献

  • 搭建了一个更快更好的目标检测模型;硬件为1080 Ti 或2080 Ti GPU
  • 验证了一些优秀的目标检测优化方法的效果
  • 对前人的方法进行了改进,使其在单gpu上的训练更加高效;如CBN、PAN、SAM

论文链接:arxiv.org/pdf/2004.10…

如何设计一个目标检测模型

在YOLOv4之前,不管是one stage还是two stage的目标检测算法和一些优化技巧,都在一些数据集上表现优秀。所以这YOLOv4,也是相当于站在巨人的肩膀上,分析比较前人的一些techniques,再将其组合在一起,提升算法的性能。

0. 设计目标检测模型需要考虑什么

大方面来说, 目标检测模型要考虑性能和准确率。性能使用FPS来衡量,定位准确度使用iou,分类准确率使用Precision,Recall,mAP。更细分来说,研究和经验表明,符合以下三点的特征会让目标检测网络更加高效

  • 高分辨率输入

  • 更大的感受野

  • 更多参数 (More parameters – for greater capacity of a model to detect multiple objects of different sizes in a single image.个人理解是不是Neck结构中增加了特征融合的可学习参数呢?)

无标题.png 目标检测模型通常主要被分为backbone和检测头(head),neck是连接backbone和head之间的桥梁。那么对于backbone、neck和head,我们可以做哪些改进呢?

  1. backbone

    关注感受野,优化前处理,选取合适的卷积操作

  2. neck

    将更丰富的特征融合在一起,让网络学习多尺度特征

  3. head

    选择合适的损失函数,考虑使用anchor based 或 anchor free方法,优化后处理流程

1.改进目标检测模型的方法——

Bag of freebies & Bag of specials

通过上文我们已经知道一个好的目标检测模型,一些在训练阶段的改进和技巧,能提高模型的准确率和性能,但不会增加推理的成本,这叫Bag of freebies。而有的改进技巧,如改变了网络结构或者激活函数,可能会同时增加推理和训练的成本,作者把这称为Bag of specials。

Bag of freebie

修改训练的过程,但不影响推理的过程,即不修改网络结构 如:

  • 数据增强 (data augmentation).增加数据的多样性,避免过拟合,提高模型的泛化能力。如 Mosaic;

1668952325556.png

  • 解决样本不均衡问题——focal loss损失函数
  • 改进目标函数:如boundingbox的回归问题,改用IOU loss代替MSE loss

Bag of specials 会影响到推理结果,但能显著提升正确率

  • 优化网络结构:如扩大感受野、不同的卷积操作,Neck中的特征融合,skip-connection
  • 挑选合适的激活函数:ReLU, leaky-ReLU, parametric-ReLU, ReLU6, SELU, Swish, or Mish
  • 优化后处理:如 NMS

2.作者如何设计yolov4的

选backbone

作者基于Input Network resolution(分辨率)、Receptive Field size(感受野)、parameters(参数大小)、网络层输出大小、BFLOPS、FPS这几个性质来比较不同backbone的性能。CSPResNet50、CSPDarknet53、EfficientNet-B3的性质如下图。综合考虑,选取CSPDarknet53作为backbone。

1669036528734.png

选head

加入SPP(空间金字塔结构)增加感受野

1669037015586.png

SPP论文链接: arxiv.org/pdf/1406.47…

使用特征融合得更充分的PANet作为Neck。继续沿用yolov3的检测头(anchor based)。

BoF 和BoS

激活函数的考虑点:求导的难易、网络是否需要量化

正则化技巧:选用dropblock(看了别人的论文觉得效果好)

Normalization:CMBN

Data agumentation:自对抗学习 添加了空间注意力机制

overall structure

YOLOv4 结构:

 Backbone: CSPDarknet53 

 Neck: SPP, PAN 

 Head: YOLOv3

YOLOv4的改进方法:

• Bag of Freebies (BoF) for backbone:
    - CutMix and Mosaic data augmentation, DropBlock regularization, Class label smoothing 
    
• Bag of Specials (BoS) for backbone: 
    - Mish activation, Cross-stage partial connections (CSP), Multiinput weighted residual connections (MiWRC) 

• Bag of Freebies (BoF) for detector: 
    - CIoU-loss, CmBN, DropBlock regularization, Mosaic data augmentation, Self-Adversarial Training, Eliminate grid sensitivity, Using multiple anchors for a single ground truth, Cosine annealing scheduler, Optimal hyperparameters, Random training shapes 

• Bag of Specials (BoS) for detector: 
    - Mish activation, SPP-block, SAM-block, PAN path-aggregation block, DIoU-NMS

3.对我的启示

  1. 要对神经网络的结构有自己的思考,而不是拿来就用。
  2. 某个开源算法里面用到的优化改进方法,都可以借鉴其中的思想,用到别的地方去。
  3. 学习论文和开源算法可以进行拆解,对其中的bag of freebies和bag of specials进行罗列,探究这些用到的方法为什么能够使网络性能得到提高。