3.3 从分类到检测:YOLO的核心思想
核心问题: 图像分类只能回答“有什么”,那模型如何进一步回答“它在哪里”?
在线 Notebook
对应的交互式版本可在 Google Colab 打开,统一使用方式见 第0章说明。
技术背景
核心问题
3.2 介绍了 CNN 如何从图像中提取特征。但现实中的视觉系统往往不只需要识别类别,还需要知道目标的位置。
换句话说,分类只回答“是什么”,而检测还必须回答“在哪里”。
关键概念
| 概念 | 简单解释 |
|---|---|
| 目标检测 | 识别图像中的目标,并给出位置 |
| 边界框 | 用矩形框表示目标的位置 |
| 单阶段检测器 | 一次前向传播同时预测类别和位置 |
| NMS | 删除重复检测框的后处理方法 |
应用场景
- 自动驾驶:检测车辆、行人、交通标志
- 安全监控:检测异常目标或事件
- 工业质检:检测缺陷和目标位置
思考问题
- 为什么目标检测比分类更难?
- 为什么YOLO适合实时应用?
本节学习目标
完成本节后,你应该能够:
- ✅ 理解分类与检测的根本区别
- ✅ 理解YOLO如何把检测转化为回归问题
- ✅ 理解单阶段检测器的速度优势与权衡
目标检测的问题
分类 vs 检测
图像分类:
输入图像 → 输出一个类别
例子:这张图里有一只猫目标检测:
输入图像 → 输出多个目标 + 每个目标的位置
例子:
- 猫:位置(x1, y1, x2, y2)
- 狗:位置(x1, y1, x2, y2)检测比分类更难,因为模型要同时完成两件事:
- 识别是什么
- 定位在哪里
为什么更难
目标检测面临额外挑战:
- 图中可能有多个目标
- 不同目标大小不同
- 目标可能互相遮挡
- 还要满足实时性要求
因此,检测是在分类之外再加一层空间回归和后处理,任务复杂度会明显上升。
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快的原因在于:
- 一次前向传播完成检测
- 端到端训练
- 不需要复杂的候选区域生成
因此它非常适合:
- 实时视频分析
- 自动驾驶
- 边缘设备部署
YOLO的权衡
YOLO不是“全面最优”,而是典型的工程权衡。
优势
- 速度快
- 结构简单
- 易于端到端优化
局限
- 小目标检测较难
- 密集目标场景容易漏检
- 位置精度可能不如更复杂的两阶段方法
这里的取舍和第 2 章里的优化器选择很像:更快、结构更简单,通常要在某些边界条件上付出代价。
这说明现代视觉模型的发展,往往不是单纯追求精度,而是在:
- 准确率
- 延迟
- 计算成本 之间寻找平衡。
YOLO与CNN的关系
YOLO并不是脱离CNN的新体系,而是建立在CNN特征提取能力上的扩展:
- CNN负责提取图像特征
- 检测头负责预测边界框和类别
- 整个系统端到端训练
从这个角度看:
CNN分类:图里有什么?
↓
YOLO检测:图里有什么?它在哪里?YOLO让CNN从“识别”进一步走向“理解空间位置”。
代码实验
完整的代码示例位于:code/ch03_deep_learning_fast/detection_segmentation_demo.py
运行方式:
python code/ch03_deep_learning_fast/detection_segmentation_demo.py
图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 从检测到像素级理解:图像分割
