目录
1. 概述
1.1 文章主要改进
- 开发了一个efficient并且powerful的目标检测模型,让每个人都可以使用1080Ti或2080TI GPU来训练一个fast并且accurate的目标检测模型;
- 验证了SOTA的BoF和BoS trick对目标检测模型训练的影响;
- 验证了SOTA的包括CBN,PAN,SAM等单GPU训练方法。
1.2 算法效果
2.相关工作
2.1 目标检测模型
通常来说,目标检测模型由以下4部分组成:
- 输入:图像、图像金字塔
- 骨干网络:VGG16,ResNet50,ResNeXt-101,Darknet53等
- Neck: FPN,PAN,BiFPN等
- Head:
Dense Prediction(One Stage Detector):{RPN,YOLO,SSD,RetinaNet,FCOS}
Sparse Prediction(Two Stage Detector):{Faster R-CNN,R-FCN}
2.2 Bag of Freebies
freebies的意思是提高模型的检测精度但不增加模型推理消耗的trick。
- 数据增强:
- random erase和CutOut,与之类似的概念有 DropOut,DropConnect,DropBlock方法;
- MixUp,CutMix,style transfer GAN方法。
- 类别不平衡:
- hard negative example mining和online hard example mining一般用于two-stage目标检测模型;
- focal loss,label smoothing, knowledge distillation。
- 损失函数:
- MSE,IoU,GIoU,CIoU,DIoU
2.3 Bag of Specials
specials的意思是提高模型的检测精度也增加了推理消耗的trick。
- 增加感受野:
- SPP,ASPP,RFB
- 注意力模块:
- Squeeze-and-Excitation(SE)和Spatial Attention Module(SAM)
- 特征融合:
- skip connection,hyper-column,FPN,SFAM,ASFF,BiFPN
- 激活函数:
- ReLU,LReLU,PReLU,ReLU6,SELU,Swish,hard-Swish,Mish
- NMS后处理:
- NMS,greedy NMS,soft NMS,DIoU NMS
以上列出的Bag of Freebies和Bag of Specials在这里不做详细解释,想详细了解的请查看相应的论文。
3 实现方法
作者认为检测网络的基本目标是在系统中的快速运行和优化并行计算,而不是低计算量理论指标(BFLOP)。作者提出了两种实时神经网络方案:
- 对于GPU,作者在卷积层中使用少量groups(1-8):CSPResNeXt50/CSPDarknet53
- 对于VPU,作者使用分组卷积,但不使用SE模块,具体包括以下模型:Efficientnet-lite/MixNet/GhostNet/MobileNetV3
3.1 选择网络结构
选择网络结构的目标是找到网络输入分辨率、卷积层数、参数量( fi l t e r s i z e 2 ∗ fi l t e r s ∗ c h a n n e l / g r o u p s filter size^2 * filters * channel / groups filtersize2∗filters∗channel/groups)和层输出数(filters)之间的最佳平衡。例如,经过作者的实验,就ILSVRC2012(ImageNet)数据集上的分类任务而言,CSPResNext50比CSPDarknet53要好得多。然而,在MS-COCO数据集上的目标检测任务,CSPDarknet53比CSPResNext50要好。
另一个目标是选择额外的模块增加网络的感受野,并对不同的检测层级从骨干网络的不同层级选择最佳的参数聚集方法:例如FPN、PAN、ASFF、BiFPN。
所以对于检测模型来说,分类最佳的参考模型并不总是最优的。与分类模型不同的是,检测模型的要求如下:
- 更高的输入分辨率——用于检测多个小尺寸目标;
- 更多层——用于更高的感受野,以覆盖增大尺寸的输入网络;
- 更多参数——使模型能够在单个图像中检测多个不同大小的目标。
Backbone model | Input network resolution | Receptive field size | Parameters | Average size of layer output( W × H × C W\times H\times C W×H×C) | BFLOPs ( 512 × 512 512\times 512 512×512 network resolution) | FPS(GPU RTX 2070) |
---|---|---|---|---|---|---|
CSPResNext50 | 512x512 | 425x425 | 20.6M | 1058K | 31(15.5 FMA) | 62 |
CSPDarknet53 | 512x512 | 725x725 | 27.6M | 950K | 52(26.0 FMA) | 66 |
EfficientNet-B3 (ours) | 512x512 | 1311x1311 | 12.0M | 668K | 11(5.5 FMA) | 26 |
假设一个具有更大的感受野大小(具有更大数量的卷积层3×3)和更大数量的参数的模型应该被选为骨干网络。上表中显示了CSPResNeXt50,CSPDarknet53,Efficientnet B3的信息。CSPResNext50仅包含16个3×3卷积层、425×425的感受野和20.6M参数,而CSPDarknet53包含29个3×3卷积层、725×725的感受野和27.6M参数。理论上的证明,加上作者的大量实验,表明CSPDarknet53神经网络是两者结合最佳的检测模型骨干网络。
- 不同大小的感受野的影响总结如下:
- 大到目标大小——允许观察整个目标;
- 大到网络大小——允许观察目标周围的背景;
- 超过网络大小——增加图像点和最终激活之间的连接数。
作者通过在CSPDarknet53添加了SPP模块来增加感受野,分离出了最重要的背景特征,并且几乎不会降低网络运行速度。使用了PANet代替YOLOv3中的FPN,从骨干网络的不同层级对的主干层对不同层的检测器层进行参数融合。
最后,YOLOv4选择CSPDarknet53作为骨干网络,SPP作为附加模块,PANet作为特征融合的Neck,YOLOv3检测器作为Header。
作者没有使用CGBN或SyncBN或昂贵的专用设备。目的是允许任何人在普通的GPU(如GTX 1080Ti或RTX 2080Ti)上复现论文最新成果。
3.2 选择BoF和BoS
为了提高目标检测训练效果,卷积神经网络通常使用下列方法:
- 激活函数:ReLU,leaky-ReLU,parametric-ReLU,ReLU6,SELU,Swish or Mish
- 边框回归:MSE,IoU,GIoU,CIoU,DIoU
- 数据增强:CutOut,MixUp,CutMix
- 正则化方法:DropOut,DropPath,Spatial DropOut,DropBlock
- 网络激活归一化方法:Batch Normalization,Cross-GPU Batch Normalization(CGBN or SyncBN),Filter Response Normalization (FRN),Cross-Iteration Batch Normalization (CBN)
- 跳跃连接:Residual connections,Weighted residual connections,Multi-input weighted residual connections,Cross stage partial connections (CSP)
对于训练激活函数来说,PReLU和SELU训练困难,ReLU6用来训练量化网络,故以上函数不予考虑;而DropBlock的作者详细比较了他们的方法和其他人的方法,DropBlock方法好很多,于是直接选择了DropBlock方法作为正则化方法;对于归一化方法的选择,因为作者的目标是单GPU训练,故syncBN不予考虑。
3.3 其他提升
为了让设计的检测模型更适合单GPU训练,作者增加了补充的设计和提高如下:
- 新的数据增强方法:Mosaic和自对抗训练(SAT)
自对抗训练包含两个阶段:在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对自身进行了一次对抗性攻击,改变原始图像,从而制造出图像上没有目标的欺骗。在第二阶段中,训练神经网络以正常方式检测该修改图像上的目标。
- 基于遗传算法选择训练超参数
详见https://github.com/ultralytics/yolov3/issues/392 - 修改了一些存在的方法,使得对训练和检测更有效,改进SAM, 改进PAN和Cross mini-Batch Normalization (CmBN)
3.4 YOLOv4
- YOLOv4由以下模块组成:
- 骨干网络: CSPDarknet53
- Neck:SPP,PAN
- Head:YOLOv3
- YOLOv4使用了一下方法:
- 对骨干网络的BoF: CutMix和Mosaic data augmentation, DropBlock regularization, Class label smoothing
- 对骨干网络的BoS:Mish activation, Cross-stage partial connections (CSP), Multi-input weighted residual connections (MiWRC)
- 对检测器的BoF: 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
- 对检测器的BoS:Mish activation, SPP-block, SAM-block, PAN path-aggregation block, DIoU-NMS
4 实验
作者在ImageNet(2012 val)和COCO 2017(test-dev 2017)数据集上分别验证了了各种trick对分类网络和检测网络准确率的提高效果。
4.1 实验设置
ImageNet图像分类实验中,迭代步数为8000000步;batch size和mini-batch size分别为128和32;采用了polynomial decay学习率下降方法,初始学习率为0.1;warm-up迭代步数为1000;momentum和weight decay分别为0.9和0.005。验证BoS时,hyper-parameter使用默认设置,验证BoF时, 增加了50%训练步数。BoF实验验证了MixUp,CutMix,Mosaic,Bluring data数据增强方法,以及label smoothing方法;BoS实验验证了LReLU,Swish和Mish激活函数。
MS COCO目标检测实验中,默认hyper-parameters如下:迭代步数为500500;学习率下降策略为初始学习率为0.01,在400000步和450000步时,学习率乘以0.1,momentum和weight decay分别为0.9 and 0.0005。使用单GPU进行multi-scale训练,batch size为64,mini-batch size为8或者4,根据GPU架构和GPU显存大小决定。除了使用遗传算法进行hyper-parameter搜索,其他实验都使用默认设置。遗传算法实验使用了YOLOv3 SPP网络训练GIOU损失函数,在min-val 5k测试集上进行验证,采用了搜索到的学习率为0.00261,momentum为0.949,对ground truth的IoU threshold为0.213,loss normalizer为0.07。验证了大量的BoF,包括grid sensitivity elimination,mosaic数据增强,IoU threshold,遗传算法,class label smoothing, CmBN,自对抗训练,cosine annealing学习策略,动态mini-batch size, DropBlock, Optimized Anchors, 不同的IoU losses。验证了大量的BoS,包括Mish,SPP,SAM,RFB,BiFPN以及Gaussian YOLO。所有实验都基于单GPU训练,syncBN优化并没有使用。
4.2 不同feature对分类网络训练的影响
上图介绍了不同的数据增强方法及数据增强的效果。
MixUp | CutMix | Mosaic | Bluring | Label Smoothing | Swish | Mish | Top-1 | Top-5 |
---|---|---|---|---|---|---|---|---|
77.9% | 94.0% | |||||||
x | 77.2% | 94.0% | ||||||
√ | 78.0% | 94.3% | ||||||
√ | 78.1% | 94.5% | ||||||
x | 77.5% | 93.8% | ||||||
√ | 78.1% | 94.4% | ||||||
x | 64.5% | 86.0% | ||||||
√ | 78.9% | 94.5% | ||||||
√ | √ | √ | 78.5% | 94.8% | ||||
√ | √ | √ | √ | 79.8% | 95.2% |
从上表中可以看出,对CSPResNeXt-50分类结果有提高的trick是CutMix,Mosaic,Label Smoothing和Mish激活函数,四项结合分类准确率达到了最高。
MixUp | CutMix | Mosaic | Bluring | Label Smoothing | Swish | Mish | Top-1 | Top-5 |
---|---|---|---|---|---|---|---|---|
77.2% | 93.6% | |||||||
√ | √ | √ | 77.8% | 94.4% | ||||
√ | √ | √ | √ | 78.7% | 94.8% |
同CSPResNeXt-50分类结果一致,CutMix,Mosaic,Label Smoothing和Mish激活函数对分类效果有提高,并且四项结合分类准确率达到了最高,但是CSPDarknet-53的分类效果不如CSPResNeXt-50好,TOP1和TOP5的准确率均稍低一点。
4.3 检测网络训练
检测网络验证了以下BoF提高了检测的准确率并且没有影响检测模型的FPS。
- S:消除网格敏感性。公式 b x b_x bx = σ \sigma σ( t x t_x tx) + c x c_x cx, b y b_y by = σ \sigma σ( t y t_y ty) + c y c_y cy , c x c_x cx和 c y c_y cy为整数,被YOLOv3用来评估目标坐标,那么,绝对值特别高的 t x t_x tx会使得 b x b_x bx接近 c x c_x cx或者 c x + 1 c_x + 1 cx+1的值。解决网络敏感性问题通过对sigmoid函数乘以一个大于1.0的常数来解决,以解决一些目标因网格敏感而不可检测的问题;
- M:Mosaic数据增强,在训练中使用4张图片组成mosaic代替单张图片;
- IT:IoU阈值,对于一个ground truth使用IoU (truth, anchor) > IoU threshold的多个anchor进行检测;
- GA:遗传算法,在训练的前10%步数,使用遗传算法选择最优超参数;
- LS:Class label smoothing,对sigmoid激活函数使用class label smoothing算法;
- CBN:CmBN,使用Cross mini-Batch Normalization在整个batch中进行统计而不是单个mini-batch中;
- CA:Cosine annealing学习策略, 在sinusoid训练中调整learning rate
- DM:动态mini-batch size,在random training shapes中,小分辨率时自动增加mini-batch size大小;
- OA:优化Anchors,使用
512x512
分辨率训练时,使用优化的anchors; - GIoU, CIoU, DIoU, MSE: 边框回归时,使用不同的损失函数。
验证了对于不同Bag-of-Specials,包括 PAN,RFB,SAM,Gaussian YOLO(G),及ASFF对检测精度的影响,认为SPP,PAN,和SAM对检测精度有提高。
S | M | IT | GA | LS | CBN | CA | DM | OA | loss | AP | AP50 | AP75 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
MSE | 38.0% | 60.0% | 40.8% | |||||||||
x | MSE | 37.7% | 59.9% | 40.5% | ||||||||
√ | MSE | 39.1% | 61.8% | 42.0% | ||||||||
x | MSE | 36.9% | 59.7% | 39.4% | ||||||||
√ | MSE | 38.9% | 61.7% | 41.9% | ||||||||
x | MSE | 33.0% | 55.4% | 35.4% | ||||||||
√ | MSE | 38.4% | 60.7% | 41.3% | ||||||||
√ | MSE | 38.7% | 60.7% | 41.9% | ||||||||
x | MSE | 35.3% | 57.2% | 38.0% | ||||||||
√ | GIoU | 39.4% | 59.4% | 42.5% | ||||||||
√ | DIoU | 39.1% | 58.8% | 42.1% | ||||||||
√ | CIoU | 39.6% | 59.2% | 42.6% | ||||||||
√ | √ | √ | √ | CIoU | 41.5% | 64.0% | 44.8% | |||||
x | x | CIoU | 36.1% | 56.5% | 38.4% | |||||||
√ | √ | √ | √ | √ | MSE | 40.3% | 64.0% | 43.1% | ||||
√ | √ | √ | √ | √ | GIoU | 42.4% | 64.4% | 45.9% | ||||
√ | √ | √ | √ | √ | CIoU | 42.4% | 64.4% | 45.9% |
从上表的前9行可以看出,训练使用的trick,单独的消除网格敏感性,IoU阈值,label smoothing和动态mini-batch size对检测mAP的提高没有帮助,label smoothing这个方法对图像分类的准确率有提高,而对目标检测并没有效果;从第10到第12行可以看出,使用GIOU、DIOU、CIOU损失函数对0.5mAP没有提高,但是对0.5:0.95mAP和0.75mAP有所提高;从第13和第14行可以看出,单独使用CIOU损失函数对mAP的提高没有帮助,加上消除网格敏感性,Mosaic数据增强,IoU阈值和遗传算法后,CIOU损失函数可以提高mAP;从第15到第17行可以看出消除网格敏感性,Mosaic数据增强,IoU阈值、遗传算法和优化Anchors几个tirck结合,即使使用MSE函数对检测mAP也是有提高的,加上GIOU和CIOU损失函数,对mAP提高的效果更明显,CIOU和GIOU对mAP提高的结果相同(PS:这两个结果完全相同,未免有点儿太巧了,悄咪咪地说。。。)。
Model | AP | AP50 | AP75 |
---|---|---|---|
CSPResNeXt50-PANet-SPP | 42.4% | 64.4% | 45.9% |
CSPResNeXt50-PANet-SPP-RFB | 41.8% | 62.7% | 45.1% |
CSPResNeXt50-PANet-SPP-SAM | 42.7% | 64.6% | 46.3% |
CSPResNeXt50-PANet-SPP-SAM-G | 41.6% | 62.7% | 45.0% |
CSPResNeXt50-PANet-SPP-ASFF-RFB | 41.1% | 62.6% | 44.4% |
在表5中表明,以表4中加了BoF的最佳结果为baseline,加了SAM结构的网络对检测mAP有提高,而同时使用SAM和Gaussian YOLO时对CSPDarknet53-PANet-SPP网络检测的mAP并没有提高,对CSPDarknet53-PANet-SPP的mAP作者还在实验中,见https://github.com/AlexeyAB/darknet/issues/5341。
4.4 不同骨干网络和预训练模型对检测的影响
(所有模型训练参数相同)
Model (with optimal setting) | Size | AP | AP50 | AP75 |
---|---|---|---|---|
CSPResNeXt50-PANet-SPP | 512x512 | 42.4 | 64.4 | 45.9 |
CSPResNeXt50-PANet-SPP(BoF-backbone) | 512x512 | 42.3 | 64.3 | 45.7 |
CSPResNeXt50-PANet-SPP(BoF-backbone+Mish) | 512x512 | 42.3 | 64.2 | 45.8 |
CSPDarknet53-PANet-SPP(BoF-backbone) | 512x512 | 42.4 | 64.5 | 46.0 |
CSPDarknet53-PANet-SPP(BoF-backbone+Mish) | 512x512 | 43.0 | 64.9 | 46.5 |
从上表中可以看出,在相同分辨率条件下,使用了BoF训练的CSPResNeXt50-PANet-SPP的ImageNet预训练模型对检测效果的提高没有帮助,反而使得检测效果有所下降。而使用了BoF训练的CSPDarknet53-PANet-SPP预训练模型对检测精度的提高有所帮助,加上Mish激活函数后,在512x512分辨率下,检测效果达到了最好。作者认为,虽然CSPDarknet53在ImageNet分类上不如CSPResNeXt50的效果好,加了各种trick后CSPDarknet53的检测效果比CSPResNeXt50效果好,说明CSPDarknet53是一个适合检测的网络。
4.5 不同mini-batch size对检测的影响
Model (without OA) | Size | AP | AP50 | AP75 |
---|---|---|---|---|
CSPResNeXt50-PANet-SPP(without BoF/BoS, mini-batch 4) | 608 | 37.1 | 59.2 | 39.9 |
CSPResNeXt50-PANet-SPP(without BoF/BoS, mini-batch 8) | 608 | 38.4 | 60.6 | 41.6 |
CSPDarknet53-PANet-SPP(with BoF/BoS, mini-batch 4) | 512 | 41.6 | 64.1 | 45.0 |
CSPDarknet53-PANet-SPP(with BoF/BoS, mini-batch 8) | 512 | 41.7 | 64.2 | 45.2 |
从上表中可以看出,CSPResNeXt50-PANet-SPP在不使用BoF和BoS时,mini batch为4和mini batch为8最终得到的mAP结果是有差别的,mini batch越大,检测效果越好;而CSPDarknet53-PANet-SPP在使用了BoF和BoS后,mini batch为4和mini batch为8的检测精度接近,说明mini batch的大小对检测精度的没有影响,作者认为,这样任何人都可以使用一张GPU来训练一个完美的检测模型。(PS:突然觉得作者可以试一下Group Norm,因为训练Faster RCNN时一张卡上的batch size是2)
5 结果
经过实验,与其他最新目标检测模型的结果比较,YOLOv4位于帕累托的最优曲线上,在速度和精度方面都优于最快和最精确的目标检测模型。
由于不同的算法使用不同架构的GPU进行推理时间验证,作者在Maxwell、Pascal和Volta架构的常用GPU上运行了YOLOv4,并与其他最新方法进行了比较,结果列在了论文的表8~表10中。
6 结论
作者提出了一个在COCO数据集上的又快又准的检测模型,检测模型可以在8~16GB的GPU上进行训练,并且验证了很多深度学习的训练trick对分类网络和检测网络的影响。
7 致谢
感谢Glenn Jocher提供了mosaic数据增强算法,使用遗传算法选择超参数以及解决了grid sensitivity问题,Glenn Jocher的代码位置在https://github.com/ultralytics/yolov3。
参考文献
见论文原文