yolov4_yolov4训练 - CSDN
精华内容
参与话题
  • YOLOv4来了!43.5%mAP+65FPS 精度速度最优平衡, 各种调优手段释真香! 作者团队:Alexey Bochkovskiy&中国台湾中央研究院 论文链接: https://arxiv.org/pdf/2004.10934.pdf 代码链接: ...

    关注

    点击这里的链接,获取下面资料:

     

    资源二:深度学习视频教程
    
    1. “花书”深度学习圣经——动手学深度学习   
    2. 《计算机视觉深度学习入门》共5门视频   
    3. 《深度学习进阶视频课程》

     

    精彩内容

    YOLOv4来了!43.5%mAP+65FPS 精度速度最优平衡, 各种调优手段释真香!

    作者团队:Alexey Bochkovskiy&中国台湾中央研究院

    论文链接:

    https://arxiv.org/pdf/2004.10934.pdf

    代码链接:

    https://github.com/AlexeyAB/darknet

    这个很重要!预训练模型 + 作者训练好的模型 链接:

    YOLOV4 预训练模型 yolov4.conv.137 + yolov4-weights 网盘链接

     

    1 Introduction

     

    /可以说有许多技巧可以提高卷积神经网络(CNN)的准确性,但是某些技巧仅适合在某些模型上运行,或者仅在某些问题上运行,或者仅在小型数据集上运行;我们来码一码这篇文章里作者都用了哪些调优手段:

    • 加权残差连接(WRC)

    • 跨阶段部分连接(CSP)

    • 跨小批量标准化(CmBN)

    • 自对抗训练(SAT)

    • Mish激活

    • 马赛克数据增强

    • CmBN

    • DropBlock正则化

    • CIoU Loss

     

    有没有被惊到!

    经过一系列的堆料,终于实现了目前最优的实验结果:43.5%的AP(在Tesla V100上,MS COCO数据集的实时速度约为65FPS)。


    这篇文章的贡献如下:

    • 开发了一个高效、强大的目标检测模型。它使每个人都可以使用1080 Ti或2080 TiGPU来训练一个超级快速和准确的目标探测器。

    • 验证了在检测器训练过程中,最先进的Bag-of-Freebies和Bag-of-Specials 的目标检测方法的影响。

    • 修改了最先进的方法,使其更有效,更适合于单GPU训练,包括CBN、PAN、SAM等。


    总之一句话:速度差不多的精度碾压;精度差不多的速度碾压。

     

    2 Relate Works

     

    作者对现有目标检测算法进行了总结:


    目前检测器通常可以分为以下几个部分,不管是two-stage还是one-stage都可以划分为如下结构,只不过各类目标检测算法设计改进侧重在不同位置:

    作者把所有的调优手段分为了两大类“Bag of freebies(免费礼包)”和“Bag of specials(特价包)”,细品 还真形象。

     

    • Bag of freebies

    是指在离线训练阶段为了提升精度而广泛使用的调优手段,而这种技巧并不在推断中使用,不会增加推断时间。

    • 数据类:

    数据增强(random erase/CutOut/hide-and-seek/grid mask/MixUp/CutMix/GAN)

    数据分布:two-stage的有难例挖掘,one-stage的有focal loss。

    • 特征图类:

    DropOut/DropConnect/DropBlock

    • Bounding Box目标函数类:

    MSE/ IoU loss/l1、l2 loss/GIoU loss/DIoU loss/CIoU loss

     

    • Bag of specials

    是指在推断过程中增加的些许成本但能换来较大精度提升的技巧。

    • 增大感受野类:

    SPP/ASPP/RFB

    • 注意力类:

    Squeeze-and-Excitation (SE)/Spa-tial Attention Module (SAM)

    • 特征集成类:

    SFAM/ASFF/BiFPN

    • 激活函数类:

    ReLu/LReLU/PReLU/ReLU6/Scaled ExponentialLinear Unit (SELU)/Swish/hard-Swish/Mish 

    • 后处理类:

    soft NMS/DIoU NMS 

     

     

    3 YOLOv4 Method

     

    3.1 架构选择

    作者选择架构主要考虑几方面的平衡:输入网络分辨率/卷积层数量/参数数量/输出维度。

     

    一个模型的分类效果好不见得其检测效果就好,想要检测效果好需要以下几点:

    • 更大的网络输入分辨率——用于检测小目标

    • 更深的网络层——能够覆盖更大面积的感受野

    • 更多的参数——更好的检测同一图像内不同size的目标


    假设符合上面几点要求的backboone就是预期的backbone,作者对CSPResNext50和CSPDarknet53进行了比较,如表1所示,表明CSPDarknet53神经网络是作为目标检测backbone的最优选择。

    为了增大感受野,作者使用了SPP-block,使用PANet代替FPN进行参数聚合以适用于不同level的目标检测。
     

    最终YOLOv4的架构出炉:

    • backbone:CSPResNext50

    • additional block:SPP-block

    • path-aggregation neck:PANet

    • heads:YOLOv3的heads

     

    3.2 BoF(免费礼包)和BoS(特价包)的选择

     

    CNN常用的通用技巧:

     

    • 对于训练激活函数,由于PReLU和SELU更难训练,而ReLU6是专门为量化网络设计的,因此将上述其余激活函数从候选列表中删除。

    • 在reqularization方法上,发表Drop-Block的人将其方法与其他方法进行了详细的比较,其regularization方法取得了很大的成果。因此,作者毫不犹豫地选择DropBlock作为regularization方法。

    • 在归一化方法的选择上,由于关注的是只使用一个GPU的训练策略,所以没有考虑syncBN。

     

    3.3 其他改进


    为了使设计的检测器更适合于单GPU上的训练,作者做了如下的附加设计和改进:

    • 介绍了一种新的数据增强Mosaic法和Self-AdversarialTraining 
      自对抗训练法。

    • 应用遗传算法选择最优超参数。

    • 改进SAM,改进PAN,和交叉小批量标准化(CmBN),使我们的设计适合于有效的训练和检测

     

    • Mosaic法

    是一种将4张训练图片混合成一张的新数据增强方法,这样可以丰富图像的上下文信息。如下图所示:

    这种做法的好处是允许检测上下文之外的目标,增强模型的鲁棒性。此外,在每一层从4个不同的图像批处理标准化计算激活统计,这大大减少了对大mini-batch处理size的需求。

     

    • AdversarialTraining自对抗训练

    这是一种新的数据扩充技术,该技术分前后两个阶段进行。

    在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对自身执行一种对抗性攻击,改变原始图像,从而造成图像上没有目标的假象。
    在第二阶段,训练神经网络对修改后的图像进行正常的目标检测。

     

    • CmBN

    表示CBN的修改版本,如下图所示,定义为跨微批量标准化(CmBN)。这仅收集单个批中的小批之间的统计信息。

     

    • SAM改进

    将SAM从空间上的attention修改为点上的attention,并将PAN的short-cut连接改为拼接,分别如图5和图6所示:

     

    3.4 YOLOv4架构总结

     

    • YOLOv4 架构:

    Backbone: CSPDarknet53

    Neck: SPP [25], PAN 

    Head: YOLOv3

     

    • YOLOv4 使用的调优技巧:

    BoF

    backbone:CutMix和mosaic数据增强,DropBlock正则化,类标签平滑。

    detector:ciu -loss,CmBN, DropBlock正则化,Mosaic数据增强,自对抗训练,消除网格敏感性,为单个groundtruth使用多个anchors,余弦退火调度器,最优超参数,随机训练形状

     

    BoS

    backbone:Mish激活、跨级部分连接(CSP)、多输入加权剩余连接(MiWRC)。

    detector:Mish activation,SPP-block, SAM-block, PAN path-aggregation block,DIoU-NMS.

     

     

    4 Experiments

     

    • 4.1 实验建立

     

    在ImageNet图像分类实验中,默认的超参数如下:

    • 训练步骤为8,000,000;

    • 批量尺寸为128,

    • 小批量尺寸为32;

    • 采用多项式衰减学习速率调度策略,

    • 初始学习速率为0.1,

    • 热身步骤为1000;

    • momentum和weight衰减分别设置为0.9和0.005。

     

    在BoF实验中,还增加了50%的训练步骤,验证了混合、切分、镶嵌、模糊数据增强和标签平滑正则化方法。

     

    在BoS实验中,使用与默认设置相同的超参数。比较了LReLU、Swish和Mish激活函数的作用。所有实验均使用1080Ti或2080Ti GPU进行训练。

     

    MS COCO目标检测实验中,默认的超参数为:

    • 训练步骤为500500;

    • 采用初始学习速率0.01的步长衰减学习速率策略,在400000步和450000步分别乘以因子0.1;

    • momentum衰减为0.9,weight衰减为0.0005。

    • 所有的架构都使用一个GPU来执行批处理大小为64的多尺度训练,而小批处理大小为8或4取决于架构和GPU内存限制。

    除了使用遗传算法进行超参数搜索实验外,其他实验均使用默认设置。

    • 遗传算法利用YOLOv3-SPP进行带GIoU损失的训练,搜索300个epoch的min-val5k集。

    • 遗传算法实验采用搜索学习率0.00261、momentum0.949、IoU阈值分配ground truth 0.213、损失归一化器0.07。

     

    对于所有实验,只使用一个GPU训练,因此不会使用syncBN等优化多个gpu的技术。

     

    • 4.2 不同特征对分类器训练的影响

     

    具体来说,如Fugure7所示,类标签平滑、不同数据增强技术、双侧模糊、MixUp、CutMix和Mosaic的影响,以及不同激活的影响,如Leaky-ReLU(默认)、Swish和Mish。结果如下表所示:

     

     

    • 4.3不同特征对检测器训练的影响

    进一步研究不同的Bag-of-Freebies (BoF-detector)对detector训练精度的影响,如表4所示。通过研究在不影响FPS的情况下提高检测精度的不同特征。

     

    进一步研究不同的bag-specials(boss-detector)对检测器训练精度的影响,包括PAN、RFB、SAM、Gaussian YOLO(G)、ASFF,如表5所示。

     

    • 4.4 不同的backbone和预先训练的重量对检波器训练的影响

     

    • 4.5 不同的mini-batch size对检测器训练的影响

     

    5 Results

     

    • 与目前较前沿检测模型的比较:

    由于不同的方法使用不同架构的gpu进行推理时间验证,我们将yolov4运行在通常采用的Maxwell架构、Pascal架构和Volta架构的gpu上,并将其与其他最先进的方法进行比较。

     

     

    • 表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。

     

     

    展开全文
  • 课程演示环境:Ubuntu需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测... 《YOLOv4目标检测实战:人脸口罩佩戴识别》《YOLOv4目标检测实战:中国交通标志识别》《YOLOv4目标检测:原理与源码解析》
  • 刚刚在看论文的时候发现yolov4竟然悄无声息的出现了!!! 太棒了!!! https://arxiv.org/abs/2004.10934v1 代码:https://github.com/AlexeyAB/darknet 据说有许多功能可以提高卷积神经网络(CNN)的准确性。...

    论文地址:https://arxiv.org/pdf/2004.10934.pdf

    GitHub地址:https://github.com/AlexeyAB/darknet

    觉得作者很地道,论文附上开源,没有比这更开心的事情了吧!

    首先附上对论文总结的思维导图,帮助大家更好的理解!

    思维导图和论文译文PDF均可在【计算机视觉联盟】后台回复yolov4获取

     

    下边是对论文的翻译,有些地方可能翻译的不是很准备,欢迎指正补充

    摘要

    有很多特征可以提高卷积神经网络(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。

    1、介绍

    大多数基于CNN的物体检测器仅适用于推荐系统。例如,通过慢速精确模型执行的城市摄像机搜索免费停车位,而汽车碰撞警告与快速不精确模型有关。提高实时物体检测器的精度不仅可以将它们用于提示生成推荐系统,还可以用于独立的过程管理和减少人工输入。常规图形处理单元(GPU)上的实时对象检测器操作允许以可承受的价格对其进行运行。最精确的现代神经网络无法实时运行,需要使用大量的GPU进行大量的mini-batch-size训练。我们通过创建在常规GPU上实时运行的CNN来解决此类问题,并且该培训仅需要一个传统的GPU。

    这项工作的主要目标是在产生式系统中设计一个运行速度快的目标探测器,并对并行计算进行优化,而不是设计一个低计算量的理论指标(BFLOP)。我们希望所设计的对象易于训练和使用。如图1中的YOLOv4结果所示,任何人使用传统的GPU进行训练和测试,都可以获得实时、高质量和令人信服的目标检测结果。我们的贡献概括如下:

    1. 我们开发了一个高效且功能强大的目标检测模型。它使每个人都可以使用1080Ti或2080TiGPU来训练超快、精确的物体探测器。

    2. 我们验证了当前最新的“免费袋”和“特殊袋”检测方法在探测器训练过程中的影响。

    3. 我们修改了最新的方法,使其更有效,更适合于单个GPU的培训,包括CBN[89]、PAN[49]、SAM[85]等。

    2、相关工作(Related work)

    2.1 目标检测算法(Object detection models)

    目标检测算法一般有两部分组成:一个是在ImageNet预训练的骨架(backbone),,另一个是用来预测对象类别和边界框的头部。对于在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]。还可以使两级对象检测器成为无锚对象检测器,例如RepPoints [87]。对于一级目标检测器,最具代表性的模型是YOLO [61、62、63],SSD [50]和RetinaNet [45]。近年来,开发了无锚的(anchor free)一级物体检测器。这类检测器是CenterNet [13],CornerNet [37、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])上。

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

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

    • 骨架: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 :

      • RPN[64],SSD [50],YOLO [61], RetinaNet [45](基于锚)

      • CornerNet[37],CenterNet [13],MatrixNet [60],FCOS [78](无锚)

      • 密集预测(一阶段):

    • 稀疏预测(两阶段):

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

      • RepPoints[87](无锚)

    2.2 Bag of freebies

    通常,传统的物体检测器是离线训练的。因此,研究人员一直喜欢采用这种优势并开发出更好的训练方法,从而可以使目标检测器获得更好的精度而又不会增加推理成本。我们称这些仅改变培训策略或仅增加培训成本的方法为“免费赠品”。数据检测是对象检测方法经常采用的并符合免费赠品的定义。数据增强的目的是增加输入图像的可变性,从而使设计的物体检测模型对从不同环境获得的图像具有更高的鲁棒性。例如,光度失真和几何失真是两种常用的数据增强方法,它们无疑有利于物体检测任务。在处理光度失真时,我们调整图像的亮度,对比度,色相,饱和度和噪点。对于几何失真,我们添加了随机缩放,裁剪,翻转和旋转。

    上面提到的数据增强方法是全像素调整,并且保留了调整区域中的所有原始像素信息。此外,一些从事数据增强的研究人员将重点放在模拟对象遮挡问题上。他们在图像分类和目标检测方面取得了良好的成果。例如,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可以达到较好的收敛速度和精度。

    2.3 Bag of spedials

    对于那些仅增加少量推理成本但可以显着提高对象检测准确性的插件模块和后处理方法,我们将其称为“特价商品”。一般而言,这些插件模块用于增强模型中的某些属性,例如扩大接受域,引入注意力机制或增强特征集成能力等,而后处理是用于筛选模型预测结果的方法。

    可以用来增强接收域的通用模块是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筛选过程中。值得一提的是,由于上述后处理方法均未直接涉及捕获的图像功能,因此在随后的无锚方法开发中不再需要后处理。

    3、方法(Methodology)

    其基本目标是在生产系统中对神经网络进行快速操作,并针对并行计算进行优化,而不是低计算量理论指示器(BFLOP)。我们提供了实时神经网络的两种选择:

    • 对于GPU,我们使用少量的组(1-8)卷积层:CSPResNeXt50 / CSPDarknet53

    • 对于VPU-我们使用分组卷积,但是我们不再使用挤压和激发(SE)块-特别是这包括以下模型:EfficientNet-lite / MixNet [76] / GhostNet [21] / Mo-bileNetV3

      3.1 Selection of architecture

      我们的目标是在输入网络分辨率,卷积层数,参数数(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。

    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是专门为量化网络设计的,因此我们从候选列表中删除了上述激活功能。在重新量化方法中,发布Drop-Block的人们将自己的方法与其他方法进行了详细的比较,而其正则化方法赢得了很多。因此,我们毫不犹豫地选择了DropBlock作为我们的正则化方法。至于标准化方法的选择,由于我们专注于仅使用一个GPU的训练策略,因此不考虑syncBN。

    3.3 Additional improvements

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

    • 我们引入了一种新的数据增强方法:Mosaic, and Self-Adversarial Training (SAT)

    • 在应用遗传算法时,我们选择最优的超参数

    • 我们修改了一些现有方法,使我们的设计适合进行有效的训练和检测-改进的SAM,改进的PAN ,以及跨小批量标准化(CmBN)

    Mosaic是一种新的混合4幅训练图像的数据增强方法。所以四个不同的上下文信息被混合,而CutMix只混合了2种。

    这允许检测其正常上下文之外的对象。此外,批量归一化从每层上的4个不同的图像计算激活统计。这极大地减少了对large mini-batch-size的需求。

    自对抗训练(SAT)也代表了一种新的数据增强技术,它在两个前向后向阶段运行。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对其自身执行对抗性攻击,改变原始图像,以制造图像上没有所需对象的欺骗。在第二阶段,训练神经网络,以正常的方式在修改后的图像上检测目标。

    CmBN表示CBN的修改版本,如图4所示,定义为交叉小批量规范化(Cross mini-Batch Normalization,CMBN)。这仅在单个批次内的小批次之间收集统计信息。

    我们将SAM从空间注意修改为点注意,并将PAN的快捷连接分别替换为串联,如图5和图6所示。

    3.4 YOLOv4

    在本节中,我们将详细介绍YOLOv4的细节。

    YOLOv4的组成:

    YOLOv4的使用:

    4、Experiments

    我们在ImageNet(ILSVRC 2012 Val)数据集上测试了不同训练改进技术对分类器精度的影响,然后在MS Coco(test-dev 2017)数据集上测试了不同训练改进技术对检测器精度的影响。

    4.1 Experimental setup

    在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之类的技术。

    4.2 Influence of different features on Classifier training

    首先,我们研究了不同特征对分类器训练的影响;具体地说,类标签平滑的影响,不同数据扩充技术的影响,双边模糊,混合,CutMix和马赛克,如图7所示,以及不同活动的影响,如Leaky-relu(默认情况下),SWISH和MISH。

    在我们的实验中,如表2所示,通过引入诸如:CutMix和Mosaic数据增强、类标签平滑和Mish激活等特征,提高了分类器的精度。因此,我们用于分类器训练的BoF-Backbone(Bag Of Freebies)包括以下内容:CutMix和Mosaic数据增强以及类标签平滑。此外,我们还使用MISH激活作为补充选项,如表2和表3所示。

    4.3 Influence of different features on Detector training

    进一步的研究涉及不同的免费袋(BOF探测器)对探测器训练精度的影响,如表4所示。我们通过研究在不影响FPS的情况下提高探测器精度的不同特性,显著扩展了BOF列表:

    进一步研究了不同的专业袋(BOS检测器)对检测器训练精度的影响,包括PAN、RFB、SAM、高斯YOLO(G)和ASFF,如表5所示。在我们的实验中,当使用SPP、PAN和SAM时,检测器的性能最佳。

    4.4 Influence of different backbones and pretrained weightings on Detector training

    进一步,我们研究了不同主干模型对检测器精度的影响,如表6所示。请注意,具有最佳分类精度的模型在检测器精度方面并不总是最佳。

    首先,尽管与CSPDarknet53模型相比,经过不同功能训练的CSPResNeXt-50模型的分类准确性更高,但CSPDarknet53模型在对象检测方面显示出更高的准确性。

    其次,使用BoF和Mish进行CSPResNeXt50分类器训练会提高其分类准确性,但是将这些预先训练的权重进一步应用于检测器训练会降低检测器准确性。但是,将BoF和Mish用于CSPDarknet53分类器训练可以提高分类器和使用该分类器预训练加权的检测器的准确性。结果是,与CSPResNeXt50相比,主干CSPDarknet53更适合于检测器。

    我们观察到,由于各种改进,CSPDarknet53模型具有更大的能力来提高检测器精度。

    4.4 Influence of different mini-batch size on Detector training

    最后,我们分析了在不同最小批量大小下训练的模型所获得的结果,结果如表7所示。从表7所示的结果中,我们发现在添加BoF和BoS训练策略之后,最小批量大小几乎没有影响在检测器的性能上。该结果表明,在引入BoF和BoS之后,不再需要使用昂贵的GPU进行训练。换句话说,任何人都只能使用传统的GPU来训练出色的探测器。

    5、Results

    与其他最先进的物体探测器获得的结果比较如图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。

    6、Conclusions

    我们提供最先进的检测器,其速度(FPS)和准确度(MS COCO AP50 ... 95和AP50)比所有可用的替代检测器都高。所描述的检测器可以在具有8-16GB-VRAM的常规GPU上进行训练和使用,这使得它的广泛使用成为可能。一阶段基于锚的探测器的原始概念已证明其可行性。我们已经验证了大量特征,并选择使用其中的一些特征以提高分类器和检测器的准确性。这些功能可以用作将来研究和开发的最佳实践。

    7、Acknowledgements

    作者要感谢Glenn Jocher进行Mosaic数据增强的想法,通过使用遗传算法选择超参数并解决网格敏感性问题的方法https://github.com/ultralytics/yolov3.10。

    思维导图和论文译文PDF均可在【计算机视觉联盟】后台回复yolov4获取

    展开全文
  • 从YOLOV3到YOLOV4:算法原理及其实战

    千人学习 2020-06-11 14:45:03
    本课程在介绍计算机视觉深度学习基本概念基础上,详尽讲解YOLOV3和YOLOV4的算法模型原理,并基于实际项目中的无人零售商品数据集来手把手教大家如何将它训练成YOLOV3和V4模型,最后对训练出来的模型集进行性能评估,...
  • YOLOv4---(详解各种trick)

    千次阅读 多人点赞 2020-05-29 11:30:46
    YOLOv4—(详解各种trick) 参考自(https://zhuanlan.zhihu.com/p/139764729) 前段时间大名鼎鼎的yolov4终于面世了,可是看过以后确实大失所望。不是说yolov4不好,只不过没有什么革命性的创新,相当于作者尝试了...

    YOLOv4—(详解各种trick)

    参考自(https://zhuanlan.zhihu.com/p/139764729)

    在这里插入图片描述

    前段时间大名鼎鼎的yolov4终于面世了,可是看过以后确实大失所望。不是说yolov4不好,只不过没有什么革命性的创新,相当于作者尝试了计算机视觉领域的各种花里胡哨的trick,然后给了一个最佳方案的trick组合。而且,这些东西对于实际的工业生产并没有什么用。。。。也就是落地基本不可能。

    下面来仔细看一下文章中提到的各种trick。

    论文地址
    github

    文中将前人的工作主要分为Bag of freebies和Bag of specials,前者是指不会显著影响模型测试速度和模型复杂度的技巧,主要就是数据增强操作,对应的Bag of specials就是会稍微增加模型复杂度和速度的技巧,但是如果不大幅增加复杂度且精度有明显提升,那也是不错的技巧。本文按照论文讲的顺序进行分析。由于每篇论文其实内容非常多,我主要是分析思想和一些核心细节。

    本篇文章分析如下技术:random erasing、cutout、hide-and-seek、grid mask、Adversarial Erasing、mixup、cutmix、mosaic、Stylized-ImageNet、label smooth、dropout和dropblock。 下一篇分析网络结构、各种层归一化技术、以及其他相关技术。

    1 数据增强相关

    1.1 Random erasing data augmentation

    论文名称:Random erasing data augmentation

    论文地址
    github
    随机擦除增强,非常容易理解。作者提出的目的主要是模拟遮挡,从而提高模型泛化能力,这种操作其实非常make sense,因为我把物体遮挡一部分后依然能够分类正确,那么肯定会迫使网络利用局部未遮挡的数据进行识别,加大了训练难度,一定程度会提高泛化能力。其也可以被视为add noise的一种,并且与随机裁剪、随机水平翻转具有一定的互补性,综合应用他们,可以取得更好的模型表现,尤其是对噪声和遮挡具有更好的鲁棒性。具体操作就是:随机选择一个区域,然后采用随机值进行覆盖,模拟遮挡场景。
    在这里插入图片描述
    在细节上,可以通过参数控制擦除的面积比例和宽高比,如果随机到指定数目还无法满足设置条件,则强制返回。 一些可视化效果如下:
    在这里插入图片描述
    对于目标检测,作者还实现了3种做法,如下图所示(然而我打开开源代码,发现只实现了分类的随机擦除而已,尴尬)。
    在这里插入图片描述
    当然随机擦除可以和其他数据增强联合使用,如下所示。
    在这里插入图片描述
    torchvision已经实现
    注意:torchvision的实现仅仅针对分类而言,如果想用于检测,还需要自己改造。调用如下所示:

    torchvision.transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False)
    

    1.2 Cutout

    论文名称:Improved Regularization of Convolutional Neural Networks with Cutout
    论文地址
    github
    出发点和随机擦除一样,也是模拟遮挡,目的是提高泛化能力,实现上比random erasing简单,随机选择一个固定大小的正方形区域,然后采用全0填充就OK了,当然为了避免填充0值对训练的影响,应该要对数据进行中心归一化操作,norm到0。

    本文和随机擦除几乎同时发表,难分高下(不同场景下谁好难说),区别在于在cutout中,擦除矩形区域存在一定概率不完全在原图像中的。而在Random Erasing中,擦除矩形区域一定在原图像内。Cutout变相的实现了任意大小的擦除,以及保留更多重要区域。

    需要注意的是作者发现cutout区域的大小比形状重要,所以cutout只要是正方形就行,非常简单。具体操作是利用固定大小的矩形对图像进行遮挡,在矩形范围内,所有的值都被设置为0,或者其他纯色值。而且擦除矩形区域存在一定概率不完全在原图像中的(文中设置为50%)

    论文中有一个细节可以看看:作者其实开发了一个早期做法,具体是:在训练的每个epoch过程中,保存每张图片对应的最大激活特征图(以resnet为例,可以是layer4层特征图),在下一个训练回合,对每张图片的最大激活图进行上采样到和原图一样大,然后使用阈值切分为二值图,盖在原图上再输入到cnn中进行训练,有点自适应的意味。但是有个小疑问:训练的时候不是有数据增强吗?下一个回合再用前一次增强后的数据有啥用?我不太清楚作者的实现细节。如果是验证模式下进行到是可以。 这种做法效果蛮好的,但是最后发现这种方法和随机选一个区域遮挡效果差别不大,而且带来了额外的计算量,得不偿失,便舍去。就变成了现在的cutout了。

    可能和任务有关吧,按照我的理解,早期做法非常make sense,效果居然和cutout一样,比较奇怪。并且实际上考虑目标检测和语义分割,应该还需要具体考虑,不能照搬实现。

    学习这类论文我觉得最重要的是思想,能不能推广到不同领域上面?是否可以在训练中自适应改变?是否可以结合特征图联合操作?
    在这里插入图片描述
    1.3 Hide-and-Seek

    论文名称:Hide-and-Seek: A Data Augmentation Technique for Weakly-Supervised Localization and Beyond
    论文地址
    github
    可以认为是random earsing的推广。核心思想就是去掉一些区域,使得其他区域也可以识别出物体,增加特征可判别能力。和大部分细粒度论文思想类型,如下所示:
    在这里插入图片描述
    数据增强仅仅用于训练阶段,测试还是整图,不遮挡,如下所示。
    在这里插入图片描述
    做法是将图片切分为sxs个网格,每个网格采用一定概率进行遮挡,可以模拟出随机擦除和cutout效果。

    至于隐藏值设置为何值,作者认为比较关键,因为可能会改变训练数据的分布。如果暴力填黑,认为会出现训练和测试数据分布不一致问题,可能不好,特别是对于第一层卷积而言。作者采用了一些理论计算,最后得到采用整个数据集的均值来填充造成的影响最小(如果采用均值,那么输入网络前,数据预处理减掉均值,那其实还是接近0)。

    1.4 GridMask Data Augmentation
    论文名称:GridMask Data Augmentation
    论文地址

    本文可以认为是前面3篇文章的改进版本。本文的出发点是:删除信息和保留信息之间要做一个平衡,而随机擦除、cutout和hide-seek方法都可能会出现可判别区域全部删除或者全部保留,引入噪声,可能不好。如下所示:
    在这里插入图片描述
    要实现上述平衡,作者发现非常简单,只需要结构化drop操作,例如均匀分布似的删除正方形区域即可。并且可以通过密度和size参数控制,达到平衡。如下所示:
    在这里插入图片描述
    其包括4个超参,如下所示:
    在这里插入图片描述
    首先定义k,即图像信息的保留比例,其中H和W分别是原图的高和宽,M是保留下来的像素数,保留比例k如下,该参数k和上述的4个参数无直接关系,但是该参数间接定义了r:
    在这里插入图片描述
    在这里插入图片描述
    d决定了一个dropped square的大小, 参数 x和 y的取值有一定随机性.
    在这里插入图片描述
    在这里插入图片描述
    其实看起来,就是两个参数: r和d,r通过k计算而来,用于计算保留比例(核心参数),d用了控制每个块的大小。d越大,每个黑色块面积就越大,黑色块的个数就越少,d越小,黑色块越小,个数就越多。xy仅仅用于控制第一个黑色块的偏移而已。

    对于应用概率的选择,可以采用固定值或者线性增加操作,作者表示线性增加会更好,例如首先选择r = 0.6,然后随着训练epoch的增加,概率从0增加到0.8,达到240th epoch后固定,这种操作也是非常make sense,为了模拟更多场景,在应用于图片前,还可以对mask进行旋转。这种策略当然也可以应用于前3种数据增强策略上。

    1.5 object Region Mining with Adversarial Erasing

    论文地址

    本文在yolov4中仅仅是提了一下,不是重点,但是我觉得思想不错,所以还是写一下。

    本文要解决的问题是使用分类做法来做分割任务(弱监督分割),思想比较有趣。如下所示:

    在这里插入图片描述
    通过迭代训练的方式不断挖掘不同的可判别区域,最终组合得到完整的分割结果。第t次训练迭代(一次迭代就是指的一次完整的训练过程),对于每张图片都可以得到cam图(类别激活图),将cam图二值化然后盖在原图上,进行下一次迭代训练,每次迭代都是学习一个不同的可判别区域,迭代结束条件就是分类性能不行了,因为可判别区域全部被盖住了(由于该参数其实很难设置,故实验直接取3)。最后的分割结果就是多次迭代的cam图叠加起来即可。

    本文是cvpr2017的论文,放在现在来看,做法其实超级麻烦,现在而言我肯定直接采用细粒度方法,采用特征擦除技术,端到端训练,学习出所有可判别区域。应该不会比这种做法效果差,但是在当时还是不错的思想。

    但是其也提供了一种思路:是否可以采用分类预测出来的cam,结合弱监督做法,把cam的输出也引入某种监督,在提升分类性能的同时,提升可判别学习能力。

    1.6 mixup

    论文题目:mixup: BEYOND EMPIRICAL RISK MINIMIZATION

    论文地址

    mixup由于非常有名,我想大家都应该知道,而且网上各种解答非常多,故这里就不重点说了。

    其核心操作是:两张图片采用比例混合,label也需要混合。
    在这里插入图片描述
    论文中提到的一些关键的Insight:

    1 也考虑过三个或者三个以上的标签做混合,但是效果几乎和两个一样,而且增加了mixup过程的时间。

    2 当前的mixup使用了一个单一的loader获取minibatch,对其随机打乱后,mixup对同一个minibatch内的数据做混合。这样的策略和在整个数据集随机打乱效果是一样的,而且还减少了IO的开销。

    3 在同种标签的数据中使用mixup不会造成结果的显著增强

    1.7 cutmix和Mosaic

    论文名称:CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features
    论文地址
    github
    简单来说cutmix相当于cutout+mixup的结合,可以应用于各种任务中。
    在这里插入图片描述
    mixup相当于是全图融合,cutout仅仅对图片进行增强,不改变label,而cutmix则是采用了cutout的局部融合思想,并且采用了mixup的混合label策略,看起来比较make sense。

    cutmix和mixup的区别是,其混合位置是采用hard 0-1掩码,而不是soft操作,相当于新合成的两张图是来自两张图片的hard结合,而不是Mixup的线性组合。但是其label还是和mixup一样是线性组合。作者认为mixup的缺点是:Mixup samples suffer from the fact that they are locally ambiguous and unnatural, and therefore confuses the model, especially for localization。
    在这里插入图片描述
    M是和原图大小一样的矩阵,只有0-1值,λ\lambda 用于控制线性混合度,通过λ\lambda 参数可以控制裁剪矩形大小,
    在这里插入图片描述
    伪代码如下:
    在这里插入图片描述
    而Mosaic增强是本文提出的,属于cutmix的扩展,cutmix是两张图混合,而马赛克增强是4张图混合,好处非常明显是一张图相当于4张图,等价于batch增加了,可以显著减少训练需要的batch size大小。
    在这里插入图片描述
    1.8 Stylized-ImageNet

    论文名称:ImageNet-trained cnns are biased towards texture; increasing shape bias improves accuracy and robustness

    本文非常有意思,得到的结论非常有意义,可以指导我们对于某些场景测试失败的分析。本质上本文属于数据增强论文,做的唯一一件事就是:对ImageNet数据集进行风格化。

    本文结论是:CNN训练学习到的实际是纹理特征(texture bias)而不是形状特征,这和人类的认知方式有所区别,如论文题目所言,存在纹理偏置。而本文引入风格化imagenet数据集,平衡纹理和形状偏置,提高泛化能力。

    本文指出在ImageNet上训练的CNN强烈的偏向于识别纹理而不是形状,这和人的行为是极为不同的,存在纹理偏差,所以提出了Stylized-ImageNet数据,混合原始数据训练就可以实现既关注纹理,也关注形状(也就是论文标题提到的减少纹理偏向,增加形状偏向)。从而不仅更适合人类的行为,更惊讶的是提升了目标检测的精度,以及鲁棒性,更加体现了基于形状表示的优势。

    文章从一只披着象皮的猫究竟会被识别为大象还是猫这个问题入手,揭示了神经网络根据物体的texture进行识别而非我们以为的根据物体的形状。

    作者准备了6份数据,分别是正常的图片,灰色图,只包含轮廓的,只包含边缘的,只有纹理没有形状,纹理和形状相互矛盾(大象的纹理,猫的形状),对于第六份数据(纹理和形状冲突的数据),作者采用Stylized-ImageNet随机地将物体的纹理替换掉(也就是本文创新点),如下(c)所示:
    在这里插入图片描述
    采用了4个主流网络,加上人类直观评估。原图其实是作者除了物体外,其余都是白色背景的数据集,目的是去除干扰。 对于前面5份数据,采用原图和灰度图,神经网络都可以取得非常高的准确率,而对于只包含轮廓和只包含边缘的图片,神经网络的预测准确率则显著降低。更有意思的是,对于只包含纹理的图片,神经网络取得特别高的准确率。因而不难推断出,神经网络在识别中,主要是参考纹理信息而不是形状信息。

    作者先构造数据集,然后再进行后面的深入实验,IN就是指的ImageNet,SIN是指的风格化的ImageNet,如下所示
    在这里插入图片描述
    SIN的特点是保留shape,但是故意混淆掉纹理信息。
    在这里插入图片描述
    从上表的第一行可以看出,在原始图片IN上训练的模型不能适应去除纹理SIN的图片(IN-SIN),而使用去除纹理的图片进行训练和测试效果会差于使用原始图片进行训练和测试(SIN-SIN),这说明纹理信息在图像识别中确实起到了一定的作用,去除了纹理信息会提高模型识别的难度。最后,当我们使用去除纹理的图片进行训练而在原图进行测试的时候(SIN-IN),效果比在去除纹理的图片上面效果好(SIN-SIN)。

    后面三行的实验采用的是第一行resnet的网络结构,其主要特征是限制模型的感受野,从而让模型无法学习到空间的信息,其对应的感受野分别是3333, 17 * 17,99,对于训练原始的图片,其结果测试误差跟没有加上感受野限制的误差差别不大,从而说明纹理信息起到主导作用(IN-IN),而对应去除掉纹理信息的图片,其测试结果下降十分明显(SIN-SIN),说明形状信息起到主要的作用,证明了SIN的模型确实在学习形状的信息而不是纹理的信息。这个实验是要说明提出的SIN数据集由于强制抹掉了固定纹理,网络训练难度增大,在没有限制感受野情况下可以学的蛮好,但是一旦限制了感受野就不行了,说明SIN模型学习到的不仅仅是纹理(因为纹理是局部的,如果依靠纹理来分类,那么准确率应该下降不了这么多),更多的是依靠shape分类,因为感受野外限制了,导致无法看到整个shape,并且通过更加限制感受野,SIN-SIN准确率下降更多可以发现。 也就是说SIN数据集由于替换掉了纹理,迫使网络学习shape和纹理,达到了本文目的。SIN上训练的ResNet50展示出更强的形状偏向,符合人类常理。

    增强形状偏向也改变了表示,那么影响了CNN的性能和鲁棒性了吗?我们设置了两个训练方案:

    1 同时在SIN和IN上训练

    2 同时在SIN和IN上训练,在IN上微调。称为Shape-ResNet。
    在这里插入图片描述
    作者把去掉纹理的数据和原图一起放进去模型中进行训练,最后用原图进行finetune,发现这种方法可以提高模型的性能。Shape-ResNet超过了原始ResNet的准确率,说明SIN是有用的图像增强。

    总结:CNN识别强烈依赖于纹理,而不是全局的形状,但是这是不好的,为了突出形状bias,可以采用本文的SIN做法进行数据增强,SIN混合原始数据训练就可以实现既关注纹理,也关注形状,不仅符合人类直观,也可以提高各种任务的准确率和鲁邦性。所以本文其实是提出了一种新的数据增强策略。是不是很有意思的结论?

    1.9 label smooth

    论文题目:Rethinking the inception architecture for computer vision

    label smooth是一个非常有名的正则化手段,防止过拟合,我想基本上没有人不知道,故不详说了,核心就是对label进行soft操作,不要给0或者1的标签,而是有一个偏移,相当于在原label上增加噪声,让模型的预测值不要过度集中于概率较高的类别,把一些概率放在概率较低的类别。

    2 特征增强相关

    2.1 DropBlock

    论文题目:DropBlock: A regularization method for convolutional networks

    论文地址
    github
    由于dropBlock其实是dropout在卷积层上的推广,故很有必须先说明下dropout操作。

    dropout,训练阶段在每个mini-batch中,依概率P随机屏蔽掉一部分神经元,只训练保留下来的神经元对应的参数,屏蔽掉的神经元梯度为0,参数不参数与更新。而测试阶段则又让所有神经元都参与计算。

    dropout操作流程:参数是丢弃率p

    1)在训练阶段,每个mini-batch中,按照伯努利概率分布(采样得到0或者1的向量,0表示丢弃)随机的丢弃一部分神经元(即神经元置零)。用一个mask向量与该层神经元对应元素相乘,mask向量维度与输入神经一致,元素为0或1。

    2)然后对神经元rescale操作,即每个神经元除以保留概率1-P,也即乘上1/(1-P)。

    3)反向传播只对保留下来的神经元对应参数进行更新。

    4)测试阶段,Dropout层不对神经元进行丢弃,保留所有神经元直接进行前向过程。

    为啥要rescale呢?是为了保证训练和测试分布尽量一致,或者输出能量一致。可以试想,如果训练阶段随机丢弃,那么其实dropout输出的向量,有部分被屏蔽掉了,可以等下认为输出变了,如果dropout大量应用,那么其实可以等价为进行模拟遮挡的数据增强,如果增强过度,导致训练分布都改变了,那么测试时候肯定不好,引入rescale可以有效的缓解,保证训练和测试时候,经过dropout后数据分布能量相似。
    在这里插入图片描述
    dropout方法多是作用在全连接层上,在卷积层应用dropout方法意义不大。文章认为是因为每个feature map的位置都有一个感受野范围,仅仅对单个像素位置进行dropout并不能降低feature map学习的特征范围,也就是说网络仍可以通过该位置的相邻位置元素去学习对应的语义信息,也就不会促使网络去学习更加鲁邦的特征。

    既然单独的对每个位置进行dropout并不能提高网络的泛化能力,那么很自然的,如果我们按照一块一块的去dropout,就自然可以促使网络去学习更加鲁邦的特征。思路很简单,就是在feature map上去一块一块的找,进行归零操作,类似于dropout,叫做dropblock。(小声哔哔一句,这跟上面数据增强的方法不是一个道理呢。。。不过就是操作方式上有点区别而已。)
    在这里插入图片描述
    绿色阴影区域是语义特征,b图是模拟dropout的做法,随机丢弃一些位置的特征,但是作者指出这中做法没啥用,因为网络还是可以推断出来,©是本文做法。
    在这里插入图片描述
    dropblock有三个比较重要的参数,一个是block_size,用来控制进行归零的block大小;一个是γ,用来控制每个卷积结果中,到底有多少个channel要进行dropblock;最后一个是keep_prob,作用和dropout里的参数一样。
    在这里插入图片描述
    M大小和输出特征图大小一致,非0即1,为了保证训练和测试能量一致,需要和dropout一样,进行rescale。

    上述是理论分析,在做实验时候发现,block_size控制为7*7效果最好,对于所有的feature map都一样,γ通过一个公式来控制,keep_prob则是一个线性衰减过程,从最初的1到设定的阈值(具体实现是dropout率从0增加到指定值为止),论文通过实验表明这种方法效果最好。如果固定prob效果好像不好。

    实践中,并没有显式的设置 γ 的值,而是根据keep_prob(具体实现是反的,是丢弃概率)来调整。

    DropBlock in ResNet-50 DropBlock加在哪?最佳的DropBlock配置是block_size=7,在group3和group4上都用。将DropBlock用在skip connection比直接用在卷积层后要好,具体咋用,可以看代码。

    class DropBlock2D(nn.Module):
        r"""Randomly zeroes 2D spatial blocks of the input tensor.
    
        As described in the paper
        `DropBlock: A regularization method for convolutional networks`_ ,
        dropping whole blocks of feature map allows to remove semantic
        information as compared to regular dropout.
    
        Args:
            drop_prob (float): probability of an element to be dropped.
            block_size (int): size of the block to drop
    
        Shape:
            - Input: `(N, C, H, W)`
            - Output: `(N, C, H, W)`
    
        .. _DropBlock: A regularization method for convolutional networks:
           https://arxiv.org/abs/1810.12890
    
        """
    
        def __init__(self, drop_prob, block_size):
            super(DropBlock2D, self).__init__()
    
            self.drop_prob = drop_prob
            self.block_size = block_size
    
        def forward(self, x):
            # shape: (bsize, channels, height, width)
    
            assert x.dim() == 4, \
                "Expected input with 4 dimensions (bsize, channels, height, width)"
    
            if not self.training or self.drop_prob == 0.:
                return x
            else:
                # get gamma value
                gamma = self._compute_gamma(x)
    
                # sample mask
                mask = (torch.rand(x.shape[0], *x.shape[2:]) < gamma).float()
    
                # place mask on input device
                mask = mask.to(x.device)
    
                # compute block mask
                block_mask = self._compute_block_mask(mask)
    
                # apply block mask
                out = x * block_mask[:, None, :, :]
    
                # scale output
                out = out * block_mask.numel() / block_mask.sum()
    
                return out
    
        def _compute_block_mask(self, mask):
            # 比较巧妙的实现,用max pool来实现基于一点来得到全0区域
            block_mask = F.max_pool2d(input=mask[:, None, :, :],
                                      kernel_size=(self.block_size, self.block_size),
                                      stride=(1, 1),
                                      padding=self.block_size // 2)
    
            if self.block_size % 2 == 0:
                block_mask = block_mask[:, :, :-1, :-1]
    
            block_mask = 1 - block_mask.squeeze(1)
    
            return block_mask
    
        def _compute_gamma(self, x):
            return self.drop_prob / (self.block_size ** 2)
    

    2.1 BN、GN、IN和LN

    这4种归一化技术非常有名,网上分析文章非常多,故本文不打算从头到尾详细分析一遍,而是从计算角度分析4种归一化手段的计算区别。
    在这里插入图片描述
    假设输入维度是(N,C,H,W),不管哪一层归一化手段,都不会改变输出大小,即输出维度也是(N,C,H,W)。

    (1) BN

    对于BN,其归一化维度是N、HxW维度,故其可学习权重维度是(C,),其实就是BN的weight和bias维度,也就是论文中的 α,β 。
    在这里插入图片描述
    BN本质意思就是在Batch和HxW维度进行归一化,可以看出和batch相关,如果batch比较小,那么可能统计就不准确。并且由于测试时候batch可能和训练不同,导致分布不一致,故还多了两个参数:全局统计的均值和方差值,从而eval模式是必须开的,其调用实例如下所示:
    在这里插入图片描述
    上述中C=100 其流程是:对batch输入计算均值和方差(N、H和W维度求均值),得到维度为(C,),然后对输入(N,C,H,W)采用计算出来的(C,)个值进行广播归一化操作,最后再乘上可学习的(C,)个权重参数即可

    (2) LN

    对于LN,其归一化维度是C、HxW维度或者HxW维度或者W维度,但是不可以归一化维度为H,可以设置,比较灵活,其对每个batch单独进行各自的归一化操作,归一化操作时候不考虑batch,所以可以保证训练和测试一样。 例如:

    m = nn.LayerNorm(normalized_shape=[100 ,35 ,45])
    input = torch.randn(20, 100, 35, 45)
    

    如上所示,其可学习权重维度是(100,35,45):对batch输入计算均值和方差(C、H和W维度求均值),输出维度为(N,),然后对输入(N,C,H,W)采用计算出来的(N,)个值进行广播归一化操作,最后再乘上可学习的(C,H,W)个权重参数即可。当然也可以设置为(35,45),意思同样理解。

    可以看出其归一化是在指定输入shape情况下的归一化,和batch无关。故可以保证训练和测试一致,不需要强制开启eval模式。

    通过设置输入参数shape为(H,W),其实就是IN归一化了,比较灵活。
    在这里插入图片描述
    (3) IN

    对于IN,其归一化维度最简单,就是HxW,如下所示:
    在这里插入图片描述
    输入参数必须且只能是C,其内部计算是:对batch输入计算均值和方差(H,W维度求均值方差),输出维度为(N,C),然后对输入(N,C,H,W)采用计算出来的(N,C)个值进行广播归一化操作,最后再乘上可学习的(C,)个权重参数即可。

    由于其计算均值和方差和batch没有关系,故也不需要强制开启eval模式。

    (4) GN

    GN是介于LN和IN之间的操作,多了一个group操作,例子如下:
    在这里插入图片描述
    注意第一个参数分组数必须能够将输入通道整除,否则会报错,因为无法均匀分组。其内部计算是:对batch输入计算均值和方差(C/组数、H,W维度求均值方差),输出维度为(N,组数),然后对输入(N,C,H,W)采用计算出来的(N,组数)个值进行广播归一化操作,最后再乘上可学习的(C,)个权重参数即可。不需要强制开启eval模式。

    2.2 FRN

    论文名称:Filter response normalization layer: Eliminating batch dependence in the training of deep neural networks

    论文地址

    虽然GN解决了小batch size时的问题,但在正常的batch size时,其精度依然比不上BN层。有什么办法能解决归一化既不依赖于batch,又能使精度高于BN呢?FRN就是为了解决这个问题。
    在这里插入图片描述
    要解决batch依赖问题,则不能对batch维度进行归一化。FRN层由两部分组成,Filtere Response Normalization (FRN)和Thresholded Linear Unit (TLU)。
    在这里插入图片描述
    (1) FRN

    N是HxW,表面看起来计算方式非常类似IN,计算过程是:对输入的batch个样本在HxW维度上计算方差,不计算均值,得到输出维度(batch,c),然后对(batch,c,h,w)进行除方差操作,并且引入可学习参数,权重维度是(C,),最后对上述输出乘以可学习参数即可输出。

    其中,ϵ是一个很小的正常数,防止除以零。

    (2) TLU

    由于在FRN操作中没有减去均值,会导致“归一化”后的特征值不是关于零对称,可能会以任意的方式偏移零值。如果使用ReLU作为激活函数的话,会引起误差,产生很多零值,性能下降。所以需要对ReLU进行增强,即TLU,引入一个可学习的阈值τ
    在这里插入图片描述
    从上面来看,FRN层引入了γ、β和τ三个可学习的参数,分别学习变换重构的尺度、偏移和阈值,他们都具有C个值,对应每一个通道。

    一般情况下,特征图的大小N=H×W都比较大,但也有N=1的情况(全连接或者特征图为1×1)。在N=1的情况下,若ϵ很小,则会变成一个sign函数,梯度值变得很小,不利于优化;若ϵ相对较大,则曲线会平滑一点,容易优化。
    在这里插入图片描述
    故在实现方面,在N=1的情况下,将ϵ变成一个可学习的参数(初始化为10−4);而对于N≠1时,将其固定为10−6。为了保证可学习参数ϵ>0,对其进行一定限制
    在这里插入图片描述
    其tf实现如下所示:
    在这里插入图片描述
    另外在实验上,存在几个细节:

    1 由于FRN层没有均值中心化,所以会有一些模型对初始学习率的选择十分敏感,特别是那些使用了多个最大池化层的网络。为了缓解这个问题,作者建议使用warm-up来对学习率进行调整。

    2 一般而言,FC层后一般都不会接归一化层,这是因为均值和方差计算的数量太少,难以正确估计。但如果FC层后接FRN层,性能不会下降,反而会有上升。

    3 作者对BN+TLU或者GN+TLU或者FRN+ReLU等都做过实验对比,还是发现FRN+TLU的搭配是最好。

    在一些大佬实践中表明warm-up策略比较关键,如果不用效果可能不太稳定。同时整片论文都是实验性质的,没有啥原理性解释,不太好理解。而且本文看起来也蛮麻烦的,对目前的代码结构还是有蛮大的侵入性,还需要配合warm-up,用到的地方好像没有很多。

    2.3 CBN

    论文名称:Cross-Iiteration Batch Normalization
    github
    大家都知道当batch比较小时候,BN在batch维度统计不准确,导致准确率下降,前面的FRN也是为了解决该问题,而本文从另一个角度解决问题,思想比较make sense。在无法扩大batch训练的前提下,是否可以通过收集最近几次迭代信息来更新当前迭代时刻的均值和方差,这样就变向实现了扩大batch目的? 但是我们知道在当前迭代时刻,参数已经更新了N次,存储的前几个迭代的参数肯定无法直接和当前迭代次数进行合并计算,也就是由于网络权重的变化,不同迭代产生的网络激活无法相互比较。故需要找到一种解决办法。所幸作者指出:由于梯度下降机制,模型训练过程中相近的几个iter所对应的模型参数的变化是平滑的(smoothly),其权重变化可以用泰勒级数拟合出来,因此通过基于泰勒多项式的拟合来补偿网络权重的变化,从而可以准确地估计统计量,并可以有效地应用批次归一化。

    在训练yolo中,常用的一个技巧是设置mini batch和batch,即网络前向batch/ mini batch次,然后再进行一次梯度更新,也是为了变相扩大batch size,但是其缺点是bn操作无法实现等价的扩大N倍,本文就相当于可以解决这个问题。通常在多卡情况下一般采用SyncBN,其也叫作Cross-GPU Batch Normalization ,主要是解决batch特别小的场景,例如语义分割中batch通常都是1的情况训练效果不够好的问题,其在多个gpu上计算BN,实现了跨GPU上计算,使用多卡构造了大batch训练,属于技术改进。而本文想在单卡下实现同样效果,因为不是每个人都有多张卡。
    在这里插入图片描述
    上述图表是基于ResNet-18在ImageNet上面训练得到的top 准确率,可以看出当batch大于16后,BN的精度就蛮好了,随着batch减少,精度快速下降,GN虽然性能还可以,但是batch大的时候精度不如BN,而Naive版本的CAN效果其实和BN差不多,Naive版本是指收集最近K个迭代信息,然后用于计算当前迭代时刻的统计量,可以发现由于梯度更新原因,直接计算统计量其实没有效果,而本文的CBN可以比较好的克服。

    假设当前迭代时刻为t,则 t-τ 时刻中的统计量在t时刻的值,可以用泰勒级数近似:
    在这里插入图片描述
    在这里插入图片描述
    对于上述式子,代码就比较好写了,只要存储前k个时刻的统计量及其梯度即可。最后进行汇总就行:
    在这里插入图片描述
    注意求方差时候,采用了max操作,作者指出这样可以保留有用的统计信息(不太好理解)。得到统计量后,后面直接进行归一化即可,和标准BN计算方式一样。
    在这里插入图片描述
    在这里插入图片描述
    上图可以很好的反映出计算过程,BN就是仅仅利用当前迭代时刻信息进行norm,而CBN在计算当前时刻统计量时候会考虑前k个时刻统计量,从而实现扩大batch size操作。同时作者指出CBN操作不会引入比较大的内存开销,训练速度不会影响很多,但是训练时候会慢一些,比GN还慢。
    在这里插入图片描述
    论文做的实验比较多,这里不详细说了,有兴趣的可以下载原文查看。有一个细节是:CBN多了一个window size,实验中设定为8。并且需要在网络训练初期要用较小的窗大小,随着网络的训练,模型参数也会越来越稳定,再用较大的窗大小可以获得更好的结果。

    2.4 CmBN

    CmBN是yolov4中提出的,属于CBN的小改动,但是作者论文图绘制的比较隐晦,不太好理解,本文详细说下流程。
    在这里插入图片描述
    注意此时 [公式] 是没有进行更新的,使用的是前面时刻梯度更新得到的值。橙色流程的意思其实就是前面提到的yolo中常用的变相扩大batch size做法,其网络前向batch/ mini batch次,然后再第N-1迭代时刻进行统一的梯度更新,包括更新权重W以及BN可学习参数[公式],可以看出其无法变相扩大batch大小,实现更加精确的batch维度统计,但是实际上用起来还是有点效果的,不然大家训练时候也就不会用了。最好的办法其实应该还是同步BN好用,跨卡统计batch参数,但是不是人人都有多卡的,所以CBN还是有用武之地的。

    在理解了BN流程基础上,理解CBN就非常容易了,CBN由于在计算每个迭代时刻统计量时候会考虑前3个时刻的统计量,故变相实现了大batch,然后在每个mini batch内部,都是标准的BN操作即:1 计算BN统计量;2 应用BN;3 更新可学习参数和网络权重

    而CmBN的做法和前面两个都不一样,其把大batch内部的4个mini batch当做一个整体,对外隔离,主要改变在于BN层的统计量计算方面,具体流程是:假设当前是第t次迭代时刻,也是mini-batch的起点,

    (1) 在第t时刻开始进行梯度累加操作

    (2) 在第t时刻开始进行BN统计量汇合操作,这个就是和CBN的区别,CBN在第t时刻,也会考虑前3个时刻的统计量进行汇合,而CmBN操作不会,其仅仅在mini batch内部进行汇合操作

    (3) 就是正常的应用BN,对输入进行变换输出即可

    (4) 在mini batch的最后一个时刻,进行参数更新和可学习参数更新

    可以明显发现CmBN是CBN的简化版本,其唯一差别就是在计算第t时刻的BN统计量时候,CBN会考虑前一个mini batch内部的统计量,而CmBN版本,所有计算都是在mini batch内部。我怀疑是为了减少内存消耗,提高训练速度,既然大家都是近似,差距应该不大,而且本身yolo训练时候,batch也不会特别小,不至于是1-2,所以CmBN的做法应该是为了yolov4专门设计的,属于实践性改进。

    3、网络改进

    3.1 增加感受野技巧

    论文中主要是提到了三种结构:SPP层、ASPP和RFB。

    (1) SPP层
    在这里插入图片描述
    其结构如上所示,内部采用不同大小的kernel size和strdie实现不同感受野特征输出,然后concat即可,在yolov3-spp里面有具体结构:

    ---- START SPP -----
    [maxpool]
    stride=1
    size=5
    
    [route]
    layers=-2
    
    [maxpool]
    stride=1
    size=9
    
    [route]
    layers=-4
    
    [maxpool]
    stride=1
    size=13
    
    [route]
    layers=-1,-3,-5,-6
    
    ----End SPP ----
    

    即上一层的特征图输入是13x13x512,然后三个分支分别是stride=1,kernel size为5,9,13,然后三个图拼接,得到13x13x2048的图,然后

    [convolutional]
    batch_normalize=1
    filters=512
    size=1
    stride=1
    pad=1
    activation=leaky
    

    接一个1x1卷积,得到13x13x512的特征图,然后进行后续操作。

    (2) ASPP
    在这里插入图片描述
    ASPP和SPP的差别是,并不是采用max pool得到不同感受野的特征图,而是采用卷积实现,且其kernel size全部是3,但是引入了不同的空洞率来变相扩大感受野。其余操作和SPP一致,ASPP来自DeepLab论文。

    (3) RFB
    在这里插入图片描述
    RFB结构来自RFBNet,效果不错,计算量也不大,可以看出RFB是ASPP的推广,其采用了不同大小的kernel和不同的空洞率,相比ASPP,计算量减少不少,效果应该差不多。RFB在推理阶段引入的计算量非常小,但是在ssd中AP提高蛮多,是个不错的选择。

    3.2 注意力机制技巧

    论文中主要是提到了SE和SAM模块
    在这里插入图片描述
    SE模块比较简单,目的是对特征通道进行重新加权,如上图所示。
    在这里插入图片描述
    SAM是CBAM论文中的空间注意力模块。其流程是:将Channel attention模块输出特征图作为本模块的输入特征图。首先做一个基于channel的global max pooling 和global average pooling,然后将这2个结果基于channel 做concat操作。然后经过一个卷积操作,降维为1个channel。再经过sigmoid生成spatial attention feature。最后将该feature和该模块的输入feature做乘法,得到最终生成的特征。

    SE模块可以提升大概1%的ImageNet top-1精度,增加2%计算量,但推理时有10%的速度损失,对GPU不太友好,而SAM模块仅仅增加0.1%计算量,提升0.5%的top-1准确率,故本文选择的其实是SAM模块。

    yolov4对SAM进行简单修改,如下所示:
    在这里插入图片描述
    修改spatial-wise attention 为 pointwise attention,简化了流程,目的应该也是为了提高训练速度。

    3.3 特征融合技巧

    特征融合,主要是指不同输出层直接的特征融合,主要包括FPN、PAN、SFAM、ASFF和BiFPN。

    (1) FPN

    FPN是目前最主流的不同层融合方案,应用非常广泛,其结构为:
    在这里插入图片描述
    FPN仅仅融合相邻层的特征图,采用上采样或者下采样操作得到尺度一致的特征图,然后采用add操作得到融合后特征图。

    (2) PAN

    PAN来自论文:Path Aggregation Network for Instance Segmentation。其结构如下所示:
    在这里插入图片描述
    FPN加入top-down的旁路连接,能给feature增加high-level语义,有利于分类。但是PAN论文作者觉得low-level的feature很有利于定位,虽然FPN中P5也间接融合了low-level的特征,但是信息流动路线太长了如红色虚线所示,其中会经过超多conv操作,本文在FPN的P2-P5又加了low-level的特征,最底层的特征流动到N2-N5只需要经过很少的层如绿色需要所示,主要目的是加速信息融合,缩短底层特征和高层特征之间的信息路径。down-top的融合做法是:
    在这里插入图片描述
    其实不管作者如何解释motivation,这种top-down和donw-top的做法,看起来也比较make sense,后面的很多FPN改进都用到了这个思想。

    (3) SFAM

    SFAM来自M2det: A single-shot object detector based on multi-level feature pyramid network
    在这里插入图片描述
    其中SFAM结构如下所示:
    在这里插入图片描述
    SFAM全称是Scale-wise Feature Aggregation Module,不同尺度的特征进行重组和融合,基本原理是对不同TUM的输出(每个TUM有6个不同尺度的输出),将其中相同尺度的特征进行concat,然后经过一个SE模块(对通道进行reweighting)输出,然后进行检测。其实就是把相同尺度的各层金字塔特征提取出来,然后concat,经过se模块,进行通道加权,再进行后续的预测,实现对不同通道进行不同加权功能。看起来开销有点大呀,因为要多个stage。

    和FPN及其改进版本的不同是SFAM的融合是尺度感知的,只融合相同尺度的特征,而不是像FPN那样,强制上下采样然后进行融合。

    (4) ASFF

    ASFF来自论文:Learning Spatial Fusion for Single-Shot Object Detection,也就是著名的yolov3-asff
    在这里插入图片描述
    FPN操作是一个非常常用的用于对付大小尺寸物体检测的办法,作者指出FPN的缺点是不同尺度之间存在语义gap,举例来说基于iou准则,某个gt bbox只会分配到某一个特定层,而其余层级对应区域会认为是背景(但是其余层学习出来的语义特征其实也是连续相似的,并不是完全不能用的),如果图像中包含大小对象,则不同级别的特征之间的冲突往往会占据要素金字塔的主要部分,这种不一致会干扰训练期间的梯度计算,并降低特征金字塔的有效性。一句话就是:目前这种concat或者add的融合方式不够科学。本文觉得应该自适应融合,自动找出最合适的融合特征, 简要思想就是:原来的FPN add方式现在变成了add基础上多了一个可学习系数,该参数是自动学习的,可以实现自适应融合效果,类似于全连接参数。 ASFF具体操作包括 identically rescaling和adaptively fusing。

    定义FPN层级为l,为了进行融合,对于不同层级的特征都要进行上采样或者下采样操作,用于得到同等空间大小的特征图,上采样操作是1x1卷积进行通道压缩,然后双线性插值得到;下采样操作是对于1/2特征图是采样3 × 3 convolution layer with a stride of 2,对于1/4特征图是add a 2-stride max pooling layer然后引用stride 卷积。其自适应融合过程如下:
    在这里插入图片描述
    具体操作为:

    (1) 首先对于第l级特征图输出cxhxw,对其余特征图进行上下采样操作,得到同样大小和channel的特征图,方便后续融合

    (2) 对处理后的3个层级特征图输出,输入到1x1xn的卷积中(n是预先设定的),得到3个空间权重向量,每个大小是nxhxw

    (3) 然后通道方向拼接得到3nxhxw的权重融合图

    (4) 为了得到通道为3的权重图,对上述特征图采用1x1x3的卷积,得到3xhxw的权重向量

    (5) 在通道方向softmax操作,进行归一化,将3个向量乘加到3个特征图上面,得到融合后的cxhxw特征图

    (6) 采用3x3卷积得到输出通道为256的预测输出层

    (5) BIFPN

    BiFPN来自论文:EfficientDet: Scalable and efficient object detection 。ASFF思想和BiFPN非常类似,也是可学习参数的自适应加权融合,但是比ASFF更加复杂。在这里插入图片描述
    思想都差不多,多尺度融合不仅仅是从下到上,也要从上到下,并且融合的参数都是学习出来的,不是简单的add或者concat就Ok的。由于BiFPN操作非常有名,这里就不详细说了,大家可以参考知乎文章。

    4. 总结

    读了这篇文章以后,给人留下深刻印象的不是创新点,而是Bag of freebies和Bag of specials。所以有人多人都说YOLOv4是拼凑trick得到的。YOLOv4中Bag of freebies和Bag of Specials两部分总结的确实不错,对研究目标检测有很大的参考价值,涵盖的trick非常广泛。但是感觉AB大神并没有将注意力花在创新点上,没有花更多篇幅讲解这创新性,这有些可惜。(ASFF中就比较有侧重,先提出一个由多个Trick组成的baseline,然后在此基础上提出ASFF结构等创新性试验,安排比较合理)

    此外,笔者梳理了yolov4.cfg并没有发现在论文中提到的创新点比如modified SAM, 并且通过笔者整理的YOLOv4结构可以看出,整体架构方面,可以与yolov3-spp进行对比,有几个不同点:

    换上了更好的backbone: CSDarknet53
    将原来的FPN换成了PANet中的FPN
    结构方面就这些不同,不过训练过程确实引入了很多特性比如:

    Weighted Residual Connections(论文中没有详细讲)
    CmBN
    Self-adversarial-training
    Mosaic data augmentation
    DropBlock
    CIOU loss
    总体来讲,这篇文章工作量还是非常足的,涉及到非常非常多的trick, 最终的结果也很不错,要比YOLOv3高10个百分点。文章提到的Bag of freebies和Bag of specials需要好好整理,系统学习一下。

    但是缺点也很明显,创新之处描述的不够,没能有力地证明这些创新点的有效性。此外,yolov4.cfg可能并没有用到以上提到的创新点,比如SAM。

    展开全文
  • YOLOV4

    千次阅读 2020-04-26 20:47:00
    论文:YOLOv4: Optimal Speed and Accuracy of Object Detection Github:https://github.com/AlexeyAB/darknet 论文主要针对各种可以提升精度的trick进行了整合,加入YOLOV3中,得到最终本文的YOLOV4。最终在...

    论文:YOLOv4: Optimal Speed and Accuracy of Object Detection

    Github:https://github.com/AlexeyAB/darknet

     

    论文主要针对各种可以提升精度的trick进行了整合,加入YOLOV3中,得到最终本文的YOLOV4。最终在coco上面达到了43.5%AP ,在Tesla V100 上达到了65FPS。性能+精度,好到爆炸。

     

    主要贡献:

    1. 提出了一个高效快速的目标检测框架YOLOV4
    2. 分析验证了Bag-ofFreebies 和Bag-of-Specials 方法对检测框架训练和推理的影响。
    3. 更改方法,使得YOLOV4可以适应于单GPU训练,大大降低YOLOV4的训练门槛。

     

    检测框架对比:

    输入Input:

     Image, Patches, Image Pyramid

    骨架网络Backbones:

    VGG16 , ResNet-50 , SpineNet, EfficientNet-B0/B7 , CSPResNeXt50 ,CSPDarknet53

    颈部模块Neck:
    • Additional blocks: SPP , ASPP, RFB, SAM
    • Path-aggregation blocks: FPN , PAN ,NAS-FPN , Fully-connected FPN, BiFPN, ASFF , SFAM  

    头部模块Heads:
    • Dense Prediction (one-stage):RPN , SSD , YOLO , RetinaNet (anchor based), CornerNet, CenterNet , MatrixNet, FCOS (anchor free)
    • Sparse Prediction (two-stage):Faster R-CNN , R-FCN , Mask RCNN (anchor based)RepPoints (anchor free)

     

    Bag of freebies :

    仅仅改变训练策略,并且只增加训练的开销,不增加推理测试的开销的改进,称为Bag of freebies。

    We call these methods that only change the training strategy or only increase the training cost as “bag of freebies.”

    用到的改进包括,

    (1)数据增强data augmentation

    brightness ,contrast ,hue ,saturation ,noise ,random scaling,cropping,flipping ,rotating ,CutOut, MixUp, CutMix

    (2)正则化方法

    DropOut, DropPath ,Spatial DropOut , or DropBlock

    (3)难例挖掘

    hard negative example mining ,online hard example mining ,focal loss ,label smoothing

    (4)损失函数

    MSE, IoU, GIoU, CIoU, DIoU

     

    Bag of specials:

    只通过增加很小的计算量就可以极大的提高模型精度的方法,称为Bag of specials。

    For those plugin modules and post-processing methods that only increase the inference cost by a small amount but can significantly improve the accuracy of object detection, we call them “bag of specials”.

    用到的改进包括,

    (1)增大感受野

    SPP , ASPP, RFB , Spatial Pyramid Matching (SPM)

    (2)attention方法

    Squeeze-and-Excitation (SE), Spatial Attention Module (SAM)

    (3)跳跃连接:

    Residual connections, Weighted residual connections, Multi-input weighted residual connections,  Cross stage partial connections (CSP) , FPN ,SFAM  ,ASFF  ,BiFPN  

    (4)激活函数:

    ReLU, leaky-ReLU, parametric-ReLU, ReLU6, SELU, Swish, Mish 

    (5)NMS

    greedy NMS, soft NMS

    (6)归一化方法:

    Batch Normalization (BN) ,Cross-GPU Batch Normalization (CGBN or SyncBN), Filter Response Normalization (FRN) , Cross-Iteration Batch Normalization (CBN)

     

    网络基础结构的选择:

    CSPDarknet53比CSPResNext50 ,EfficientNet-B3具有更大的感受野,更快的速度,因此,选择CSPDarknet53作为YOLOV4的基础骨架。

     

    分类精度高的模型不一定检测精度也高,

    A reference model which is optimal for classification is not always optimal for a detector.

    检测需要的条件,

    1. 更高的输入图片分辨率,有助于检测多尺度的小物体
    2. 更多的层,可以匹配更大的网络输入
    3. 更多的参数,使得模型有更大的包容力检测不同大小的物体

     

     

    实验结果:

     

     

     

    展开全文
  • YOLOv4

    千次阅读 2020-04-25 21:55:03
    paper:https://arxiv.org/pdf/2004.10934.pdf, code:...核心中的核心:作者将Weighted-Residual-Connections(WRC), Cross-Stage-Partial-connections(CSP), Cross mini-Batch Normalization...
  • YOLOv4在速度和准确率上都十分优异,作者使用了大量的trick,论文也写得很扎实,在工程还是学术上都有十分重要的意义,既可以学习如何调参,也可以了解目标检测的trick。   来源:晓飞的算法工程笔记 公众号 论文:...
  • YoLov4

    2020-04-26 11:22:35
    论文:YOLOv4: Optimal Speed and Accuracy of Object Detection paper,code 核心:作者将Weighted-Residual-Connections(WRC), Cross-Stage-Partial-connections(CSP), Cross mini-Batch Normalization(CmBN), ...
  • Yolo v4系列学习(五)Yolov4-tiny

    千次阅读 热门讨论 2020-06-28 20:07:00
    这几天,Alexey Bochkovskiy大神在Yolov4官网上更新了Yolov4-tiny!这对于计算资源相对紧张的开发者来说当然是福音啊。 这样的话,YOLO算法各个版本都有其对应的tiny版本了! 1、从如下网址下载最新版的darknetAB...
  • Tips ◎作者系极市原创作者计划特约...早上刷到YOLOv4之时,非常不敢相信这是真的! paper:https://arxiv.org/pdf/2004.10934.pdf, code:https://github.com/AlexeyAB/darknet 核心中的核心:作者将Weighted-Re...
  • yolov3-tiny的训练

    万次阅读 2018-12-23 14:38:55
    yolov3-tiny      其实训练过程与之前的yolov3是一样了 主要当时找weight跟预训练的卷积层weight找了好久 在这里把链接贴上: 先是获得训练好的yolov3-tiny的权重用来test: wget ...
  • Yolov4可视化网络结构图

    千次阅读 多人点赞 2020-08-11 10:18:31
    该结构图由netron工具打开制作而成,如想安装netron工具,可移步大白的另一篇文章《网络可视化工具netron详细安装流程》
  • yolov3与yolov4效果对比

    千次阅读 2020-05-07 15:19:53
    yolov3与yolov4相比它表现的更加趋于完美,在yolo3中他没有检测到的东西,在yolo4中检测出来了(yolo3genyolo4的分类完全相同都是80类。) yolo4对于遮挡的物体检测性能相比yolo3更加优越。 ...
  • YOLOV3性能评估对比

    千次阅读 2018-09-19 14:40:42
  • yolov3和yolov3-tiny部署的模型的运行速度

    千次阅读 热门讨论 2019-04-29 10:01:35
    yolov3的模型在intel core i5的CPU上的一张图像的测试速度为1500ms-2000ms之间,如下图所示: yolov3-tiny的模型在intel core i5的CPU上的一张图像的测试速度为130ms-200ms之间,如下图所示: CPU配置如下: ...
  • YOLOv3 训练的各种config文件以及weights文件。

    万次阅读 热门讨论 2020-07-13 17:14:45
    YOLOv3训练过程中的各种文件。包括配置文件,权重文件。 yolov3.pt yolov3.weights darknet53.conv.74 yolov3-spp.weights yolov3-tiny.conv.15 yolov3-tiny.pt yolov3-tiny.weighs ...
  • Yolov3&Yolov4&Yolov5模型权重及网络结构图资源下载

    千次阅读 多人点赞 2020-08-31 11:57:59
    Yolov4的《深入浅出Yolo系列之Yolov3&Yolov4核心基础完整讲解》 (2)Yolov5的《深入浅出Yolo系列之Yolov5核心基础完整讲解》 其中提到很多网络模型的权重,由于不是国内资源,很多同学反馈不好下载。 而且文章...
  • linux下配置运行yolov4!亲测有效!

    千次阅读 热门讨论 2020-04-26 10:12:10
    一、下载yolov4 git clone https://github.com/AlexeyAB/darknet.git 二、编译 # cd到darknet目录下 make 或者 make -j8 编译过程中可能会出现以下错误: error: ‘for’ loop initial declarations are ...
  • MobileNetV2-YoloV3

    千次阅读 2019-07-24 19:10:33
    无预训练: https://github.com/thancaocuong/MobileNetV2-YoloV3
1 2 3 4 5 ... 20
收藏数 14,806
精华内容 5,922
关键字:

yolov4