三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Yolo系列算法学习笔记——YoloV7知识点梳理与总结

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-11×11改变通道数(升维/降维)
CBS-23×31特征提取(保持空间尺寸)
CBS-33×32下采样(空间尺寸减半)

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) )
分支1MaxPool(k=2,s=2) → CBS(1×1)( (160, 160, 128) )
分支2CBS(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) )来自上一层的特征图
Expand1×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) )恢复到扩展后的通道数
Merge1×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

功能传统SPPSPPCSPC
多尺度特征提取支持增强,支持更多上下文信息
梯度流动稳定性一般使用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 = 1Padding = (K-1)/2时,输出尺寸 = 输入尺寸:

池化核 (K)填充 (Padding)输出尺寸计算结果
5×52( (20 + 4 - 5)/1 + 1 = 20 )✅ 20×20
9×94( (20 + 8 - 9)/1 + 1 = 20 )✅ 20×20
13×136( (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 策略:从粗到细的动态标签分配

具体流程

  1. 计算每个预测框与真实框的代价矩阵(综合考虑分类损失、回归损失和IoU)
  2. 使用动态K策略,为每个真实框动态选择最优的K个正样本
  3. 选中的正样本参与损失计算,其余为负样本

本质:不再是固定的 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 的检测头引入了ImplicitAImplicitM两个隐式学习模块。

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 回答了‘如何白嫖多分支的高精度’。这三个问题的答案都不增加推理成本,却带来了显著的精度提升。”

← 返回列表