深度学习目标检测之 YOLO v4

  • 论文原文:https://arxiv.org/abs/2004.10934
  • 代码
    • 原版c++: https://github.com/AlexeyAB/darknet
    • keras:https://github.com/Ma-Dan/keras-yolo4
    • pytorch:https://github.com/Tianxiaomo/pytorch-YOLOv4

前言

2020年YOLO系列的作者Redmon在推特上发表声明,出于道德方面的考虑,从此退出CV界。本以为YOLOv3已经是YOLO系列的终局之战。没想到,俄罗斯的程序员 Alexey Bochkovskiy 凭借自己的摸索复现了 YOLO 系列全部模型,并总结了最接近几年目标检测的各种套路推出了 YOLO v4,然后与Redmon取得联系,正式将他们的研究命名为YOLO v4。

简单来说,就是说这个YOLO v4算法是在原有YOLO目标检测架构的基础上,采用了近些年CNN领域中最优秀的优化策略,从数据处理、主干网络、网络训练、激活函数、损失函数等各个方面都有着不同程度的优化,虽没有理论上的创新,但是会受到许许多多的工程师的欢迎,各种优化算法的尝试。文章如同于目标检测的trick综述,效果达到了实现FPS与Precision平衡的目标检测 new baseline。更有意思的是作者提出了 backbone,neck,head 的目标检测通用框架套路。

backbone, neck, head 其实非常的形象。它表示组成一个“人”的三个部分。从下到上就是 backbone, neck, head 。

  • backbone:各类卷积网络,目的是对原始图像做初步的特征提取。
  • neck:各类结构,目的是从结构上做“特征的融合”。主要为解决小目标检测,重叠目标检测等问题。
  • head:gd 编码,回归和解析。

0 摘要

目前有很多可以提高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(Mish激活)。我们使用了新的算法:WRC, CSP, CmBN, SAT, Mish activation, Mosaic data augmentation(马赛克数据增强), CmBN, Dropblock regularization 和CIoU loss以及它们的组合,获得了最优的效果:在MS COCO数据集上的AP值为43.5%(65.7% AP50),在Tesla V100上的实时推理速度为65FPS。开源代码链接:https://github.com/AlexeyAB/darknet。

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

先放网络架构(图不记得从哪里保存下来的了)

YOLOv4 = CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部)
在这里插入图片描述
当输入是416x416时,特征结构如下
在这里插入图片描述
当输入是608x608时,特征结构如下:
在这里插入图片描述

1 介绍

大部分基于CNN的目标检测器主要只适用于推荐系统。举例来说,通过城市相机寻找免费停车位置的系统使用着慢速但是高精度的模型,然而汽车碰撞警告却使用着快速但是低精度的模型。提高实时目标检测器的精度不经能够应用在推荐系统上,而且还能用于独立的流程管理以及降低人员数量上。目前大部分高精度的神经网络不仅不能实时运行,并且需要较大的mini-batch-size在多个GPUs上进行训练。我们构建了仅在一块GPU上就可以实时运行的CNN解决了这个问题,并且它只需要在一块GPU上进行训练

在这里插入图片描述

我们工作的主要目标就是设计一个仅在单个计算系统(比如单个GPU)上就可以快速运行的目标检测器并且对并行计算进行优化,并非减低计量计算量理论指标(BFLOP)。我们希望这个检测器能够轻松的训练和使用。具体来说就是任何一个人仅仅使用一个GPU进行训练和测试就可以得到实时的,高精度的以及令人信服的目标检测结果,正如在图片1中所示的YOLOv4的结果。我们的贡献总结如下:

(1)我们提出了一个高效且强大的目标检测模型。任何人可以使用一个1080Ti或者2080Ti的GPU就可以训练出一个快速并且高精度的目标检测器。

(2)我们在检测器训练的过程中,测试了目标检测中最高水准的Bag-of-Freebies和Bat-of-Specials方法

(3)我们改进了最高水准的算法,使得它们更加高效并且适合于在一个GPU上进行训练,比如CBN[89]、PAN[49]、SAM[85]等。

2 相关工作(Related work)

2.1 目标检测模型(Object detection models)

检测器通常由两部分组成:backbone和head。前者在 ImageNet 上进行预训练,后者用来预测类别信息和目标物体的边界框。在GPU平台上运行的检测器,它们的backbone可能是VGG [68],ResNet [26],ResNeXt [86]或DenseNet [30]。在CPU平台上运行的检测器,它们的backbone可能是[31],MobileNet [28、66、27、74]或ShuffleNet [97、53]。对于head部分,通常分为两类:one-stage和two-stage的目标检测器。Two-stage的目标检测器的代表是R-CNN [19]系列,包括:faster R-CNN [64],R-FCN [9]和Libra R-CNN [ 58]. 还有基于anchor-free的Two-stage的目标检测器,比如RepPoints[87]。One-stage目标检测器的代表模型是YOLO [61、62、63],SSD [50]和RetinaNet [45]。在最近几年,出现了基于anchor-free的one-stage的算法,比如CenterNet [13],CornerNet [37、38],FCOS [78]等等。在最近几年,目标检测器在backbone和head之间会插入一些网络层,这些网络层通常用来收集不同的特征图。我们将其称之为目标检测器的neck。通常,一个neck由多个bottom-up路径和top-down路径组成。使用这种机制的网络包括Feature Pyramid Network(FPN,特征金字塔网络)[44],Path Aggregation Network(PAN,路径聚集网络)[49],BiFPN[77]和NAS-FPN[17]。

除了上面的这些模型,一些学者将重点放在为目标检测器构建新的backbone(DetNet [43],DetNAS [7])或者是一整个新的模型(SpineNet [12],HitDe-tector [20])。

在这里插入图片描述
在这里插入图片描述

综上所述,一个普通的目标检测器由下面四个部分组成:

  • 输入:图像,斑块,图像金字塔

  • 骨架:VGG16 [68],ResNet-50 [26],SpineNet [12],EfficientNet-B0 / B7 [75],CSPResNeXt50 [81],CSPDarknet53 [81]

  • 颈部:

    • 其他块:SPP [25],ASPP [5],RFB [47],SAM [85]
    • 路径聚合块:FPN [44],PAN [49],NAS-FPN [17] ],Fully-connected FPN,BiFPN [77],ASFF [48],SFAM [98]
  • Heads :

    • Dense Prediction (密集预测)(一阶段):

      • RPN[64],SSD [50],YOLO [61], RetinaNet [45](基于锚)
      • CornerNet[37],CenterNet [13],MatrixNet [60],FCOS [78](无锚)
    • Sparse Prediction (稀疏预测)(两阶段):

      • Faster R-CNN [64],R-FCN [9],Mask R-CNN [23](基于锚)
      • RepPoints[87](无锚)

2.2 Bag of freebies

通常来说,目标检测器都是进行离线训练的(训练的时候对GPU数量和规格不限制)。因此,研究者总是喜欢扬长避短,使用最好的训练手段,因此可以在不增加推理成本的情况下,获得最好的检测精度。我们将只改变训练策略或者只增加训练成本的方法称之为"bag of freebies"。在目标检测中经常使用并且满足bag of freebies的定义的算法称是①数据增广。数据增广的目的是增加输入图片的可变性,因此目标检测模型对从不同场景下获取的图片有着更高的鲁棒性。举例来说,photometric distoitions(光度失真)和geometric distortions(几何失真)是用来数据增强方法的两个常用的手段。在处理photometric distortion中,我们会调整图像的亮度,对比度,色调,饱和度以及噪声。对于geometric distortion,我们会随机增加尺度变化,裁剪,翻转以及旋转。

上面提及的数据增广的手段都是像素级别的调整,它保留了调整区域的所有原始像素信息。此外,一些研究者将数据增广的重点放在了②模拟目标物体遮挡问题上。他们在图像分类和目标检测上已经取得了不错的结果。具体来说,random erase[100]和CutOut [11]可以随机选择图像上的矩形区域,然后进行随机融合或者使用零像素值来进行融合。对于hide-and-seek[69]和grid mask[6],他们随机地或者均匀地在一幅图像中选择多个矩形区域,并且使用零来代替矩形区域中的像素值。如果将相似的概念用来特征图中,出现了DropOut [71],DropConnect [80]和DropBlock [16]方法。此外,一些研究者提出一起使用多张图像进行数据增强的方法。举例来说,MixUp [92]使用两张图片进行相乘并且使用不同的系数比进行叠加,然后使用它们的叠加比来调整标签。对于CutMix [91],它将裁剪的图片覆盖到其他图片的矩形区域,然后根据混合区域的大小调整标签。除了上面提及的方法,style transfer GAN[15]也用来数据增广,CNN可以学习如何有效的减少纹理偏差。

一些和上面所提及的不同的方法用来解决数据集中的语义分布可能存在偏差的问题。处理语义分布偏差的问题,一个非常重要的问题就是在不同类别之间存在数据不平衡,并且这个问题在two-stage目标检测器中,通常使用hard negative example mining[72]或者online hard example mining[67]来解决。但是example mining 方法并不适用于one-stage的目标检测器,因为这种类型的检测器属于dense prediction架构。因此focal loss[45] 算法用来解决不同类别之间数据不均衡的问题。③另外一个非常重要的问题就是使用one-hot很难描述不同类别之间关联度的关系。Label smothing[73]提出在训练的时候,将hard label转换成soft label,这个方法可以使得模型更加的鲁棒性。为了得到一个最好的soft label, Islam[33]引入了知识蒸馏的概念来设计标签细化网络。

最后一个bag of freebies是④设计边界框回归的目标函数。传统的目标检测器通常使用均方根误差(MSE)在Bbox的中心坐标以及宽高上进行直接的回归预测,即 {xcenter,ycenter,w,h}\{x_{center},y_{center},w,h\}{xcenterycenterwh} ,或者左上角和右下角的两个点,即 {xtop_left,ytop_left,xbottom_right,ybottom_right}\{x_{top\_left},y_{top\_left},x_{bottom\_right},y_{bottom\_right}\}{xtop_leftytop_leftxbottom_rightybottom_right} 进行回归。对于anchor-based方法,去预测相应的offset,比如 {xcenter_Offset,ycenter_Offset,wOffset,hoffset}\{x_{center\_Offset},y_{center\_Offset},w_{Offset},h_{offset}\}{xcenter_Offsetycenter_OffsetwOffsethoffset}{xtop_left_offset,ytop_left_offset,xbottom_right_offset,ybottom_right_offset}\{x_{top\_left\_offset},y_{top\_left\_offset},x_{bottom\_right\_offset},y_{bottom\_right\_offset}\}{xtop_left_offsetytop_left_offsetxbottom_right_offsetybottom_right_offset}但是,预测Bbox每个点的坐标值是将这些点作为独立的变量,但是实际上并没有将目标物体当成一个整体进行预测。为了更好的解决这个问题,一些研究者最近提出了IoU loss[[90],它能够将Bbox区域和ground truth的BBox区域的作为整体进行考虑。IoU损失函数需要计算BBox四个坐标点以及ground truth的IoU。因为IoU具有尺度不变性,它可以解决传统算法比如 l1,l2l_1,l_2l1,l2 范数计算{x,y,w,h}\{x,y,w,h\}{xywh} 存在的问题,这个损失函数会随着尺度的变化而发生变化。最近,一些研究者继续提高IoU损失函数的性能。举例来说,除了覆盖范围,GIoU[65]还包括目标物体的形状和坐标。他们提出寻找同时包括预测的BBox和ground truth的BBox的封闭区域BBox,然后使用这个BBox作为分母去代替原来Iou损失函数中的分母。DIoU loss[99]额外考虑了目标物体的中心距离,CIoU [99]另一方面同时将覆盖区域,中心点距离和纵横比考虑在内。CIoU在BBox回归问题上可以获得最好的收敛速度和准确率。

在这里插入图片描述

2.3 Bag of specials

对于那些插件模块后处理方法,它们仅仅稍微的增加了推理成本,但是可以极大地提高目标检测的准确度,我们将其称之为“bag of specials”。一般来说,这些插件模块用来提高一个模型中特定的属性,比如增加感受野,引入注意力机制或者提高特征整合的能力等等;后处理方法是用来抑制模型预测结果的一种方法。

可以用来提升感受野的常规的方法是SPP [25],ASPP [5]和RFB [47]。SPP模型来源于空间金字塔匹配(SPM)[39],而且SPMs原始的方法将特征图划分成很多d*d个相等的块,其中d可以是{1,2,3,…},因此可以形成空间金字塔,然后提取bag-of-word的特征。SPP将SPM应用在CNN中,然后使用max-pooling代替bag-of-word运算。因为SPP输出的是一维的特征向量,因此它不能应用在全卷积网络(FCN)中。在YOLOv3中,Redmon和Farhadi改进了SPP模块,将max-pooling输出和内核尺寸k*k连接起来,其中k={1,5,8,13},stride=1。基于这个设计,一个相对较大的k*k的max-pooling有效地提高了backbone特征的感受野。在添加了改进后的SPP模型之后,YOLO-v3-608在COCO数据集上,虽然增加了0.5%的额外计算量,但是提高了2.7%的AP50。ASPP模块和改进的SPP模块的区别主要在:原始的k*k过滤器尺寸,从stride=1到3*3内核尺寸的max-pooling,在stride=1的碰撞卷积运算中膨胀比为k。RFB模块使用一些k*k的内核,膨胀比为k,步长为1的碰撞卷积,它比ASPP获得了更全面的空间覆盖率。RFB在MS COCO数据集上仅仅增加了7%的额外推理时间,但是得到了5.7%的AP50提升。

目标检测上经常使用的注意力模块主要分成channel-wise注意力模块和point-wise注意力模块,这两个注意力模块主要的代表分别是Squeeze-and-Excitation(SE)[29]和Spatial Attention Module(SAM)[85]。尽管SE模块在ImageNet图像分类工作上仅仅增加了2%的计算量而提高了1%的top-1准确率,但是在GPU上提高了10%的推理时间,因此SE模块更适合在移动设备上使用。但是对于SAM模块来说,在ImageNet图像分类任务中,它仅仅需要0.1%的额外计算量却能够提升ResNet-SE 0.5%的top-1准确率。它在GPU上并没有有效地影响推理速度。

关于特征融合,早期的是使用skip connection[51]或者是hyper-column[22]将低级的特征和高级的语义特征进行融合。因为多尺度预测方法比如FPN逐渐受到追捧,因此提出了很多将不同特征金字塔融合的轻量级模型。这类别的模型包括SfAM[98]、ASFF[48]和BiFPN[77]。SFAM的主要思想是在多尺度连接特征图上使用channel-wise级别的调整。对于ASFF,它使用softmax作为point-wise级别的调整,然后将不同尺度的特征图加在一起。在BiFPN中,提出使用多输入权重残差连接去执行scale-wise级别的调整,然后将不同尺度的特征图加在一起。

在深度学习的研究中,一些人重点关心去寻找一个优秀的激活函数。一个优秀的激活函数可以让梯度更有效的进行传播,与此同时它不会增加额外的计算量。在2010年,Nair和Hinton[56]提出了ReLU激活函数充分地解决了梯度消失的问题,这个问题在传统的tanh和sigmoid激活函数中会经常遇到。随后,LReLU [54],PReLU [24],ReLU6 [28],比例指数线性单位(SELU)[35],Swish [59],hard-Swish [27]和Mish [55]等等相继提出,它们也用来解决梯度消失的问题。LReLU和PReLU主要用来解决当输出小于零的时候,ReLU的梯度为零的问题。ReLU6和hard-Swish主要为量化网络而设计。对于神经网络的自归一化,提出SELU激活函数去实现这个目的。需要注意的是Swish和Mish都是连续可导的激活函数。

在基于深度学习的目标检测中使用的后处理方法是NMS,它可以用来过滤那些预测统一物体、但是效果不好的BBoxes,然后仅仅保留较好的BBoxes。优化NMS和优化目标方程的方法异曲同工。NMS提出的最初的方法并没有将上下文信息考虑在内,因此Girshick[19]在R-CNN中添加了分类置信度作为参考,然后根据置信度得分的顺序,由高到低执行greedy NMS。对于soft NMS来说,它考虑了这样一个问题:在greedy NMS使用IoU的时候,目标遮挡可能会造成置信度得分的退化。在soft NMS基础上,DIoU NMS将重心坐标的距离信息添加到Bbox的筛选处理中了。值得一提的是,上面提到的后处理方法中都不直接引用捕获的图像特征,后续的anchor-free方法开发中不再需要后处理。
在这里插入图片描述

3 方法

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

  • GPU 在卷积层中,我们使用少量的组(1-8): CSPResNeXt50 / CSPDarknet53
  • VPU 我们使用分组卷积,但是我们不使用Squeeze-and-excitement(SE)模块,具体包括以下模型:EfficientNet-lite / MixNet / GhostNet / MobileNetV3

3.1 网络架构的选择

我们的目标是寻找 输入网络的分辨率、卷积层的个数、参数的数量 (filter_size2∗filters∗channel/groups)(filter\_size^2*filters*channel/groups)(filter_size2filterschannel/groups)以及输出层的个数(filters)之间的最优的平衡。举例来说,大量的研究表明:在ILSVRC2012(ImageNet)的目标检测上,CSPResNext50比CSPDarket53的效果更好,但是在MS COCO的目标检测中,两个的效果恰好相反。

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

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

  • 更好的输入尺寸(分辨率)- 为了检测多个小物体
  • 更多网路层 - 为了获得更大的感受野去覆盖不断增大的输入尺寸
  • 更多的参数 - 提高模型的能力从而能够在一张图片上检测到不同尺寸的多个物体。

假设来说,我们可以认为具有更大感受野(有大量的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最优的选择
在这里插入图片描述
不同尺寸的感受野的影响总结如下:

  • 等于目标物体的大小时:能够看到整个物体
  • 等于网络的尺寸:能够看到目标物体周围的上下文信息
  • 大于网络的尺寸:增加图像点和最终激活之间连接的数量

我们将SPP模块添加到CSPDarknet53中,因为它极大提高了感受野,能够分离出最重要的上下文特征而且没有降低网络运行的速度。我们使用PANet作为不同检测器不同backbone训练阶段聚集参数的方法,而非YOLOv3的FPN模块。

最后,我们选择CSPDarknet53作为backbone, SPP作为附加的模块,PANet 作为neck,使用YOLOv3作为YOLOv4架构的head。

未来,我们计划扩展检测器的Bag of freebies,它们在理论上可以解决某些问题并且能够提高检测器的精度,后续会以实验的形式探究每个算法对检测器的影响。

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

3.2 BoF 和 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 额外的改进

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

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

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

  • 我们改进了一些现有的算法,让我们的设计更适合高效的训练和检测 - 改进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所表示的那样。

在这里插入图片描述

3.4 YOLOv4

在这个部分,我们会详细介绍YOLOv4的细节:

YOLOv4网络架构的细节

网络组成

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上进行预训练

融合不同位置上的特征图

进行预测

4 实验

我们测试了不同训练提升技巧在ImageNet(ILSVRC2012 val)数据集上的精度影响,然后又验证了检测器在MS COCO(test-val 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激活函数作为补充的选项。

在这里插入图片描述

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

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

  • S:消除栅格的敏感度 这个方程在YOLOv3中用于评估目标物体的坐标,自重cx和cy通常是整数,因此,当bx的值非常接近cx或者cx+1的时候,tx的绝对值会非常大。我们通过给sigmoid函数乘以一个大于1的因子来解决这个问题,因此,这样就消除了栅格对不可检测物体的影响。
  • M:Mosaic数据增广 - 在训练过程中,使用四张图片而非一张进行增广处理
  • IT:IoU****阈值 - 为一个ground truth的IoU使用多个anchors,ground truth IoU(truth, anchor) > IoU 阈值
  • GA:遗传算法 - 在前10%的训练时间内使用遗传算法选择最优的超参数
  • LS:C****lass 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的时候,检测器得到了最好的性能。

在这里插入图片描述
在这里插入图片描述

4.4 不同backbones和预训练权重在检测器训练中的影响

下一步我们研究不同backbones模型在检测器准确率上的影响,正如表6所示。我们注意到拥有最佳分类准确率的模型,检测器的准确度未必是最佳的。

首先,尽管使用不同算法训练得到的CSPResNeXt-50模型的分类精度比CSPDarknet53模型的要高,但是CSPDarknet53模型的检测精度更高。

再者,CSPResNeXt-50分类器训练使用BoF和Mish提高了它的分类准确率,但是检测器训练使用的预训练权重的进一步使用减少了检测器的精度。但是,CSPDarknet53分类器训练使用BoF和Mish提高了分类器和检测器的准确率,它使用分类器预训练权重。这表示CSPDarknet53比CSPResNeXt-50更适合作为检测器。

我们观察到,由于各种改进,CSPDarknet53模型显示出了更大的提高的检测器精度的能力

在这里插入图片描述

4.5 不同mini-batch尺寸在检测器训练上的影响

最后,我们分析了不同mini-batch尺寸的训练的模型的结果,并且结果在表7中显示出来。从表7中我们发现在添加了BoF和BoS训练策略之后,mini-batch尺寸几乎对检测器的性能没有影响。结果显示在引入了BoF和BoS之后,就不需要使用昂贵的GPUs进行训练。换句话说,任何人可以仅仅使用一个GPU去训练一个优秀的检测器。

在这里插入图片描述

5 结果

使用最先进的目标检测器得到的对比结果在图8中显示(具体请看原文)。我们的YOLOv4坐落在帕累托最优曲线上,而且在精度和速度上都优于目前最快的和最准确的检测器。
在这里插入图片描述

6 结论

我们提出了一个最先进的目标检测器,它比所有检测器都要快而且更准确。这个检测器可以仅在一块8-16GB的GPU上进行训练,这使得它可以广泛的使用。One-stage的anchor-based的检测器的原始概念证明是可行的。我们已经验证了大量的特征,并且其用于提高分类器和检测器的精度。这些算法可以作为未来研究和发展的最佳实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Android] 年年有鱼手机主题

自制的年年有鱼手机主题,希望大家喜欢!~ 下载地址:https://yunpan.cn/cqauQbiM97idd (提取码:d272) 本文转自haiyang45751CTO博客,原文链接: http://blog.51cto.com/haiyang457/1…

mysql 小数做索引_10 分钟掌握 MySQL 的索引查询优化技巧

本文的内容是总结一些MySQL的常见使用技巧,以供没有DBA的团队参考。如无特殊说明,存储引擎以InnoDB为准。MySQL的特点了解MySQL的特点有助于更好的使用MySQL,MySQL和其它常见数据库最大的不同在于存在存储引擎这个概念,存储引擎负…

模块与包

一 模块介绍 1、什么是模块? #常见的场景:一个模块就是一个包含了一组功能的python文件,比如spam.py,模块名为spam,可以通过import spam使用。#在python中,模块的使用方式都是一样的,但其实细说的话&#x…

解决eclipse + pydev 编译过程中有中文的问题

最近在学习python编程,开发环境设置好了,是用eclipse pydev 来做开发的环境,配置好了之后,需要解决的一个关键问题就是老问题了:如何解决代码中的中文问题。。。 其实但我们在配置编程环境的时候,就需要设…

程序员的思考--终于确定了自己的技术发展方向

经过了将近5年的工作沉淀以后,终于确定了自己的职业发展方向。从现在开始终于可以有的放矢了,不再迷茫了。回想以往,找到这个方向,确实不是一件容易的事情,一路也是迷茫的走过来,随着知识和工作经验的积累&…

【原】iOS:手把手教你发布代码到CocoaPods(Trunk方式)

概述 关于CocoaPods的介绍不在本文的主题范围内,如果你是iOS开发者却不知道CocoaPods,那可能要面壁30秒了。直奔主题,这篇文章主要介绍如果把你的代码发布到CocoaPods代码库中,让别人可以使用“pod search yourOpenProject”命令查…

kafka tool 查看指定group下topic的堆积数量_ELK架构下利用Kafka Group实现Logstash的高可用...

系统运维的过程中,每一个细节都值得我们关注下图为我们的基本日志处理架构所有日志由Rsyslog或者Filebeat收集,然后传输给Kafka,Logstash作为Consumer消费Kafka里边的数据,分别写入Elasticsearch和Hadoop,最后使用Kiba…

jquery flot pie画饼图

具体效果如下&#xff1a; 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> 5 <title>Insert title here</title> 6 <script language"javas…

mysql fetch rows_差异mysql_fetch_array()和mysql_fetch_rows()函数_mysql

区别mysql_fetch_array()和mysql_fetch_rows()函数form:http://www.uphtm.com/php/254.html如果我们不仔细看会发现象mysql_fetch_array()和mysql_fetch_rows()函数没有什么区别&#xff0c;但是细细的看你会发现它们区别还是蛮大了&#xff0c;如果各位对于此函数的区别不了解…

解读设计模式----简单工厂模式(SimpleFactory Pattern),你要什么我就给你什么

本文首发于博客园,地址:http://www.cnblogs.com/beniao/archive/2008/08/09/1263318.html 一、模式概述 从设计模式的类型上来说&#xff0c;简单工厂模式是属于创建型模式&#xff0c;又叫做静态工厂方法&#xff08;Static Factory Method&#xff09;模式&#xff0c;但不属…

Memcached常用操作

memcached是一个高性能的、分布式内存对象缓存系统&#xff0c;应用广泛。 通过缓存数据库查询结果&#xff0c;减少数据库访问次数&#xff0c;以提高动态Web应用的速度、 提高可扩展性。 它可以应对任意多个连接&#xff0c;使用非阻塞的网络IO。由于它的工作机制是在内存中开…

android自定义金额输入键盘_Android 自定义控件 - 仿支付宝数字键盘

原标题&#xff1a;Android 自定义控件 - 仿支付宝数字键盘简介在一些带有支付功能的 App 中&#xff0c;输入的密码一般只能是纯数字&#xff0c;虽然我们可以指定 EditText 输入框只能输入数字&#xff0c;但是为了提供用户的使用体验&#xff0c;我们往往更倾向于使用自定义…

tfs文件系统之NS配置管理

NameServer简称NS 充当着客户与DS的交互桥梁 1.NS配置文件修改&#xff1a; [public] #log file size default 1GB log_size1073741824 #log file num default 64 log_num 64 #log file level default debug log_leveldebug #main queue size default 10240 task_max_queue_…

插件式架构设计实践:插件式系统架构设计简介

本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework&#xff08;MEF&#xff09;&#xff0c;以插件式架构设计为导线&#xff0c;分享本人在从事基于微软Silverlight技术构建的RIA系统中实施插件式系统架构设计的相关技术和经…

五种方式让你在java中读取properties文件内容不再是难题

2019独角兽企业重金招聘Python工程师标准>>> 方式1.通过context:property-placeholder加载配置文件jdbc.properties中的内容 <context:property-placeholder location"classpath:jdbc.properties" ignore-unresolvable"true"/> 上面的配置…

hive metastore mysql_Hive MetaStore的结构

本篇主要是介绍Hive在MySQL中存储的源数据的表结构。Hive MetaStore 数据库表结构图test.pngTBLS记录数据表的信息字段解释TBL_ID在hive中创建表的时候自动生成的一个id&#xff0c;用来表示&#xff0c;主键CREATE_TIME创建的数据表的时间&#xff0c;使用的是时间戳DBS_ID这个…

更改阿里云域名解析台里某个域名绑定的IP之后不能解析到新IP

1.由于要撤销一组负载均衡&#xff0c;所以需要更改阿里云域名解析台里某个域名由原来绑定的负载均衡公网IP换到服务器公网IP 2.在服务器上nginx指定了域名访问&#xff0c;开启nginx服务 3.暂时关闭该组负载均衡服务 4.实现通过服务器IP可以访问项目&#xff0c;域名访问不了 …

秒懂数据类型的真谛—Python基础前传(4)

一切编程语言都是人设计的&#xff0c;既然是人设计的&#xff0c;那么设计各种功能的时候就一定会有它的道理&#xff0c;那么设计数据类型的用意是什么呢&#xff1f; (一) 基本数据类型 基本数据类型&#xff1a; 数字 int字符串 str布尔值 bool列表 list元组 tuple字典 dic…

wordpress配置SMTP服务发送邮件

使用SMTP服务发送邮件&#xff0c;需要使用一个插件&#xff1a;http://wordpress.org/extend/plugins/wp-mail-smtp/ 下载完成以后解压到plugin目录&#xff0c;然后在插件中启用这个插件。 配置SMTP服务 SMTP的选项 发送一封测试邮件吧 >>> 本文转自齐师傅博客园博客…

使用Server 2008新GPO做驱动器映射

在Server 2003的时代&#xff0c;我们为用户做网络驱动器映射(以下就直接称为Map Network Drive&#xff09;, 通常可能有以下的做法. 方法一: 做一个登录脚本&#xff0c;放在DC的netlogon目录&#xff0c;接着在“Active Directory用户和计算机”控制台的用户属性的Logon S…