万字长文解析 YOLOv1-v5 模型(下)

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,5000CU*H 3个月
模型训练 PAI-DLC,5000CU*H 3个月
简介: 万字长文解析 YOLOv1-v5 模型

3,实验结果

YOLOv3 实验结果非常好!详情见表3。

网络异常,图片无法展示
|

COCOmAP 指标而言,YOLOv3SSD 变体相近,但是速度却比后者快了 3 倍。尽管如此,YOLOv3 还是比 Retinanet 这样的模型在精度上要差一些。

但是当我们以 IOU = 0.5 这样的旧指标对比,YOLOv3 表现更好,几乎和 Retinanet 相近,远超 SSD 变体。这表面它其实是一款非常灵活的检测器,擅长为检测对象生成合适的边界框。然而,随着IOU阈值增加,YOLOv3 的性能开始同步下降,这时它预测的边界框就不能做到完美对齐了。

在过去的 YOLOv1/v2 上,YOLO 一直在小目标检测领域表现不好,现在 YOLOv3 基本解决了这个问题,有着更好的 APSAP_SAPS 性能。但是它目前在中等尺寸或大尺寸物体上的表现还相对较差,仍需进一步的完善。

当我们基于 AP50AP_{50}AP50 指标绘制精度和速度曲线(Figure 3)时,我们发现YOLOv3与其他检测系统相比具有显着优势,换句话说,它更快更好。

网络异常,图片无法展示
|

Figure 3 可以看出,YOLOv3 的曲线非常靠近曲线坐标的同时又非常高,这意味着 YOLOv3 有着良好速度的同时又有很好的精度,无愧当前最强目标检测模型。

4,失败的尝试

一些没有作用的尝试工作如下。

Anchor box x,y 偏移预测。我们尝试了常规的 Anchor box 预测方法,比如利用线性激活将坐标 x、yx、yxy 的偏移程度,预测为边界框宽度或高度的倍数。但我们发现这种做法降低了模型的稳定性,且效果不佳。

用线性方法预测 x,y,而不是使用 logistic。我们尝试使用线性激活函数来直接预测 x,yx,yxy 的偏移,而不是 ligistic 激活函数,但这降低了 mAP

focal loss。我们尝试使用focal loss,但它使我们的 mAP降低了 2 点。 对于 focal loss 函数试图解决的问题,YOLOv3 已经具有鲁棒性,因为它具有单独的对象性预测(objectness predictions)和条件类别预测。因此,对于大多数示例来说,类别预测没有损失?或者其他的东西?我们并不完全确定。

双 IOU 阈值和真值分配。在训练过程中,Faster RCNN 用了两个IOU 阈值,如果预测的边框与的 ground truthIOU0.7,那它是正样本 ;如果 IOU 在 [0.3—0.7]之间,则忽略这个 box;如果小于 0.3,那它是个负样本。我们尝试了类似的策略,但效果并不好。

5,改进的意义

YOLOv3 是一个很好的检测器,速度很快,很准确。虽然它在 COCO 数据集上的 mAP 指标,即 AP50AP_{50}AP50AP90AP_{90}AP90 之间的平均值上表现不好,但是在旧指标 AP50AP_{50}AP50 上,它表现非常好。

总结 YOLOv3 的改进点如下:

  • 使用金字塔网络来实现多尺度预测,从而解决小目标检测的问题。
  • 借鉴残差网络来实现更深的 Darknet-53,从而提升模型检测准确率。
  • 使用 sigmoid 函数替代 softmax 激活来实现多标签分类器。
  • 位置预测修改,一个 gird 预测 3box

四,YOLOv4

因为 YOLOv1-v3 的作者不再更新 YOLO 框架,所以 Alexey Bochkovskiy 接起了传承 YOLO 的重任。相比于它的前代,YOLOv4 不再是原创性且让人眼前一亮的研究,但是却集成了目标检测领域的各种实用 tricks 和即插即用模块 ,称得上是基于 YOLOv3 框架的各种目标检测 tricks 的集大成者。 本文章不会对原论文进行一一翻译,但是做了系统性的总结和关键部分的翻译。

1,摘要及介绍

我们总共使用了:WRCCSPCmBNSATMish 激活和 Mosaic 数据增强、CIoU 损失方法,并组合其中的一部分,使得最终的检测模型在 MS COCO 数据集、Tesla V100 显卡上达到了 43.5%AP 精度 和 65FPS 速度。

网络异常,图片无法展示
|

我们的主要贡献在于:

  1. 构建了简单高效的 YOLOv4 检测器,修改了 CBNPANSAM 方法使得 YOLOv4 能够在一块 1080Ti 上就能训练。
  2. 验证了当前最先进的 Bag-of-FreebiesBag-of-Specials 方法在训练期间的影响。

目前的目标检测网络分为两种:一阶段和两阶段。检测算法的组成:Object detector = backbone + neck + head,具体结构如下图所示。

网络异常,图片无法展示
|

2,相关工作

2.1,目标检测方法

按照检测头的不同(head)将目标检测模型分为:两阶段检测和一阶段检测模型,各自代表是 Faster RCNNYOLO 等,最近也出了一些无 anchor 的目标检测器,如 CenterNet 等。近几年来的检测器会在Backbone网络(backbone)和头部网络(head)之间插入一些网络层,主要作用是收集不同阶段的特征。,称其为检测器的颈部(neck)。 neck 通常由几个自下而上(bottom-up)的路径和几个自上而下(top-down)的路径组成。 配备此机制的网络包括特征金字塔网络(FPN)[44],路径聚合网络(PAN)[49],BiFPN [77]和NAS-FPN [17]。

一般,目标检测器由以下几部分组成:

网络异常,图片无法展示
|

2.2,Bag of freebies(免费技巧)

不会改变模型大小,主要是针对输入和 loss 等做的优化工作,一切都是为了让模型训练得更好。

最常用的方式是数据增强data augmentation),目标是为了提升输入图像的可变性(variability),这样模型在不同环境中会有更高的鲁棒性。常用的方法分为两类:光度失真和几何失真(photometric distortions and geometric distortions)。在处理光度失真时,我们调整了图像的亮度、对比度、色调、饱和度和噪声;对于几何失真,我们添加随机缩放,裁剪,翻转和旋转。

上述数据增强方法都是逐像素调整的,并且保留了调整区域中的所有原始像素信息。此外,也有些研究者将重点放在模拟对象遮挡的问题上,并取得了一些成果。例如随机擦除(random-erase)[100] 和 CutOut [11] 方法会随机选择图像中的矩形区域,并填充零的随机或互补值。而捉迷藏(hide-and-seek)[69] 和网格遮罩(grid-mask)[6] 方法则随机或均匀地选择图像中的多个矩形区域,并将它们替换为所有的 zeros。这个概念有些类似于 DropoutDropConnectDropBlock 这些在 feature 层面操作的方法,如 。此外,一些研究人员提出了使用多个图像一起执行数据增强的方法。 例如,MixUp 方法使用两个图像以不同的系数比值相乘后叠加,然后使用这些叠加的比值来调整标签。 对于 CutMix,它是将裁切后的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签。 除了以上方法之外,还有 style transfer GAN 方法用于数据扩充、减少 CNN 所学习的纹理偏差。

MIX-UPMix-up 在分类任务中,将两个图像按照不同的比例相加,例如 A∗0.1+B∗0.9=CA\ast 0.1 + B\ast 0.9=CA0.1+B0.9=C,那么 CCClabel 就是 [0.1A,0.9A][0.1A, 0.9A][0.1A,0.9A]。在目标检测中的做法就是将一些框相加,这些 label 中就多了一些不同置信度的框。

上面的方法是针对数据增强目标,第二类方法是针对解决数据集中语义分布可能存在偏差的问题( semantic distribution in the dataset may have bias)。在处理语义分布偏差问题时,类别不平衡imbalance between different classes)问题是其中的一个关键,在两阶段对象检测器中通常通过困难负样本挖掘(hard negative example mining)或在线困难样本挖掘(online hard example mining,简称 OHEM)来解决。但样本挖掘方法并不能很好的应用于一阶段检测器,因为它们都是密集检测架构(dense prediction architecture)。因此,何凯明等作者提出了 Focal Loss 用来解决类别不平衡问题。 另外一个关键问题是,很难用 one-hot hard representation 来表达不同类别之间的关联度的关系,但执行标记时又通常使用这种表示方案。 因此在(Rethinking the inception architecture for computer vision)论文中提出标签平滑(label smoothing)的概念,将硬标签转换为软标签进行训练,使模型更健壮。为了获得更好的软标签,论文(Label refinement network for coarse-to-fine semantic segmentation)介绍了知识蒸馏的概念来设计标签细化网络。

最后一类方法是针对边界框(BBox)回归的目标函数。传统的目标检测器通常使用均方误差(MSEMSEMSE)对BBox 的中心点坐标以及高度和宽度直接执行回归,即 {xcenter,ycenter,w,h}\lbrace x_{center}, y_{center}, w, h \rbrace{xcenter,ycenter,w,h} 或者 {xtop−left,ytop−left,xbottom−right,ybottom−right}\lbrace x_{top-left}, y_{top-left}, x_{bottom-right}, y_{bottom-right} \rbrace{xtopleft,ytopleft,xbottomright,ybottomright} 坐标。如果基于锚的方法,则估计相应的偏移量,例如 {xcener−offset,ycener−offset,w,h}\lbrace x_{cener-offset}, y_{cener-offset}, w, h \rbrace{xceneroffset,yceneroffset,w,h} 或者 {xtop−left−offset,ytop−left−offset,xbottom−right−offset,ybottom−right−offset}\lbrace x_{top-left-offset}, y_{top-left-offset}, x_{bottom-right-offset}, y_{bottom-right-offset} \rbrace{xtopleftoffset,ytopleftoffset,xbottomrightoffset,ybottomrightoffset}。这些直接估计 BBox 的各个点的坐标值的方法,是将这些点视为独立的变量,但是实际上这没有考虑对象本身的完整性。为了更好的回归 BBox,一些研究者提出了 IOU 损失[90]。顾名思义,IoU 损失既是使用 Ground Truth 和预测 bounding boxBBox)的交并比作为损失函数。因为 IoU 是尺度不变的表示,所以可以解决传统方法计算 {x,y,w,h}\lbrace x,y,w,h \rbrace{xywh}L1L1L1L2L2L2 损失时,损失会随着尺度增加的问题。 最近,一些研究人员继续改善 IoU 损失。 例如,GIoU 损失除了覆盖区域外还包括对象的形状和方向,GIoU 损失的分母为同时包含了预测框和真实框的最小框的面积。DIoU 损失还考虑了对象中心的距离,而CIoU 损失同时考虑了重叠区域,中心点之间的距离和纵横比。 CIoU 损失在 BBox 回归问题上可以实现更好的收敛速度和准确性。

[90] 论文: An advanced object detection network.

2.3,Bag of specials(即插即用模块+后处理方法)

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

增大感受野模块。用来增强感受野的常用模块有 SPPASPPRFBSPP 起源于空间金字塔匹配(SPM),SPM 的原始方法是将特征图分割为几个 d×dd\times dd×d 个相等的块,其中 ddd 可以为 {1,2,3,..}\lbrace 1,2,3,.. \rbrace{1,2,3..},从而形成空间金字塔。SPPSPM 集成到 CNN 中,并使用最大池化操作(max pooling)替代 bag-of-word operation。原始的 SPP 模块是输出一维特征向量,这在 FCN 网络中不可行。

引入注意力机制。在目标检测中经常使用的注意力模块,通常分为 channel-wise 注意力和 point-wise 注意力。代表模型是 SESAM(Spatial Attention Module )。虽然 SE 模块可以提高 ReSNet50ImageNet 图像分类任务 1%top-1 准确率而计算量只增加 2%,但是在 GPU 上,通常情况下,它会将增加推理时间的 10% 左右,所以更适合用于移动端。但对于 SAM,它只需要增加 0.1% 的额外的推理时间,就可以在 ImageNet 图像分类任务上将 ResNet50-SEtop-1 准确性提高 0.5%。 最好的是,它根本不影响 GPU 上的推理速度。

特征融合或特征集成。早期的实践是使用 skip connectionhyper-column 将低层物理特征集成到高层语义特征。 由于诸如 FPN 的多尺度预测方法已变得流行,因此提出了许多集成了不同特征金字塔的轻量级模块。 这种模块包括 SFAMASFFBiFPNSFAM 的主要思想是使用 SE 模块在多尺度级联特征图上执行通道级级别的加权。 对于 ASFF,它使用softmax 作为逐点级别权重,然后添加不同比例的特征图。在BiFPN 中,提出了多输入加权残差连接以执行按比例的级别重新加权,然后添加不同比例的特征图。

激活函数。良好的激活函数可以使梯度在反向传播算法中得以更有效的传播,同时不会引入过多的额外计算成本。2010NairHinton 提出的 ReLU 激活函数,实质上解决了传统的tanhsigmoid 激活函数中经常遇到的梯度消失问题。随后,随后,LReLUPReLUReLU6,比例指数线性单位(SELU),Swishhard-SwishMish等激活函数也被提出来,用于解决梯度消失问题。LReLUPReLU 的主要目的是解决当输出小于零时 ReLU 的梯度为零的问题。而 ReLU6Hard-Swish 是专门为量化网络设计的。同时,提出了 SELU 激活函数来对神经网络进行自归一化。 最后,要注意 SwishMish 都是连续可区分的激活函数。

后处理。最开始常用 NMS 来剔除重复检测的 BBox,但是 NMS 会不考虑上下文信息(可能会把一些相邻检测框框给过滤掉),因此 Girshick 提出了 Soft NMS,为相邻检测框设置一个衰减函数而非彻底将其分数置为零。而 DIoU NMS 则是在 soft NMS 的基础上将中心距离的信息添加到 BBox 筛选过程中。值得一提的是,因为上述后处理方法都没有直接涉及捕获的图像特征,因此在后续的 anchor-free 方法中不再需要 NMS 后处理。

3,方法

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

  • 对于 GPU,我们在卷积层中使用少量分组(1-8):如CSPResNeXt50 / CSPDarknet53
  • 对于 VPU,我们使用分组卷积,但是我们避免使用 SE-特别是以下模型:EfficientNet-lite / MixNet [76] / GhostNet [21] / MobiNetNetV3

3.1,架构选择

我们的目标是在输入图像分辨率、卷积层数量、参数量、层输出(滤波器)数量之间找到最优平衡。我们大量的研究表面,在 ILSVRC2012(ImageNet) 分类数据集上,CSPResNext50 网络优于 CSPDarknet,但是在 MS COCO 目标检测数据集上,却相反。

这是为什么呢,两种网络,一个分类数据集表现更好,一个检测数据集表现更好。

网络异常,图片无法展示
|

在分类问题上表现最优的参考模型并不一定总是在检测问题上也表现最优。与分类器相比,检测器需要满足以下条件:

  • 更高的输入网络尺寸(分辨率),用于检测多个小型物体。
  • 更多的网络层,用以得到更高的感受野以覆盖更大的输入网络尺寸。
  • 更多参数,用以得到更大的模型容量,从而可以在单个图像中检测到多个不同大小的对象。

表1 显示了 CSPResNeXt50CSPDarknet53EfficientNet B3 网络的信息。CSPResNext50 仅包含163×33\times 33×3 卷积层,最大感受野为 425×425425\times 425425×425和网络参数量为 20.6 M,而 CSPDarknet53 包含 293×33\times 33×3 卷积层,最大感受野为 725×725725\times 725725×725 感受野和参数量为 27.6 M。理论上的论证再结合作者的大量实验结果,表面 CSPDarknet53 更适合作为目标检测器的 backbone

不同大小的感受野的影响总结如下:

  • 达到对象大小 - 允许查看整个对象
  • 达到网络大小 - 允许查看对象周围的上下文环境
  • 超过网络规模 - 增加图像点和最终激活之间的连接

我们在 CSPDarknet53 上添加了 SPP 模块,因为它显著增加了感受野,分离出最重要的上下文特征,并且几乎没有降低网络运行速度。 我们使用 PANet 作为针对不同检测器级别的来自不同backbone 级别的参数聚合方法,而不是 YOLOv3中使用的FPN

最后,我们的 YOLOv4 架构体系如下:

  • backboneCSPDarknet53 + SPP
  • neck: PANet
  • headYOLOv3head

3.2,Selection of BoF and BoS

为了更好的训练目标检测模型,CNN 通常使用如下方法:

  • 激活函数:ReLUleaky-ReLUparameter-ReLUReLU6SELUSwishMish
  • 边界框回归损失:MSEIoUGIoUCIoUDIoU 损失;
  • 数据扩充:CutOutMixUpCutMix
  • 正则化方法:DropOutDropPath,空间 DropOutDropBlock
  • 通过均值和方差对网络激活进行归一化:批归一化(BN),交叉-GPU 批处理规范化(CGBNSyncBN),过滤器响应规范化(FRN)或交叉迭代批处理规范化(CBN);
  • 跳跃连接:残差连接,加残差连接,多输入加权残差连接或跨阶段局部连接(CSP

以上方法中,我们首先提出了难以训练的 PRELUSELU,以及专为量化网络设计的 ReLU6 激活。因为 DropBlock 作者证明了其方法的有效性,所以正则化方法中我们使用 DropBlock

3.3,额外的改进

这些方法是作者对现有方法做的一些改进。

为了让 YOLOv4 能更好的在单个 GPU 上训练,我们做了以下额外改进:

  • 引入了新的数据增强方法:Mosaic 和自我对抗训练 self-adversarial trainingSAT)。
  • 通过遗传算法选择最优超参数。
  • 修改了 SAMPANCmBN

Mosaic 是一种新的数据增强方法,不像 cutmix 仅混合了两张图片,它混合了 444 张训练图像,从而可以检测到超出其正常上下文的对象。 此外,BN 在每层上计算的激活统计都是来自 4 张不同图像,这大大减少了对大 batch size 的需求。

网络异常,图片无法展示
|

CmBN 仅收集单个批次中的 mini-batch 之间的统计信息。

网络异常,图片无法展示
|

我们将 SAMspatial-wise attentation 改为 point-wise attention,并将 PANshortcut 连接改为 concatenation(拼接),分别如图 5 和图 6 所示。

网络异常,图片无法展示
|


3.4 YOLOv4

YOLOv4 网络由以下部分组成

  • Backbone: CSPDarknet53
  • Neck: SPP, PAN
  • Head: YOLOv3

同时,YOLO v4 使用了

  • 用于 backboneBoFCutMixMosaic数据增强,DropBlock正则化,类标签平滑。
  • 用于 backboneBoSMish激活,跨阶段部分连接(CSP),多输入加权残余连接(MiWRC)。
  • 用于检测器的 BoFCIoU 损失,CmBNDropBlock 正则化,mosaic 数据增强,自我对抗训练,消除网格敏感性,在单个 ground-truth 上使用多个 anchor,余弦退火调度器,最佳超参数,随机训练形状。
  • 用于检测器 BoSMish 激活,SPP 模块,SAM 模块,PAN 路径聚集块,DIoU-NMS

4,实验

4.1,实验设置

4.2,对于分类器训练过程中不同特性的影响

7 可视化了不同数据增强方法的效果。

网络异常,图片无法展示
|

2 的实验结果告诉我们,CutMixMosaic 数据增强,类别标签平滑及 Mish 激活可以提高分类器的精度,尤其是 Mish 激活提升效果很明显。

网络异常,图片无法展示
|

4.3,对于检测器训练过程中不同特性的影响

  • SSS: Eliminate grid sensitivit。原来的 bx=σ(tx)+cxb_x = \sigma(t_x) + c_xbx=σ(tx)+cx,因为 sigmoid 函数值域范围是 (0,1)(0,1)(0,1) 而不是 [0,1][0,1][0,1],所以 bxb_xbx 不能取到 grid 的边界位置。为了解决这个问题,作者提出将 σ(tx)\sigma(t_x)σ(tx) 乘以一个超过 111 的系数,如 bx=1.1σ(tx)+cxb_x = 1.1\sigma(t_x) + c_xbx=1.1σ(tx)+cxbyb_yby 的公式类似。
  • ITITIT:之前的 YOLOv3111anchor 负责一个 GT,现在 YOLOv4 改用多个 anchor 负责一个 GT。对于 GT 来说,只要 IoU(anchori,GTj)>IoU−thresholdIoU(anchor_i, GT_j) > IoU -thresholdIoU(anchori,GTj)>IoUthreshold ,就让 anchorianchor_ianchori 去负责 GTjGT_jGTj
  • CIoUCIoUCIoU:使用了 GIoU,CIoU,DIoU,MSE 这些误差算法来实现边框回归,验证出 CIoU 损失效果最好。

网络异常,图片无法展示
|

同时实验证明,当使用 SPPPANSAM 时,检测器将获得最佳性能。

4.4,不同骨干和预训练权重对检测器训练的影响

综合各种改进后的骨干网络对比实验,发现 CSPDarknet53CSPResNext 模型显示出提高检测器精度的更大能力。

网络异常,图片无法展示
|

4.5,不同小批量的大小对检测器训练的影响

实验证明,在使用了 BoFBoS 训练策略后,小批量大小(mini-batch sizes)对检测器的性能几乎没有影响。实验结果对比表格就不放了,可以看原论文。

5,结果

与其他 state-of-the-art 目标检测算法相比,YOLOv4 在速度和准确性上都表现出了最优。详细的比较实验结果参考论文的图 8、表 8和表 9

6,YOLOv4 主要改进点

例举出一些我认为比较关键且值得重点学习的改进点。

6.1,Backbone 改进

后续所有网络的结构图来都源于江大白公众号,之后不再一一注明结构图来源。

Yolov4 的整体结构可以拆分成四大板块,结构图如下图所示。

网络异常,图片无法展示
|

YOLOv4 的五个基本组件如下:

  1. CBMYolov4 网络结构中的最小组件,由 Conv+Bn+Mish 激活函数三者组成。
  2. CBL:由 Conv+Bn+Leaky_relu 激活函数三者组成。
  3. Res unit:借鉴 Resnet 网络中的残差结构思想,让网络可以构建的更深,和 ResNetbasic block 由两个 CBL(ReLU)组成不同,这里的 Resunit2CBM 组成。
  4. CSPX:借鉴 CSPNet 网络结构,由三个卷积层和 XRes unint 模块 Concate 组成。
  5. SPP:采用 1×1,5×5,9×9,13×13 的最大池化的方式,进行多尺度融合。

其他基础操作:

  1. Concat:张量拼接,会扩充维度。
  2. add:逐元素相加操作,不改变维度(element-wise add)。

因为每个 CSPX 模块有 5+2∗X5+2\ast X5+2X 个卷积层,因此整个 backbone 中共有 1+(5+2×1)+(5+2×2)+(5+2×8)+(5+2×8)+(5+2×4)=721 + (5+2\times 1) + (5+2\times 2) + (5+2\times 8) + (5+2\times 8) + (5+2\times 4) = 721+(5+2×1)+(5+2×2)+(5+2×8)+(5+2×8)+(5+2×4)=72 个卷积层

这里卷积层的数目 72 虽然不等同于 YOLOv353,但是 backbone 依然是由 [1、2、8、8、4] 个卷积模块组成的,只是这里的 YOLOv4 中的卷积模块替换为了 CSPX 卷积模块,猜想是这个原因所以 YOLOv4 的作者这里依然用来 Darknet53 命名后缀。

6.1.1,CSPDarknet53

YOLOv4 使用 CSPDarknet53 作为 backbone,它是在 YOLOv3 的骨干网络 Darknet53 基础上,同时借鉴 2019 年的 CSPNet 网络,所产生的新 backbone

CSPDarknet53 包含 5CSP 模块,CSP 中残差单元的数量依次是 [1,2,8,8,4][1, 2,8,8,4][1,2,8,8,4],这点和 Darknet53 类似。每个 CSP 模块最前面的卷积核的大小都是 3×33\times 33×3stride=2,因此可以起到下采样的作用(特征图大小缩小一倍)。因为 backbone 总共有 5CSP模块,而输入图像是 608×608608\times 608608×608,所以特征图大小变化是:608->304->152->76->38->19,即经过 bckbone 网络后得到 19×1919\times 1919×19 大小的特征图。CSPDarknet53 网络结构图如下图所示。

网络异常,图片无法展示
|

CSPNet 作者认为,MobiletNetShuffleNet 系列模型是专门为移动端(CPU)平台上设计的,它们所采用的深度可分离卷积技术(DW+PW Convolution)并不兼容用于边缘计算的 ASIC 芯片。

CSP 结构是一种思想,它和ResNet、DenseNet 类似,可以看作是 DenseNet 的升级版,它将 feature map 拆成两个部分,一部分进行卷积操作,另一部分和上一部分卷积操作的结果进行concate

CSP 结构主要解决了四个问题:

  1. 增强 CNN 的学习能力,能够在轻量化的同时保持着准确性;
  2. 降低计算成本;
  3. 降低内存开销。CSPNet 改进了密集块和过渡层的信息流,优化了梯度反向传播的路径,提升了网络的学习能力,同时在处理速度和内存方面提升了不少。
  4. 能很好的和 ResNetDarkNet 等网络嵌入在一起,增加精度的同时减少计算量和降低内存成本。
6.1.2,Mish 激活

YOLOv4 中使用 Mish 函数的原因是它的低成本和它的平滑、非单调、无上界、有下界等特点,在表 2 的对比实验结果中,和其他常用激活函数如 ReLUSwish 相比,分类器的精度更好。

Mish 激活函数是光滑的非单调激活函数,定义如下:

Mish(x)=x⋅tanh(In(1+ex))Swish(x)=x⋅sigmoid(x)Mish(x) = x\cdot tanh(In(1 + e^x)) \\\\ Swish(x) = x\cdot sigmoid(x) \\\\Mish(x)=xtanh(In(1+ex))Swish(x)=xsigmoid(x)

Mish 函数曲线图和 Swish 类似,如下图所示。

网络异常,图片无法展示
|

值得注意的是 Yolov4Backbone 中的激活函数都使用了Mish 激活,但后面的 neck + head 网络则还是使用leaky_relu 函数。

Leaky ReLU(x)={x,x>0λx,x≤0Leaky \ ReLU(x) = \begin{cases} x, & x > 0 \\\\ \lambda x, & x \leq 0 \end{cases}LeakyReLU(x)=x,λx,x>0x0

6.1.3,Dropblock

Yolov4 中使用的 Dropblock ,其实和常见网络中的 Dropout 功能类似,也是缓解过拟合的一种正则化方式。

传统 dropout 功能是随机删除减少神经元的数量,使网络变得更简单(缓解过拟合)。

6.2,Neck 网络改进

在目标检测领域中,为了更好的融合 low-levelhigh-level 特征,通常会在 backbonehead 网络之间插入一些网络层,这个中间部分称为 neck 网络,典型的有 FPN 结构。

YOLOv4neck 结构采用了 SPP 模块 和 FPN+PAN 结构。

先看看 YOLOv3neck 网络的立体图是什么样的,如下图所示。

网络异常,图片无法展示
|

FPN 是自顶向下的,将高层的特征信息经过上采样后和低层的特征信息进行传递融合,从而得到进行预测的特征图 ①②③。

再看下图 YOLOv4Neck 网络的立体图像,可以更清楚的理解 neck 是如何通过 FPN+PAN 结构进行融合的。

网络异常,图片无法展示
|

FPN 层自顶向下传达强语义特征,而特征金字塔则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行参数聚合,这种正向反向同时结合的操作确实 6 啊。

值得注意的是,Yolov3FPN 层输出的三个大小不一的特征图①②③直接进行预测。但Yolov4 输出特征图的预测是使用 FPN 层从最后的一个 76*76 特征图 ① 和而经过两次PAN 结构的特征图 ② 和 ③ 。

另外一点是,原本的 PANet 网络的 PAN 结构中,两个特征图结合是采用 shortcut + element-wise 操作,而 Yolov4 中则采用 concat(route)操作,特征图融合后的尺寸会变化。原本 PAN 和修改后的 PAN 结构对比图如下图所示。

网络异常,图片无法展示
|

6.3,预测的改进

6.3.1,使用CIoU Loss

Bounding Box RegeressionLoss 近些年的发展过程是:Smooth L1 Loss-> IoU Loss(2016)-> GIoU Loss(2019)-> DIoU Loss(2020)->CIoU Loss(2020)

6.3.2,使用DIoU_NMS

6.4,输入端改进

6.4.1,Mosaic 数据增强

YOLOv4 原创的 Mosaic 数据增强方法是基于 2019 年提出的 CutMix 数据增强方法做的优化。CutMix 只对两张图片进行拼接,而 Mosaic 更激进,采用 4 张图片,在各自随机缩放、裁剪和排布后进行拼接。

网络异常,图片无法展示
|

在目标检测器训练过程中,小目标的 AP 一般比中目标和大目标低很多。而 COCO 数据集中也包含大量的小目标,但比较麻烦的是小目标的分布并不均匀。在整体的数据集中,它们的占比并不平衡。

网络异常,图片无法展示
|

如上表所示,在 COCO 数据集中,小目标占比达到 41.4%,数量比中目标和大目标要大得多,但是在所有的训练集图片中,只有 52.3% 的图片有小目标,即小物体数量很多、但分布非常不均匀,而中目标和大目标的分布相对来说更加均匀一些。

少部分图片却包含了大量的小目标。

针对这种状况,Yolov4 的作者采用了 Mosaic 数据增强的方式。器主要有几个优点:

  • 丰富数据集:随机使用 4 张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好。
  • 减少训练所需 GPU 数量: Mosaic 增强训练时,可以直接计算 4 张图片的数据,使得 Mini-batch 大小并不需要很大,一个 GPU 就可以训练出较好的模型。

五,YOLOv5

YOLOv5 仅在 YOLOv4 发表一个月之后就公布了,这导致很多人对 YOLOv5 的命名有所质疑,因为相比于它的前代 YOLOv4,它在理论上并没有明显的差异,虽然集成了最近的很多新的创新,但是这些集成点又和 YOLOv4 类似。我个人觉得之所以出现这种命名冲突应该是发布的时候出现了 “撞车”,毕竟 YOLOv4 珠玉在前(早一个月),YOLOv5 也只能命名为 5 了。但是,我依然认为 YOLOv5YOLOv4 是不同的,至少在工程上是不同的,它的代码是用 Python(Pytorch) 写的,与 YOLOv4C代码 (基于 darknet 框架)有所不同,所以代码更简单、易懂,也更容易传播。

另外,值得一提的是,YOLOv4 中提出的关键的 Mosaic 数据增强方法,作者之一就是 YOLOv5 的作者 Glenn Jocher。同时,YOLOv5 没有发表任何论文,只是在 github 上开源了代码

5.1,网络架构

通过解析代码仓库中的 .yaml 文件中的结构代码,YOLOv5 模型可以概括为以下几个部分:

  • Backbone: Focus structure, CSP network
  • Neck: SPP block, PANet
  • Head: YOLOv3 head using GIoU-loss

5.2,创新点

5.2.1,自适应anchor

在训练模型时,YOLOv5 会自己学习数据集中的最佳 anchor boxes,而不再需要先离线运行 K-means 算法聚类得到 kanchor box 并修改 head 网络参数。总的来说,YOLOv5 流程简单且自动化了。

5.2.2, 自适应图片缩放

在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片统一缩放到一个标准尺寸,再送入检测网络中。

5.2.3,Focus结构

Focus 结构可以简单理解为将 W×HW\times HW×H 大小的输入图片 4 个像素分别取 1 个(类似于邻近下采样)形成新的图片,这样 1 个通道的输入图片会被划分成 4 个通道,每个通道对应的 WH 尺寸大小都为原来的 1/2,并将这些通道组合在一起。这样就实现了像素信息不丢失的情况下,提高通道数(通道数对计算量影响更小),减少输入图像尺寸,从而大大减少模型计算量。

以 Yolov5s 的结构为例,原始 640x640x3 的图像输入 Focus 结构,采用切片操作,先变成 320×320×12 的特征图,再经过一次 32 个卷积核的卷积操作,最终变成 320×320×32 的特征图。

网络异常,图片无法展示
|

5.3,四种网络结构

YOLOv5 通过在网络结构问价 yaml 中设置不同的 depth_multiplewidth_multiple 参数,来创建大小不同的四种 YOLOv5 模型:Yolv5s、Yolv5m、Yolv5l、Yolv5x。

5.4,实验结果

各个版本的 YOLOv5COCO 数据集上和 V100 GPU 平台上的模型精度和速度实验结果曲线如下所示。

网络异常,图片无法展示
|


参考资料

相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
模型无关的局部解释(LIME)技术原理解析及多领域应用实践
在当前数据驱动的商业环境中,人工智能(AI)和机器学习(ML)已成为各行业决策的关键工具,但随之而来的是“黑盒”问题:模型内部机制难以理解,引发信任缺失、监管合规难题及伦理考量。LIME(局部可解释模型无关解释)应运而生,通过解析复杂模型的个别预测,提供清晰、可解释的结果。LIME由华盛顿大学的研究者于2016年提出,旨在解决AI模型的透明度问题。它具有模型无关性、直观解释和局部保真度等优点,在金融、医疗等领域广泛应用。LIME不仅帮助企业提升决策透明度,还促进了模型优化和监管合规,是实现可解释AI的重要工具。
75 9
|
21天前
|
开发框架 供应链 监控
并行开发模型详解:类型、步骤及其应用解析
在现代研发环境中,企业需要在有限时间内推出高质量的产品,以满足客户不断变化的需求。传统的线性开发模式往往拖慢进度,导致资源浪费和延迟交付。并行开发模型通过允许多个开发阶段同时进行,极大提高了产品开发的效率和响应能力。本文将深入解析并行开发模型,涵盖其类型、步骤及如何通过辅助工具优化团队协作和管理工作流。
52 3
|
1月前
|
机器学习/深度学习 搜索推荐 大数据
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
【10月更文挑战第2天】在处理大规模数据集的推荐系统项目时,提高检索模型的召回率成为关键挑战。本文分享了通过改进特征工程(如加入用户活跃时段和物品相似度)和优化模型结构(引入注意力机制)来提升召回率的具体策略与实现代码。严格的A/B测试验证了新模型的有效性,为改善用户体验奠定了基础。这次实践加深了对特征工程与模型优化的理解,并为未来的技术探索提供了方向。
80 2
深度解析:如何通过精妙的特征工程与创新模型结构大幅提升推荐系统中的召回率,带你一步步攻克大数据检索难题
|
14天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
12 1
|
23天前
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
197 3
|
2天前
|
安全 测试技术 Go
Go语言中的并发编程模型解析####
在当今的软件开发领域,高效的并发处理能力是提升系统性能的关键。本文深入探讨了Go语言独特的并发编程模型——goroutines和channels,通过实例解析其工作原理、优势及最佳实践,旨在为开发者提供实用的Go语言并发编程指南。 ####
|
2月前
|
机器学习/深度学习 存储 人工智能
让模型评估模型:构建双代理RAG评估系统的步骤解析
在当前大语言模型(LLM)应用开发中,评估模型输出的准确性成为关键问题。本文介绍了一个基于双代理的RAG(检索增强生成)评估系统,使用生成代理和反馈代理对输出进行评估。文中详细描述了系统的构建过程,并展示了基于四种提示工程技术(ReAct、思维链、自一致性和角色提示)的不同结果。实验结果显示,ReAct和思维链技术表现相似,自一致性技术则呈现相反结果,角色提示技术最为不稳定。研究强调了多角度评估的重要性,并提供了系统实现的详细代码。
56 10
让模型评估模型:构建双代理RAG评估系统的步骤解析
|
2月前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
280 1
|
3月前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
71 0
|
3月前
|
Apache 开发者 Java
Apache Wicket揭秘:如何巧妙利用模型与表单机制,实现Web应用高效开发?
【8月更文挑战第31天】本文深入探讨了Apache Wicket的模型与表单处理机制。Wicket作为一个组件化的Java Web框架,提供了多种模型实现,如CompoundPropertyModel等,充当组件与数据间的桥梁。文章通过示例介绍了模型创建及使用方法,并详细讲解了表单组件、提交处理及验证机制,帮助开发者更好地理解如何利用Wicket构建高效、易维护的Web应用程序。
43 0

推荐镜像

更多