YOLOv5: PyTorch 工程化的里程碑

代码: github.com/ultralytics/yolov5
作者: Ultralytics (Glenn Jocher)
特点: ❌ 无正式论文,但代码、文档、生态最完善


历史意义

v5 没有革命性创新,但它通过 PyTorch 重写 + 极致工程化 + 完善生态,让 YOLO 真正走入大众。

1
2
v4: darknet(C 语言) → 研究者友好但部署难
v5: PyTorch → 人人可用,pip install 即可

网络架构

整体结构 (与 v4 相似但更优化)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
输入 640×640×3

┌─────────────────────────┐
│ Backbone: 改进CSPDarknet53 │
│ ├─ Focus (切片下采样) │
│ ├─ Conv + C3 (CSP Bottleneck) │
│ └─ SPPF (Fast 金字塔池化) │
└────────────┬────────────┘

┌─────────────────────────┐
│ Neck: PANet (FPN+PAN) │
│ ├─ 上采样 + Concat │
│ └─ C3 + Conv │
└────────────┬────────────┘

┌─────────────────────────┐
│ Head: YOLOv3-Style Head │
│ ├─ 3尺度检测 │
│ └─ Anchor-Based │
└─────────────────────────┘

预测输出 (P3, P4, P5)

核心组件详解

1. Focus 层

1
2
3
4
5
输入 640×640×3
→ 切片操作 (每隔1像素取1个)
→ 320×320×12
→ Conv
→ 320×320×32

原理: 将空间信息压缩到通道维度,减少信息丢失。类似 Passthrough 层但更高效。

2. C3 模块 (CSP Bottleneck with 3 Convs)

1
2
3
输入 ──┬──→ Conv → Bottleneck×N → Conv ──┐
│ ├── Concat → Conv → 输出
└──→ Conv ──────────────────────────┘

= CSPNet 的简化高效实现。核心公式:C3 = 3×Conv + N×Bottleneck + CSP

3. SPPF (Spatial Pyramid Pooling - Fast)

1
2
3
4
5
输入 → Conv
├──→ MaxPool(5) ──┐
├──→ MaxPool(5) ──┤ 串行 (更快!)
├──→ MaxPool(5) ──┼──→ Concat → Conv → 输出
└──→ 直通 ────────┘

v4 SPP 是并行多尺度池化,SPPF 改用串行:效果相同但快得多(因为逐级复用)。


模型变体系列

变体 参数量 速度 适用场景
yolov5n 1.9M 极快 移动端/边缘
yolov5s 7.2M 很快 轻量级嵌入
yolov5m 21.2M 通用场景
yolov5l 46.5M 高精度需求
yolov5x 86.7M 极致精度

通过 depth_multiplewidth_multiple 缩放控制模型大小。


工程亮点

数据增强全家桶

增强 说明
Mosaic (4图拼1) 继承 v4
Copy-Paste 从其他图粘贴实例
Random Affine 旋转、缩放、平移、剪切
MixUp 两图加权混合
HSV 增强 色调、饱和度、明度扰动

训练策略

  • 自动锚框计算: 训练前自动聚类计算最佳锚框
  • Warmup + Cosine 调度: 学习率预热 + 余弦衰减
  • EMA: 指数移动平均更新权重
  • 多尺度训练: 同 v2 思路
  • 超参数进化: 遗传算法自动调参

推理优化

  • TTA (Test Time Augmentation):测试时增强
  • 多模型集成
  • 多种导出格式 (ONNX, TensorRT, CoreML, TFLite…)

训练细节 (From Scratch)

📦 参考: [[30.resources/yolo-master/docs/Pytorch_YoLo_From_Scratch/v5/YOLOv5.ipynb|YOLOv5 Notebook]]

模块 实现
ConBNSiLU Conv2D + BN + SiLU 激活 → 基础构建块
Bottleneck1 1×1降维 → 3×3 → add(输入),用于Backbone
Bottleneck2 1×1降维 → 3×3 (无残差),用于Neck
SPPF 串行金字塔快速池化
C3 CSP + 3×Conv + N×Bottleneck

⚠️ Notebook 中损失函数和 train/test 代码尚待完善。


v5 vs v8 选型

YOLOv5 YOLOv8
Anchor Anchor-Based Anchor-Free
Head 耦合Head 解耦Head
推出时间 2020 2023
维护 维护中 主力维护

新项目优先 v8/v11,老项目 v5 依然稳定可用。


相关链接

  • 📝 [[YOLO 系列总览]]
  • 📝 [[YOLOv4 详解]]
  • 📝 [[YOLO 核心概念]]
  • 📦 [[30.resources/yolo-master/docs/Pytorch_YoLo_From_Scratch/v5/README|v5 From Scratch]]
  • 📦 [[30.resources/yolo-master/docs/Hands_on_YoLo_with_ultralytics/README|Ultralytics 实操]]