目前有很多算法可以提高CNN的准确性。在大量数据集上结合这些算法进行实际测试、在实验结果上理论的验证是十分必要的。一些算法操作单一针对特定的模型、或者特定的问题、又或者小规模的数据集 有效;有些算法适用于大多数模型、任务、数据集,例如批量归一化(batch-normalization)和 残差连接(residual-connections)。
我们认为这样的通用算法包括:【Weighted-Residual-Connections (WRC)】、 【Cross-Stage-Partial-connections (CSP)】、【Cross mini-Batch Normalization (CmBN)】、【Self-adversarial-training (SAT)】、【Mish-activation】。
我们使用新的算法:【WRC】、【CSP】、【CmBN】、【SAT】、【Mish activation】、【Mosaic data augmentation】、【CmBN】、【DropBlock regularization】、【CIoU loss】 以及他们的组合。
达到了最优的效果:COCO数据集上的 43.5 % A P 43.5\% AP 43.5%AP( 65.7 % A P 50 65.7\% AP_{50} 65.7%AP50),在特斯拉V100上的实际推理速度为 65FPS
基于CNN的目标检测大多数只使用推荐系统。例如,通过城市相机 寻找免费停车位置的系统,使用的是慢速的准确的模型;在汽车碰撞警告上使用的是快速低精度的模型。提高实时目标检测的精度,不仅能够应用在推荐系统上,还有独立的流程管理,以及减少人员数量上。实时目标检测操作在传统的 GPU 上,允许开发人员在一个可以负担起的价格 大量使用GPU。
最准确的神经网络不是实时运行的,而是要求使用多个GPUs来训练更大的mini-batch-size。我们通过创建一个在传统的GPU上实时运行的CNN来解决这些问题,它只需要在一块GPU上进行训练。
这项工作的主要目的是 设计在实际工作环境中的一个快速运行的目标检测器,并且能够平行计算,而不是去完成 低计算量理论指示器(BFLOP)。我们希望设计的检测器方便训练和使用。就如任何一人使用常见的GPU来训练和测试就可以达到实时、高质量、更信服的目标检测结果。如图1中展示的YOLOv4的结果。我们的贡献如下:
2.1 目标检测模型
一个检测器一般是由两部分构成:backbone 和 head。backbone是在ImageNet上预训练的,head用作预测分类和目标的边界框。
backbone:
对于这些在GPU上运行的检测器,它们的backbone可能是 VGG,ResNet,ResNeXt,DenseNet。
对于运行在CPU上的检测器,backbone可能是 SqueezeNet、MobileNet、ShuffleNet。
head:
至于head部分,通常被分为两类:one-stage 和 two-stage。two-stage目标检测器的代表是 R-CNN 系列:fast R-CNN、faster R-CNN、R-FCN、Libra R-CNN。还有基于 anchor-free 的two-stage,例如 RepPoints。one-stage目标检测的代表模型为 YOLO、SSD、RetinaNet。近几年,基于 anchor-free 的 one-stage得到了发展,比如:CenterNet、CornerNet、FCOS等。
neck:
最近几年,目标检测经常会在backbone和head之间添加一些层,这些层用来收集不同阶段的特征图。我们称之为目标检测器中的 neck。通常,neck由多个bottom-up路径和top-down路径组成。具有这种机制的网络:【特征金字塔网络(Feature Pyramid Network, FPN)】、【路径聚合网络(Path Aggregation Network, PAN)】、【BiFPN】、【AS-FPN 】
else:
除了上面的网路,一些学者将重点放在为目标检测器 直接构建新的backbone(DetNet、DetNAS)或者一个新的完整的模型(SpineNet、HitDetector)。
综上所述,一个普通的目标检测是由以下4部分组成:
- Input:Image, Patches, Image Pyramid
- Backbones: VGG16、ResNet-50 、 SpineNet、EfficientNet-B0/B7、CSPResNeXt50 、CSPDarknet53
- neck:
- Additional blocks:SPP、ASPP、RFB、SAM
- Path-aggregation blocks:FPN、PAN、NAS-FPN、Fully-connected FPN、BiFPN、ASFF、SFAM
- Heads:
- Dense Prediction (one-stage):
anchor based:RPN、SSD、YOLO、RetinaNet
anchor free:CornerNet、CenterNet、MatrixNet、FCOS- Sparse Prediction (two-stage):
anchor based:Faster R-CNN、R-FCN、Mask RCNN
anchor free:RepPoints
2.2 Bag of freebies
通常的,一个普通的目标检测器是离线训练的。因此,研究者喜欢利用这个优势,开发更好的训练方法,使目标检测器在不增加推理成本的情况下获得更好的精度。我们把这种 只会改变训练策略或只会增加训练成本的方法称之为“bag of freebies”
bag of freebies:字面意思就是“免费赠品”。在这里就是指,用一些比较有用的训练技巧来训练模型,从而使得模型获得更好的准确率但不增加模型的复杂度,也就不会增加推理的计算量。
2.2.1 数据增强(Data augmentation)。
像素级别的调整,它保留了调整区域的所有原始像素信息。
目的是增加图片的可变性,使得目标检测模型对不同场景下获取的图片有更高的鲁棒性。
几何增强(geometric distortions):尺度变化,裁剪,翻转、旋转
色彩增强(photometric distortions ):亮度、对比度、色调、饱和度、噪声
模拟目标物体遮挡问题。
- 随机选择图像上的矩形区域,然后进行随机融合或者使用零像素值来进行融合(random erase、CutOut)
- 随机地或者均匀地在一幅图像中选择多个矩形区域,并且使用零来代替矩形区域中的像素值(hide-and-seek、grid mask)
- 相同的裁剪矩形并填充的概念放在 heatmap上(DropOut、DropConnect、DropBlock)
其他
MIX-UP:使两张图片使用不同的系数比进行叠加,然后使用它们的叠加比来调整标签
例:分类任务:A*0.1+B*0.9=C,C的lable为 [0.1A,0.9B]。目标检测任务:将一些框相加,这些label中就多了一些不同置信度的框CutMix:将裁剪后的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签
style transfer GAN:也可以用来做数据增强,让CNN学习如何有效的见减少纹理的偏差。
2.2.2 数据不均衡问题(imbalance problems in object detection)。
不同类别之间存在数据不平衡:
- 在 two-stage 目标检测器中,通常使用hard negative example mining 或者 online hard example mining。
- 在 one-stage 目标检测器中,常用算法就是 Focal-loss。
- 使用 one-hot 很难描述不同类别之间关联度的关系。将 hard label 转换成 soft label,使得模型更加鲁棒
2.2.3 设计边界框回归的目标函数。
- 均方根(MSE):传统的目标检测器的损失函数。在Bbox的中心坐标以及宽高上直接回归,或者左上角和右下角的两个点。
- anchor-based 方法:去预测相应的 offset
但是预测 Bbox 每个点的坐标值,是将这些点作为独立的标量,但实际上并没有将目标物体当做一个整体进行预测。
为了更好的解决这个问题,一些研究者最近提出了IOU损失函数,以及提高 IOU损失函数的方法:
- IOU 损失函数:它能够将 Bbox 区域和 ground truth 的Bbox 区域 作为整体进行考虑。IOU损失函数需要计算Bbox四个坐标点以及与 ground truth的IOU。因为IOU具有尺度不变性,他可以解决传统算法( L 1 , L 2 L_1,L_2 L1,L2损失)计算{x,y,w,h}存在的问题,这个损失函数会随着尺度的变化而变化。
- GIOU:考虑了覆盖范围、目标物体的形状和坐标。他们提出了寻找预测的Bbox和GT的Bbox的封闭区域的Bbox,然后使用这个Bbox最为坟墓去代替雨来的IOU损失函数中的分母。
- DIOU:额外考虑了目标物体的中心距离。
- CIOU:将覆盖区域、中心点距离和纵横比都考虑在内。
其中 CIOU 在Bbox 回归问题上可以获得最好的收敛速度和准确率
2.3 Bag of specials
Bag of specials:指一些插件模块(plugin modules)和后处理方法(post-processing methods),它们只稍微增加了推理成本,但可以极大的提高目标检测的准确度。一般来说,
- 这些插件用来提高一个模型中的特定属性。比如增加感受野( SPP、ASPP、 RFB),引入注意力机制(spatial attention、channel attention),提高特征整合的能力(FPN、ASFF、BiFPN)。
- 后处理方法:抑制模型预测结果
2.3.1 提升感受野
常用的常规方法有:SPP、ASPP、RFB。
- SPP模型来源于空间金字塔匹配(SPM),而且SPMs原始的方法将特征图划分为很多的 d ∗ d d*d d∗d个相等的块,其中 d ∈ 1 , 2 , 3.. d\in{1,2,3..} d∈1,2,3..。因此可以形成空间金字塔,然后提取 bag-of-word 的特征。
SPP将SPM应用在CNN中,然后使用 maxpooling 代替 bag-of-word运算。
SPP输出是一维的特征向量,因此不能应用在全卷积网络(FCN)中。
在 YOLOv3 中,作者改进了 SPP 模块,将maxpooling 输出 和内核储存 k ∗ k k*k k∗k 连接起来,其中 k ∈ 1 , 5 , 8 , 13 , s t r i d e = 1 k\in{1,5,8,13}, stride=1 k∈1,5,8,13,stride=1。基于这个设计一个相对较大的 k ∗ k k*k k∗k 的maxpooling有效的提高了backbone特征的感受野。基于改进后的SPP之上的YOLOv3-608,在COCO数据集上测试,增加了 0.5% 的额外的计算量,但提高了2.7% 的 AP50。- ASPP模块 与改进的SPP模块的区别:改进的SPP为原始的kernel size= k x k kxk kxk stride=1过滤器尺寸,ASPP在SPP前面加了 dilated ratio=k,stride=1的空洞卷积。
- RFB模块是利用k×k核的几个空洞卷积,dilated ratio=k,stride=1,获得比ASPP更全面的空间覆盖。RFB只需要额外7%的推断时间,就可以将MS COCO上的SSD的AP50提高5.7%。
2.3.2 注意力机制
- channel-wise attention:代表为 Squeeze-and-Excitation(SE)。SE模块在 ImageNet 图像分类工作上增加了 2%的计算量,但提高了 1%的 top1的准确率。同时在GPU上的推理时间增加了 10%,所以它更适合移动端。
SE的原理简述:在featuremap层中同时引入一个 1 × 1 × C 1×1×C 1×1×C 的weights,这样对每个channel上的特征加上不同的权重,以此来提高特征学习能力。- point-wise attention:代表为 Spatial Attention Module (SAM)。它仅仅需要0.1%的额外计算量却能够提升ResNet-SE 0.5%的top-1准确率。在GPU上并没有有效地影响推理速度。
- Channel+Spatial:一个featuremap的维度:NCHW,N:batch size,C:channel,H:height,W:weight。Channel attention 和spatial attention 是从两个不同的方法对feature进行增强。
2.3.3 特征融合
- Skip connection:用在encoder-decoder中比较多,例如最经典的Unet,融入了low-level和high-level的信息,在目标检测中主要用在了类似于pose这一类的检测任务中,例如DLA,Hourglass,以及最近的CenterNet
- hyper-column:最经典的就要属于InceptionV1-4结构了,使用不同的kernel-size的convolution来集成特征。
- SFAM, ASFF和BiFPN:
SPAM:主要思想是在多尺度连接特征图上使用 channel-wise 级别的调整。
ASFF:它使用 softmax 作为 point-wise级别的调整,然后将不同尺度的特征加在一起。
BiFPN:提出了多输入权重残差连接去执行scale-wose级别的调整,然后就不同储存的特征图加在一起。
2.3.4 激活函数
一个优秀的激活函数能让梯度更有效的传播,同时不会增加额外的计算量。RuLU之后 LReLU、PReLU、ReLU6、Scale的Exponential Linear Unit(SELU)、Swish、hard-Swish、Mish。
- ReLU:充分的解决了梯度消失的问题(该问题在传统的 tanh 和 sigmoid 激活函数中进场遇到)。
- LReLU、PReLU:主要用于解决当输出小于量时,ReLU的梯度为零的问题。
- ReLU6、hard-Swish:主要为量化网络而设计的。
- SELU:是进行神经网络的自归一化而提出的
2.3.5 后处理方法
- NMS:在基于深度学习的目标检测中使用的后处理方法,它可以用来过滤那些预测统一物体、但效果不好的 Bbox,从而保留较好的Bbox。
优化 NMS和优化目标方程的方法异曲同工。NMS提出的最初的方法并没有考虑上下文信息- greedy NMS:Girshick 在 R-CNN 中添加分类置信度作为参考,根据置信度得分的顺序,由高到低执行 。
- soft NMS:在greedy NMS 使用IOU时,目标遮挡可能会造成置信度得分的退化。
- DIOU NMS:将重心坐标的距离信息添加到Bbox的筛选处理中。
指的一提的是,上面提到的后处理方法中都不直接引用捕获的图像特征,后续的 anchor-free 方法开发中不在需要后处理。
我们的基本目的是在生产系统和并行计算的优化中加快神经网络的速度,而不是地计算量的理论指标(BFLOP)。
- GPU:使用少量的组(1-8)的卷积层:CSPResNeXt50 / CSPDarknet53
- VPN:使用分组卷积,但是不使用 SE 模块:EfficientNet-lite / MixNet / GhostNet / MobileNetV3
3.1 网络架构的选择
- 我们的目标是寻找 输入网络的分辨率、卷积层的个数、参数的数量 ( f i l t e r _ s i z e 2 ∗ f i l t e r s ∗ c h a n n e l / g r o u p s ) (filter\_size^2*filters*channel/groups) (filter_size2∗filters∗channel/groups) 、输出层的个数(filters)之间的最好的平衡。
例如:
在ILSVRC2012(ImageNet)的目标检测上,效果:CSPResNext50 > CSPDarket53;
在MS COCO的目标检测中,效果:CSPResNext50 < CSPDarket53。- 下一个目标是选择额外的模块增加感受野,以及不同检测器不同的backbone进行参数聚合的最佳方法。例:FPN、PAN、ASFF、BiFPN。
在分类任务上最优模型在检测上未必最优。和分类任务相比检测器需要以下要求:
- 更好的输入尺寸(分辨率):用于检测多个小尺寸对象
- 更多的网络层:为了获得更大的感受野去覆盖增加的输入尺寸
- 更多的参数:提高模型的能力,从而能够在一张图上检测到多个不同尺寸的物体
假设,我们可以认为一个有更大的感受野(更多的卷积层3x3)和大量的参数的模型应该被选做 backbone。表格1中展示了 CSPResNetXt50, CSPDarkent53以及EfficientNet B3的相关信息。
- CSPResNeXt50 有16个3*3的卷积层,425*425的感受野和20.6M个参数,
- CSPDarkent53 有29个3*3个卷积层,725*725的感受野和27.6M个参数
从理论证明和大量的实验表明这两个模型中,CSPDarkent53 是作为检测器的 backbone的最优的选择。
不同尺寸的感受野的影响如下:
等于目标物体的大小:能够看到整个物体信息
等于网络的尺寸:能够看到目标物体周围的上下文信息
大于网络的尺寸:增加图像点和最终激活之间的连接数量将 SPP 模块添加到CSPDarknet53 中,因为它极大的提高了感受野,能够分离出最重要的上下文特征,同时没有降低网络的运行速度。我们使用PANet 作为不同检测器不同 backbone 训练阶段聚集参数的方法,而非YOLOv3 的FPN模块。
最终,YOLOv4 = CSPDarknet53 + PANet + YOLOv3 的head ,以及SPP作为附加的模块。
(目标检测的网路结构 = backbone + neck + head)
未来,我们计划扩展检测器的 Bag of freebies,这些在理论上解决某些问题并能够提高检测器的精度,后续以实验的形式探究每个算法对检测器的影响。
我们没有使用 Cross-CPU Batch Normalization(CGBN 或 SyncBN)或者昂贵的定制设备。这样能让任何人在一个GPU上得到先进的结果,比如在GTX1080Ti、RTX2080Ti。
3.2 BoF 和 BoS 的选择
为了提高目标检测的训练,CNN通常使用一些技巧:
- 激活函数:ReLU、leaky-ReLU、
parametric-ReLU、ReLU6、SELU、Swish、Mish- Bbox的损失函数:MSE、IoU、GIOU、CIOU、DIOU
- 数据增强:CutOut、MixUp、CutMix
- 正则化方式:
DropOut、DropPath、Spatial DropOut、DropBlock- 通过平均值和方差对网络激活进行标准化:BN、
CGBN or SyncBN、FRN、CBN- 跳跃连接:残差连接、加权残差连接、多输入加权残差连接、跨阶段部分连接
画横线的表示YOlOv4中并不选用:
- 激活函数中, PReLU和SELU难以训练,ReLU6是专门为量化网络设计的,这三个不选用
- 正则化方法中,提出DropBlock的学着将其算法和其他算法进行了比较,DropBlock效果最好。因此选择DropBlock作为YOLOv4的正则化方法
- 归一化方法中,只关注在一块GPU上训练策略,因此不考虑SyncBN。
3.3 额外的改进
为了让检测器更适合在单个GPU上进行训练,做了一下额外的设计和改进:
- 数据增广的新的方法:Mosaic、Self-Adversarial Training(SAT)
- 在应用遗传算法去选择最优的超参数
- 改进了一些现有的算法,让我们的设计更适合高效的训练和检测:改进的SAM、改进的 PAN以及 Cross mini-Batch Normalization(CmBN)
【Mosaic】
新型的数据增广的算法:它混合了四张训练图片,因此有四种不同的上下文进行融合(CutMix 仅仅将两张图片进行融合)。此外,batch normalization 在每个网络层中计算四张不同图片的激活统计,这极大较少了一个大的mini-batch的尺寸的需求。
【自适应对抗训练(SAT)】
新型的数据增广的算法:它在前后两个阶段上进行操作。在第一阶段,神经网络改变原始图像而不是网络权值。用这种方式,神经网络自己进行对抗训练,改变原始图像,造成图像上没有需要的物体的假象。在第二阶段,神经网络使用常规的方法进行训练,在第一阶段修改之后的图片上进行。
【CmBN(Cross mini-Batch Normalization)】
CBN的改进版本。它只收集了一个批次中的mini-batches之间的统计数据。
【改进的 SAM】
将 SAM 的 spatial-wise 注意力改为 point-wise 注意了机制,
将 PAN 中的 shortcut 连接变成 concatenation 连接,如下图
3.4 额外的改进
网络构成 backbone neck head 具体模块 CSPDarknet53 SPP, PAN YOLOv3 BoF 【CutMix and Mosaic data augmentation】
【DropBlock regularization】
【Class label smoothing】【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】
【Cross-stage partial connections(CSP)】
【Multi-input weighted residual connections (MiWRC) 】【Mish activation】
【SPP-block】
【SAM-block】
【PAN path-aggregation block】
【DIoU-NMS】模块作用 在ImageNet上进行预训练 融合不同位置上的特征 进行预测
测试了不同训练技巧在 ImageNet(ILSVRC2012 val)数据集上的精度的影响,然后又验证了检测器在 MS COCO(test-val 2017)数据集上个的准确率。
4.1 实验参数配置
在 mageNet 图像分类实验
默认的超参数如下:
- 训练步长为:8,000,000
- batch size / mini-batch size:128 / 32
- polynominal decay learning rate scheduling strategy:初始学习率为0.1
- warm-up 步长:1000
- momentum:0.9
- weight decay:0.005
训练设置:
- 在所有的 BoS 实验使用同样的默认的超参数;
- 在BoF实验中,增加了一半的训练步长;同时验证了 MixUp、CutMix、Mosaic、Bluring、标签正则化;比较了 LreLU、Swish、Mish激活函数的影响。
- 所有的实验都在1080Ti 或者 2080Ti GPU 上进行训练
在MS COCO目标检测实验中
默认超参数为:
- 训练步长为:500,500
- the step decay learning rate scheduling strategy:初始学习率:0.1,在步长400,000和450,000时 乘以0.1
- momentum:0.9
- weight decay:0.0005
- batch size:64,mini-batch:8 or 4(取决于网络结构和GPU的内存限制)
训练设置:
- 除超参数搜索实验使用遗传算法外,其他实验均使用默认设置。 遗传算法采用 YOLOv3-SPP进行 GIoU损失的训练,并为最小5k集 进行300个 epochs;搜索学习率为 0.00261,动量0.949,IoU阈值 0.213,损失标准化0.07。
- 我们还验证了大量的BoF 算法,包括 grid sensitivity elilmination、mosaic 数据增广、IoU阈值化、遗传算法、class label smoothing、cross mini-batch normalization、self-adversarial training、cosine anneling scheduler、dynamic mini-batch size、DropBlock、Optimized anchors、不同的IoU损失函数。
- 也在不同BoS 算法上进行了实验,包括 Mish、SPP、SAM、RFB、BiFBN、Gaussian YOLO。
- 所有的训练只在一块GPU上进行训练。
4.2 不同的算法在分类器上训练的影响
如下图所示:
4.3 不同的算法在检测器上训练的影响
研究 Bag-of-Freebies 在检测器训练准确度的影响(不会影响FPS):
- S:消除栅格的敏感度 这个方程在 YOLOv3用于评估目标物体的坐标,自重 cx 和 cy 通常是整数。因此,当 bx的值非常接近 cx 或者 cx+1 时,tx的绝对值会非常大。通过给sigmoid函数乘以一个大于1的因子来解决这个问题。因此,这样就消除了栅格对不可检测物体的影响。
- M:Mosaic 数据增广 在训练过程中,使用四张图片而非一张进行增广处理
- IT:IoU阈值 为一个ground truth 的IoU使用多个 anchors,ground true IoU(truth,anchor)>IoU阈值
- GA:遗传算法 在前10%的训练时间内使用遗传算法选择最优的超参数
- LS:class label smoothing 为sigmoid激活函数使用标签平滑
- CBN:CmBN 在整个批次中使用Cross min-batch Normalization 收集统计数据,而非在单独的mini-batch中收集统计数据
- CA:Cosine annealing scheduler 在sinusoid训练中改变学习率
- DM:动态的mini-batch 尺寸 在低分辨率的训练过程中,利用随机训练形状自动增加小批量的尺寸
- OA:优化 anchors 使用优化的anchors进行训练,网络的分辨率为512*512
- GIoU、CIoU、DIoU、MSE 为边界框回归使用不同的损失函数
研究 Bag-of-Specials 在检测器训练准确度的影响:
包括PAN, RFB, SAM, Gaussian YOLO(G),以及ASFF。
在我们的实验中,使用SPP+PAN+SAM 时,检测器得到了最好的性能。
4.4 不同backbone和预训练权重在检测器训练中的影响
通过实验注意到,拥有最佳分类准确率的模型,检测器的准确率未必最佳。
在ILSVRC2012(ImageNet)的目标检测上,效果:CSPResNext50 > CSPDarket53;
在MS COCO的目标检测中,效果:CSPResNext50 < CSPDarket53
- CSPResNeXt-50分类器训练时使用 BoF和Mish 提高了它的分类准确率,但是检测器训练使用的预训练权重进一步减少检测器的精度。
- CSPDarknet53 分类器训练使用 BoF 和Mish提高了分类器、以及使用这种分类器预训练权重的检测器的准确率。
4.5 不同min-batch尺寸在检测器训练中的影响
实验结果如下表。从表中可以发现
在引入了BoF、BoS训练策略后,mini-batch尺寸几乎对检测器的性能没有影响。这样就不需要昂贵的GPUs进行训练(也就是说,任何人仅使用一个GPU就可以训练一个优秀的检测器)。
使用最先进的目标检测器得到的对比结果如下图所示。YOLOv4位于帕累托最优曲线上,在速度和精度方面都优于最快和最准确的检测器
(论文中还展示了不同设备上不同的检测模型的对比)