今天刷看到了YOLOv4之时,有点激动和兴奋,等了好久的YOLOv4,你终究仍是出现了git
论文地址:https://arxiv.org/pdf/2004.10934.pdfgithub
GitHub地址:https://github.com/AlexeyAB/darknet算法
以为做者很地道,论文附上开源,没有比这更开心的事情了吧!网络
首先附上对论文总结的思惟导图,帮助你们更好的理解!架构
下边是对论文的翻译,有些地方可能翻译的不是很准备,欢迎指正补充dom
(思惟导图和论文译文PDF都可在公众号【计算机视觉联盟】回复YOLOv4获取)ide
有不少特征能够提升卷积神经网络(CNN)的准确性。须要在大型数据集上对这些特征的组合进行实际测试,并须要对结果进行理论证实。某些特征仅在某些模型上运行,而且仅在某些问题上运行,或者仅在小型数据集上运行;而某些特征(例如批归一化和残差链接)适用于大多数模型,任务和数据集。咱们假设此类通用特征包括加权残差链接(WRC),跨阶段部分链接(CSP),交叉小批量标准化(CmBN),自对抗训练(SAT)和Mish激活。咱们使用如下新功能:WRC,CSP,CmBN,SAT,Mish激活,马赛克数据加强,CmBN,DropBlock正则化和CIoU丢失,并结合其中的一些特征来实现最新的结果:在MS COCO数据集上利用Tesla V10以65 FPS的实时速度得到了43.5%的AP(65.7%AP50)。开源代码连接:https://github.com/AlexeyAB/darknet。函数
大多数基于CNN的物体检测器仅适用于推荐系统。例如,经过慢速精确模型执行的城市摄像机搜索免费停车位,而汽车碰撞警告与快速不精确模型有关。提升实时物体检测器的精度不只能够将它们用于提示生成推荐系统,还能够用于独立的过程管理和减小人工输入。常规图形处理单元(GPU)上的实时对象检测器操做容许以可承受的价格对其进行运行。最精确的现代神经网络没法实时运行,须要使用大量的GPU进行大量的mini-batch-size训练。咱们经过建立在常规GPU上实时运行的CNN来解决此类问题,而且该培训仅须要一个传统的GPU。性能
这项工做的主要目标是在产生式系统中设计一个运行速度快的目标探测器,并对并行计算进行优化,而不是设计一个低计算量的理论指标(BFLOP)。咱们但愿所设计的对象易于训练和使用。如图1中的YOLOv4结果所示,任何人使用传统的GPU进行训练和测试,均可以得到实时、高质量和使人信服的目标检测结果。咱们的贡献归纳以下:学习
目标检测算法通常有两部分组成:一个是在ImageNet预训练的骨架(backbone),,另外一个是用来预测对象类别和边界框的头部。对于在GPU平台上运行的检测器,其骨干能够是VGG [68],ResNet [26],ResNeXt [86]或DenseNet [30]。对于在CPU平台上运行的那些检测器,其主干能够是SqueezeNet [31],MobileNet [2八、6六、2七、74]或ShuffleNet [9七、53]。对于头部,一般分为两类,即一级对象检测器和二级对象检测器。最具备表明性的两级对象检测器是R-CNN [19]系列,包括fast R-CNN [18],faster R-CNN [64],R-FCN [9]和Libra R-CNN [ 58]。还可使两级对象检测器成为无锚对象检测器,例如RepPoints [87]。对于一级目标检测器,最具表明性的模型是YOLO [6一、6二、63],SSD [50]和RetinaNet [45]。近年来,开发了无锚的(anchor free)一级物体检测器。这类检测器是CenterNet [13],CornerNet [3七、38],FCOS [78]等。近年来,无锚点单级目标探测器获得了发展,这类探测器有CenterNet[13]、CornerNet[37,38]、FCOS[78]等。近年来发展起来的目标探测器常常在主干和头部之间插入一些层,这些层一般用来收集不一样阶段的特征图。咱们能够称它为物体探测器的颈部。一般,颈部由几个自下而上的路径和几个自上而下的路径组成。具备这种机制的网络包括特征金字塔网络(FPN)[44]、路径汇集网络(PAN)[49]、BiFPN[77]和NAS-FPN[17]。除上述模型外,一些研究人员将重点放在直接构建用于检测对象的新主干(DetNet [43],DetNAS [7])或新的整个模型(SpineNet [12],HitDe-tector [20])上。
总而言之,普通的检测器由如下几个部分组成:
一般,传统的物体检测器是离线训练的。所以,研究人员一直喜欢采用这种优点并开发出更好的训练方法,从而可使目标检测器得到更好的精度而又不会增长推理成本。咱们称这些仅改变培训策略或仅增长培训成本的方法为“免费赠品”。数据检测是对象检测方法常常采用的并符合免费赠品的定义。数据加强的目的是增长输入图像的可变性,从而使设计的物体检测模型对从不一样环境得到的图像具备更高的鲁棒性。例如,光度失真和几何失真是两种经常使用的数据加强方法,它们无疑有利于物体检测任务。在处理光度失真时,咱们调整图像的亮度,对比度,色相,饱和度和噪点。对于几何失真,咱们添加了随机缩放,裁剪,翻转和旋转。
上面提到的数据加强方法是全像素调整,而且保留了调整区域中的全部原始像素信息。此外,一些从事数据加强的研究人员将重点放在模拟对象遮挡问题上。他们在图像分类和目标检测方面取得了良好的成果。例如,random erase[100]和CutOut [11]能够随机选择图像中的矩形区域,并填充零的随机或互补值。至于hide-and-seek[69]和grid mask[6],他们随机或均匀地选择图像中的多个矩形区域,并将其替换为全部零。若是相似的概念应用于要素地图,则有DropOut [71],DropConnect [80]和DropBlock [16]方法。另外,一些研究人员提出了使用多个图像一块儿执行数据加强的方法。例如,MixUp [92]使用两个图像对具备不一样系数的图像进行乘法和叠加,而后使用这些叠加的系数来调整标签。对于CutMix [91],它是将裁切后的图像覆盖到其余图像的矩形区域,并根据混合区域的大小调整标签。除了上述方法以外,样式转移GAN [15]还用于数据扩充,这种用法能够有效地减小CNN所学习的纹理误差。
与上面提出的各类方法不一样,其余一些免费赠品方法专用于解决数据集中语义分布可能存在误差的问题。在处理语义分布偏向问题时,一个很是重要的问题是不一样类之间存在数据不平衡的问题,这一问题一般是经过两阶段对象设计器中的难例挖掘[72]或在线难例挖掘[67]来解决的。可是实例挖掘方法不适用于一级目标检测器,由于这种检测器属于密集预测架构。所以Linet等 [45]提出了焦点损失,以解决各个类别之间存在的数据不平衡问题。另外一个很是重要的问题是,很难用one-hot representation来表达不一样类别之间的关联度。这种表示方法常常在执行标签时使用。[73]中提出的标签平滑是将硬标签转换为软标签以进行训练,这可使模型更加健壮。为了得到更好的软标签,Islamet等人[33]引入知识蒸馏的概念来设计标签优化网络。
最后一袋赠品是边界框回归的目标函数。传统的目标检测器一般使用均方偏差(MSE)直接对BBox的中心点坐标和高度、宽度进行回归,即{xcenter,ycenter,w,h},或者对左上角和右下点,即{xtopleft,ytopleft,xbottomright,ybottomright}进行回归。对于基于锚点的方法,是估计相应的偏移量,例如{xcenterOffset,ycenterOffset,wOffset,hoffset}和{xtopleftoffset,ytopleftoffset,xbottomright toffset,ybottomright toffset},例如{xtopleftoffset,ytopleftoffset}和{xtopleftoffset,ytopleftoffset}。然而,直接估计BBox中每一个点的坐标值是将这些点做为独立变量来处理,而实际上并无考虑对象自己的完整性。为了更好地处理这一问题,最近一些研究人员提出了IoU loss[90],将预测BBOX区域的覆盖率和地面真实BBOX区域的覆盖率考虑在内。IOU loss计算过程将触发BBOX的四个坐标点的计算,方法是执行具备地面实况的借条,而后将生成的结果链接到一个完整的代码中。因为IOU是一种标度不变的表示,它能够解决传统方法计算{x,y,w,h}的l1或l2个损失时,损失会随着尺度的增大而增大的问题。最近,搜索者不断改善欠条损失。例如,GIOU损失[65]除了包括覆盖区域外,还包括对象的形状和方向。他们提出找出能同时覆盖预测BBOX和实际BBOX的最小面积BBOX,并用这个BBOX做为分母来代替原来在欠条损失中使用的分母。对于DIoU loss[99],它另外考虑了物体中心的距离,而CIoU损失[99]则同时考虑了重叠面积、中心点之间的距离和纵横比。在求解BBox回归问题时,Ciou能够达到较好的收敛速度和精度。
对于那些仅增长少许推理成本但能够显着提升对象检测准确性的插件模块和后处理方法,咱们将其称为“特价商品”。通常而言,这些插件模块用于加强模型中的某些属性,例如扩大接受域,引入注意力机制或加强特征集成能力等,然后处理是用于筛选模型预测结果的方法。
能够用来加强接收域的通用模块是SPP [25],ASPP [5]和RFB [47]。 SPP模块起源于空间金字塔匹配(SPM)[39],SPM的原始方法是将功能图分割成若干x不等的块,其中{1,2,3,...}能够是空间金字塔,而后提取词袋特征。 SPP将SPM集成到CNN中,并使用最大池操做而不是词袋运算。因为Heet等人提出了SPP模块。 [25]将输出一维特征向量,在全卷积网络(FCN)中应用是不可行的。所以,在YOLOv3的设计中[63],Redmon和Farhadi将SPP模块改进为内核大小为k×k的最大池输出的串联,其中k = {1,5,9,13},步长等于1。在这种设计下,相对大k×kmax池有效地增长了骨干特征的接受范围。在添加了改进版本的SPP模块以后,YOLOv3-608在MS COCOobject检测任务上将AP50升级了2.7%,而额外的计算费用为0.5%。ASPP[5]模块和改进的SPP模块之间的操做差别主要来自于原始k× kkernel大小,最大卷积步长等于1到3×3内核大小,膨胀比等于tok,步长等于1。 RFB模块将使用k×kkernel的几个扩张卷积,扩张比率equalstok和步幅等于1来得到比ASPP更全面的空间覆盖范围。 RFB [47]仅花费7%的额外推断时间便可将MS COCO上SSD的AP50提升5.7%。
物体检测中经常使用的注意模块主要分为通道式注意和点式注意,这两种注意模型的表明分别是挤压激发(SE)[29]和空间注意模块(SAM)[85]。虽然SE模块在Im-ageNet图像分类任务中能够提升1%的TOP-1准确率,可是在GPU上一般会增长10%左右的推理时间,所以更适合在移动设备上使用,虽然SE模块在Im-ageNet图像分类任务中能够提升1%的TOP-1准确率,可是在GPU上一般会增长10%左右的推理时间。而对于SAM,它只须要额外支付0.1%的计算量,在ImageNet图像分类任务上能够提升ResNet50-SE 0.5%的TOP-1准确率。最棒的是,它彻底不影响GPU上的推理速度。
在特征集成方面,早期的实践是使用KIP链接[51]或超列[22]将低级物理特征集成到高级语义特征。随着模糊神经网络等多尺度预测方法的普及,人们提出了许多集成不一样特征金字塔的轻量级模块。这种类型的模块包括SfAM[98]、ASFF[48]和BiFPN[77]。SfAM的主要思想是使用SE模块对多比例尺拼接的特征地图进行通道级的加权。ASFF采用Softmax做为逐点层次加权,而后添加不一样尺度的特征地图;BiFPN采用多输入加权残差链接进行尺度层次从新加权,再添加不一样尺度的特征地图。
在深度学习的研究中,有些人专一于寻找良好的激活功能。良好的激活函数可使梯度更有效地传播,同时不会引发过多的计算成本。在2010年,Nair和Hin-ton [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和Mishare都具备连续可区分的激活功能。
在基于深度学习的对象检测中一般使用的后处理方法是NMS,它能够用于过滤那些没法预测相同对象的BBox,并仅保留具备较高响应速度的候选BBox。 NMS尝试改进的方法与优化目标函数的方法一致。 NMS提出的原始方法没有考虑上下文信息,所以Girshicket等人。 [19]在R-CNN中添加了分类置信度得分做为参考,而且根据置信度得分的顺序,从高分到低分的顺序执行贪婪的NMS。对于软网络管理系统[1],考虑了一个问题,即物体的遮挡可能会致使带有IoU评分的贪婪的网络管理系统的置信度得分降低。 DIoU NMS [99]开发人员的思惟方式是在softNMS的基础上将中心距离的信息添加到BBox筛选过程当中。值得一提的是,因为上述后处理方法均未直接涉及捕获的图像功能,所以在随后的无锚方法开发中再也不须要后处理。
其基本目标是在生产系统中对神经网络进行快速操做,并针对并行计算进行优化,而不是低计算量理论指示器(BFLOP)。咱们提供了实时神经网络的两种选择:
咱们的目标是在输入网络分辨率,卷积层数,参数数(filtersize2 过滤器通道/组)和层输出(过滤器)数目之间找到最佳平衡。例如,大量研究代表,在ILSVRC2012(ImageNet)数据集的对象分类方面,CSPResNext50比CSPDarknet53更好。然而,相反,就检测MS COCO数据集上的对象而言,CSPDarknet53比CSPResNext50更好。
下一个目标是为不一样的检测器级别从不一样的主干级别中选择其余块以增长接收场和参数汇集的最佳方法: FPN,PAN,ASFF,BiFPN。
对于分类最佳的参考模型对于检测器并不是老是最佳的。与分类器相比,检测器须要知足如下条件:
假设能够选择接受场较大(卷积层数为3×3)和参数数较多的模型做为主干。表1显示了CSPResNeXt50、CSPDarknet53和Effi-cientNet B3的信息。CSPResNext50只包含16个卷积层3×3,425×425感觉野和20.6M参数,而CSPDarknet53包含29个卷积层3×3,725×725感觉野和27.6M参数。这一理论证实,再加上咱们的大量实验,代表CSPDarknet53神经网络是二者做为探测器骨干的最佳模型。
不一样大小的感觉野对检测效果的影响以下所示:
咱们在CSPDarknet53上添加SPP块,由于它显著增长了接受场,分离出最重要的上下文特征,而且几乎不会下降网络操做速度。咱们使用PANET代替YOLOv3中使用的FPN做为不一样骨级的参数聚合方法,用于不一样的检测器级别。
最后,咱们选择了CSPDarknet53主干、SPP附加模块、PANET路径聚合Neck和YOLOv3(基于锚点的)头部做为YOLOv4的体系结构。
未来,咱们计划显着扩展检测器的赠品袋(BoF)的内容,从理论上讲,它能够解决一些问题并提升检测器的准确性,并以实验方式依次检查每一个功能的影响。
咱们不使用跨GPU批量标准化(CGBNor SyncBN)或昂贵的专用设备。这使任何人均可以在传统的图形处理器上重现咱们的最新成果,例如GTX 1080Ti或RTX2080Ti。
为了改进目标检测训练,CNN一般使用如下方法:
至于训练激活功能,因为PReLU和SELU更难训练,而且ReLU6是专门为量化网络设计的,所以咱们从候选列表中删除了上述激活功能。在从新量化方法中,发布Drop-Block的人们将本身的方法与其余方法进行了详细的比较,而其正则化方法赢得了不少。所以,咱们绝不犹豫地选择了DropBlock做为咱们的正则化方法。至于标准化方法的选择,因为咱们专一于仅使用一个GPU的训练策略,所以不考虑syncBN。
为了使设计的检测器更适合在单个GPU上进行训练,咱们进行了如下附加设计和改进:
Mosaic是一种新的混合4幅训练图像的数据加强方法。因此四个不一样的上下文信息被混合,而CutMix只混合了2种。
这容许检测其正常上下文以外的对象。此外,批量归一化从每层上的4个不一样的图像计算激活统计。这极大地减小了对large mini-batch-size的需求。
自对抗训练(SAT)也表明了一种新的数据加强技术,它在两个前向后向阶段运行。在第一阶段,神经网络改变原始图像而不是网络权值。经过这种方式,神经网络对其自身执行对抗性攻击,改变原始图像,以制造图像上没有所需对象的欺骗。在第二阶段,训练神经网络,以正常的方式在修改后的图像上检测目标。
CmBN表示CBN的修改版本,如图4所示,定义为交叉小批量规范化(Cross mini-Batch Normalization,CMBN)。这仅在单个批次内的小批次之间收集统计信息。
咱们将SAM从空间注意修改成点注意,并将PAN的快捷链接分别替换为串联,如图5和图6所示。
在本节中,咱们将详细介绍YOLOv4的细节。
YOLOv4的组成:
YOLOv4的使用:
咱们在ImageNet(ILSVRC 2012 Val)数据集上测试了不一样训练改进技术对分类器精度的影响,而后在MS Coco(test-dev 2017)数据集上测试了不一样训练改进技术对检测器精度的影响。
在ImageNet图像分类实验中,缺省超参数以下:训练步数为800万步;batch size和mini-batch size分别为128和32;采用多项式衰减学习率调度策略,初始学习率为0.1;预热步数为1000步;动量和权值分别设置为0.9和0.005。咱们全部的BoS实验都使用与默认设置相同的超参数,而且在BoF实验中,咱们增长了50%的训练步骤。在BoF实验中,咱们验证了MixUp、CutMix、Mosaic、Bluring数据加强和标记平滑正则化方法。在BoS实验中,咱们比较了LReLU、SWISH和MISHISH激活函数的效果。全部实验均使用1080Ti或2080Ti GPU进行训练。
在MS COCO目标检测实验中,缺省超参数以下:训练步数为500,500;采用阶跃衰减学习率调度策略,初始学习率为0.01,在400,000步和450,000步分别乘以因子0.1;动量衰减和权重衰减分别设置为0.9和0.0005。全部的体系结构都使用单个GPU来执行批处理大小为64的多尺度训练,而小批处理大小为8或4,具体取决于体系结构和GPU内存的限制。除采用遗传算法进行超参数搜索实验外,其他实验均采用默认设置。遗传算法使用YOLOv3-SPP算法在有GIoU损失的状况下进行训练,在300个历元中搜索Min-Val5k集。咱们采用搜索学习率0.00261,动量0.949,IOU阈值分配地面真值0.213,损失归一化0.07%进行遗传算法实验。咱们验证了大量的BoF算法,包括网格敏感度消除、moSAIC数据加强、IOU阈值、遗传算法、类标签平滑、交叉小批量归一化、自对抗训练、余弦退火调度器、动态小批量大小、DropBlock、优化锚点、不一样类型的IOU损失。咱们还在不一样的BoS上进行了实验,包括MISH、SPP、SAM、RFB、BiFPN和Gaus-Sian YOLO[8]。对于全部的实验,咱们只使用一个GPU进行训练,所以不使用诸如优化多个GPU的syncBN之类的技术。
首先,咱们研究了不一样特征对分类器训练的影响;具体地说,类标签平滑的影响,不一样数据扩充技术的影响,双边模糊,混合,CutMix和马赛克,如图7所示,以及不一样活动的影响,如Leaky-relu(默认状况下),SWISH和MISH。
在咱们的实验中,如表2所示,经过引入诸如:CutMix和Mosaic数据加强、类标签平滑和Mish激活等特征,提升了分类器的精度。所以,咱们用于分类器训练的BoF-Backbone(Bag Of Freebies)包括如下内容:CutMix和Mosaic数据加强以及类标签平滑。此外,咱们还使用MISH激活做为补充选项,如表2和表3所示。
进一步的研究涉及不一样的免费袋(BOF探测器)对探测器训练精度的影响,如表4所示。咱们经过研究在不影响FPS的状况下提升探测器精度的不一样特性,显著扩展了BOF列表:
进一步研究了不一样的专业袋(BOS检测器)对检测器训练精度的影响,包括PAN、RFB、SAM、高斯YOLO(G)和ASFF,如表5所示。在咱们的实验中,当使用SPP、PAN和SAM时,检测器的性能最佳。
进一步,咱们研究了不一样主干模型对检测器精度的影响,如表6所示。请注意,具备最佳分类精度的模型在检测器精度方面并不老是最佳。
首先,尽管与CSPDarknet53模型相比,通过不一样功能训练的CSPResNeXt-50模型的分类准确性更高,但CSPDarknet53模型在对象检测方面显示出更高的准确性。
其次,使用BoF和Mish进行CSPResNeXt50分类器训练会提升其分类准确性,可是将这些预先训练的权重进一步应用于检测器训练会下降检测器准确性。可是,将BoF和Mish用于CSPDarknet53分类器训练能够提升分类器和使用该分类器预训练加权的检测器的准确性。结果是,与CSPResNeXt50相比,主干CSPDarknet53更适合于检测器。
咱们观察到,因为各类改进,CSPDarknet53模型具备更大的能力来提升检测器精度。
最后,咱们分析了在不一样最小批量大小下训练的模型所得到的结果,结果如表7所示。从表7所示的结果中,咱们发如今添加BoF和BoS训练策略以后,最小批量大小几乎没有影响在检测器的性能上。该结果代表,在引入BoF和BoS以后,再也不须要使用昂贵的GPU进行训练。换句话说,任何人都只能使用传统的GPU来训练出色的探测器。
与其余最早进的物体探测器得到的结果比较如图8所示。YOLOv4在速度和准确性方面均优于最快,为最准确的探测器。
因为不一样的方法使用不一样体系结构的GPU进行推理时间验证,咱们在经常使用的Maxwell、Pascal和VoltaArchitecture体系结构的GPU上运行YOLOv4,并将它们与其余先进的方法进行了比较。表8列出了使用Maxwell GPU的帧率比较结果,能够是GTX Titan X(Maxwell)或Tesla M40 GPU。表9列出了使用Pascal GPU的帧率比较结果,它能够是Titan X(Pascal)、Titan XP、GTX 1080 Ti或Tesla P100 GPU。表10列出了使用VoltaGPU的帧率对比结果,能够是Titan Volta,也能够是Tesla V100 GPU。
咱们提供最早进的检测器,其速度(FPS)和准确度(MS COCO AP50 ... 95和AP50)比全部可用的替代检测器都高。所描述的检测器能够在具备8-16GB-VRAM的常规GPU上进行训练和使用,这使得它的普遍使用成为可能。一阶段基于锚的探测器的原始概念已证实其可行性。咱们已经验证了大量特征,并选择使用其中的一些特征以提升分类器和检测器的准确性。这些功能能够用做未来研究和开发的最佳实践。
做者要感谢Glenn Jocher进行Mosaic数据加强的想法,经过使用遗传算法选择超参数并解决网格敏感性问题的方法https://github.com/ultralytics/yolov3.10。
计算机视觉联盟 报道 | 公众号 CVLianMeng