最近在学习v4相关的内容,先粗略翻译翻译v4的文章。其中如果有什么意见或者建议可以评论一下。
YOLOv4论文下载:https://arxiv.org/pdf/2004.10934.pdf.
YOLOv4代码下载:https://github.com/AlexeyAB/darknet
据说有大量的特征可以提高卷积神经网络(CNN)的精度。需要在大数据集上对这些特征组合进行实际测试,并对结果进行理论论证。某些特征只在某些模型上运行,对某些问题也只起作用,或者只对小规模数据集起作用;而一些特性,如批处理规范化和剩余连接,适用于大多数模型、任务和数据集。我们假设这些普遍特征包括加权剩余连接(WRC),跨阶段部分连接(CSP),交叉小批量标准化(CmBN),自我对抗训练(SAT)和混合激活。我们使用新特性:WRC,CSP,CmBN,SAT,Mish激活函数,马赛克数据增加,CmBN,DropBlock正规化,CIoU损失函数,并结合一些实现先进的结果:在MS COCO数据集上达到了43.5%的AP(65.7% AP50),在特斯拉V100上的实时速度约65 FPS。源代码在https://github.com/AlexeyAB/darknet。
大多数基于CNN的物体检测器仅适用于推荐系统。例如,通过慢速精确模型执行通过城市摄像机搜索空闲停车位的过程,而汽车碰撞警告则与快速不精确模型有关。提高实时物体检测器的准确性,不仅可以将它们用于提示生成推荐系统,还可以用于独立的过程管理和减少人工输入。常规图形处理单元(GPU)上的实时对象检测器操作允许它们以可承受的价格进行大量使用。最精确的现代神经网络不能实时运行,并且需要大量的GPU来进行大型微型批次的训练。我们通过创建CNN来解决此类问题,该CNN在常规GPU上实时运行,并且训练仅需要一个常规GPU。
YOLOv4与其他最新目标检测器的比较。 YOLOv4的运行速度比EfficientDet快两倍,并且性能相当。将YOLOv3的AP和FPS分别提高了10%和12%。
这项工作的主要目标是设计生产系统中目标检测器的快速运行速度并优化并行计算,而不是低计算量理论指标(BFLOP)。我们希望可以轻松地训练和使用设计的对象。例如,任何使用常规GPU进行训练和测试的人都可以获得实时,高质量和令人信服的对象检测结果,如图1所示的YOLOv4结果。我们的贡献总结如下:
1.我们开发了有效而强大的对象检测模型。它使每个人都可以使用1080 Ti或2080 Ti GPU训练超快速和准确的物体检测器。
2.我们验证了最先进的Bag-of-Freebies和Bag-of-Specials方法在目标检测训练期间的影响。
3.我们修改了最先进的方法,使其变得更高效并且更适合单个GPU训练,包括CBN[89]、PAN[49]、SAM[85]等。
现代检测器通常由两部分组成,一个是在ImageNet上预训练的骨架,另一个是用来预测物体的类别和边界框的头部。对于在GPU平台上运行的检测器,其主干可以是VGG [68],ResNet [26],ResNeXt [86]或DenseNet [30]。对于在CPU平台上运行的检测器,其主干可以是SqueezeNet [31],MobileNet [28、66、27、74]或ShuffleNet [97、53]。至于头部,通常分为两类,即一步目标检测和二步目标检测。最有代表性的两步目标检测是R-CNN [19]系列,包括Fast R-CNN [18],Faster R-CNN [64],R-FCN [9]和Libra R-CNN [58]。在二步目标检测中也可以不用anchor的目标检测,例如RepPoints [87]。对于一步目标检测来说,最具代表性的模型是YOLO [61、62、63],SSD [50]和RetinaNet [45]。近年来,开发了不用anchor的一步目标检测。这种检测器有CenterNet [13],CornerNet [37、38],FCOS [78]等。近年来开发的目标检测通常在骨架网络和头部之间插入一些层,这些层通常用于收集特征图。从不同的阶段。我们可以称其为目标检测的颈部(neck)。通常,颈部由几个自下而上的路径和几个自上而下的路径组成。配备此机制的网络包括Feature Pyramid Network (FPN)[44],Path Aggregation(PAN)[49],BiFPN[77]和NAS-FPN[17]。
除了上述模型外,一些研究人员还强调直接构建用于目标检测的新骨干(DetNet [43],DetNAS [7])或新的整个模型(SpineNet [12],HitDetector [20])。
综上所述,普通的目标检测由以下几部分组成:
通常情况下,传统的目标检测的训练都是离线进行的。因此,研究人员总是喜欢利用这一优势,并开发出更好的训练方法,使得目标检测在不增加测试成本的情况下达到更好的精度。我们将这些只需改变训练策略或只增加训练成本的方法称为bag of freebies。数据增强是目标检测经常采用并符合这个定义的方法。数据增强的目的是增加输入图像的多样性,从而使设计的目标检测模型对来自不同环境的图片具有较高的鲁棒性。比如,光度失真和几何失真是两种常用的数据扩充方法,它们无疑有益于物体检测任务。处理光度失真时,我们调整图像的亮度、对比度、色调、饱和度和噪声。对于几何变形,我们添加了随机缩放,裁剪,翻转和旋转。
上面提到的数据增强的方法都是逐像素调整,并且保留了调整区域中的所有原始像素信息。此外,一些从事数据增强的研究人员将重点放在模拟对象遮挡问题上。他们在图像分类和目标检测中取得了良好的效果。例如,随机擦除[100]和CutOut [11]可以随机选择图像中的矩形区域,并填充零的随机或互补值。至于捉迷藏[69]和网格遮罩[6],他们随机或均匀地选择图像中的多个矩形区域并将其替换为全零。如果将相似的概念应用于要素地图,则有DropOut [71],DropConnect [80]和DropBlock [16]方法。另外,一些研究人员提出了使用多个图像一起执行数据增强的方法。例如,MixUp [92]使用两个图像以不同的系数比率进行乘法和叠加,然后使用这些叠加比率来调整标签。对于CutMix [91],它是将裁切后的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签。除了上述方法外,网络转移GAN [15]还用于数据增强,这种用法可以有效地减少CNN所学习的纹理偏差。
与上面提出的各种方法不同,其他一些Bag of freebies方法专用于解决数据集中语义分布可能存在偏差的问题。在处理语义分布偏差问题时,一个非常重要的问题是,不同类之间存在数据不平衡的问题,而该问题通常可以通过以下方式来解决:否定性示例挖掘[72]或在线示例性在线挖掘[67]两步目标检测。但是示例挖掘方法不适用于一步目标检测,因为这种检测器属于密集预测体系结构。因此林等。 [45]提出了焦点损失,以解决各种类别之间存在的数据不平衡问题。另一个非常重要的问题是,很难用one-hot编码来表达不同类别之间的关联度的关系。执行标记时经常使用此表示方案。在[73]中提出的标签平滑是将硬标签转换为软标签以进行训练,这可以使模型更具鲁棒性。为了获得更好的软标签,Islam等人。 [33]介绍了知识蒸馏的概念来设计标签细化网络。
最后一个bag of freebies是边界框(BBox)回归的目标函数。传统的物体检测器通常使用均方误差(MSE)直接对BBox的中心点坐标以及高度和宽度执行回归,即{xcenter,ycenter,w,h}或左上角和右下角点,即{xtop left,ytop left,xbottom right,ybottom right}。对于基于anchor的方法,将估计相应的偏移量,例如{ x center offset , y center offset , w offset , h offset } and { x top left offset , y top left offset , x bottom right offset , y bottom right offset }。但是,直接估计BBox的每个点的坐标值是将这些点视为独立变量,但实际上并没有考虑对象本身的完整性。为了使这个问题得到更好的处理,一些研究人员最近提出了IoU损失[90],它考虑了预测的BBox区域和地面真实BBox区域的覆盖范围。IoU损失计算过程将通过计算预测值与真实值的IoU,然后将生成的结果连接成一个整体代码,最终通过计算获得BBox的四个坐标值。因为IOU是一个与尺度无关的表示,它可以解决当传统方法计算{x,y,w,h}的l1或l2损失时,损失会随着尺度增加而增大的问题。最近,一些研究人员继续改善IoU损失。例如,GioU损失[65]除了覆盖区域外还包括对象的形状和方向。他们建议找到可以同时覆盖预测的BBox和地面真值BBox的最小面积BBox,并使用该BBox作为分母来替换最初用于IoU损失的分母。至于DIoU损失[99],它还考虑了对象中心的距离,而CIoU损失[99]同时考虑了重叠区域,中心点之间的距离和纵横比。 CIoU可以在BBox回归问题上实现更好的收敛速度和准确性。
对于那些仅增加少量推理成本但可以显着提高对象检测准确性的插件模块和后处理方法,我们将其称为“Bag of specials”。一般而言,这些插件模块用于增强模型中的某些属性,例如扩大接受域,引入注意力机制或增强特征集成能力等,而后处理是用于筛选模型预测结果的方法。可以用来增强感受野的通用模块是SPP [25],ASPP [5]和RFB [47]。 SPP模块起源于空间金字塔匹配(SPM)[39],SPM的原始方法是将特征图分割为几个d×d个相等的块,其中d可以为{1,2,3,…},因此形成空间金字塔,然后提取词袋特征。 SPP将SPM集成到CNN中,并使用最大池操作而不是单词袋操作。由于He等人提出的SPP模块。 [25]将输出一维特征向量,在全卷积网络(FCN)中应用是不可行的。因此,在YOLOv3 [63]的设计中,Redmon和Farhadi将SPP模块改进为内核大小为k×k的最大池输出的级联,其中k = {1,5,9,13},步幅等于1。在这种设计下,较大的k×k最大池有效增加了骨干特征的接收场。在添加了改进版本的SPP模块之后,YOLOv3-608在MS COCO对象检测任务上将AP50升级了2.7%,而额外的计算成本为0.5%。 ASPP [5]模块和改进的SPP模块之间在操作上的差异主要在于由原来的步长1、核大小为k×k的最大池化到几个3×3核的最大池化,缩放比例为k,步长1的空洞卷积。RFB模块是使用几个k×k核的空洞卷积,空洞率为k,步长为1以得到比ASPP更全面的空间覆盖率。RFB[47]只需额外增加7%推理时间却在MS COCO上将SSD的AP50提升5.7%。
目标检测中常用的注意力模块主要分为通道注意和点注意,这两种注意模型的代表是挤压和激发(SE)[29]和空间注意模块(SAM)[ 85]。尽管SE模块可以将ImageNet图像分类任务中的ResNet50的功能提高1%的top-1精度,仅需增加2%的计算量,但是在GPU上通常会增加大约10%的推理时间,因此更适合在移动设备中使用。但是对于SAM,它只需要支付0.1%的额外费用,就可以在ImageNet图像分类任务上将ResNet50-SE的top-1准确性提高0.5%。最棒的是,它根本不影响GPU上的推理速度。
在特征集成方面,早期的实践是使用跳过连接[51]或超列[22]将低层物理特征集成到高层语义特征。由于诸如FPN的多尺度预测方法已变得流行,因此提出了许多集成了不同特征金字塔的轻量级模块。这种模块包括SFAM [98],ASFF [48]和BiFPN [77]。 SFAM的主要思想是使用SE模块在多尺度级联特征图上执行通道级重加权。对于ASFF,它使用softmax作为逐点级别的权重,然后添加不同比例的特征图。在BiFPN中,提出了多输入加权残差连接以执行按比例的级别重新加权,然后添加不同比例的特征图。
在深度学习的研究中,有些人专注于寻找良好的激活函数。良好的激活函数可以使梯度更有效地传播,同时不会造成过多的额外计算成本。 Nair和Hinton [56]在2010年提出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,它可以用于过滤那些对相同目标预测较差的边界框,并且只保留响应较高的候选边界框。 NMS尝试改进的方法与优化目标函数的方法一致。 NMS提出的原始方法没有考虑上下文信息,因此Girshick等。 [19]在R-CNN中添加了分类置信度得分作为参考,并且根据置信度得分的顺序,从高分到低分的顺序执行了贪婪的NMS。对于软网络管理系统[1],它考虑到一个问题,即物体的遮挡可能会导致带有IoU分数的贪婪的网络管理系统的置信度得分下降。 DIoU NMS [99]开发人员的思维方式是在软NMS的基础上将中心点距离的信息添加到BBox筛选过程中。值得一提的是,由于上述后处理方法均未直接涉及捕获的图像特征,因此在随后的无锚点定方法开发中不再需要后处理。
其基本目标是在生产系统中实现神经网络的快速运行,并针对并行计算进行优化,而不是低计算量理论指标(BFLOP)。我们提供了两种实时神经网络选项:
我们的目标是在输入网络分辨率,卷积层数,参数量(卷积核2 * 卷积核个数 * 通道数/组数)和每层输出个数(过滤器)之间找到最佳平衡。例如,我们的大量研究表明,就ILSVRC2012(ImageNet)数据集上的对象分类而言,CSPResNext50与CSPDarknet53相比要好得多[10]。然而,相反,就检测MS COCO数据集上的对象而言,CSPDarknet53优于CSPResNext50 [46]。
下一个目标是针对不同的检测器级别从不同的主干级别中选择其他块来增加接收场和参数聚集的最佳方法: FPN,PAN,ASFF,BiFPN。
对于分类最佳的参考模型对于检测器并非总是最佳的。与分类器相比,检测器需要以下条件:
我们可以假设一个具有较大的感受野(具有大量3×3的卷积层)和大量参数的模型应被选作主干。表1显示了CSPResNeXt50,CSPDarknet53和EfficientNet B3的信息。 CSPResNext50仅包含16个卷积层3×3,一个425×425接收场和20.6 M参数,而CSPDarknet53包含29个卷积层3×3,一个725×725感受野和27.6 M个参数。这种理论上的论证,再加上我们的大量实验,表明CSPDarknet53神经网络是两者的最佳模型,是检测器的骨干。
不同大小的接收场的影响总结如下:
我们在CSPDarknet53上添加了SPP块,因为它大大增加了感受野,分离出最重要的上下文特征,并且几乎不会降低网络运行速度。我们使用PANet作为来自不同主干级别,针对不同检测器级别的参数聚合方法,而不是YOLOv3中使用的FPN。
最后,我们选择CSPDarknet53骨干网,SPP附加模块,PANet路径聚合瓶颈和YOLOv3(基于锚)头作为YOLOv4的体系结构。
之后,我们计划大幅扩展用于探测器的Bag of Freebies(BoF)的内容,从理论上讲,它可以解决一些问题并提高探测器的准确性,并以实验方式依次检查每个功能的影响。我们不使用跨GPU批量标准化(CGBN或SyncBN)或昂贵的专用设备。这使任何人都可以在常规图形处理器上重现我们的最新技术成果,例如GTX 1080Ti或RTX 2080Ti。
为了改善目标检测训练,CNN通常使用以下方法:
至于训练激活功能,由于PReLU和SELU更难以训练,并且ReLU6是专门为量化网络设计的,因此我们从候选列表中删除了上述激活功能。在reqularization方法中,发布DropBlock的人们已经将他们的方法与其他方法进行了详细的比较,并且其正则化方法赢得了很多。因此,我们毫不犹豫地选择了DropBlock作为我们的正则化方法。至于标准化方法的选择,由于我们专注于仅使用一个GPU的训练策略,因此不考虑syncBN。
为了使设计的检测器更适合在单个GPU上进行训练,我们进行了以下额外的设计和改进:
马赛克数据增强是一个混合了4个训练图像的新的数据增强方法。由于混合了4个不同的contexts,而CutMix只混合了2个输入图像。这使得可以检测到目标正常contexts之外的目标。此外,批标准化从每层上4个不同的图像计算激活值统计数据。这显著地减少了对大batch size的需要。
自对抗训练(SAT)也代表了一项新的数据增强技术,该技术可在2个向前和向后的阶段进行操作。在第一阶段,神经网络会更改原始图像,而不是网络权重。以这种方式,神经网络对其自身执行对抗攻击,从而改变原始图像以产生对图像上没有所需物体的欺骗。在第二阶段,通过正常方式在修改的图像上进行目标检测对神经网络进行训练。
如图4所示,CmBN是CBN的修改版,定义为Cross mini-Batch Normalization(CmBN)。其只收集单个批次内mini-batches之间的统计数据。
我们将SAM从空间注意改为点注意,并替换PAN到串联的快捷连接,分别如图5和图6所示。
本节,我们将详细介绍YOLOv4。
YOLOv4包括:
YOLO v4使用:
我们测试了不同训练改进技术对ImageNet(ILSVRC 2012 val)数据集上分类器准确性的影响,然后测试了MS COCO(test-dev 2017)数据集上检测器准确性的影响。
在ImageNet图像分类实验中,默认的超参数如下:训练步骤为8,000,000;批量大小和最小批量大小分别为128和32;采用多项式衰减学习率调度策略,初始学习率为0.1。预热步骤为1000;动量和权重衰减分别设置为0.9和0.005。我们所有的BoS实验都使用与默认设置相同的超参数,并且在BoF实验中,我们添加了额外的50%训练步骤。在BoF实验中,我们验证了MixUp,CutMix,Mosaic,模糊数据增强和标签平滑正则化方法。在BoS实验中,我们比较了LReLU,Swish和Mish激活功能的效果。所有实验均使用1080 Ti或2080 Ti GPU进行训练。
在MS COCO对象检测实验中,默认的超参数如下:训练步骤是500,500;训练步骤是500,500。采用步阶衰减学习率调度策略,初始学习率为0.01,并分别以400,000步和450,000步乘以系数0.1。动量和权重衰减分别设置为0.9和0.0005。所有架构都使用单个GPU以64的批量大小执行多尺度训练,而最小批量大小为8或4则取决于架构和GPU内存限制。除了使用遗传算法进行超参数搜索实验外,所有其他实验均使用默认设置。遗传算法使用YOLOv3-SPP训练GIoU损失,并搜索300个纪元的最小值5k集。对于遗传算法实验,我们采用搜索学习率0.00261,动量0.949,IoU阈值来分配地面实况0.213,并使用损失归一化器0.07。我们已经验证了许多BoF,包括消除网格敏感性,镶嵌数据增强,IoU阈值,遗传算法,类标签平滑,交叉小批量标准化,自对抗训练,余弦退火调度程序,动态小批量大小,DropBlock,优化锚点,不同类型的IoU损失。我们还对各种BoS进行了实验,包括Mish,SPP,SAM,RFB,BiFPN和高斯YOLO [8]。对于所有实验,我们仅使用一个GPU进行训练,因此未使用可优化多个GPU的诸如syncBN之类的技术。
首先,我们研究不同特征对分类器训练的影响;具体来说,如图7所示,类别标签平滑化的影响,不同数据增强技术的影响,双边模糊,MixUp,CutMix和Mosaic的影响,以及Leaky-ReLU(默认情况下),Swish和Mish等不同激活的影响。
在我们的实验中,如表2所示,通过引入以下功能提高了分类器的准确性:CutMix和Mosaic数据扩充,类标签平滑和Mish激活。因此,我们用于分类器训练的BoFbackbone(免费赠品袋)包括以下内容:CutMix和Mosaic数据增强和类标签平滑。此外,我们将Mish激活用作补充选项,如表2和表3所示。
进一步的研究涉及到不同的Bag-of-Freebies (BoF-detector)对检测器训练准确性的影响,如表4所示。我们通过研究可提高检测器准确性而不影响FPS的不同功能来显着扩展BoF列表:
如表5所示,进一步的研究涉及了不同的Bag-of-Specials(BoS-detector)对检测器训练精度的影响,包括PAN、RFB、SAM、Gaussian YOLO(G)和ASFF。在我们的实验中,当使用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列出了使用Maxwell GPU的帧速率比较结果,可以是GTX Titan X(Maxwell)或Tesla M40 GPU。表9列出了使用Pascal GPU的帧速率比较结果,可以是Titan X(Pascal),Titan Xp,GTX 1080 Ti或Tesla P100 GPU。对于表10,它列出了使用Volta GPU的帧速率比较结果,可以是Titan V olta或Tesla V100 GPU。
我们提供最先进的检测器,其速度(FPS)和准确度(MS COCO AP50 … 95和AP50)比所有可用的替代检测器都要高。所描述的检测器可以训练并在具有8-16 GB-VRAM的常规GPU上使用,这使得它的广泛使用成为可能。一步基于锚的探测器的原始概念已经证明了其可行性。我们已经验证了许多功能,并选择使用这些方法以提高分类器和检测器的准确性。这些方法可以用作未来研究和开发的最佳实践。
作者要感谢Glenn Jocher提出的马赛克数据增强,通过使用遗传算法选择超参数以及解决网格敏感度问题的想法,网址为https://github.com/ultralytics/yolov3。