YOLOV7是什么

YOLO算法作为one-stage目标检测算法最典型的代表,其基于深度神经网络进行对象的识别和定位,运行速度很快,可以用于实时系统。
YOLOV7是目前YOLO系列最先进的算法,在准确率和速度上超越了以往的YOLO系列。
了解YOLO是对目标检测算法研究的一个必须步骤。

网络框架

架构图总览

CBS模块解读

  • 对于CBS模块,我们可以看从图中可以看出它是由一个Conv层,也就是卷积层,一个BN层,也就是Batch normalization层,还有一个Silu层,这是一个激活函数。

  • silu激活函数是swish激活函数的变体,两者的公式如下所示

  • $$
    silu(x)=x⋅sigmoid(x)
    $$

  • $$
    swish(x)=x⋅sigmoid(βx)
    $$

  • 从架构图中我们可以看出,CBS模块这里有三种颜色,三种颜色代表它们的卷积核(k)和步长(s)不同。

  • 首先最浅的颜色,也就是第一个CBS模块的颜色,它是一个1x1的卷积,stride(步长为1)。

  • 其次稍浅的颜色,也就是第二个CBS模块的颜色,它是一个3x3的卷积,stride(步长为1)。

  • 最后最深的颜色,也就是第三个CBS模块的颜色,它是一个3x3的卷积,stride(步长为2)。

  • 1x1的卷积主要用来改变通道数。

  • 3x3的卷积,步长为1,主要用来特征提取

  • 3x3的卷积,步长为2,主要用来下采样。

CBW模块解读

  • CBW模块和CBS模块,我们可以看出来是基本一致的。
  • 由一个Conv层,也就是卷积层,一个BN层,也就是Batch normalization层,还有一个sigmoid层,这是一个激活函数。
  • 卷积核为1x1,stride(步长为1)

REP模块解读

  • REP模块分为两个,一个是train,也就是训练,一个deploy,也就是推理。
  • 训练模块,它有三个分支。
    最上面的分支是3x3的卷积,用于特征提取。
    中间的分支是1x1的卷积,用于平滑特征。
    最后分支是一个Identity,不做卷积操作,直接移过来。

    最后把它们相加在一起。
  • 推理模块,包含一个3x3的卷积,stride(步长为1)。是由训练模块重参数化转换而来。
    在训练模块中,因为第一层是一个3x3的卷积,第二层是一个1x1的卷积,最后层是一个Identity。
    在模型从参数化的时候,需要把1x1的卷积啊,转换成3x3的卷积,把Identity也转换成3x3的卷积,然后进行一个矩阵的一个加法,也就是一个矩阵融合过程。
    然后最后将它的权重进行相加,就得到了一个3x3的卷积,也就是说,这三个分支就融合成了一条线,里面只有一个3x3的卷积。
    它们的权重是三个分支的叠加结果,矩阵,也是三个分支的叠加结果。

MP模块解读

  • MP模块有两个分支,作用是进行下采样。
  • 第一条分支先经过一个maxpool,也就是最大池化。最大值化的作用就是下采样,然后再经过一个1x1的卷积进行通道数的改变。
  • 第二条分支先经过一个1x1的卷积,做通道数的变化,然后再经过一个3x3卷积核、步长为2的卷积块,这个卷积块也是用来下采样的。
  • 最后把第一个分支和第二分支的结果加在一起,得到了超级下采样的结果。

ELAN模块解读

  • ELAN模块是一个高效的网络结构,它通过控制最短和最长的梯度路径,使网络能够学习到更多的特征,并且具有更强的鲁棒性。
  • ELAN有两条分支。
  • 第一条分支是经过一个1x1的卷积做通道数的变化。
  • 第二条分支就比较复杂了。它先首先经过一个1x1的卷积模块,做通道数的变化。然后再经过四个3x3的卷积模块,做特征提取。
    如图所示,最后把四个特征叠加在一起得到最后的特征提取结果。

ELAN-W模块解读

  • 对于ELAN-W模块,我们也看到它跟ELAN模块是非常的相似,所略有不同的就是它在第二条分支的时候选取的输出数量不同。
  • ELAN模块选取了三个输出进行最后的相加。
  • ELAN-W模块选取了五个进行相加。

UPSample模块解读

  • UPSample模块是一个上采样的模块,它使用的上采样方式是最近邻插值

SPPCSPC模块解读

  • SPP的作用是能够增大感受野,使得算法适应不同的分辨率图像,它是通过最大池化来获得不同感受野。

    我们可以看到在第一条分支中,经理了maxpool的有四条分支。分别是5,9,13,1,这四个不同的maxpool就代表着他能够处理不同的对象。
    也就是说,它这四个不同尺度的最大池化有四种感受野,用来区别于大目标和小目标。
    比如一张照片中的狗和行人以及车,他们的尺度是不一样的,通过不同的maxpool,这样子就能够更好的区别小目标和大目标。

  • CSP模块,首先将特征分为两部分,其中的一个部分进行常规的处理,另外一个部分进行SPP结构的处理,最后把这两个部分合并在一起,这样子就能够减少一半的计算量,使得速度变得快,精度反而会提升。

Backbone

  • 结构如图

  • 总共有 50 层, 我在上图用黑色数字把关键层数标示出来了。
    首先是经过 4 层卷积层,如下图,CBS 主要是 Conv + BN + SiLU 构成,我在图中用不同的颜色表示不同的 size 和 stride, 如 (3, 2) 表示卷积核大小为 3 ,步长为 2。 在 config 中的配置如图。

  • 经过 4个 CBS 后,特征图变为 160 * 160 * 128 大小。随后会经过论文中提出的 ELAN 模块,ELAN 由多个 CBS 构成,其输入输出特征大小保持不变,通道数在开始的两个 CBS 会有变化, 后面的几个输入通道都是和输出通道保持一致的,经过最后一个 CBS 输出为需要的通道。

  • MP 层 主要是分为 Maxpool 和 CBS , 其中 MP1 和 MP2 主要是通道数的比变化。

  • backbone的基本组件就介绍完了,我们整体来看下 backbone,经过 4 个 CBS 后,接入例如一个 ELAN ,然后后面就是三个 MP + ELAN 的输出,对应的就是 C3/C4/C5 的输出,大小分别为 80 * 80 * 512 , 40 * 40 * 1024, 20 * 20 * 1024。 每一个 MP 由 5 层, ELAN 有 8 层, 所以整个 backbone 的层数为 4 + 8 + 13 * 3 = 51 层, 从 0 开始的话,最后一层就是第 50 层。

  • YOLOV7 head 其实就是一个 pafpn 的结构,和之前的YOLOV4,YOLOV5 一样。首先,对于 backbone 最后输出的 32 倍降采样特征图 C5,然后经过 SPPCSP,通道数从1024变为512。先按照 top down 和 C4、C3融合,得到 P3、P4 和 P5;再按 bottom-up 去和 P4、P5 做融合。

  • 这里基本和 YOLOV5 是一样的,区别在于将 YOLOV5 中的 CSP 模块换成了 ELAN-H 模块, 同时下采样变为了 MP2 层。 ELAN-H 模块是我自己命名的,它和 backbone 中的 ELAN 稍微有点区别就是 cat 的数量不同。

  • 至于 E-ELAN 论文中说到是在 YOLOV7-E6eE中用到, 但是我在看代码的时候,有点没太明白是怎么做 shuffle 的,这里等我弄明白了再补上来。

  • 对于 pafpn 输出的 P3、P4 和 P5 , 经过 RepConv 调整通道数,最后使用 1x1 卷积去预测 objectness、class 和 bbox 三部分。
    RepConv 在训练和推理是有一定的区别。训练时有三个分支的相加输出,部署时会将分支的参数重参数化到主分支上。