YOLOv7原理解析

2 阅读9分钟

摘要

本文从整体结构、基础模块、特征提取、特征融合和检测输出五个角度梳理 YOLOv7。内容重点解释 CBS、ELAN/E-ELAN、MP、UP、SPPCSPC、RepConv/RepConvN 等模块,并补充 YOLOv7 的模型缩放、辅助检测头、主检测头和动态标签分配机制。

说明:本文是基于结构图和论文整理的学习笔记。图中出现的 ELAN-H、ELAN-W、MP1、MP2 等名称可能是绘图时的简写,正式术语以 YOLOv7 原论文和官方实现为准。

目录


1. YOLOv7 的整体思路

YOLOv7 是单阶段目标检测器。它将输入图片一次性送入网络,通过 Backbone 提取特征,再通过 Neck 融合不同尺度的特征,最后由 Head 输出多个尺度的预测结果。

下图按照笔记中的 640×640 输入进行示意。实际的空间尺寸、通道数和输出层数量会随模型规模、输入尺寸和数据集类别数变化。

YOLOv7 整体结构示意图

图 1:YOLOv7 的 Backbone、Neck 和 Head 结构示意。

对于一个检测尺度,设网格尺寸为 N×N、Anchor 数为 A、类别数为 C,则每个网格的输出维度通常为:

N×N×A×(C+5)N \times N \times A \times (C+5)

其中 C+5 包含:

  • 4 个边界框参数:tx、ty、tw、th;
  • 1 个目标置信度 objectness;
  • C 个类别预测值。

图中使用了 3 个 Anchor。当数据集有 80 个类别时,每个网格对应的通道数为 3×(80+5)=255。

2. 基础模块解析

2.1 CBS

CBS 可以理解为 Conv、BN 和 SiLU 三个操作的组合:

CBS(x)=SiLU(BN(Conv(x)))\mathrm{CBS}(x)=\mathrm{SiLU}(\mathrm{BN}(\mathrm{Conv}(x)))

SiLU 的定义为:

SiLU(x)=xSigmoid(x)\mathrm{SiLU}(x)=x\cdot\mathrm{Sigmoid}(x)

结构图中的“卷积核大小,步长”不应读成 3×1 或 3×2 卷积。例如:

图中标记含义主要作用
(1,1)1×1 卷积,stride=1调整通道数
(3,1)3×3 卷积,stride=1特征提取,不改变空间尺寸
(3,2)3×3 卷积,stride=2下采样,同时提取特征

需要区分三个概念:卷积核大小影响感受野,stride 影响空间尺寸,输出通道数决定通道维度是否变化。C/2 是卷积层设置的输出通道数,并不是 stride=1 自动产生的结果。

CBS 模块和卷积参数说明

不同 CBS 的结构示意

2.2 ELAN 与 E-ELAN

ELAN 通过设计不同长度的梯度传播路径,让网络在加深时仍然能够有效学习。理解 ELAN 时,可以从以下三点入手:

  1. 输入特征被分到不同分支;
  2. 不同分支经过不同数量的 CBS;
  3. 中间特征和末端特征通过 concat 融合,再由过渡层调整通道数。

图中 C、C/2、2C 等符号表示不同位置的通道数。它们由各个卷积层的输出通道配置决定,不能简单根据步长推断。

ELAN 模块结构示意

YOLOv7 论文进一步提出 E-ELAN。E-ELAN 在保持原有梯度路径设计的基础上,引入 expand、shuffle 和 merge cardinality,通过分组卷积和特征重组增强不同特征组的表达能力。

原图中标记为 ELAN-H 或 ELAN-W 的模块,建议在正式文章中注明“按图示命名”,不要直接当作 YOLOv7 论文的正式模块名称。

E-ELAN 相关结构示意

2.3 MP 下采样模块

MP 模块通过多条分支完成下采样和特征融合。常见分支包括:

  • 先使用 MaxPool,再使用 1×1 卷积调整通道;
  • 先使用 1×1 卷积调整通道,再使用 stride=2 的 3×3 卷积下采样;
  • 最后通过 concat 融合分支结果。

与其使用“超级下采样”这种不够明确的说法,不如直接说明它同时完成了空间尺寸缩小和多分支特征融合。图中的 MP1、MP2 属于结构图中的阶段命名,具体配置应以对应模型配置文件为准。

MP 下采样模块示意

2.4 UP 上采样模块

UP 模块通常由 1×1 卷积和上采样操作组成:

  1. 通过 1×1 卷积调整通道数;
  2. 通过上采样扩大特征图空间尺寸;
  3. 与 Backbone 中较早阶段的特征进行 concat。

结构图中使用的是最近邻插值。最近邻插值本身没有可学习参数,作用是改变特征图的空间分辨率。

UP 上采样模块示意

2.5 SPPCSPC

SPPCSPC 可以看作 SPP 和 CSP 思路的组合:

  • SPP 分支使用不同大小的池化操作获得不同感受野;
  • CSP 思路将特征分成不同路径,减少重复计算并保留梯度信息;
  • 多条分支最终通过 concat 融合。

感受野表示特征图上的一个位置能够利用原图多大范围的信息。随着网络下采样,特征图分辨率降低,单个位置通常对应更大的输入区域,因此更适合建模大目标和上下文信息。

需要注意,SPPCSPC 的输出通道数是否减半取决于卷积层配置,并不是 SPP 或 CSP 固定带来的结果。

SPPCSPC 模块示意

感受野示意

2.6 RepConv 与 RepConvN

RepConv 的核心思想是训练阶段使用多分支,推理阶段将分支等价融合成一个卷积层:

  • 训练阶段:3×3 卷积分支、1×1 卷积分支和 identity 分支共同优化;
  • 部署阶段:将卷积、BN 和 identity 分支的参数融合为一个等价的 3×3 卷积;
  • 推理时只保留融合后的结构,从而降低推理分支数量。

YOLOv7 进一步使用 planned re-parameterized convolution。对于已经存在残差连接或 concat 的位置,直接再加入 identity 分支可能破坏原有的梯度路径,因此会使用不带 identity 分支的 RepConvN。

RepConv 训练结构和部署结构示意

3. Backbone:主干特征提取

Backbone 的主要任务是逐步降低特征图分辨率,同时提升语义表达能力。YOLOv7 的主干部分由 CBS、ELAN/E-ELAN 和 MP 等模块组成。

YOLOv7 Backbone 结构示意

阅读 Backbone 结构图时,建议按照下面的顺序:

  1. 查看输入尺寸和每次下采样的位置;
  2. 记录每个阶段的空间尺寸和通道数;
  3. 观察 ELAN/E-ELAN 如何复用不同深度的特征;
  4. 找出送往 Neck 的多尺度特征。

图中以 640×640 输入为例展示了 160×160、80×80、40×40 和 20×20 等不同分辨率。具体通道数会随 YOLOv7、YOLOv7-X、YOLOv7-tiny 等模型配置变化,因此不应把图中的某一组数字当成所有 YOLOv7 变体的固定结构。

4. Neck 与 Head:特征融合和检测输出

Neck 位于 Backbone 和 Head 之间,主要通过上采样、下采样、concat 和卷积操作融合不同层级的特征:

  • 高分辨率特征包含更多细节,适合小目标;
  • 低分辨率特征包含更强语义信息,适合大目标;
  • 多尺度融合可以同时利用细节和语义。

Head 在三个尺度上输出检测结果。以 640×640 输入、3 个 Anchor 为例,常见的空间尺寸为 20×20、40×40 和 80×80。若类别数为 C,则三个输出层的通道数分别为:

特征图适合目标输出张量
20×20大目标20×20×3×(C+5)
40×40中目标40×40×3×(C+5)
80×80小目标80×80×3×(C+5)

YOLOv7 Head 结构示意

5. YOLOv7 的训练改进

5.1 E-ELAN

通过 expand、shuffle、merge cardinality 增强不同特征组的表达能力,同时尽量保持原有梯度路径。

5.2 模型缩放

对于基于 concat 的网络,仅单独增加深度可能改变后续过渡层的输入通道。YOLOv7 会联合考虑计算块深度和过渡层宽度,以获得更合理的模型缩放结果。

5.3 辅助检测头和主检测头

YOLOv7 将最终负责输出的检测头称为 lead head,将训练时辅助优化的检测头称为 auxiliary head。辅助检测头主要帮助网络获得更充分的深层监督,推理时不必保留。

5.4 Coarse-to-fine 标签分配

YOLOv7 使用主检测头的预测结果与 Ground Truth 共同生成软标签,并为 auxiliary head 和 lead head 分配不同粒度的监督信号。这样可以让辅助检测头更关注召回率,同时让主检测头学习更精确的结果。

5.5 其他训练技巧

论文还讨论了 Conv-BN 融合、隐式知识和 EMA 等训练或部署相关技巧。它们的共同目标是在不明显增加推理成本的情况下提升检测效果。

6. 推理流程

YOLOv7 的推理过程可以概括为:

  1. 对输入图片进行缩放和填充,得到模型要求的输入尺寸;
  2. 经过 Backbone 提取多层特征;
  3. 经过 Neck 融合多尺度信息;
  4. Head 输出三个尺度的预测张量;
  5. 根据网格位置、Anchor 和回归参数解码边界框;
  6. 过滤低置信度结果;
  7. 使用 NMS 去除高度重叠的重复框;
  8. 将坐标映射回原始图片。

训练阶段的多分支结构与推理阶段的部署结构可能不同,这是理解 RepConv、辅助检测头和模型重参数化的关键。

7. 总结

理解 YOLOv7 可以抓住四条主线:

  1. Backbone 负责提取不同层级的图像特征;
  2. ELAN/E-ELAN 负责改善特征提取和梯度传播;
  3. Neck 和 Head 负责多尺度特征融合与预测;
  4. 重参数化、辅助检测头和动态标签分配负责提升训练效果与部署效率。

8. 参考资料