YOLOv4 学习笔记

《YOLOv4: Optimal Speed and Accuracy of Object Detection》2020

论文原文:https://arxiv.org/abs/2004.10934
源码:https://github.com/AlexeyAB/darknet

建议阅读:https://blog.csdn.net/weixin_44791964/article/details/106214657

摘要

有很多特征可以提高卷积神经网络(CNN)的准确性。需要在大型数据集上对这些特征的组合进行实际测试,并需要对结果进行理论证明。某些特征仅在某些模型上运行,并且仅在某些问题上运行,或者仅在小型数据集上运行;而某些特征(例如批归一化和残差连接)适用于大多数模型,任务和数据集。我们假设此类通用特征包括加权残差连接(WRC),跨阶段部分连接(CSP),交叉小批量标准化(CmBN),自对抗训练(SAT)和Mish激活。我们使用以下新功能:WRC,CSP,CmBN,SAT,Mish激活,Mosaic数据增强,CmBN,DropBlock正则化和CIoU丢失,并结合其中的一些特征来实现最新的结果:在MS COCO数据集上利用Tesla V10以65 FPS的实时速度获得了43.5%的AP(65.7%AP50)。

从摘要可以看出:v4实际上就是保留Darknet作为backbone,然后通过大量的实验研究了众多普适性算法对网络性能的影响,然后找到了它们最优的组合。

网络架构

一、介绍

大部分基于CNN的目标检测器主要只适用于推荐系统。举例来说,通过城市相机寻找免费停车位置的系统使用着慢速但是高精度的模型,然而汽车碰撞警告却使用着快速但是低精度的模型。提高实时目标检测器的精度不经能够应用在推荐系统上,而且还能用于独立的流程管理以及降低人员数量上。目前大部分高精度的神经网络不仅不能实时运行,并且需要较大的mini-batch-size在多个GPUs上进行训练。我们构建了仅在一块GPU上就可以实时运行的CNN解决了这个问题,并且它只需要在一块GPU上进行训练
YOLOv4 学习笔记_第1张图片
图1 提出的YOLOv4与其他最新对象检测器的比较,YOLOv4的运行速度比EfficientDet快两倍,并且性能相当。将YOLOv3的AP和FPS分别提高了10%和12%。

贡献总结如下:

  1. 提出一个高效且强大的目标检测模型。任何人可以使用一个1080Ti或者2080Ti的GPU就可以训练出一个快速并且高精度的目标检测器。
  2. 我们在检测器训练的过程中,测试了目标检测中最高水准的Bag-of-Freebies和Bat-of-Specials方法。
  3. 我们改进了最高水准的算法,使得它们更加高效并且适合于在一个GPU上进行训练,比如CBN, PAN, SAM等。

二、相关工作

2.1 目标检测模型

检测器通常由两部分组成:backbonehead。前者在ImageNet上进行预训练,后者用来预测类别信息和目标物体的边界框。在GPU平台上运行的检测器,它们的backbone可能是VGG, ResNet, ResNetXt,或者是DenseNet。在CPU平台上运行的检测器,它们的backbone可能是SqueezeNet,MobileNet或者是ShuffleNet。对于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等等。在最近几年,目标检测器在backbone和head之间会插入一些网络层,这些网络层通常用来收集不同的特征图。我们将其称之为目标检测器的neck通常,一个neck由多个bottom-up路径和top-down路径组成。使用这种机制的网络包括Feature Pyramid Network(FPN),Path Aggregation Network(PAN),BiFPN和NAS-FPN。除上述模型外,一些研究人员将重点放在直接构建用于检测物体的新主干(DetNet ,DetNAS )或新的整个模型(SpineNet ,HitDe-tector )上。

总而言之,普通的检测器由以下4个部分组成

输入:图像,Patches,图像金字塔
backbone:VGG16 ,ResNet-50 ,ResNetXt,DenseNet,SpineNet ,EfficientNet-B0 / B7 ,CSPResNeXt50 ,CSPDarknet53
neck:
         其他块:SPP ,ASPP ,RFB ,SAM 
         路径聚合块:FPN ,PAN ,NAS-FPN ,Fully-connected FPN,BiFPN ,ASFF ,SFAM

Heads : 

        密集预测(一阶段): RPN,SSD,YOLO , RetinaNet (基于anchor)
                            CornerNet,CenterNet ,MatrixNet ,FCOS(无anchor)
        稀疏预测(两阶段): Faster R-CNN,R-FCN ,Mask R-CNN (基于anchor);RepPoints(无anchor)

YOLOv4 学习笔记_第2张图片
作者将那些增加模型性能,只在训练阶段耗时增多,但不影响推理耗时的技巧称为 ——赠品(bag of freebies),也就是白给的提高精度的方法。而那些微微提高了推理耗时,却显著提升性能的,叫做——特价(bag of specials),就是那些不免费,但很实惠的技巧。

2.2 Bag of freebies(赠品)

数据增强方法为例,虽然增加了训练时间,但可以让模型泛化性能和鲁棒性更好。例如下面的常见增强方法:

图像扰动,
改变亮度、对比对、饱和度、色调
加噪声
随机缩放
随机裁剪(random crop)
翻转
旋转
随机擦除(random erase)
Cutout
MixUp
CutMix

下图是作者在训练模型时用的图像增强方法:
YOLOv4 学习笔记_第3张图片
另外,还有常见的正则化方法:

DropOut
DropConnect
DropBlock

平衡正负样本的方法:

Focal loss
OHEM(在线难分样本挖掘)

此外,还有回归 loss的改进:

GIOU
DIOU
CIoU

凡此种种,都是训练时候的改进技巧,不影响推理速度,都可以称为赠送品。YOLOv4 学习笔记_第4张图片

2.3 Bag of specials(特价)

例如增大感受野技巧:

SPP
ASPP
RFB

注意力机制

Squeeze-and-Excitation (SE), 增加2%计算量(但推理时有10%的速度),可以提升1%的ImageNet top-1精度。
Spatial Attention Module (SAM),增加0.1%计算量,提升0.5%的top-1准确率。

特征融合集成

FPN
SFAM
ASFF
BiFPN (也就是大名鼎鼎的EfficientDet)

更好的激活函数

ReLU
LReLU
PReLU
ReLU6
SELU
Swish
hard-Swish

后处理非最大值抑制算法

soft-NMS
DIoU NMS

YOLOv4 学习笔记_第5张图片

3. YOLOv4模型设计

我们工作基本的目标就是在生产系统和优化并行预算中加快神经网络的速度,而非降低计算量理论指标(BFLOP)。我们提供了两个实时神经网络的选择:

(1)GPU 在卷积层中,我们使用少量的组卷积(1-8): 网络结构采用的CSPResNeXt50 / CSPDarknet53。

(2)VPU 我们使用完全的组卷积,但是我们不使用Squeeze-and-excitement(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 ) (filtersize^2 * filters * channel/groups) filtersize2filterschannel/groups以及输出层的个数(filters)之间的最优的平衡。举例来说,大量的研究表明:在ILSVRC2012(ImageNet)的对象分类上,CSPResNext50比CSPDarket53的效果更好,但是在MS COCO的目标检测中,CSPDarknet53优于CSPResNext50

下一个目标就是选择额外的模块去增加感受野以及为不同检测器不同的backbone选择参数聚合的最佳方法。比如:FPN, PAN, ASFF, BiFPN。

在分类任务上最优的模型在检测上未必就是最优的。和分类任务相比,检测器需要以下要求:

(1)更好的输入尺寸(分辨率)- 为了检测多个小物体

(2)更多层 - 为了具有更大的感受野

(3)更多的参数 - 提高模型的能力从而能够在一张图片上检测到不同尺寸的多个物体。

假设来说,我们可以认为具有更大感受野(有大量的3 * 3的卷积层)和具有大量参数的模型应当作为检测器的backbone。表格1展示了CSPResNetXt50, CSPDarkent53以及EfficientNet B3的相关信息。CSPResNetXt50仅仅只有16个3 * 3的卷积层,一个425 * 425的感受野和20.6M个参数,然而CSPDarkent53有29个3 * 3的卷积层,725 * 725的感受野和27.6M个参数。从理论证明和大量的实验表明在这两个模型中,CSPDarkent53是作为检测器的backbone最优的选择
YOLOv4 学习笔记_第6张图片
=不同尺寸的感受野的影响总结如下:

(1)等于目标物体的大小时:能够看到整个物体

(2)等于网络的尺寸:能够看到目标物体周围的上下文信息

(3)大于网络的尺寸:增加图像点和最终激活之间连接的数量

我们将SPP模块添加到CSPDarknet53中,因为它极大提高了感受野,能够分离出最重要的上下文特征而且没有降低网络运行的速度

我们使用PANet作为不同检测器不同backbone训练阶段聚集参数的方法,而非YOLOv3的FPN模块。

最后,我们选择了CSPDarknet53作为backbone, SPP作为附加的模块、PANet路径聚合Neck,YOLOv3(基于锚点的)检测器作为YOLOv4_head。

CSPDarkNet53+SPP+PANet(path-aggregation neck)+YOLOv3-head = YOLOv4.

我们没有使用Cross-GPU Batch Normalization(CGBN 或者 SyncBN) 或者昂贵的定制设备。这能够使得任何人在一个GPU上就可以得到最先进的结果,比如在GTX 1080Ti或者RTX 2080Ti

3.2 Selection of BoF and BoS

为了改进目标检测训练,CNN通常使用以下方法:

激活:ReLU,leaky-ReLU,parameter-ReLU,ReLU6,SELU,Swish或Mish
边界框回归损失:MSE,IoU,GIoU,CIoU,DIoU
数据增强:CutOut,MixUp,CutMix
正则化方法:DropOut, DropPath [36],Spatial DropOut [79]或DropBlock
通过均值和方差对网络激活进行归一化:Batch Normalization (BN) [32],Cross-GPU Batch Normalization (CGBN or SyncBN)[93], Filter Response Normalization (FRN) [70], orCross-Iteration Batch Normalization (CBN) [89]
跨连接:Residual connections, Weightedresidual connections, Multi-input weighted residualconnections, or Cross stage partial connections (CSP)

对于训练激活函数,因为PReLU和SELU难以训练,并且RELU6是专门为量化网络设计的,我们因此不考虑这这三个激活函数。在正则化方法中,提出DropBlok的学者将其算法和其他算法进行了比较,然后DropBolck效果更好。因此我们毫不犹豫的选择DropBlock作为我们的正则化方法。在归一化方法的选择中,因为我们关注在一块GPU上的训练策略,因此我们不考虑syncBN

3.3 Additional improvements

为了让检测器更适合在单个GPU上进行训练,我们做了以下额外的设计和改进:

(1)我们提出了数据增广的新的方法:Mosaic和Self-Adversarial Training(SAT)

(2)在应用遗传算法去选择最优的超参数

(3)我们改进了一些现有的算法,让我们的设计更适合高效的训练和检测 - 改进SAM, 改进PAN以及Cross mini-Batch
Normalization(CmBN)

Mosaic是一种新型的数据增广的算法,它混合了四张训练图片。因此有四种不同的上下文进行融合,然而CutMix仅仅将两张图片进行融合。此外,batch normalization在每个网络层中计算四张不同图片的激活统计。这极大减少了一个大的mini-batch尺寸的需求。

自适应对抗训练:SAT也表示了一个新的数据增广的技巧,它在前后两阶段上进行操作。在第一阶段,神经网络代替原始的图片而非网络的权重。用这种方式,神经网络自己进行对抗训练,代替原始的图片去创建图片中此处没有期望物体的描述。在第二阶段,神经网络使用常规的方法进行训练,在修改之后的图片上进检测物体。
YOLOv4 学习笔记_第7张图片
正如图4中显示,CmBN(Cross mini-Batch Normalization)代表CBN改进的版本。它只收集了一个批次中的mini-batches之间的统计数据。

我们将SAM的spatial-wise注意力变成了point-wise注意力机制,然后将PAN中的shortcut连接变成了concatenation连接,正如图5和图6所表示的那样。
YOLOv4 学习笔记_第8张图片

3.4. YOLOv4

YOLOv4 学习笔记_第9张图片

4 实验

我们测试了不同训练改进技术对ImageNet(ILSVRC 2012 val)数据集上分类器准确性的影响,然后对MS COCO(test-dev 2017)数据集上检测器的准确性进行了测试。

4.1 实验参数配置

在ImageNet图像分类实验中,默认的超参数如下:训练步长为8,000,000;batch size和mini-batch size分别为128和32;polynominal decay learning rate scheduling strategy初始的学习率为0.1;warm-up步长为1000;momentum和weight decay分别设置为0.9和0.005。所有的BoS实验使用相同的、默认的超参数,在BoF实验中,我们增加了一半的训练步长。在BoF实验中,我们验证了MixUp, CutMix, Mosaic, Bluring数据增加一节label smoothing regularization方法。在BoS实验中,我们比较了LReLU,Swish和Mish激活函数的影响。所有的实验都在1080Ti或者2080Ti GPU上进行训练。

在MS COCO目标检测实验中,默认的超参数如下:训练步长为500,500;the step decay learning rate scheduling strategy初始化学习率为0.01在步长为400,000和450,000的时候乘以0.1;momentum和weight decay分别设置为0.9和0.0005。所有的架构在一块GPU进行多尺度训练,它的batch size为64,然而它的mini-batch为8还是4取决于网络架构和GPU的内存限制。除了对寻找最优的超参数使用遗传算法之外,其他所有的实验都使用默认的设置。遗传算法和GIoU使用YOLOv3-SPP进行训练,并且为5k个min-val进行300个epochs。对我们采用搜索的学习率为0.00261,momentum为0.949,IoU阈值为设置为0.213,遗传算法实验的损失标准化为0.07。我们还验证了大量的BoF算法,包括grid sensitivity elimination, 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以及Gaussiian YOLO。所有的实验我们仅仅使用一个GPU进行训练,因此比如syncBN的优化多个GPU的技巧我们并没有使用。

4.2 不同算法在分类器训练上的影响

首先,我们研究了不同算法在分类器训练上的影响;具体来说,Class label smoothing的影响,不同数据增广技巧,bilateral blurring,MixUp, CutMix和Mosaic的印象在图7中显示,以及不同激活函数的影响,比如Leaky-ReLU(默认的),Swish和Mish。

在表2中所示,在我们的实验中,通过引入一些算法,分类器的准确率得到了提升,这些算法包括:CutMix和Mosaic数据增广,Class label smoothing和Mish激活函数。结果,我们的用于分类器训练的BoF-backbone(Bag of Freebies)包括:Cutmix 和Mosaic数据增广算法以及Class labelsmoothing。正如表2和表3所示,我们将Mish激活函数作为补充的选项。
YOLOv4 学习笔记_第10张图片

4.3 不同算法在检测器训练上的影响

进一步的研究关注不同Bag-of-Freebies(BoF-detector)在检测器训练准确度的影响,正如表4所示。通过研究能够提高检测器准确度的算法,我们极大地扩展了BoF的算法选项,而且并没有影响FPS:
YOLOv4 学习笔记_第11张图片

  • S:消除栅格的敏感度 方程bx =sigma(tx)+ cx;by =sigma(ty)+
    cy,其中cx和cy始终是整数,在YOLOv3中用于评估对象坐标,因此,对于接近 cx或 cx +1值的bx值,需要非常高的tx绝对值。我们通过将sigmoid函数乘以超过1.0的因数来解决此问题,从而消除了无法检测到物体的网格的影响。
  • M:Mosaic数据增广 - 在训练过程中,使用四张图片而非一张进行增广处理
  • IT:IoU阈值 - 为一个ground truth的IoU使用多个anchors,ground truth IoU(truth,anchor) > IoU 阈值
  • GA:遗传算法 - 在前10%的训练时间内使用遗传算法选择最优的超参数
  • LS:Class label smoothing - 为sigmoid激活函数使用class label smoothing。
  • CBN:CmBN - 在整个批次中通过使用Cross mini-Batch
    Normalization收集统计数据,而非在单独的mini-batch中收集统计数据。
  • CA:Cosine annealing scheduler - 在sinusoid训练中改变学习率
  • DM:动态的mini-batch尺寸 - 在低分辨率的训练过程中,通过随机训练形状自动的改提高mini-batch的尺寸。
  • OA: 优化Anchors - 使用优化的anchors进行训练,网络的分辨率为512*512 GIoU, CIoU, DIoU, MSE 为边界框回归使用不同的损失函数。

下一步的研究关心在检测器训练准确度上,不同Bag-of-Specials(BoS-detector)的影响,包括PAN, RFB, SAM, Gaussian YOLO(G),以及ASFF,正如表5所示。在我们的实验中,当使用SPP, PAN和SAM的时候,检测器得到了最好的性能。
YOLOv4 学习笔记_第12张图片

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

进一步,我们研究了不同骨干模型对检测器精度的影响,如表6所示。我们注意到,具有最佳分类精度的模型在检测器精度方面并不总是最佳的。
首先,尽管与CSPDarknet53模型相比,经过不同功能训练的CSPResNeXt50模型的分类准确性更高,但是CSPDarknet53模型在对象检测方面显示出更高的准确性。
其次,将BoF和Mish用于CSPResNeXt50分类器训练可提高其分类准确性,但是将这些预训练权重进一步用于检测器训练会降低检测器准确性。
但是,将BoF和Mish用于CSPDarknet53分类器训练会提高分类器和使用该分类器预训练加权的检测器的准确性。
最终结果是,骨干CSPDarknet53比CSPResNeXt50更适合于检测器。
我们观察到,由于各种改进,CSPDarknet53模型显示出提高检测器精度的更大能力。
YOLOv4 学习笔记_第13张图片

4.5. Influence of different minibatch size on Detector training

最后,我们分析了使用不同小批量大小训练的模型获得的结果,结果显示在表7中。从表7中显示的结果中,我们发现在添加BoF和BoS训练策略之后,小批量大小对检测器的性能几乎没有影响。此结果表明,在引入BoF和BoS之后,不再需要使用昂贵的GPU进行训练。换句话说,任何人都只能使用常规的GPU来训练出色的检测器。
YOLOv4 学习笔记_第14张图片

五. Results

与其他最先进的物体探测器获得的结果进行比较,如图8所示。我们的YOLOv4位于帕累托最优曲线上,在速度和准确性方面均优于最快,最精确的探测器。由于不同的方法使用不同架构的GPU进行推理时间验证,因此我们在Maxwell,Pascal和Volta架构的通用GPU上运行YOLOv4,并将它们与其他最新方法进行比较。
YOLOv4 学习笔记_第15张图片
图8:不同物体检测器的速度和准确性的比较。(一些文章指出,它们的探测器的FPS仅适用于其中一种GPU:Maxwell / Pascal / Volta)

表8列出了使用Maxwell GPU的帧速率比较结果,它可以是GTX Titan X(Maxwell)或Tesla M40 GPU。
YOLOv4 学习笔记_第16张图片
表8:MS COCO数据集上不同物体检测器的速度和准确性的比较(testdev 2017)

(FPS 30或更高的实时检测器在此处突出显示。我们将结果与batch = 1进行比较,而无需使用tensorRT。)

表9列出了使用Pascal GPU的帧速率比较结果,可以是Titan X(Pascal),Titan Xp,GTX 1080 Ti或Tesla P100 GPU。
YOLOv4 学习笔记_第17张图片
表9:MS COCO数据集上不同物体检测器的速度和准确性的比较(test-dev 2017)。
(FPS 30或更高的实时检测器在此处突出显示。我们将结果与batch = 1进行比较,而无需使用tensorRT。)

至于表10,它列出了使用Volta GPU的帧速率比较结果,可以是Titan Volta或Tesla V100 GPU。

YOLOv4 学习笔记_第18张图片
表10:MS COCO数据集上不同物体检测器的速度和准确性的比较(test-dev 2017)
(FPS 30或更高的实时检测器在此处突出显示。我们将结果与batch = 1进行比较,而无需使用tensorRT)

参考(感谢)
https://www.cnblogs.com/icetree/p/13111746.html
https://blog.csdn.net/qq_38316300/article/details/105759305
https://blog.csdn.net/nan355655600/article/details/106246625?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162376783516780264016094%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fnavwordall.%2522%257D&request_id=162376783516780264016094&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2navwordallfirst_rank_v2~hot_rank-2-106246625.first_rank_v2_pc_rank_v29&utm_term=YOLOv4&spm=1018.2226.3001.4187
https://zhuanlan.zhihu.com/p/135840896
https://zhuanlan.zhihu.com/p/135980432

你可能感兴趣的:(2D目标检测)