YOLOv4: Optimal Speed and Accuracy of Object Detection
论文:https://arxiv.org/abs/2004.10934
代码:https://github.com/AlexeyAB/darknet
YOLOv4在COCO上,可达43.5%AP,速度高达65fps
YOLOv4的特点是集大成者,俗称堆料,但最终达到这么高的性能,一定是不断堆料、不断调参的结果。
1、框架:
- backbone:CSPdarknet53
- neck:SPP ,PAN
- Head:YOLOv3,在head部分决定网络是检测还是分类。
对于GPU,作者在卷积层中使用:CSPResNeXt50/CSPDarknet53
对于VPU,作者使用分组卷积,但避免使用SE块-具体来说,它包括以下模型:EfficientNet-lite/MixNet/GhostNet/MobileNetV3
目标是在输入网络分辨率、卷积层数、参数数量和层输出(filters)的数量之间找到最佳平衡。
- 416*416*3输入
- 压缩宽度和高度到通道维度
- 在后面几层已经具有一定语义信息
- 进行CBL*3
CSPDarknet53(CSP)
CSPDarknet53(CSP)是darknet53的改进版本,经过主干神经网会得到3个有效特征层输出13*13*1024、26*26*512和52*52*256的特征层CSP
- resblock构成
- Mish 激活函数:Relu激活函数一直以来是做卷积神经网络的首选。不过随着mish出现,这种情况可能会发生改变。看函数形状会发现这个函数不是单调的,Relu和Mish对比,Mish的梯度更平滑,而且实现证明Mish和各种优化器结合的效果都比较好。更具体的说一下,Mish无边界(即正值可以到达任何高度),避免了由于封顶而导致的饱和。理论上对负值的轻微允许更好的梯度流。而不是像Relu中那样的硬0边界。最后,可能也是最重要的,目前的想法是,平滑的激活函数允许更好的信息深入深入网络,从而得到更好的准确性和泛化。 尽管如此,我测试了许多激活函数,他们也满足了其中的许多想法,但大多数都无法执行。这里的主要区别可能是Mish函数在曲线上几户所有点上的平滑度。 在简单测试中,越来越多的层被添加到一个测试神经网络总,而没有一个统一的函数。随着层深的增加,Relu精度迅速下降,其次是Swish。相比之下,mish能更好地保持准确性,这可能是因为它能更好的传播信息。
- 使用CSPDarknet的结构(CSP+Darknet)
融合特征提取 neck
SPP结构
- 首先进行13*13*1024卷积进行3次卷积
- 然后进行SPP模块,只需要不同池化核进行池化后再进行堆叠就可以了
- 最后再进行3次卷积
PANet
SE 和SAM
- SENet(Squeeze-and-Excitation)增加2%计算量(但推理时有10%的速度),可以提升1%的ImageNet top-1精度。
- Spatial Attention Module(SAM),增加0.1%计算量,提升0.5%的top-1准确率。
数据增强
- 数据增强(扩充)
- 亮度、饱和度、噪声
- 几何变形
- 模拟对象遮挡
- random erase
- cutout
- hide-and-seek grid mask 随机或均匀选取图片中的集合区域将其全部替换为0
- feature map
- dropout
- dropconnect
- dropblock
- 图像融合
- Mixup
- CutMix作者在CutMix基础上提出Mosica增强
- 解决类别不平衡
- hard negative example mining
- online hard example mining
- focal loss
- label smoothing:[0,0,1]转换到[0.01,0.01,0.90]
- bbox
YOLOv4 = CSPDarknet53+SPP+PAN+YOLOv3其中YOLOv4用到相当多的技巧:
- 用于backbone的BoF:CutMix和Mosaic数据增强,DropBlock正则化,Class label smoothing
- 用于backbone的BoS:Mish激活函数,CSP,MiWRC
- 用于检测器的BoF:CIoU-loss,CmBN,DropBlock正则化,Mosaic数据增强,Self-Adversarial 训练,消除网格敏感性,对单个ground-truth使用多个anchor,Cosine annealing scheduler,最佳超参数,Random training shapes
- 用于检测器的Bos:Mish激活函数,SPP,SAM,PAN,DIoU-NMS
2、步骤:
3、细节:吸收各个领域的trick改进自己的算法:
- 输入端创新:Mosaic数据增强、cmBN、SAT自对抗训练
- BackBone(CNN)主干网络:CSPDarknet53、Mish激活函数、Dropblock
- Neck:在BackBone和最后的输出层之间的一些层,比如Yolov4中的SPP模块、FPN+PAN结构
- Prediction:主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms
cmBN 参考链接https://blog.csdn.net/qq_35447659/article/details/107797737