回到目录:[算法学习笔记系列索引]
目录
一、核心思想:博采众长的优化集成
YOLOv3 的局限 → YOLOv4 的改进方向
改进过程演化
二、网络架构:CSPDarknet53 + SPP + PANet
🏗️ Backbone:CSPDarknet53
什么是CSP结构?
Darknet-53 → CSPDarknet53 的演进
🔗 Neck:SPP + PANet(核心升级)
1. SPP模块(空间金字塔池化)
2. PANet(路径聚合网络)
三、损失函数:CIoU Loss(核心改进)
CIoU的数学公式
为什么CIoU比MSE/IoU更好?
四、训练策略:Bag of Freebies(免费午餐)
1. Mosaic数据增强(核心创新)
2. CutMix数据增强
3. DropBlock正则化
4. 自对抗训练(SAT)
5. CmBN(Cross-iteration Batch Normalization)
6. 其他优化
五、YOLOv3 vs. YOLOv4 全面对比
六、总结
一、核心思想:博采众长的优化集成
YOLOv4的核心理念是“集大成者”——它没有提出颠覆性的理论,而是系统性地筛选并整合了当时计算机视觉领域大量被验证有效的“tricks”,精准解决了YOLOv3的痛点,实现了精度(AP)提升10%,速度(FPS)提升12%的跨越式进步。
YOLOv3 的局限 → YOLOv4 的改进方向
| YOLOv3的局限 | YOLOv4的改进 |
|---|---|
| Darknet-53特征提取能力有提升空间 | 引入CSPDarknet53,更强更高效 |
| 仅用FPN单向融合,浅层细节传递衰减 | 引入SPP + PANet,多尺度感受野+双向融合 |
| 边界框损失函数不够精确(MSE/IoU) | 采用CIoU Loss,考虑中心距和长宽比 |
| 训练策略和数据增强相对传统 | 引入Mosaic、CutMix、DropBlock、CmBN等 |
改进过程演化
%%{init: { 'theme': 'base', 'themeVariables': { 'fontSize': '16px' }, 'flowchart': { 'useMaxWidth': false, 'padding': 6, 'nodeSpacing': 35, 'rankSpacing': 35 } }}%% graph TD A[YOLOv3 的局限] --> B[主干网络不够强] A --> C[单尺度FPN融合不足] A --> D[损失函数不够精确] A --> E[训练策略传统] B --> F[引入 CSPDarknet53] C --> G[引入 SPP + PANet] D --> H[引入 CIoU Loss] E --> I[引入 Mosaic、CutMix、DropBlock、CmBN] F --> J[YOLOv4] G --> J H --> J I --> J J --> K[精度 AP ↑ 10%] J --> L[速度 FPS ↑ 12%]二、网络架构:CSPDarknet53 + SPP + PANet
YOLOv4的整体架构可以清晰地分为三个部分:Backbone(主干网络)→ Neck(特征融合)→ Head(检测头)。
🏗️ Backbone:CSPDarknet53
CSPDarknet53是YOLOv4的主干网络,它是在Darknet53的基础上,引入了CSP(Cross Stage Partial)结构。
什么是CSP结构?
CSP结构本质上是一种网络设计范式,通过“拆分-处理-合并”三步走,在降低计算量的同时保持精度。
以一个CSP残差块为例(输入尺寸 112×112×128):
| 步骤 | 操作 | 张量尺寸变化 | 说明 |
|---|---|---|---|
| 1. 拆分(Split) | 沿通道维度一分为二 | 128 → 64 + 64 | 分支1进入残差块,分支2直接跳过 |
| 2. 分支1处理 | 1×1降维(64→32) → 3×3卷积(32) → 1×1升维(32→64) → Add残差 | (112,112,64) | 只有一半数据经过昂贵计算 |
| 3. 分支2跳过 | 不做任何计算 | (112,112,64) | 原始特征直接保留 |
| 4. 合并(Concat) | 通道维度拼接 | 64 + 64 = 128 | 输出尺寸不变,但计算量降低约20% |
CSP的价值:
- 计算量降低:只有一半通道进入残差块,FLOPs降低约20%
- 梯度流更丰富:拼接操作为梯度提供了额外“高速公路”,缓解梯度消失
- 特征重用:保留DenseNet“特征重用”的优点,同时截断冗余梯度信息
Darknet-53 → CSPDarknet53 的演进
| 对比维度 | Darknet-53 (YOLOv3) | CSPDarknet53 (YOLOv4) |
|---|---|---|
| 残差块结构 | 标准瓶颈(1×1→3×3→1×1+残差) | CSP瓶颈(拆分→半通道处理→拼接) |
| 计算量 | 基准 | 降低约20% |
| 特征提取能力 | 强 | 更强(梯度流优化) |
| 参数量 | 基准 | 略有减少 |
🔗 Neck:SPP + PANet(核心升级)
YOLOv4的Neck部分是对YOLOv3的FPN的重大升级,引入了SPP模块和PANet结构。
1. SPP模块(空间金字塔池化)
目标:在不改变空间尺寸的前提下,极大扩展感受野,融合多尺度特征。
计算过程(以输入 19×19×1024 为例):
# 输入特征图 x: (B, 1024, 19, 19) # 四个并行的最大池化层,步长=1,填充自动匹配 pool1 = MaxPool2d(kernel=1, stride=1, padding=0) # → (B,1024,19,19) pool2 = MaxPool2d(kernel=5, stride=1, padding=2) # → (B,1024,19,19) pool3 = MaxPool2d(kernel=9, stride=1, padding=4) # → (B,1024,19,19) pool4 = MaxPool2d(kernel=13, stride=1, padding=6) # → (B,1024,19,19) # 通道维度拼接 out = torch.cat([pool1(x), pool2(x), pool3(x), pool4(x)], dim=1) # → (B, 4096, 19, 19) # 通道数翻4倍关键数学原理(保持空间尺寸不变):
池化输出尺寸公式:输出 = (输入 + 2×Padding - Kernel) / Stride + 1
当Stride=1,Padding = (K-1)/2时:
- K=1, Pad=0 → 输出 = (19+0-1)/1+1 = 19 ✅
- K=5, Pad=2 → 输出 = (19+4-5)/1+1 = 19 ✅
- K=9, Pad=4 → 输出 = (19+8-9)/1+1 = 19 ✅
- K=13, Pad=6 → 输出 = (19+12-13)/1+1 = 19 ✅
物理效果:每一个输出点都融合了 1×1(原始)、5×5(局部)、9×9(区域)、13×13(几乎全局)四个尺度的“最强响应”,感受野大幅扩展。
2. PANet(路径聚合网络)
目标:在FPN(自顶向下)的基础上,增加自底向上的路径,让浅层的位置信息也能高效传递到深层。
YOLOv3的FPN(单向):
13×13 (深层语义) ──上采样──→ 26×26 ──上采样──→ 52×52 (浅层细节)→ 语义信息从上往下传,但位置信息无法从下往上传递
YOLOv4的PANet(双向):
自顶向下(语义传递): 13×13 ──上采样→ 26×26 ──上采样→ 52×52 自底向上(位置传递): 52×52 ──下采样→ 26×26 ──下采样→ 13×13→ 两条路径融合,形成信息闭环,语义和位置充分交融
注:YOLOv4在PANet中融合方式采用拼接(Concat),而非原始PANet论文的相加,以保留更完整的特征信息。
三、损失函数:CIoU Loss(核心改进)
YOLOv4采用CIoU Loss(Complete IoU Loss)替代了YOLOv3的MSE/IoU Loss,从三个几何维度全面评估预测框与真实框的相似度。
CIoU的数学公式
\text{CIoU} = \text{IoU} - \frac{\rho^2(b, b^{gt})}{c^2} - \alpha \cdot v
| 符号 | 含义 | 物理意义 |
|---|---|---|
| \text{IoU} | 交并比 | 衡量重叠面积 |
| \frac{\rho^2(b, b^{gt})}{c^2} | 中心点距离/对角线长度² | 衡量中心点距离 |
| \alpha \cdot v | 权重 × 长宽比一致性 | 衡量长宽比差异 |
其中:
- v = \frac{4}{\pi^2} \left( \arctan\frac{w^{gt}}{h^{gt}} - \arctan\frac{w}{h} \right)^2(长宽比惩罚项)
- \alpha = \frac{v}{(1 - \text{IoU}) + v}(权衡权重)
CIoU Loss = 1 - CIoU
为什么CIoU比MSE/IoU更好?
| 损失函数 | 考虑重叠面积 | 考虑中心距离 | 考虑长宽比 | 问题 |
|---|---|---|---|---|
| MSE (V3) | ❌ 间接 | ❌ | ❌ | 坐标独立回归,缺乏整体性 |
| IoU Loss | ✅ | ❌ | ❌ | 两框无重叠时梯度为0 |
| GIoU Loss | ✅ | ❌ | ❌ | 无法区分中心对齐差异 |
| DIoU Loss | ✅ | ✅ | ❌ | 长宽比不一致时仍有偏差 |
| CIoU Loss (V4) | ✅ | ✅ | ✅ | 全面评估,最精准 |
四、训练策略:Bag of Freebies(免费午餐)
YOLOv4引入了一系列强大的训练策略,在不增加推理成本的前提下大幅提升精度。
1. Mosaic数据增强(核心创新)
- 操作:将4张图片随机缩放、裁剪、排布后拼接成1张新图片
- 效果:
- 极大丰富小目标训练样本
- 减少对大Batch Size的依赖(4张拼1张 = 等效Batch Size翻4倍)
- 让模型同时学习不同尺度和背景
2. CutMix数据增强
- 操作:将一张图片的部分区域裁剪掉,用另一张图片的对应区域填充
- 效果:提升模型鲁棒性,防止过拟合(比MixUp更有效)
3. DropBlock正则化
- 操作:连续丢弃特征图上的矩形区域(而非Dropout的随机点)
- 效果:迫使网络学习更鲁棒的特征,防止过拟合
4. 自对抗训练(SAT)
- 操作:对图像添加微小扰动,生成对抗样本
- 效果:增强模型对干扰的抵抗能力
5. CmBN(Cross-iteration Batch Normalization)
- 操作:在多个迭代之间统计BN信息
- 效果:小Batch Size训练时保持稳定
6. 其他优化
- Mish激活函数:替代Leaky ReLU,提供更平滑的非线性
- 标签平滑:防止过拟合,提升泛化能力
五、YOLOv3 vs. YOLOv4 全面对比
| 模块 | YOLOv3 | YOLOv4 | 改进效果 |
|---|---|---|---|
| 主干网络 | Darknet-53 | CSPDarknet53 | 计算量↓20%,特征提取↑ |
| Neck结构 | FPN | SPP + PANet | 感受野↑,特征融合↑ |
| 激活函数 | Leaky ReLU | Mish | 精度↑ |
| 损失函数 | MSE / IoU Loss | CIoU Loss | 定位精度↑↑ |
| 数据增强 | 基础方法 | Mosaic, CutMix | 泛化能力↑↑ |
| 正则化 | Dropout | DropBlock | 防过拟合↑ |
| BN策略 | 标准BN | CmBN | 小Batch训练稳定↑ |
六、总结
“YOLOv4的本质,是在YOLOv3的基础上,做了全方位的‘精准补强’:
①主干网络:用CSP结构对Darknet53进行改造,在降低计算量的同时增强了梯度流;
②Neck结构:用SPP扩大感受野,用PANet打通双向信息通道,让多尺度特征融合更充分;
③损失函数:用CIoU取代MSE,同时考虑重叠面积、中心距离和长宽比,定位更精准;
④训练策略:引入Mosaic、CutMix、DropBlock等一系列‘免费午餐’,在不增加推理成本的前提下大幅提升泛化能力。YOLOv4没有发明新的理论,但它把当时所有被验证有效的tricks用到了极致,实现了精度和速度的双重跨越。”