目标检测发展史:从 R-CNN 到 YOLO 的演进

目标检测(Object Detection)是计算机视觉的核心任务之一,近十年发展迅速。本文梳理从传统方法到深度学习时代的演进脉络,帮助理解各阶段的核心技术突破。

传统目标检测方法

Viola-Jones 检测器

2001 年提出的 Viola-Jones 是第一个真正实用的人脸检测算法:

1
2
3
4
5
6
# 核心思想:Haar 特征 + AdaBoost + 级联分类器
# 特征提取:Haar-like 特征
# 分类器:AdaBoost 强分类器级联

# 优点:速度快,可以实时检测
# 缺点:只适合人脸这种规则目标,泛化能力差

核心组件:

  1. Haar 特征:类似卷积核,计算黑白区域像素和的差异
  2. Integral Image:快速计算任意矩形区域像素和
  3. AdaBoost:选择少量关键特征,训练强分类器
  4. 级联结构:快速过滤背景,减少计算量

HOG + SVM

Histogram of Oriented Gradients (HOG) + SVM 是早期行人检测的主流方法:

1
2
3
4
5
6
7
8
9
10
# 特征:HOG 描述子
# - 将图像划分为 cells
# - 计算每个 cell 的梯度方向直方图
# - 归一化后得到特征向量
# 分类器:SVM (Support Vector Machine)

# 滑动窗口检测:多尺度扫描
# - 金字塔多尺度变换
# - 每个窗口提取 HOG 特征
# - SVM 分类

问题

  • 特征工程复杂,需要人工设计
  • 滑动窗口计算量大
  • 泛化能力差,换个类别需要重新设计特征

两阶段检测器(Two-Stage)

R-CNN:开创深度学习检测时代

2014 年 Ross Girshick 提出 R-CNN,将深度学习引入目标检测:

1
2
3
4
5
6
7
候选区域生成 → 特征提取 → 分类 + 边界框回归

流程:
1. Selective Search 生成 ~2000 个候选区域
2. 每个区域 warp/crop 后送入 CNN (AlexNet)
3. CNN 特征送入 SVM 分类
4. 边界框回归精修

缺点

  • 候选区域独立送入 CNN,重复计算
  • 训练流程复杂(多阶段)
  • 检测速度慢(GPU 上 ~47 fps/f,但一张图要几十秒)

SPPNet:空间金字塔池化

SPPNet 的核心贡献是 Spatial Pyramid Pooling

1
2
3
4
5
6
7
8
9
10
# 问题:CNN 需要固定尺寸输入
# 解决:SPP 层

# SPP 原理:
# - 将特征图划分为不同尺度的网格
# - 每个网格做 max pooling
# - 拼接所有尺度的特征

# 优势:只对整张图做一次 CNN 前向
# 候选区域通过 Spatial Pooling 获取特征

Fast R-CNN:端到端训练

Fast R-CNN 实现了真正的端到端训练:

1
2
3
4
5
6
7
8
9
10
11
12
# 创新点:
# 1. ROI Pooling(后改为 ROI Align)
# 2. 多任务损失:分类 Loss + 边界框回归 Loss
# 3. 共享特征图

# ROI Pooling 问题:
# - 两次量化误差
# - 特征与原图不对齐

# Fast R-CNN 速度:
# 训练比 R-CNN 快 9 倍
# 检测快 213 倍(GPU)

Faster R-CNN:区域提议网络

Faster R-CNN 的核心创新是 **Region Proposal Network (RPN)**:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
整体结构:
┌─────────────┐
│ Backbone │ (VGG/ResNet 特征提取)
└──────┬──────┘

┌──────▼──────┐
│ RPN │ (区域提议网络,替代 SS)
└──────┬──────┘

┌──────▼──────┐
│ ROI Pooling │
└──────┬──────┘

┌──────▼──────┐
│ Classifier │ (分类 + 边界框回归)
└─────────────┘

RPN 核心

1
2
3
4
5
6
7
# RPN 是一个全卷积网络
# 输入:特征图
# 输出:多个 Anchor 的前景/背景概率 + 边界框偏移

# Anchor:预设的参考框
# - 3 种尺度 × 3 种比例 = 9 个 Anchor
# - 每个位置预测 9 个候选区域

Faster R-CNN 实现了 完全端到端 的检测框架,是两阶段检测的巅峰。

单阶段检测器(One-Stage)

YOLOv1:回归思想的突破

2016 年 Joseph Redmon 提出 YOLO,将检测视为回归问题

1
2
3
4
5
6
7
8
9
10
11
12
# YOLOv1 核心思想:
# - 将图像划分为 7×7 网格
# - 每个网格预测 2 个边界框
# - 每个边界框包含:x, y, w, h, confidence
# - 每个网格预测类别概率

# 输出张量:7×7×(5×2 + 20) = 7×7×30

# 损失函数:多任务损失
# - 坐标回归 Loss
# - 置信度 Loss(前景/背景)
# - 分类 Loss

优势

  • 速度快(45 fps,fast 版本 155 fps)
  • 端到端,简洁高效

问题

  • 小目标检测效果差
  • 网格划分粗糙,定位精度低
  • 召回率低

SSD:多尺度特征图检测

SSD (Single Shot MultiBox Detector) 结合了多尺度思想:

1
2
3
4
5
6
7
8
9
10
11
12
# 核心改进:
# - 利用多个不同尺度的特征图检测
# - 低层特征图检测小目标
# - 高层特征图检测大目标

# Default Box (Anchor):
# - 每个位置设置多个不同尺度的 Anchor
# - 6 种尺度(vgg16 版)+ 6 种比例

# 训练策略:
# - Hard Negative Mining:负样本过多时只选高置信度负样本
# - Data Augmentation:随机裁剪、缩放

YOLOv2:改进与增强

YOLOv2 在 v1 基础上做了大量改进:

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 骨干网络:Darknet-19
# - 引入 Batch Normalization
# - 用 1×1 卷积压缩特征

# 2. Anchor Box(借鉴 Faster R-CNN)
# - 使用 K-Means 聚类得到 5 种 Anchor
# - 预测相对于 Anchor 的偏移量

# 3. 改进:
# - 多尺度训练(不同 epoch 用不同输入尺寸)
# - Pass-through Layer(细粒度特征)
# - 更好的损失函数(IoU Loss)

YOLOv3:多尺度预测

YOLOv3 引入 FPN(Feature Pyramid Network):

1
2
3
4
5
6
7
8
9
10
11
# 骨干网络:Darknet-53
# - 53 层卷积网络
# - 残差连接

# 多尺度预测:
# - 3 个不同尺度的特征图
# - 大尺度(13×13):检测大目标
# - 中尺度(26×26):检测中目标
# - 小尺度(52×52):检测小目标

# 类别预测:独立 logistic 激活(支持多标签)

RetinaNet 与 Focal Loss

单阶段检测器面临 类别不平衡 问题,Focal Loss 解决了这个痛点:

1
2
3
4
5
6
7
8
9
10
11
12
# Cross Entropy:
# CE(p, y) = -log(p) if y=1
# CE(p, y) = -log(1-p) otherwise

# Focal Loss:
# FL(p, y) = -α(1-p)^γ * log(p) if y=1
# FL(p, y) = -(1-α)p^γ * log(1-p) otherwise

# 核心思想:
# - 置信度高的样本权重降低
# - 难分类样本权重增加
# - γ=2 时,简单样本贡献减少 96%

Anchor-free 流派

FCOS:全卷积一阶段检测

2019 年提出的 FCOS 真正实现了 Anchor-free

1
2
3
4
5
6
7
8
9
10
11
12
# 核心思想:
# - 每个点预测一个边界框
# - 用 center-ness 过滤低质量预测

# 与 Anchor-based 对比:
# - Anchor-based:预设 Anchor,在 Anchor 上预测偏移
# - Anchor-free:直接预测到边界框的距离

# Center-ness:
# - 计算特征点到真实框中心的距离
# - 中心点处为 1,边缘处接近 0
# - 用 center-ness 加权分类分数,过滤边缘预测

CenterNet:关键点检测思路

CenterNet 将检测转化为关键点检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 核心思想:
# - 检测目标的中心点
# - 中心点的热力图峰值就是目标中心
# - 通过中心点回归目标的宽高

# Heatmap:
# - 每个类别一张热力图
# - 真实中心点处为 1,向外扩散衰减

# 输出:Keypoint Heatmap + Size Offset + Offset

# 优势:
# - 简单,Anchor-free
# - 速度很快
# - 容易扩展到其他任务(3D 检测、姿态估计)

YOLOX:YOLO 的 Anchor-free 升级

YOLOX 将 YOLO 带入 Anchor-free 时代:

1
2
3
4
5
6
7
8
9
10
11
12
# 2021 年,旷视科技提出 YOLOX

# 主要改进:
# 1. Anchor-free(去掉预设 Anchor)
# 2. Decoupled Head(分类和回归解耦)
# 3. SimOTA(动态匹配正负样本)
# 4. Strong augmentation (YOLOX-Darknet)

# Decoupled Head:
# - 分类和回归分支分开
# - 收敛更快
# - 精度更高

Transformer 时代

DETR:端到端检测新范式

2020 年 Facebook 提出 DETR:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 核心创新:
# - 使用 Transformer Encoder-Decoder
# - 去掉 NMS 后处理
# - 真正端到端

# 结构:
# - CNN Backbone 提取特征
# - Transformer Encoder:全局注意力
# - Transformer Decoder:查询目标
# - FFN:输出分类和边界框

# 训练:
# - Hungarian Matching 匹配预测和真实框
# - 需要更长训练时间

RT-DETR:实时 DETR

RT-DERT 是百度提出的实时检测 Transformer:

1
2
3
4
5
6
7
8
# 创新点:
# - 混合 Encoder:高效注意力机制
# - IoU-aware Query Selection
# - 实时性能(比 YOLOv8 更快)

# Encoder 优化:
# - AIFI(Adaptive Interface Feature Interaction)
# - CCFF(CSP-Conv/FFN)

总结

目标检测发展脉络:

阶段 方法 代表模型 特点
传统 HOG+SVM DPM 特征人工设计,速度慢
两阶段 CNN+候选区 R-CNN → Faster R-CNN 精度高,速度慢
单阶段 回归 YOLO、SSD 速度快,精度略低
Anchor-free 关键点 FCOS、CenterNet 简单,无 Anchor
Transformer Attention DETR、RT-DETR 全局感知,训练难

趋势

  1. 从 Anchor 到 Anchor-free
  2. 从两阶段到单阶段
  3. 从 CNN 到 Transformer
  4. 精度与速度的持续平衡