ML 学习站
跳到正文

目标检测:从 R-CNN 到 YOLO

双阶段 vs 单阶段, anchor 机制, YOLOv8 5 行上手。

50 分钟3 / 42,635
加载中...

本章深入探讨了目标检测从 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 个类别平均:

  1. 按置信度排序所有预测
  2. 计算 Precision-Recall 曲线
  3. 曲线下面积 = AP
  4. 100 类 AP 平均 = mAP

COCO 数据集更严格: mAP@[0.5:0.95] (10 个 IoU 阈值平均)。

3. 两大流派

流派 A: 双阶段 (Two-stage) — 准而慢

先提议区域 (region proposal), 再分类 + 精修边界框

R-CNN (2014)

里程碑, 但极慢 (53s/图):

  1. Selective Search 提议 ~2000 个候选框
  2. 每个候选框 resize 到 227×227, 过 CNN 提特征
  3. SVM 分类 + 回归精修边界框

Fast R-CNN (2015)

改进: 共享卷积特征, 不再每个候选独立过 CNN:

  1. 整图过 CNN 得到 feature map
  2. RoI Pooling 把每个候选框映射到 feature map, 提取固定大小特征
  3. 全连接层同时分类 + 回归

速度: 0.3s/图 (200x 加速)

Faster R-CNN (2015)

核心创新: RPN (Region Proposal Network) 替代 Selective Search:

  1. 整图过 CNN 得 feature map
  2. RPN 在 feature map 上滑窗, 用 anchor box 提议候选
  3. 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》的掌握程度。

1

Faster R-CNN 相比 Fast R-CNN 的核心改进是?

2

YOLO 系列最核心的创新是?

3

目标检测中的 NMS (Non-Max Suppression) 作用是?

讨论区(0)

加载评论中...