⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议。
Skip to content

3.3 从分类到检测:YOLO的核心思想

核心问题: 图像分类只能回答“有什么”,那模型如何进一步回答“它在哪里”?

在线 Notebook

对应的交互式版本可在 Google Colab 打开,统一使用方式见 第0章说明


技术背景

核心问题

3.2 介绍了 CNN 如何从图像中提取特征。但现实中的视觉系统往往不只需要识别类别,还需要知道目标的位置。

换句话说,分类只回答“是什么”,而检测还必须回答“在哪里”。

关键概念

概念简单解释
目标检测识别图像中的目标,并给出位置
边界框用矩形框表示目标的位置
单阶段检测器一次前向传播同时预测类别和位置
NMS删除重复检测框的后处理方法

应用场景

  • 自动驾驶:检测车辆、行人、交通标志
  • 安全监控:检测异常目标或事件
  • 工业质检:检测缺陷和目标位置

思考问题

  • 为什么目标检测比分类更难?
  • 为什么YOLO适合实时应用?

本节学习目标

完成本节后,你应该能够:

  1. ✅ 理解分类与检测的根本区别
  2. ✅ 理解YOLO如何把检测转化为回归问题
  3. ✅ 理解单阶段检测器的速度优势与权衡

目标检测的问题

分类 vs 检测

图像分类:

输入图像 → 输出一个类别
例子:这张图里有一只猫

目标检测:

输入图像 → 输出多个目标 + 每个目标的位置
例子:
- 猫:位置(x1, y1, x2, y2)
- 狗:位置(x1, y1, x2, y2)

检测比分类更难,因为模型要同时完成两件事:

  1. 识别是什么
  2. 定位在哪里

为什么更难

目标检测面临额外挑战:

  • 图中可能有多个目标
  • 不同目标大小不同
  • 目标可能互相遮挡
  • 还要满足实时性要求

因此,检测是在分类之外再加一层空间回归和后处理,任务复杂度会明显上升。


YOLO的核心思想

YOLO(You Only Look Once)的关键创新是:把目标检测变成一次前向传播完成的回归问题。

传统思路

早期检测方法通常是:

滑动窗口 / 区域候选

对每个区域单独分类

合并结果

问题: 候选区域太多,速度慢,系统复杂。

YOLO思路

YOLO直接把整张图像输入网络:

输入图像

CNN提取特征

输出网格预测
  ├─ 边界框坐标
  ├─ 置信度
  └─ 类别概率

关键变化: 不再先“找候选区域”,而是直接预测所有目标。

这也是 YOLO 被看作“单阶段检测”的原因:它把检测从多步骤流水线收束成一次前向传播。


YOLO如何工作

1. 图像划分为网格

YOLO把输入图像划分为多个网格单元。

图像
┌───┬───┬───┐
│ G │ G │ G │
├───┼───┼───┤
│ G │ G │ G │
├───┼───┼───┤
│ G │ G │ G │
└───┴───┴───┘

每个网格负责预测落在自己区域内的目标。

2. 每个网格输出什么

每个网格通常输出:

  • 边界框坐标 (x, y, w, h)
  • 目标置信度 confidence
  • 类别概率 class probabilities

于是,检测问题就从“搜索目标”变成了“直接回归这些数值”。

3. 非极大值抑制(NMS)

多个网格可能同时预测到同一个目标,因此需要后处理:

  • 保留最高置信度的框
  • 删除和它高度重叠的重复框

这一步叫 NMS(Non-Maximum Suppression)

NMS 的存在说明,检测不是只靠网络输出,还需要一个把重复结果整理成最终答案的工程后处理。


为什么YOLO快

YOLO快的原因在于:

  1. 一次前向传播完成检测
  2. 端到端训练
  3. 不需要复杂的候选区域生成

因此它非常适合:

  • 实时视频分析
  • 自动驾驶
  • 边缘设备部署

YOLO的权衡

YOLO不是“全面最优”,而是典型的工程权衡。

优势

  • 速度快
  • 结构简单
  • 易于端到端优化

局限

  • 小目标检测较难
  • 密集目标场景容易漏检
  • 位置精度可能不如更复杂的两阶段方法

这里的取舍和第 2 章里的优化器选择很像:更快、结构更简单,通常要在某些边界条件上付出代价。

这说明现代视觉模型的发展,往往不是单纯追求精度,而是在:

  • 准确率
  • 延迟
  • 计算成本 之间寻找平衡。

YOLO与CNN的关系

YOLO并不是脱离CNN的新体系,而是建立在CNN特征提取能力上的扩展:

  • CNN负责提取图像特征
  • 检测头负责预测边界框和类别
  • 整个系统端到端训练

从这个角度看:

CNN分类:图里有什么?

YOLO检测:图里有什么?它在哪里?

YOLO让CNN从“识别”进一步走向“理解空间位置”。


代码实验

完整的代码示例位于:code/ch03_deep_learning_fast/detection_segmentation_demo.py

运行方式:

bash
python code/ch03_deep_learning_fast/detection_segmentation_demo.py

YOLO vs Segmentation

图3.3:目标检测与图像分割输出形式的对比。左侧强调 YOLO 用边界框回答”目标在哪里”,右侧则展示像素级理解如何进一步细化空间信息。

代码文件: code/ch03_deep_learning_fast/detection_segmentation_demo.py
运行方式: python code/ch03_deep_learning_fast/detection_segmentation_demo.py

本节小结

YOLO展示了CNN如何从分类扩展到检测:

  • 分类回答“有什么”
  • 检测回答“有什么 + 在哪里”
  • YOLO用单阶段回归实现高速检测
  • 速度优势来自端到端的一次前向传播
  • 代价是小目标和密集目标场景更具挑战

从主线看,YOLO 代表的是“在保持 CNN 表征能力的同时,把任务从识别推进到定位”。


下一节: 3.4 从检测到像素级理解:图像分割

本教程采用 CC BY-NC-SA 4.0 许可协议