导言 最近复习了一遍yolov1~yolov5,自己为了应付面试,总是死记硬背八股文。没有思考设计背后的原理。重读了一遍YOLOv4的论文,架构清晰,为我提供了一些以后学习开源算法的思路。
论文的贡献
- 搭建了一个更快更好的目标检测模型;硬件为1080 Ti 或2080 Ti GPU
- 验证了一些优秀的目标检测优化方法的效果
- 对前人的方法进行了改进,使其在单gpu上的训练更加高效;如CBN、PAN、SAM
如何设计一个目标检测模型
在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结构中增加了特征融合的可学习参数呢?)
目标检测模型通常主要被分为backbone和检测头(head),neck是连接backbone和head之间的桥梁。那么对于backbone、neck和head,我们可以做哪些改进呢?
-
backbone
关注感受野,优化前处理,选取合适的卷积操作
-
neck
将更丰富的特征融合在一起,让网络学习多尺度特征
-
head
选择合适的损失函数,考虑使用anchor based 或 anchor free方法,优化后处理流程
1.改进目标检测模型的方法——
Bag of freebies & Bag of specials
通过上文我们已经知道一个好的目标检测模型,一些在训练阶段的改进和技巧,能提高模型的准确率和性能,但不会增加推理的成本,这叫Bag of freebies。而有的改进技巧,如改变了网络结构或者激活函数,可能会同时增加推理和训练的成本,作者把这称为Bag of specials。
Bag of freebie
修改训练的过程,但不影响推理的过程,即不修改网络结构 如:
- 数据增强 (data augmentation).增加数据的多样性,避免过拟合,提高模型的泛化能力。如 Mosaic;
- 解决样本不均衡问题——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。
选head
加入SPP(空间金字塔结构)增加感受野
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.对我的启示
- 要对神经网络的结构有自己的思考,而不是拿来就用。
- 某个开源算法里面用到的优化改进方法,都可以借鉴其中的思想,用到别的地方去。
- 学习论文和开源算法可以进行拆解,对其中的bag of freebies和bag of specials进行罗列,探究这些用到的方法为什么能够使网络性能得到提高。