Yolo系列算法学习笔记——YoloV7知识点梳理与总结
回到目录:[算法学习笔记系列索引]
目录
一、核心思想:算法创新的回归
二、整体网络架构
三、基础模块详解
3.1 CBS模块(基础卷积单元)
3.2 MP模块(下采样模块)
四、核心创新模块详解
4.1 E-ELAN(扩展高效层聚合网络)⭐⭐⭐
4.1.1 设计动机
4.1.2 E-ELAN 三步计算过程
4.1.3 完整计算示例(代入具体数值)
4.1.4 E-ELAN 的关键特性
4.2 SPPCSPC模块(空间金字塔池化-跨阶段部分连接)⭐⭐
4.2.1 传统SPP vs. SPPCSPC
4.2.2 SPPCSPC 的结构与计算
4.2.3 SPPCSPC 池化计算示例(保持空间尺寸不变)
4.3 RepConv(重参数化卷积)⭐⭐
4.3.1 训练时的多分支结构
4.3.2 推理时的单路结构(重参数化)
4.3.3 RepConvN(无恒等连接的版本)
五、训练策略详解
5.1 带辅助头的训练(Auxiliary Head Training)⭐⭐⭐
5.1.1 核心思想
5.1.2 为什么辅助头有效?
5.1.3 辅助头的位置
5.1.4 辅助头 vs. 主头
5.2 动态标签分配策略
5.3 基于拼接的模型缩放
六、损失函数
6.1 分类损失 ( L_{\text{cls}} )
6.2 置信度损失 ( L_{\text{obj}} )
6.3 定位损失 ( L_{\text{CIoU}} )
七、检测头:IDetect + ImplicitA / ImplicitM
八、YOLOv4 vs. YOLOv7 核心对比总结
九、用户总结
一、核心思想:算法创新的回归
YOLOv7 由 YOLOv4 的原班人马(Alexey Bochkovskiy 等)在 2022 年提出。如果说 YOLOv5 是“工程化”的巅峰、YOLOv6 是“硬件优化”的极致,那 YOLOv7 就是一次对“算法创新”的强势回归。
YOLOv7 的核心贡献可以概括为三大创新支柱 + 一个核心哲学:
① E-ELAN(扩展高效层聚合网络):一种全新的网络架构,通过expand、shuffle、merge cardinality三步操作,在不破坏原始梯度路径的前提下增强网络学习能力;
② 模型重参数化(RepConv):将 RepVGG 的“训练多分支、推理单路”思想引入检测框架;
③ 带辅助头的训练(Auxiliary Head Training):一种仅训练时生效的多头监督机制,增加训练成本但不影响推理速度。
核心哲学:YOLOv7 引入的优化被称为“Trainable bag-of-freebies”——这些方法会增加训练成本,但不会增加推理成本。
二、整体网络架构
YOLOv7 的整体架构由Backbone(主干网络)→ Neck(颈部网络)→ Head(检测头)三部分组成。
flowchart TD Input["Input (640×640×3)"] --> Backbone subgraph Backbone["Backbone:CBS+E-ELAN+MP-1"] direction LR B1["CBS 模块 (Conv + BN + SiLU)<br>—— 基础卷积单元"] B2["E-ELAN 模块<br>—— 扩展高效层聚合网络(核心创新)"] B3["MP-1 模块<br>—— 下采样模块"] B4["输出三尺度特征图<br>P3 (80×80), P4 (40×40), P5 (20×20)"] B1 --> B2 --> B3 --> B4 end Backbone --> Neck subgraph Neck["Neck:SPPCSPC + PANet"] direction LR N1["SPPCSPC 模块<br>—— SPP + CSP 的融合体"] N2["ELAN-W 模块<br>—— Neck中的E-ELAN变体"] N3["MP-2 模块<br>—— 下采样模块(Neck专用)"] N4["PANet 结构<br>—— 自顶向下 + 自底向上双向融合"] N1 --> N2 --> N3 --> N4 end Neck --> Head subgraph Head["Head:IDetect+RepConv+辅助头训练"] direction LR H1["RepConv 模块<br>—— 训练多分支 / 推理单路 3×3 卷积"] H2["IDetect 模块<br>—— 含 ImplicitA / ImplicitM 的改进检测头"] H3["辅助头 (Auxiliary Head)<br>—— 仅训练时存在"] H4["主头 (Lead Head)<br>—— 最终输出"] H1 --> H2 --> H3 --> H4 end Head --> Output["Output: 三个尺度 (80×80, 40×40, 20×20) 的检测结果"]三、基础模块详解
3.1 CBS模块(基础卷积单元)
CBS是 YOLOv7 中最基础的模块,由Conv + BN + SiLU三部分组成。
| 组件 | 说明 |
|---|---|
| Conv(卷积层) | 特征提取或通道变换 |
| BN(批归一化) | 加速收敛,稳定训练 |
| SiLU(激活函数) | ( f(x) = x \cdot \sigma(x) ),即 ( x \cdot \text{sigmoid}(x) ) |
三种变体:
| 变体 | 卷积核 | 步长 | 作用 |
|---|---|---|---|
| CBS-1 | 1×1 | 1 | 改变通道数(升维/降维) |
| CBS-2 | 3×3 | 1 | 特征提取(保持空间尺寸) |
| CBS-3 | 3×3 | 2 | 下采样(空间尺寸减半) |
3.2 MP模块(下采样模块)
MP(MaxPooling)模块是 YOLOv7 中负责下采样的模块。
MP-1(Backbone中使用):
- 分支1:MaxPool(k=2, s=2)→ CBS(1×1卷积)
- 分支2:CBS(1×1卷积,s=2)
- 合并:两个分支在通道维度上拼接(Concat)
MP-2(Neck中使用):
- 结构与 MP-1 类似,但 CBS 模块的输入输出通道数配置不同
计算示例(MP-1,输入 ( 320 \times 320 \times 128 )):
| 步骤 | 操作 | 尺寸变化 |
|---|---|---|
| 输入 | - | ( (320, 320, 128) ) |
| 分支1 | MaxPool(k=2,s=2) → CBS(1×1) | ( (160, 160, 128) ) |
| 分支2 | CBS(1×1, s=2) | ( (160, 160, 128) ) |
| 合并 | Concat(通道拼接) | ( (160, 160, 256) ) |
本质:两条路径并行下采样,拼接后通道数翻倍,既保留了池化的位置不变性,又引入了卷积的可学习性。
四、核心创新模块详解
4.1 E-ELAN(扩展高效层聚合网络)⭐⭐⭐
E-ELAN 是 YOLOv7最核心的架构创新。它在不破坏原有梯度路径的前提下,通过expand(扩展)、shuffle(打乱)、merge(合并)三步操作增强网络学习能力。
4.1.1 设计动机
ELAN 模块通过堆叠密集的残差结构来提升网络深度。但当网络继续加深时,会出现性能退化。E-ELAN 通过控制梯度路径的最短和最长长度,让网络在加深的同时保持快速收敛。
4.1.2 E-ELAN 三步计算过程
假设:输入特征图尺寸为 ( (H, W, 256) ),组参数 ( g = 4 ),输出通道数 ( C_{out} = 512 )。
步骤1:Expand(扩展基数)
输入特征图首先经过 1×1 卷积,将通道数扩展为 ( C_{out} \times g = 512 \times 4 = 2048 )。然后使用分组卷积,将特征图在通道维度上拆分成 ( g=4 ) 个独立的组,每组包含 512 个通道。
数学表达:
\text{Input}: (H, W, 256) \xrightarrow{\text{1×1 Conv}} (H, W, 2048) \xrightarrow{\text{Group Split }(g=4)} 4 \times (H, W, 512)
步骤2:Shuffle(通道打乱)
将上一步得到的 4 组特征图(每组 512 通道)通过通道混洗(Channel Shuffle)操作打乱。每个计算块计算出的特征图会根据组参数 ( g ) 被打乱成 ( g ) 个组,再将它们连接在一起。
步骤3:Merge(合并基数)
将经过混洗的 ( g ) 组特征图在通道维度上拼接(Concat),恢复到 ( C_{out} \times g = 2048 ) 通道。然后通过 1×1 卷积将通道数压缩回 ( C_{out} = 512 )。
数学表达:
4 \times (H, W, 512) \xrightarrow{\text{Concat}} (H, W, 2048) \xrightarrow{\text{1×1 Conv}} (H, W, 512)
4.1.3 完整计算示例(代入具体数值)
输入:特征图 ( (160, 160, 128) ),组参数 ( g = 4 ),输出通道 ( C_{out} = 256 )
| 步骤 | 操作 | 张量尺寸变化 | 说明 |
|---|---|---|---|
| 输入 | - | ( (160, 160, 128) ) | 来自上一层的特征图 |
| Expand | 1×1 Conv(扩展) | ( (160, 160, 128) \rightarrow (160, 160, 1024) ) | 通道扩展为 ( 256 \times 4 = 1024 ) |
| Expand | 分组(Group Split) | ( (160, 160, 1024) \rightarrow 4 \times (160, 160, 256) ) | 按 ( g=4 ) 分成4组 |
| Shuffle | 通道混洗 | ( 4 \times (160, 160, 256) ) | 各组通道交叉打乱 |
| Merge | 拼接(Concat) | ( 4 \times (160, 160, 256) \rightarrow (160, 160, 1024) ) | 恢复到扩展后的通道数 |
| Merge | 1×1 Conv(压缩) | ( (160, 160, 1024) \rightarrow (160, 160, 256) ) | 压缩回目标输出通道 |
最终输出:( (160, 160, 256) ),空间尺寸不变,通道数从 128 扩展到 256。
4.1.4 E-ELAN 的关键特性
| 特性 | 说明 |
|---|---|
| 梯度路径不变 | E-ELAN 完全没有改变原有架构的梯度传输路径 |
| 组卷积扩展基数 | 使用组卷积来增加特征的基数(cardinality) |
| 通道混洗 | 以 shuffle 和 merge cardinality 的方式组合不同组的特征 |
| 学习多样化特征 | 不同组的计算块被引导去学习更多样化的特征 |
| 过渡层不变 | E-ELAN 只改变了计算块的架构,过渡层(transition layer)的架构完全没有改变 |
本质:E-ELAN = “不切分,全参与”——输入特征图不进行硬性切分,而是全部送入模块,通过扩展→分组→混洗→合并的方式,让所有数据都参与计算,但通过分组卷积控制计算量。
4.2 SPPCSPC模块(空间金字塔池化-跨阶段部分连接)⭐⭐
SPPCSPC是 YOLOv7 对传统 SPP 模块的重大升级,它结合了SPP(多尺度池化)和CSP(跨阶段部分连接)两种设计思想。
4.2.1 传统SPP vs. SPPCSPC
| 功能 | 传统SPP | SPPCSPC |
|---|---|---|
| 多尺度特征提取 | 支持 | 增强,支持更多上下文信息 |
| 梯度流动稳定性 | 一般 | 使用CSP优化,梯度流动更稳定 |
| 参数效率 | 未优化 | 参数利用效率更高 |
4.2.2 SPPCSPC 的结构与计算
SPPCSPC 将输入特征图分成两个分支:
flowchart TD Input["输入特征图 x (C, H, W)"] --> B1["分支1 (CSP-Shortcut)"] & B2["分支2 (SPP多尺度池化)"] B1 --> B1_CBS["CBS (3×3)"] --> B1_Comp["通道压缩"] --> Concat["拼接 (Concat)"] B2 --> B2_CBS["CBS (3×3)"] --> B2_Comp["通道压缩"] --> Pool["并行多尺度MaxPool:"] Pool --> P5["5×5 (pad=2)"] & P9["9×9 (pad=4)"] & P13["13×13 (pad=6)"] P5 & P9 & P13 --> B2_Concat["拼接 (Concat)"] --> B2_Reduce["CBS (1×1) 降维"] --> Concat Concat --> Out_CBS["CBS (1×1)"] --> Output["输出特征图"]4.2.3 SPPCSPC 池化计算示例(保持空间尺寸不变)
假设输入特征图尺寸为 ( (20, 20, 512) ),三个池化核的尺寸为 5×5、9×9、13×13。
池化输出尺寸公式:
\text{输出尺寸} = \frac{\text{输入尺寸} + 2 \times \text{Padding} - \text{Kernel}}{\text{Stride}} + 1
当Stride = 1,Padding = (K-1)/2时,输出尺寸 = 输入尺寸:
| 池化核 (K) | 填充 (Padding) | 输出尺寸计算 | 结果 |
|---|---|---|---|
| 5×5 | 2 | ( (20 + 4 - 5)/1 + 1 = 20 ) | ✅ 20×20 |
| 9×9 | 4 | ( (20 + 8 - 9)/1 + 1 = 20 ) | ✅ 20×20 |
| 13×13 | 6 | ( (20 + 12 - 13)/1 + 1 = 20 ) | ✅ 20×20 |
关键:所有池化输出尺寸完全相同(20×20),所以可以直接在通道维度拼接(Concat)。13×13 的池化核覆盖了几乎整个 20×20 特征图,相当于全局池化。
4.3 RepConv(重参数化卷积)⭐⭐
RepConv是 YOLOv7 引入的结构重参数化实现。其核心思想是:训练时多分支,推理时单路。
4.3.1 训练时的多分支结构
在训练阶段,一个 RepConv 块内部包含三条并行的路径:
flowchart LR Input["输入"] --> Branch1["分支1: 3×3 卷积 + BN<br>(主分支,提取空间特征)"] Input --> Branch2["分支2: 1×1 卷积 + BN<br>(通道信息线性变换)"] Input --> Branch3["分支3: 恒等映射 (Identity)<br>(梯度顺畅流动)"] Branch1 --> Add["逐元素相加 (Add)"] Branch2 --> Add Branch3 --> Add Add --> Output["输出"]“训练时用一套复杂的、多分支的结构来保证模型学得好、精度高;等到要实际用了,就把这些分支巧妙地合并成一个简单的、高效的单一路径结构。”
4.3.2 推理时的单路结构(重参数化)
推理时,通过结构重参数化技术,将三个分支的权重和偏置融合成一个等效的 3×3 卷积。
重参数化的数学原理:
第一步:融合 BN 到卷积
BN 层的计算公式为:
y_{bn} = \gamma \cdot \frac{y - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta
将卷积 ( y = W \cdot x + b ) 代入,可以合并为一个带偏置的卷积:
W_{fused} = W \cdot \frac{\gamma}{\sqrt{\sigma^2 + \epsilon}}, \quad b_{fused} = \beta - \frac{\mu \cdot \gamma}{\sqrt{\sigma^2 + \epsilon}}
第二步:统一卷积核尺寸
- 1×1 卷积 → 3×3 卷积:通过在 1×1 卷积核的四周补零(Zero Padding)
- 恒等映射 → 3×3 卷积:构造中心值为 1、其余为 0 的 3×3 卷积核
第三步:合并分支
三个分支的卷积核逐元素相加,偏置也逐元素相加:
W_{fused} = W_1 + W_2 + W_3, \quad b_{fused} = b_1 + b_2 + b_3
4.3.3 RepConvN(无恒等连接的版本)
YOLOv7 的研究发现,RepConv 自带的恒等连接在多支路网络(如 CSP、残差网络)中会削弱其特征提取能力。因此,YOLOv7 在实际网络中使用的是RepConvN——去掉了恒等连接,只保留 3×3 和 1×1 两个分支。
本质:RepConv = “训练时人多力量大,推理时化零为整”——白嫖了多分支的高精度,但推理时依然保持单路 3×3 卷积的高速度。
五、训练策略详解
5.1 带辅助头的训练(Auxiliary Head Training)⭐⭐⭐
这是 YOLOv7最具独创性的训练策略。
5.1.1 核心思想
在训练时,YOLOv7 在网络的中间层(Neck 部分)额外添加一个辅助头(Auxiliary Head),与主头(Lead Head)共同参与训练。辅助头在推理时被移除,因此不增加任何推理开销。
【主路径】 输入 → Backbone → Neck → 主Head → 主损失 L_main 【辅助路径】(仅在训练时) 输入 → Backbone → Neck(中间层) → 辅助Head → 辅助损失 L_aux 【总损失】 L_total = L_main + λ_aux × L_aux其中 ( \lambda_{aux} ) 通常为 0.25 左右。
5.1.2 为什么辅助头有效?
深度网络中,浅层特征距离输出层较远,梯度信号在反向传播时容易衰减。辅助头在中间层提供额外的监督信号,让浅层也能收到强梯度。
本质:辅助头 = “中间加个考官,双重监督”——增加了训练成本,但给浅层特征提供了直接的强梯度,推理时零负担。
5.1.3 辅助头的位置
YOLOv7的辅助头通常添加在Neck的中间层(如FPN的某个融合层之后)。
5.1.4 辅助头 vs. 主头
| 维度 | 辅助头(Auxiliary Head) | 主头(Lead Head) |
|---|---|---|
| 位置 | 网络中间层 | 网络输出层 |
| 训练时 | ✅ 参与训练,提供监督 | ✅ 参与训练 |
| 推理时 | ❌被移除,不参与推理 | ✅ 负责最终输出 |
| 精度贡献 | 提升浅层特征质量 | 最终检测结果 |
核心洞察:辅助头通过增加训练成本来提升精度,但完全不增加推理成本——这是典型的“免费午餐”。
5.2 动态标签分配策略
YOLOv7 提出了一种动态标签分配策略:
- 结合 YOLOv5 的跨网格匹配:正样本不仅可以在当前网格,还可以在相邻网格
- 结合 YOLOX 的 SimOTA 匹配:动态计算每个真实框应该匹配多少个正样本
- Coarse-to-Fine 策略:从粗到细的动态标签分配
具体流程:
- 计算每个预测框与真实框的代价矩阵(综合考虑分类损失、回归损失和IoU)
- 使用动态K策略,为每个真实框动态选择最优的K个正样本
- 选中的正样本参与损失计算,其余为负样本
本质:不再是固定的 IoU 阈值,而是根据训练阶段自适应调整正样本分配。
5.3 基于拼接的模型缩放
YOLOv7 提出了一种基于 concatenate 模型的模型缩放方法:
- 传统缩放方法在串联模型上会导致输入输出宽度不匹配
- YOLOv7 的方法只对计算块中的深度进行扩展,传输层进行相应的宽度扩展
- 这种复合扩展方法可以保持模型在初始设计时的特性和最佳结构
六、损失函数
YOLOv7 的损失函数由三部分组成:
L = \lambda_1 L_{\text{cls}} + \lambda_2 L_{\text{obj}} + \lambda_3 L_{\text{CIoU}}
6.1 分类损失 ( L_{\text{cls}} )
采用二元交叉熵(BCE),配合BCEWithLogitsLoss。每个类别的概率独立判断(多标签分类)。
6.2 置信度损失 ( L_{\text{obj}} )
同样采用二元交叉熵(BCE),判断预测框是否包含物体。
6.3 定位损失 ( L_{\text{CIoU}} )
采用CIoU Loss(Complete IoU Loss):
L_{\text{CIoU}} = 1 - \text{IoU} + \frac{\rho^2(b, b^{gt})}{c^2} + \alpha v
其中:
\alpha = \frac{v}{(1 - \text{IoU}) + v}, \quad v = \frac{4}{\pi^2} \left( \arctan\frac{w^{gt}}{h^{gt}} - \arctan\frac{w}{h} \right)^2
各符号含义:
| 符号 | 含义 |
|---|---|
| ( \text{IoU} ) | 预测框与真实框的交并比 |
| ( \rho^2(b, b^{gt}) ) | 两框中心点的欧氏距离平方 |
| ( c^2 ) | 两框最小外接矩形的对角线长度平方 |
| ( v ) | 长宽比一致性惩罚项 |
| ( \alpha ) | 权衡权重 |
七、检测头:IDetect + ImplicitA / ImplicitM
YOLOv7 的检测头引入了ImplicitA和ImplicitM两个隐式学习模块。
IDetect 结构:
flowchart TD Input["输入特征图 (C, H, W)"] --> IA["ImplicitA (隐式加法)<br>x = x + self.implicit"] IA --> Conv["Conv2d (1×1 卷积)<br>输出通道数 = (类别数 + 5) × 锚点数"] Conv --> IM["ImplicitM (隐式乘法)<br>x = x × self.implicit"] IM --> Output["输出"]ImplicitA 和 ImplicitM 的作用:
- ImplicitA(隐式加法):学习一个可训练的偏置项,与特征图相加
- ImplicitM(隐式乘法):学习一个可训练的缩放项,与特征图相乘
这两个模块通过隐式学习的方式优化特征表示,提升模型的表达能力。
八、YOLOv4 vs. YOLOv7 核心对比总结
| 优化模块 | YOLOv4 的做法 | YOLOv7 的做法 | 一句话本质 |
|---|---|---|---|
| 核心模块 (Backbone) | CSP:切分一半计算,一半直通 | E-ELAN:全部扩展分组,混洗合并 | V4是“分流干活”,V7是“分组开会再总结” |
| 池化模块 (Neck) | SPP:四路池化,直接拼接 | SPPCSPC:双路分流(一路池化,一路直通)再拼 | V4是“直接把菜混一起”,V7是“留一半生菜垫底,另一半炒熟了铺上面” |
| 特征融合 (Neck) | PANet:双向融合,标准卷积 | MPANet:双向融合,ELAN-W替换模块 | V4骨架没变,V7把关节和肌肉全换成了大功率版本 |
| 检测头 (Head) | 标准卷积:单路卷积 | RepConv:多分支训练,单路推理 | V4是“一个人干到底”,V7是“团队协作,但只派一个人出场” |
| 训练策略 | 单头监督:只算最终损失 | 辅助头+动态分配:中间加考官,主头动态定规则 | V4是“只看期末考”,V7是“月考+期末考双重监督” |
九、用户总结
“YOLOv7 的本质,是一次对‘算法创新’的强势回归——在 YOLOv5 把工程化做到极致、YOLOv6 把硬件优化做到极致之后,YOLOv7 用三个核心创新重新定义了精度-速度边界:
①架构层面:提出E-ELAN(扩展高效层聚合网络),通过expand、shuffle、merge cardinality三步操作,在不破坏原始梯度路径的前提下增强网络学习能力——这是对 CSPNet 的根本性升级;
②模块层面:设计SPPCSPC,将 SPP 的多尺度池化与 CSP 的跨阶段部分连接融合,在提取多尺度上下文信息的同时稳定梯度流动;
③训练层面:引入带辅助头的训练,在中间层添加额外的监督信号——增加训练成本,但推理时辅助头被完全移除,零成本提升精度;
④重参数化:引入RepConv,延续 RepVGG 的‘训练多分支、推理单路’思想,实测推理速度能有 20%-30% 的提升;
⑤标签分配:融合 YOLOv5 的跨网格搜索和 YOLOX 的SimOTA 动态匹配,实现更精准的正负样本分配。
YOLOv7 证明了:在工程化趋于成熟之后,算法层面的创新依然是提升检测性能的最有效途径——它用 E-ELAN 回答了‘如何让网络更深而不退化’,用辅助头回答了‘如何让浅层特征学得更好’,用 RepConv 回答了‘如何白嫖多分支的高精度’。这三个问题的答案都不增加推理成本,却带来了显著的精度提升。”
