这篇文章的贡献如下:
YOLOv4 使用了以下特征组合:
根据上图,对于目标检测器的结构分类如下:
Input |
Image, Patches, Image Pyramid |
|
Backbones |
VGG16 [68], ResNet-50 [26], SpineNet[12], EficientNet-B0/B7 [75], CSPResNeXt50 [81],CSPDarknet53 [81] |
|
Neck |
Additional blocks |
SPP [25], ASPP [5], RFB[47], SAM [85] |
Path-aggregation blocks |
FPN [44], PAN [49],NAS-FPN [17],Fully-connected FPN, BiFPN[77], ASFF [48], SFAM [98] |
|
Heads |
Dense Prediction (one-stage) |
RPN [64], SSD [50], YOLO [61], RetinaNet[45] (anchor based),CornerNet [37], CenterNet [13], MatrixNet[60], FCOS [78] (anchor free) |
Sparse Prediction (two-stage) |
Faster R-CNN [64], R-FCN [9], Mask R-CNN [23] (anchor based),RepPoints [87] (anchor free) |
作者把所有的调优手段分为了两大类“Bag of freebies(免费礼包)”和“Bag of specials(特价包)”
免费包(Bag of freebies,BOF)
是指在离线训练阶段为了提升精度而广泛使用的调优手段,而这种技巧并不在预测中使用,不会增加预测时间。即:只是改变训练策略或者增加训练代价的方法。
数据类 |
数据增强:random erase/CutOut/hide-and-seek/grid mask/MixUp/CutMix/GAN |
数据分布:two-stage的有example mining,one-stage的有focal loss |
|
特征图类 |
DropOut/DropConnect/DropBlock |
边界框回归损失 |
MSE/ IoU loss/l1、l2 loss/GIoU loss/DIoU loss/CIoU loss |
特价包(Bag of Specials,BOS)
对于那些仅增加少量推理成本,却能显著提高目标检测精度的插件模块和后处理方法,称之为“特价包”。插件模块是为了提高模型中的某一属性,扩大感受野、引入注意力机制、增强特征集成能力和激活函数;后处理是为了筛选模型预测结果。
插件模块 |
增大感受野 |
SPP/ASPP/RFB |
注意力 |
Squeeze-and-Excitation (SE)/Spa-tial Attention Module (SAM) |
|
特征集成 |
SFAM/ASFF/BiFPN |
|
激活函数 |
ReLu/LReLU/PReLU/ReLU6/Scaled ExponentialLinear Unit (SELU)/Swish/hard-Swish/Mish |
|
后处理类 |
soft NMS/DIoU NMS |
Backbone: |
CSPDarknet53 |
Neck: |
SPP[25], PAN |
Head: |
YOLOv3 |
具体而言,YOLO v4 使用了:
架构选择
作者选择架构主要考虑几方面的平衡:输入网络分辨率/卷积层数量/参数数量/输出维度。
一个模型的分类效果好不见得其检测效果就好,想要检测效果好需要以下几点:
最终YOLOv4的架构:
BoF(免费礼包)和BoS(特价包)的选择
其他改进
为了使设计的检测器更适合于单GPU上的训练,作者做了如下的附加设计和改进:
马赛克数据增强(Mosaic data augmentation)
作者是基于CutMix做的改进,将4张训练图片混合成一张的新数据增强方法,这样可以丰富图像的上下文信息。标签是根据所占面积大小给与. 这种做法的好处是允许检测上下文之外的目标,增强模型的鲁棒性。此外,在每一层从4个不同的图像批处理标准化计算激活统计,这大大减少了对大mini-batch处理size的需求。
自对抗训练(Self-Adversarial Training,SAT)
这是一种新的数据扩充技术,该技术分前后两个阶段进行。
DropBlock 正则化(DropBlock regularization)
类标签平滑(Class label smoothing)
[0, 0, 1] —> [0.01, 0.01, 0.98]
[…]·(1-a) + a/n·[1,1…,1]
Eg:a = 0.03 class num = 3,
[0,0,1]*(1-0.03) + 0.03 / 3 *[1,1,1] = [0.01,0.01,0.98]
CIoU 损失(CIoU-loss)
DIoU-NMS
跨小批量标准化(Cross mini-Batch Normalization,CmBN)
1、Batch Normalization
BN我们都知道他主要由四个参数:均值,方差,和两个重构参数γ、β。在每一次的前向传播中,他会收集mini-batch的均值和方差,通过均值和方差去学习γ和β,从而重构一个原始网络的分布,保证后层数据输入的一直性。一般情况下使用BN,可以增加学习率,进而使训练的速度得到提升等优点[1]。
2、Cross-Iteration Batch Normalization
CBN是去估计几个连续batch的统计参数。
1.背景
还是为了解决BN在小batchsize时效果不好的问题
2.CBN
(1)作者认为连续几次训练iteration中模型参数的变化是平滑的
(2)作者将前几次iteration的BN参数保存起来,当前iteration的BN参数由当前batch数据求出的BN参数和保存的前几次的BN参数共同推算得出(顾名思义 Cross-Interation BN)
(3)训练前期BN参数记忆长度短一些,后期训练稳定了可以保存更长时间的BN参数来参与推算,效果更好
3.我个人的理解:
可以将CBN粗糙地总结为 “前几次训练的BN(LN/GN应该都可以)参数” + 当前batch数据计算的BN(LN/GN)参数 来计算得出当前次训练iteration真正的CBN参数。
3、Cross mini-Batch Normalization,CmBN
最终论文中结合了BN和CBN方法。它只收集单个批次中的小批次之间的统计信息。这样做的好处是可以在batch size比较小的情况下维持精度在一个合理的范围下。同时这样做也是为了论文中提到的适合单卡GPU训练。
网格消除敏感(Eliminate grid sensitivity)
通过将sigmoid乘以一个超过1.0的因子来解决这个问题
模拟余弦退火(Cosine annealing scheduler)
这是针对学习率的。
Mish激活(Mish activation)
Mish=x * tanh(ln(1+e^x)) |
理论上对负值的轻微允许允许更好的梯度流,而不是像ReLU中那样的硬零边界。
平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化。
跨阶段部分连接(Cross-Stage-Partial-connection,CSP)
CSPNet可以大大减少计算量,提高推理速度和准确性
一部分经过密集块和过渡层,另一部分与传输的特征映射结合到下一阶段
空间金字塔池化(Spatial Pyramid Pooling,SPP)
不管输入尺寸是怎样,SPP层 可以产生固定大小的输出 ,用于多尺度训练
Spatial Attention Module,SAM
作者基于原先的SAM进行了改进。
原先的:不仅在通道上加上了SE注意力机制,在空间上也加入了SE注意力机制
图b作者修改后的,SE结构变成了先进行卷积,在进行sigmoid,然后和原始的特征进行点点相乘。从空间注意力机制(spatial-wise attention)修改为点注意力机制(point-wise attention)
路径聚合网络(Path Aggregation Network,PAN)
PAN基于FPN和Mask RCNN模型之上提出了三点创新:
1、PANet改进了主干网络结构,加强了特征金字塔的结构,缩短了高低层特征融合的路径
2、提出了更灵活的RoI池化。之前FPN的RoI池化只从高层特征取值,现在则在各个尺度上的特征里操作;
3、预测mask的时候使用一个额外的fc支路来辅助全卷积分割支路的结果。
PANet在COCO 17实例分割竞赛中取得了第一名的成绩,在检测任务中取得了第二的成绩。
下图展示PANet的细节:
由原来的addition对其修改为级联(concatenation)
TODO.....