摘要
本文从整体结构、基础模块、特征提取、特征融合和检测输出五个角度梳理 YOLOv7。内容重点解释 CBS、ELAN/E-ELAN、MP、UP、SPPCSPC、RepConv/RepConvN 等模块,并补充 YOLOv7 的模型缩放、辅助检测头、主检测头和动态标签分配机制。
说明:本文是基于结构图和论文整理的学习笔记。图中出现的 ELAN-H、ELAN-W、MP1、MP2 等名称可能是绘图时的简写,正式术语以 YOLOv7 原论文和官方实现为准。
目录
- 1. YOLOv7 的整体思路
- 2. 基础模块解析
- 3. Backbone:主干特征提取
- 4. Neck 与 Head:特征融合和检测输出
- 5. YOLOv7 的训练改进
- 6. 推理流程
- 7. 总结
- 8. 参考资料
1. YOLOv7 的整体思路
YOLOv7 是单阶段目标检测器。它将输入图片一次性送入网络,通过 Backbone 提取特征,再通过 Neck 融合不同尺度的特征,最后由 Head 输出多个尺度的预测结果。
下图按照笔记中的 640×640 输入进行示意。实际的空间尺寸、通道数和输出层数量会随模型规模、输入尺寸和数据集类别数变化。
图 1:YOLOv7 的 Backbone、Neck 和 Head 结构示意。
对于一个检测尺度,设网格尺寸为 N×N、Anchor 数为 A、类别数为 C,则每个网格的输出维度通常为:
其中 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 三个操作的组合:
SiLU 的定义为:
结构图中的“卷积核大小,步长”不应读成 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 自动产生的结果。
2.2 ELAN 与 E-ELAN
ELAN 通过设计不同长度的梯度传播路径,让网络在加深时仍然能够有效学习。理解 ELAN 时,可以从以下三点入手:
- 输入特征被分到不同分支;
- 不同分支经过不同数量的 CBS;
- 中间特征和末端特征通过 concat 融合,再由过渡层调整通道数。
图中 C、C/2、2C 等符号表示不同位置的通道数。它们由各个卷积层的输出通道配置决定,不能简单根据步长推断。
YOLOv7 论文进一步提出 E-ELAN。E-ELAN 在保持原有梯度路径设计的基础上,引入 expand、shuffle 和 merge cardinality,通过分组卷积和特征重组增强不同特征组的表达能力。
原图中标记为 ELAN-H 或 ELAN-W 的模块,建议在正式文章中注明“按图示命名”,不要直接当作 YOLOv7 论文的正式模块名称。
2.3 MP 下采样模块
MP 模块通过多条分支完成下采样和特征融合。常见分支包括:
- 先使用 MaxPool,再使用 1×1 卷积调整通道;
- 先使用 1×1 卷积调整通道,再使用 stride=2 的 3×3 卷积下采样;
- 最后通过 concat 融合分支结果。
与其使用“超级下采样”这种不够明确的说法,不如直接说明它同时完成了空间尺寸缩小和多分支特征融合。图中的 MP1、MP2 属于结构图中的阶段命名,具体配置应以对应模型配置文件为准。
2.4 UP 上采样模块
UP 模块通常由 1×1 卷积和上采样操作组成:
- 通过 1×1 卷积调整通道数;
- 通过上采样扩大特征图空间尺寸;
- 与 Backbone 中较早阶段的特征进行 concat。
结构图中使用的是最近邻插值。最近邻插值本身没有可学习参数,作用是改变特征图的空间分辨率。
2.5 SPPCSPC
SPPCSPC 可以看作 SPP 和 CSP 思路的组合:
- SPP 分支使用不同大小的池化操作获得不同感受野;
- CSP 思路将特征分成不同路径,减少重复计算并保留梯度信息;
- 多条分支最终通过 concat 融合。
感受野表示特征图上的一个位置能够利用原图多大范围的信息。随着网络下采样,特征图分辨率降低,单个位置通常对应更大的输入区域,因此更适合建模大目标和上下文信息。
需要注意,SPPCSPC 的输出通道数是否减半取决于卷积层配置,并不是 SPP 或 CSP 固定带来的结果。
2.6 RepConv 与 RepConvN
RepConv 的核心思想是训练阶段使用多分支,推理阶段将分支等价融合成一个卷积层:
- 训练阶段:3×3 卷积分支、1×1 卷积分支和 identity 分支共同优化;
- 部署阶段:将卷积、BN 和 identity 分支的参数融合为一个等价的 3×3 卷积;
- 推理时只保留融合后的结构,从而降低推理分支数量。
YOLOv7 进一步使用 planned re-parameterized convolution。对于已经存在残差连接或 concat 的位置,直接再加入 identity 分支可能破坏原有的梯度路径,因此会使用不带 identity 分支的 RepConvN。
3. Backbone:主干特征提取
Backbone 的主要任务是逐步降低特征图分辨率,同时提升语义表达能力。YOLOv7 的主干部分由 CBS、ELAN/E-ELAN 和 MP 等模块组成。
阅读 Backbone 结构图时,建议按照下面的顺序:
- 查看输入尺寸和每次下采样的位置;
- 记录每个阶段的空间尺寸和通道数;
- 观察 ELAN/E-ELAN 如何复用不同深度的特征;
- 找出送往 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) |
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 的推理过程可以概括为:
- 对输入图片进行缩放和填充,得到模型要求的输入尺寸;
- 经过 Backbone 提取多层特征;
- 经过 Neck 融合多尺度信息;
- Head 输出三个尺度的预测张量;
- 根据网格位置、Anchor 和回归参数解码边界框;
- 过滤低置信度结果;
- 使用 NMS 去除高度重叠的重复框;
- 将坐标映射回原始图片。
训练阶段的多分支结构与推理阶段的部署结构可能不同,这是理解 RepConv、辅助检测头和模型重参数化的关键。
7. 总结
理解 YOLOv7 可以抓住四条主线:
- Backbone 负责提取不同层级的图像特征;
- ELAN/E-ELAN 负责改善特征提取和梯度传播;
- Neck 和 Head 负责多尺度特征融合与预测;
- 重参数化、辅助检测头和动态标签分配负责提升训练效果与部署效率。