YOLO v4

Optimal Speed and Accuracy of Object Detection

🔗 PDF Link 🍺 Github Code
You Only Look Once 系列续杯🍺

Section 1 介绍

主要贡献如下:

  1. 发布了一个超高效但是强大的检测模型,使得所有人都可以使用1080Ti或者2080Ti训练模型。
  2. 验证了BoF和BoS方法在训练时候的作用。
  3. 修改了SOTA的方法,让CBM,PAN,SAM更高效,更适合单GPU训练。

Section 2 相关工作

2.1 物体检测模型

  • 常用的GPU检测模型基于VGG,ResNet,ResNeXt和DenseNet,在CPU上的建模模型基于SqueezeNet,MobileNet和ShuffleNet。最后在检测网络的头部,通常分为One-stage和Two-stage。
    • Two-stage的常有R-CNN系列,R-FCN和Libra R-CNN,同时也有ankor-free的two-satge,如 RepPoints。
    • One-stage代表就是YOLO,SSD和RetinaNet,对应也有ankor-free的方法,如CenterNet,CornerNet,FCOS。
  • 近期的检测工作常常在head和backbone之间插入几层(叫做neck),常见的方法如FPN,PAN,BiFPN,NAS-FPN。
  • 另外的一些工作则是把工作重心放在backbone的升级上,如DetNet,DetNAS;或者是整个网络的升级上,如SpineNet和HitDetector。

总的来说大致如下边所示:

Input Backbones Neck.Additional blocks Neck.Path-aggregation blocks Heads.Dense Prediction(One stage) Heads.Sparse Prediction(Two stage)
Image VGG16 SPP FPN Ankor based Ankor based
Patches ResNet-50 ASPP PAN RPN Faster R-CNN
Image Pyramid SpineNet RFB NAS-FPN SSD R-FCN
EfficientNet-B0/B7 SAM Fully-connected FPN YOLO Mask RCNN
CSPResNeXt50 BiFPN RetinaNet Ankor free
CSPDarknet53 ASFF Ankor free RepPoints
SFAM CornerNet
CenterNet
MatrixNet
FCOS

2.2 Bag-of-freebies

DEF:在训练的时候增加计算量

  1. 最常被采用,也是最符合定义的一种方法就是数据增强。
    ⭐例如光畸变和几何畸变的方法,属于pixel-wise的调整,在调整区域里面所有的原始像素均保留不变。
    ⭐例如随机擦除,切除一部分区域填0等方法,属于模拟对象遮挡的方法。类似的方法还是有,hide-and-seek以及grid mask。这类方法应用于特征图的时候,被称为DropOut,DropConnect和DropBlock。
    🔥此外还有利用融合多张图片来生成一张图片的方法MixUp。类似还有CutMix,通过剪裁一部分图片拼接起来。最后,还有利用style transfer GAN来做增强的,其核心的作用在于能够减少CNN在训练时候的texture bias。
  2. 另一种与上面不同的方法是在于去解决数据集中语义分布偏差的问题,例如数据不平衡。 🔥简单的two-stage的解决方案是hard negative mining和online-hard-example-maining。 🔥但是这种方法不适合one stage的方法,因为这种方法属于dense prediction结构。在one stage中的一个解决方案是focal loss。
    🔥另一个问题在于标签之间的关联性,因此就有标签平滑的方法。
  3. 目标边框回归函数。单独的处理回归框的坐标实际上是把坐标当作了一个独立的个体来看的,忽略了物体。 🌟采用IoU损失函数,可以将其与label联系起来,同时避免了采用\(l1\),\(l2\)损失时候产生的距离尺度不一致的情况。例如GIoU,DIoU,CIoU。

2.3 Bag-of-specials

与前面提到的Bof相反的一种是Bos,从定义上看是指增加一部分Inference部分的计算成本,从而提升性能的方法。

  1. 增大感受野。常用的方法有SPP,ASPP,和RFB。
  2. 注意力机制。通常分为channel-wise和point-wise两种,各自的典型代表是Squeeze-and-Excitation和Spatial Attention Module(SAM)。
  3. 特征集成。早期常用的方法是skip connection或者是hyper-column来整合低层次的特征到深层次的语义特征中去。随着多尺度(FPN)的流行,逐渐的开始使用如SFAM,ASFF,BiFPN的方法。
  4. 激活函数。ReLU解决了梯度消失,然后就有了LReLU,PReLU,ReLU6,SELU,Swish等方法。
  5. 后处理。最常用的就是NMS了,改进之后有DIoU NMS。

Section 3 方法

3.1. Selection of architecture

这个部分实际上就是在分辨率卷积层数卷积核个数之间找参数-性能的平衡点。
简单来看,分类问题上最佳的模型并非能在检测问题上去的比较好的性能表现,简单来说需要有以下几个条件:

  1. 提高输入图像的分辨率,更好的解决小目标检测问题。
  2. 提高卷积层数,从而获得更大的感受野。
  3. 更多的参数,从而减少漏检。

假设可以使用更大的感受野和更多的参数作为backbone,那么下表告诉我们应该选择CSPDarkNet。

Backbone model Input network resolution Receptive field size Parameters Average size of layer output (WxHxC) BFLOPs (512x512 network resolution) FPS (GPU RTX 2070)
CSPResNext50 512x512 425x425 20.6 M 1058 K 31 (15.5 FMA) 62
CSPDarknet53 512x512 725x725 27.6 M 950 K 52 (26.0 FMA) 66
EfficientNet-B3 (ours) 512x512 1311x1311 12.0 M 668 K 11 (5.5 FMA) 26

接着说感受野。不同的感受野对检测的影响大致如下所示:

  1. 对象大小,可以探查到整个对象。
  2. 网格大小,可以探查对象的上下文信息。
  3. 超过网格大小,可以增加当前图像点与最终激活之间的联系(?)

总的来讲,YOLOv4就是在CSPDarknet53(backbone)上加入SPP模块,加入PANet和anchor based的YOLOv3的head部分。

3.2. Selection of BoF and BoS

为了提升性能表现,CNN的训练通常有以下一堆改进措施。

  1. 激活函数(PReLU和SELU训练麻烦的一比,ReLU6是用来做量化的,因此不同这俩)
  2. BBox的回归损失
  3. 数据增强
  4. 正则化(DropBlock文章已经对于比了其他的方法,并且发现won a lot,毫不犹豫选这个)
  5. 归一化方法(单GPU训练,别的syncBN想都不想)
  6. 跨层次连接

3.3. Additional improvements

  1. 提出了一套新的数据增强方法Mosaic and Self-Adversarial Training(SAT)
    Mosaic融合了4张训练图像,而对比CutMix只混合了两张图像。这样可以使得被检测物体脱离其在数据集中的常见位置,获得更多其他场景下的上下文信息。BN也因此被用于4张图像了,这就减少了对大batch-size的需求。
    SAT:自对抗训练也是一种数据增强技术,分为两个阶段。在第一个阶段中,改变原始图像而非权重。这样可以实现了一种对抗攻击,制造一种假象,即原始图像中没有检测目标。在第二个阶段中,在改变后的图像上进行正常训练。(⭐卧槽,花里胡哨的)

  2. 遗传算法上选了最优超参数(?)

  3. 改进了SAM,PAN,还有Cross mini-Batch Normalization(CmBN)。
    SAM,将其从spatial attention改为point attention

PAN,将其从addtion替换成了concatenation。

CmBN,即对CBN的改进,修改为仅在一个独立batch里面的mini-batches进行BN参数的计算。

3.4. YOLOv4

简单来看,YOLOv4有以下几个部分组成。

  • BackBone: CSPDarknet53
  • Neck:SPP+PAN
  • Head:YOLOv3

具体用到了:

  1. Backbone里用了BoF:CutMix+Mosaic数据增强,DropBlock正则化,类别平滑。
  2. Backbone里用了BoS:Mish激活函数,Cross-stage(CSP) partial connections,Multi-input weighted residual connections(WiWRC)。
  3. Detector里用了BoF:CIoU损失函数,CmBN,DropBlock正则化,Mosaic数据增强,SAT训练策略,Eliminate grid sensitivity,单标签多anchor,Cosine annealing scheduler,最优超参数,随机训练shapes。(⭐一堆问号,有几个那都是啥)
  4. Detector里用了BoS:Mish激活函数,SPP,SAM,PAN,DIoU-NMS。

Section 4 实验

分类在ImageNet上,检测在COCO上。

4.1. Experimental setup

  1. 在ImageNet的分类任务上,超参数设置如下: 步数:8000000;batchsize+mini-batch:128+32;lr=0.1;多项式衰减学习速率策略;预热步数:1000;momentum:0.9;weight decay:0.005;在所有的BoF中采用一致的参数,BoF上增加50%的训练步数。
  2. 在COCO检测任务上, 步数:500500;步进衰减学习速率策略,在400000和450000的时候降低为10%;预热步数:1000;momentum:0.9;weight decay:0.0005;单GPU训练batchsize:64;mini-batch是8/4;采用遗传算法搜索超参数的实验除外,其余都采用默认设置。

4.2. Influence of different features on Classifier training

探究不同特征对分类器训练的影响。
下表是针对CSPResNeXt-50的实验结果表:

MixUp CutMix Mosaic Bluring Label Smoothing Swish Mish Top-1 Top-5
77.9% 94.0%
x 77.2% 94.0%
x 78.0% 94.3%
x 78.1% 94.5%
x 77.5% 93.8%
x 78.1% 94.4%
x 64.5% 86.0%
x 78.9% 94.5%
x x x 78.5% 94.8%
x x x x 79.8% 95.2%

下表是针对CSPDarknet-53的实验结果表:

MixUp CutMix Mosaic Bluring Label Smoothing Swish Mish Top-1 Top-5
77.2% 93.6%
x x x 77.8% 94.4%
x x x x 78.7% 94.8%

4.3. Influence of different features on Detector training

进一步探究BoFs对Detection的训练的影响。 设定缩写如下: S:Eliminate grid sensitivity (通过施加sigmoid来减少不可检测的grid) M:Mosaic 数据增强
IT:IoU threshold
GA:Genetic algorithms
CBN:CmBN
CA:Cosine annealing scheduler
DM:Dynamic mini-batch size
OA:Optimized Anchors
GIoU,CIoU,DIoU,MSE

具体的实验结果表如下:

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%
x MSE 39.1% 61.8% 42.0%
x MSE 36.9% 59.7% 39.4%
x MSE 38.9% 61.7% 41.9%
x MSE 33.0% 55.4% 35.4%
x MSE 38.4% 60.7% 41.3%
x MSE 38.7% 60.7% 41.9%
x MSE 35.3% 57.2% 38.0%
x GIoU 39.4% 59.4% 42.5%
x DIoU 39.1% 58.8% 42.1%
x CIoU 39.6% 59.2% 42.6%
x x x x CIoU 41.5% 64.0% 44.8%
x x x CIoU 36.1% 56.5% 38.4%
x x x x x MSE 40.3% 64.0% 43.1%
x x x x x GIoU 42.4% 64.4% 45.9%
x x x x x CIoU 42.4% 64.4% 45.9%

具体的消融实验结果如下表所示:

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%

4.4. Influence of different backbones and pretrained weightings on Detector training

不同的backbone对检测器的性能也是有影响的,正如前文提到的一句,最佳分类性能的模型并非在检测问题上也有最佳性能。

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

虽然可以发现的是,CSPResNet50在分类问题上能取得更高的准确率,但是实际上,这个与训练模型在检测问题上后者的性能更强。另外一个有意思的是,BoF和Mist都能在分类问题上提升准确率,但是在检测问题上反而降低了。

4.5. Influence of different mini-batch size on Detector training

传统来看batch size应该是越大越好,但是下表给出的结果表明,batch size的大小实际对结果的影响并不明显,前提是在引入了BoF和BoS之后。因此,YOLOv4的训练也就不再依赖于高贵的GPU了~

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

Section 5 结果

看图说话! 不同显卡架构下的性能表现有一对表格,不在这里展示了,可以去看文章。

Section 6 结论

YOLOv4极富实践意义。