YOLOv7:Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors

YOLOv7通过扩展高效聚合网络(E-ELAN)、一致性的模型缩放策略、模型重参数化和动态标签分配,实现更高的精度

什么是 YOLOv7?

  • YOLOv7-20230408142002
  • YOLOv7 是 YOLO 系列新一代的实时目标检测算法,通过扩展高效聚合网络(E-ELAN)、一致性的模型缩放策略、模型重参数化和动态标签分配,实现更高的精度
  • YOLOv7仍然是一种anchor base的目标检测算法、采用多head检测、动态样本分配

YOLOv7的网络结构?

  • YOLOv7 由 2 个部分组成,backbone 和 head,其中 head 包含 neck 部分
  • 输入640x640 的图片,得到 3 层不同 size 的特征,然后经过 RepVGG block 和 conv,最后输出目标的类别、置信度和边框进行
  • YOLOv7 采用 3 个检测 head,每个网格使用 3 种 anchor

YOLOv7网络结构的backbone部分?

  • CBS: 主要是由 Conv+BN+SiLU,颜色表示卷积使用不同的 size、stride
  • ELAN: 由多个 CBS 组成,其输入输出特征大小保持不变,通道数在开始的两个 CBS 会有变化,后面的几个输入通道都是和输出通道保持一致的,经过最后一个 CBS 输出为需要的通道
  • MP: 主要是分为 Maxpool 和 CBS , 其中 MP1 和 MP2 主要是通道数的比变化

YOLOv7网络结构的head部分?

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

YOLOv7的一致性的模型缩放策略?

  • YOLOv7-20230408142005-1
  • 模型缩放是一种放大或缩小己经设计好的模型,使其适合不同的计算设备的方法
  • 模型缩放法通常使用不同的缩放因子,如分辨率(输入图像的大小)、深度(层数)、宽度(通道数)和阶段(特征金字塔的数量),从而在网络参数的数量、计算量、推理速度和精度方面达到良好的权衡
  • 目前几乎所有的模型缩放方法都是独立分析单个缩放因子的,甚至复合缩放类别中的方法也是独立优化缩放因子的,当这些模型的深度被缩放时,将改变某些层的输入宽度。对于基于级联的模型,不能单独分析每个比例因子,必须一起考虑。以按比例放大深度为例,这样的操作将导致过渡层的输入通道和输出通道之间的比率变化,这可能会导致模型的硬件使用量减少
  • 当我们缩放计算块的深度因子时,还必须计算该块的输出通道的变化。然后,我们将对过渡层执行相同变化量的宽度因子缩放

YOLOv7的扩展高效聚合网络(E-ELAN)?

  • YOLOv7-20230408142006

  • 图 (b) 中 CSPVoVNet 的设计是 VoVNet 的一种变体。CSPVoVNet 的架构除了考虑上述基本设计问题外,还分析了梯度路径,以使不同层的权重能够学习到更多样化的特征。上述梯度分析方法使推理更快、更准确

  • 图 © 中的 ELAN 考虑了以下设计策略——“如何设计一个高效的网络?”。他们得出了一个结论:通过控制最短最长的梯度路径,更深的网络可以有效地学习和收敛

  • E-ELAN 对基数 (Cardinality) 做了扩展 (Expand)、乱序 (Shuffle)、合并 (Merge cardinality),能在不破坏原始梯度路径的情况下,提高网络的学习能力。使用组卷积来扩展计算块的通道和基数。将对计算层的所有计算块应用相同的组参数和通道乘数。然后,每个计算块计算出的特征图会根据设置的组参数 g 被打乱成 g 个组,然后将它们连接在一起。此时,每组特征图的通道数将与原始架构中的通道数相同。最后,添加 g 组特征图来执行合并基数

YOLOv7的模型重参数化方法?

  • YOLOv7-20230408142006-1
  • 块级重参数化在训练期间将模块拆分为多个相同或不同的模块分支,在推理期间将多个分支模块集成为完全等效的模块
  • YOLOv7 发现 RepConv 中的 id 连接破坏了 ResNet 中的残差和 DenseNet中的连接,因此当具有残差或级联的卷积层被重参数化的卷积代替时,应该不使用 indentity 连接

YOLOv7的样本匹配方法?

  • YOLOv7正负样本匹配前一部分与yolov5的一样后面加了simOTA来精确筛选

YOLOv7的损失函数?

  • YOLOv5一样的损失函数

什么是SPPCSPC?

  • YOLOv7中使用的SPP结构,在COCO数据集上表现优于SPPF
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class SPPCSPC(nn.Module):
    # CSP https://github.com/WongKinYiu/CrossStagePartialNetworks
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5, k=(5, 9, 13)):
    super(SPPCSPC, self).__init__()
    c_ = int(2 * c2 * e) # hidden channels
    self.cv1 = Conv(c1, c_, 1, 1)
    self.cv2 = Conv(c1, c_, 1, 1)
    self.cv3 = Conv(c_, c_, 3, 1)
    self.cv4 = Conv(c_, c_, 1, 1)
    self.m = nn.ModuleListnn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k])
    self.cv5 = Conv(4 * c_, c_, 1, 1)
    self.cv6 = Conv(c_, c_, 3, 1)
    self.cv7 = Conv(2 * c_, c2, 1, 1)

    def forward(self, x):
    x1 = self.cv4(self.cv3(self.cv1(x)))
    y1 = self.cv6(self.cv5(torch.catx1] +m(x1) for m in self.m], 1)))
    y2 = self.cv2(x)
    return self.cv7(torch.cat((y1, y2), dim=1))