🧠 YOLO 核心概念详解

1. 目标检测基础

什么是目标检测

同时解决两个问题:物体在哪里(定位)+ 物体是什么(分类)

输出形式:

1
(x, y, w, h, confidence, class_probs...)

Two-Stage vs One-Stage

方法 流程 代表 特点
Two-Stage 提取候选区 → 分类回归 R-CNN, Faster R-CNN 精度高,速度慢
One-Stage 一步到位直接预测 YOLO, SSD 速度快,端到端

YOLO 的本质:把检测变成回归问题,整张图输入,一次性输出所有预测。


2. 核心机制

2.1 Grid Cell(网格划分)

1
2
输入图像 448×448 → 划分为 S×S 网格 (v1: S=7)
每个网格负责预测中心点落在该网格内的目标

v1 例子:

  • 7×7 = 49 个网格
  • 每个网格预测 2 个 bounding box
  • 每个 box: (x, y, w, h, confidence) = 5 个值
  • 每个网格预测 C 个类别 (VOC: 20)
  • 输出张量: 7×7×(5×2+20) = 7×7×30

⚠️ v1 限制: 每个网格只能预测一个类别,小物体/密集场景效果差

2.2 Anchor Box(锚框)

从 v2 开始引入,借鉴 Faster R-CNN。

思想: 不再直接预测坐标,而是预测相对于预设锚框的偏移

1
2
3
直接预测: (x, y, w, h)          ← v1 做法
偏移预测: (tx, ty, tw, th) ← v2+ 做法
真实框 = Anchor + 偏移量

为什么用 Anchors?

  • 网络更容易收敛
  • 一个网格可以预测多个不同形状的物体
  • K-means 聚类找到最优锚框尺寸

v2 公式:

1
2
3
4
bx = σ(tx) + cx        # 中心 x 约束在网格内
by = σ(ty) + cy # 中心 y 约束在网格内
bw = pw × e^(tw) # 宽 = 锚框宽 × 缩放
bh = ph × e^(th) # 高 = 锚框高 × 缩放

2.3 Anchor-Free(无锚框)

v8 开始引入,彻底抛弃手工设计的锚框。

做法: 直接预测边界框的关键点或中心点。

  • 简化模型设计
  • 减少超参数
  • 更适合非标准长宽比的目标

3. IoU 系列详解

IoU(交并比)

衡量预测框与真实框重叠程度的核心指标。

$$\text{IoU} = \frac{A \cap B}{A \cup B}$$

IoU 进化史

变体 全称 特点 引入版本
IoU Intersection over Union 基础版本
GIoU Generalized IoU 考虑最小外接矩形,解决不相交时梯度为零 v4
DIoU Distance IoU 加入中心点距离惩罚 v4
CIoU Complete IoU** 加入长宽比一致性 v4(最常用)
SIoU SCYLLA-IoU 考虑角度代价 v6

CIoU 公式(最常用)

$$\mathcal{L}_{CIoU} = 1 - IoU + \frac{\rho^2(b, b^{gt})}{c^2} + \alpha v$$

  • ρ²(b,bgt): 中心点欧氏距离
  • : 最小外接矩形对角线距离
  • αv: 长宽比惩罚项

4. NMS(非极大值抑制)

为什么需要 NMS?

同一个目标可能被多个边界框检测到,NMS 去重,保留最佳的那个。

算法流程

1
2
3
4
5
1. 按置信度得分排序所有预测框
2. 选最高分框 M,保留
3. 计算其余框与 M 的 IoU
4. 剔除 IoU > threshold 的框
5. 重复 2-4 直到处理完所有框

NMS-Free(v10 创新)

YOLOv10 通过一致双重分配训练策略,在推理时直接产生无冗余的预测,完全消除 NMS。

训练时:一对多 Head(丰富监督信号)+ 一对一 Head
推理时:只用一对一 Head,无需 NMS


5. Backbone / Neck / Head 架构

标准三段式(v4 确立)

1
2
3
4
5
6
7
8
9
输入图像

┌─────────┐
│ Backbone │ ← 特征提取(CNN/Attention)
├─────────┤
│ Neck │ ← 特征融合(FPN+PAN 等)
├─────────┤
│ Head │ ← 最终预测(框+类别)
└─────────┘

Backbone(骨干网络)

作用: 从原始图像中提取多层级特征。

架构 代表 特点
Darknet v1~v3 YOLO 专属轻量网络
CSPDarknet v4~v5 跨阶段部分连接,减少计算
EfficientRep v6 硬件感知结构设计
GELAN v9 广义高效层聚合
Attention-Centric v12~ 注意力机制替代CNN

Neck(颈部)

作用: 融合 Backbone 不同层级的特征,增强多尺度表达能力。

1
2
3
4
5
FPN (Feature Pyramid Network)
高层语义 ────上采样───→ 融合低层细节

PAN (Path Aggregation Network)
低层细节 ────下采样───→ 增强高层定位

经典组合:FPN + PAN = 双向特征金字塔

Head(检测头)

作用: 基于融合特征,输出最终的检测结果。

类型 特点 代表版本
耦合 Head 分类和回归共享卷积 v1~v4
解耦 Head 分类和回归分开处理 v5~v6
Anchor-Free Head 不依赖锚框 v8~
一对一 Head 每个目标仅一个预测 v10~

6. 关键训练技巧

BoF(Bag of Freebies,免费包)

不增加推理成本,只影响训练的优化方法。

方法 作用 引入
Mosaic 数据增强 4 张图拼接成 1 张,提升泛化 v4
MixUp 两张图加权混合 v4
标签平滑 软化 one-hot 标签 v4
SAT 自对抗训练 网络”欺骗自己”提升鲁棒性 v4
CmBN 跨小批量归一化 v4

BoS(Bag of Specials,特殊包)

略微增加推理成本但大幅提升性能。

方法 作用 引入
Mish 激活函数 比 ReLU 更平滑 v4
SPP 金字塔池化 多尺度感受野 v4
SAM 空间注意力 增强重要特征 v4
SE/CBAM 通道注意力 通道维度加权 魔改

7. 损失函数全景

YOLO 损失 = 三类损失之和

$$\mathcal{L}{total} = \mathcal{L}{box} + \mathcal{L}{obj} + \mathcal{L}{cls}$$

组成部分 含义 计算方式
L_box 边界框回归损失 CIoU / SIoU 等
L_obj 目标置信度损失(是否有物体) BCE Loss
L_cls 类别分类损失 BCE Loss (多标签)

v1 损失函数特点

  • 定位误差权重更大 (λ_coord = 5)
  • 无目标的网格置信度惩罚降低 (λ_noobj = 0.5)
  • w、h 取平方根,抑制大框的误差优势

v3+ 损失函数特点

  • 定位仍用差方和
  • 置信度和类别改用交叉熵
  • 多标签分类用 Sigmoid(非 Softmax)

参考资料

  • 📝 [[YOLO 系列总览]] — 版本演进总览
  • 📋 [[10.clippings/感知算法/2D检测/单阶段/YOLO/YOLO 详解:从 v1 到 v11]]
  • 📋 [[10.clippings/感知算法/2D检测/单阶段/YOLO/YOLO系列算法精讲:从yolov1至yolov8的进阶之路(2万字超全整理)-CSDN博客]]
  • 📦 [[30.resources/yolo-master/README]] — Datawhale YOLO Master