《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上进行训练。
图1 提出的YOLOv4与其他最新对象检测器的比较,YOLOv4的运行速度比EfficientDet快两倍,并且性能相当。将YOLOv3的AP和FPS分别提高了10%和12%。
贡献总结如下:
检测器通常由两部分组成:backbone
和head
。前者在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)
作者将那些增加模型性能,只在训练阶段耗时增多,但不影响推理耗时
的技巧称为 ——赠品(bag of freebies),也就是白给的提高精度的方法。而那些微微提高了推理耗时,却显著提升性能的
,叫做——特价(bag of specials),就是那些不免费,但很实惠的技巧。
以数据增强方法为例,虽然增加了训练时间,但可以让模型泛化性能和鲁棒性更好。例如下面的常见增强方法:
图像扰动,
改变亮度、对比对、饱和度、色调
加噪声
随机缩放
随机裁剪(random crop)
翻转
旋转
随机擦除(random erase)
Cutout
MixUp
CutMix
下图是作者在训练模型时用的图像增强方法:
另外,还有常见的正则化方法:
DropOut
DropConnect
DropBlock
平衡正负样本的方法:
Focal loss
OHEM(在线难分样本挖掘)
此外,还有回归 loss的改进:
GIOU
DIOU
CIoU
凡此种种,都是训练时候的改进技巧,不影响推理速度,都可以称为赠送品。
例如增大感受野技巧:
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
我们工作基本的目标就是在生产系统和优化并行预算中加快神经网络的速度,而非降低计算量理论指标(BFLOP)。我们提供了两个实时神经网络的选择:
(1)GPU 在卷积层中,我们使用少量的组卷积(1-8): 网络结构采用的CSPResNeXt50 / CSPDarknet53。
(2)VPU 我们使用完全的组卷积,但是我们不使用Squeeze-and-excitement(SE)模块,具体包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3
我们的目标是寻找输入网络的分辨率、卷积层的个数、参数的数量 ( 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) (filtersize2∗filters∗channel/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最优的选择。
=不同尺寸的感受野的影响总结如下:
(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。
为了改进目标检测训练,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。
为了让检测器更适合在单个GPU上进行训练,我们做了以下额外的设计和改进:
(1)我们提出了数据增广的新的方法:Mosaic和Self-Adversarial Training(SAT)
(2)在应用遗传算法去选择最优的超参数
(3)我们改进了一些现有的算法,让我们的设计更适合高效的训练和检测 - 改进SAM, 改进PAN以及Cross mini-Batch
Normalization(CmBN)
Mosaic是一种新型的数据增广的算法,它混合了四张训练图片。因此有四种不同的上下文进行融合,然而CutMix仅仅将两张图片进行融合。此外,batch normalization在每个网络层中计算四张不同图片的激活统计。这极大减少了一个大的mini-batch尺寸的需求。
自适应对抗训练:SAT也表示了一个新的数据增广的技巧,它在前后两阶段上进行操作。在第一阶段,神经网络代替原始的图片而非网络的权重。用这种方式,神经网络自己进行对抗训练,代替原始的图片去创建图片中此处没有期望物体的描述。在第二阶段,神经网络使用常规的方法进行训练,在修改之后的图片上进检测物体。
正如图4中显示,CmBN(Cross mini-Batch Normalization)代表CBN改进的版本。它只收集了一个批次中的mini-batches之间的统计数据。
我们将SAM的spatial-wise注意力变成了point-wise注意力机制,然后将PAN中的shortcut连接变成了concatenation连接,正如图5和图6所表示的那样。
我们测试了不同训练改进技术对ImageNet(ILSVRC 2012 val)数据集上分类器准确性的影响,然后对MS COCO(test-dev 2017)数据集上检测器的准确性进行了测试。
在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的技巧我们并没有使用。
首先,我们研究了不同算法在分类器训练上的影响;具体来说,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激活函数作为补充的选项。
进一步的研究关注不同Bag-of-Freebies(BoF-detector)在检测器训练准确度的影响,正如表4所示。通过研究能够提高检测器准确度的算法,我们极大地扩展了BoF的算法选项,而且并没有影响FPS:
下一步的研究关心在检测器训练准确度上,不同Bag-of-Specials(BoS-detector)的影响,包括PAN, RFB, SAM, Gaussian YOLO(G),以及ASFF,正如表5所示。在我们的实验中,当使用SPP, PAN和SAM的时候,检测器得到了最好的性能。
进一步,我们研究了不同骨干模型对检测器精度的影响,如表6所示。我们注意到,具有最佳分类精度的模型在检测器精度方面并不总是最佳的。
首先,尽管与CSPDarknet53模型相比,经过不同功能训练的CSPResNeXt50模型的分类准确性更高,但是CSPDarknet53模型在对象检测方面显示出更高的准确性。
其次,将BoF和Mish用于CSPResNeXt50分类器训练可提高其分类准确性,但是将这些预训练权重进一步用于检测器训练会降低检测器准确性。
但是,将BoF和Mish用于CSPDarknet53分类器训练会提高分类器和使用该分类器预训练加权的检测器的准确性。
最终结果是,骨干CSPDarknet53比CSPResNeXt50更适合于检测器。
我们观察到,由于各种改进,CSPDarknet53模型显示出提高检测器精度的更大能力。
最后,我们分析了使用不同小批量大小训练的模型获得的结果,结果显示在表7中。从表7中显示的结果中,我们发现在添加BoF和BoS训练策略之后,小批量大小对检测器的性能几乎没有影响。此结果表明,在引入BoF和BoS之后,不再需要使用昂贵的GPU进行训练。换句话说,任何人都只能使用常规的GPU来训练出色的检测器。
与其他最先进的物体探测器获得的结果进行比较,如图8所示。我们的YOLOv4位于帕累托最优曲线上,在速度和准确性方面均优于最快,最精确的探测器。由于不同的方法使用不同架构的GPU进行推理时间验证,因此我们在Maxwell,Pascal和Volta架构的通用GPU上运行YOLOv4,并将它们与其他最新方法进行比较。
图8:不同物体检测器的速度和准确性的比较。(一些文章指出,它们的探测器的FPS仅适用于其中一种GPU:Maxwell / Pascal / Volta)
表8列出了使用Maxwell GPU的帧速率比较结果,它可以是GTX Titan X(Maxwell)或Tesla M40 GPU。
表8:MS COCO数据集上不同物体检测器的速度和准确性的比较(testdev 2017)
(FPS 30或更高的实时检测器在此处突出显示。我们将结果与batch = 1进行比较,而无需使用tensorRT。)
表9列出了使用Pascal GPU的帧速率比较结果,可以是Titan X(Pascal),Titan Xp,GTX 1080 Ti或Tesla P100 GPU。
表9:MS COCO数据集上不同物体检测器的速度和准确性的比较(test-dev 2017)。
(FPS 30或更高的实时检测器在此处突出显示。我们将结果与batch = 1进行比较,而无需使用tensorRT。)
至于表10,它列出了使用Volta GPU的帧速率比较结果,可以是Titan Volta或Tesla V100 GPU。
表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