本章深入探讨了目标检测从 R-CNN 到 YOLO 的发展历程,核心概念包括任务定义、评估指标和两大技术流派。目标检测不仅识别图像中的对象,还需定位其位置并给出置信度,面临目标数量不固定、尺度差异大和类别不平衡等挑战。评估指标主要采用 IoU(交并比)和 mAP(平均精度均值),其中 COCO 数据集使用更严格的 mAP@[0.5:0.95]。技术流派分为双阶段和单阶段:双阶段方法(如 R-CNN 系列)先提议区域再分类,精度高但速度慢;单阶段方法(如 YOLO 和 SSD)直接在特征图上分类和回归,速度快但精度稍低。YOLOv5/v8 已成为工业界事实标准,兼具速度和易用性。读者将掌握目标检测的基本原理、主流方法及其适用场景,并能够根据具体需求选择合适的模型进行训练和部署。
目标检测:从 R-CNN 到 YOLO
图像分类说"这张图是猫", 目标检测更进一步: "这张图的 (x1,y1,x2,y2) 位置是猫, 置信度 0.95"。这一章拆解两大流派。
1. 任务定义
给定一张图, 输出多个 (类别, 边界框, 置信度) 三元组:
[
{"class": "cat", "box": [120, 80, 250, 200], "score": 0.95},
{"class": "dog", "box": [300, 150, 450, 320], "score": 0.88},
{"class": "person","box": [50, 30, 100, 280], "score": 0.92},
]
核心难点:
- 目标数量不固定: 一张图可能 0 个, 也可能 50 个
- 尺度差异大: 远处的小目标 + 近处的大目标
- 类别不平衡: 背景远多于前景
2. 评估指标
IoU (Intersection over Union)
预测框与真实框的交并比, 衡量定位精度:
IoU = 交集面积 / 并集面积
IoU > 0.5 通常算"检测正确"。
mAP (mean Average Precision)
工业界标准, 100 个类别平均:
- 按置信度排序所有预测
- 计算 Precision-Recall 曲线
- 曲线下面积 = AP
- 100 类 AP 平均 = mAP
COCO 数据集更严格: mAP@[0.5:0.95] (10 个 IoU 阈值平均)。
3. 两大流派
流派 A: 双阶段 (Two-stage) — 准而慢
先提议区域 (region proposal), 再分类 + 精修边界框。
R-CNN (2014)
里程碑, 但极慢 (53s/图):
- Selective Search 提议 ~2000 个候选框
- 每个候选框 resize 到 227×227, 过 CNN 提特征
- SVM 分类 + 回归精修边界框
Fast R-CNN (2015)
改进: 共享卷积特征, 不再每个候选独立过 CNN:
- 整图过 CNN 得到 feature map
- RoI Pooling 把每个候选框映射到 feature map, 提取固定大小特征
- 全连接层同时分类 + 回归
速度: 0.3s/图 (200x 加速)
Faster R-CNN (2015)
核心创新: RPN (Region Proposal Network) 替代 Selective Search:
- 整图过 CNN 得 feature map
- RPN 在 feature map 上滑窗, 用 anchor box 提议候选
- RoI Pooling + 分类 + 回归
速度: 0.2s/图, 端到端训练。
流派 B: 单阶段 (One-stage) — 快而稍粗
直接在 feature map 上分类 + 回归, 不分两步。
YOLO (You Only Look Once, 2016)
核心思想: 把图分成 S×S 网格, 每个格子直接预测:
- 每个格子预测 B 个边界框
- 每个框: (x, y, w, h, confidence) + C 个类别概率
- 单次 CNN 前向, 直接出结果
速度: 45 FPS (实时), mAP 略低于 Faster R-CNN
SSD (Single Shot MultiBox Detector, 2016)
多尺度特征图预测:
- 在不同层 feature map 上预测 (浅层检小目标, 深层检大目标)
- 默认框 (default box) 替代 anchor
- 速度 22 FPS, mAP 接近 Faster R-CNN
YOLOv5 / v8 (2020-2023, Ultralytics)
工业界事实标准:
- 速度快 (v8n 100+ FPS)
- 易用 (5 行代码训 + 部署)
- 多尺寸模型 (n/s/m/l/x)
- 自带数据增强 (Mosaic / MixUp)
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
model.train(data="coco128.yaml", epochs=100, imgsz=640)
results = model.predict("bus.jpg")
4. Anchor 机制详解
Faster R-CNN / SSD / YOLOv5 都用 anchor:
- 预定义 一组不同尺寸 / 长宽比的"参考框" (e.g. 9 种: 3 scale × 3 ratio)
- 每个位置预测相对于 anchor 的偏移 (dx, dy, dw, dh)
- 训练时把 GT 框分配给 IoU 最大的 anchor
Anchor-free 新趋势 (CenterNet / FCOS):
- 直接预测中心点 + 宽高
- 不用预设 anchor, 超参数少
- 简单但效果常与 anchor-based 持平
5. 实战:COCO 数据集训练 YOLOv8
# 安装
pip install ultralytics
# 准备数据 (COCO 格式: images + annotations)
data/
├── images/train2017/ *.jpg
├── images/val2017/ *.jpg
└── annotations/instances_train2017.json
from ultralytics import YOLO
model = YOLO("yolov8s.pt") # 预训练
model.train(
data="coco128.yaml", # 或自定义 yaml
epochs=100,
imgsz=640,
batch=16,
device=0,
)
metrics = model.val()
print(f"mAP50: {metrics.box.map50:.3f}, mAP50-95: {metrics.box.map:.3f}")
6. 进阶话题
- NMS (Non-Max Suppression): 重叠框去重, 留分数最高的
- FPN (Feature Pyramid Network): 多尺度融合, 提升小目标检测
- 数据增强: Mosaic (4 张拼 1 张) / Copy-Paste / 随机 HSV
- 损失函数: CIoU Loss (比 L1/L2 更稳) + Focal Loss (类别不平衡)
- 部署: TensorRT / ONNX / OpenVINO, 推理 100+ FPS
7. 模型选择指南
| 场景 | 推荐模型 |
|---|---|
| 实时视频 (>=30 FPS) | YOLOv8n/s, YOLOv10 |
| 高精度 (离线) | Faster R-CNN, DINO |
| 小目标多 | YOLOv8 + SAHI 切片推理 |
| 旋转 / 倾斜目标 | Oriented R-CNN, YOLOv8-OBB |
| 3D 检测 | PointPillars, CenterPoint |
总结
目标检测 = 分类 + 定位, 两大流派 (Two-stage 准 / One-stage 快)。当前工业界首选 YOLOv8 / v10, 精度 + 速度双优。
下一章图像分割, 我们看怎么把检测从"框"升级到"像素级"分类。
章末小测验
检验你对《目标检测:从 R-CNN 到 YOLO》的掌握程度。
Faster R-CNN 相比 Fast R-CNN 的核心改进是?
YOLO 系列最核心的创新是?
目标检测中的 NMS (Non-Max Suppression) 作用是?