跳到主要内容

经典检测架构

本节定位

经典检测架构最值得学的不是“模型名”,而是它们一路在解决同一个问题:

怎么在保证检测质量的同时,把检测速度提上来。

R-CNN 家族的发展史,本质上就是“把重复计算越来越多地省掉”的历史。

学习目标

  • 理解 R-CNN 家族为什么重要
  • 理解 region proposal 在检测早期路线中的作用
  • 理解 Fast / Faster R-CNN 分别优化了哪一层瓶颈
  • 建立两阶段检测器的核心直觉

一、R-CNN 系列在做什么?

1.1 基本套路

两阶段检测的典型思路是:

  1. 先提出候选区域
  2. 再对候选区域做分类和框回归

1.2 为什么会这样设计?

因为直接在整张图上同时找所有目标并不容易。
先缩小到“可能有目标的区域”,会更自然。

1.3 一个类比

就像先在地图上圈出“可能有店铺的街区”,
再逐个街区判断是哪种店。


二、三代经典架构各自补了什么?

2.1 R-CNN

优点:

  • 思路清楚

缺点:

  • 每个候选框都要单独跑一次特征提取
  • 非常慢

2.2 Fast R-CNN

优化点:

  • 整张图只提一次卷积特征
  • 候选框在共享特征图上裁切

收益:

  • 速度明显提升

2.3 Faster R-CNN

优化点:

  • 连候选区域提议也交给网络自己学

收益:

  • 把 region proposal 也纳入端到端学习

三、先看一个“共享特征 vs 重复计算”的小示例

proposals = ["box1", "box2", "box3", "box4"]


def rcNN_style_cost(num_proposals):
# 每个 proposal 都单独提特征
return num_proposals * 10


def fast_rcnn_style_cost(num_proposals):
# 整图提一次特征 + proposal 裁切
return 10 + num_proposals * 2


for n in [1, 4, 16]:
print(
{
"proposals": n,
"rcnn_cost": rcNN_style_cost(n),
"fast_rcnn_cost": fast_rcnn_style_cost(n),
}
)

3.1 这个例子最想表达什么?

Fast R-CNN 这类改进的核心并不是“更神奇”,
而是:

  • 共享计算

这正是检测模型效率演进的主线之一。


四、两阶段检测器今天还有价值吗?

当然有。
它们通常在:

  • 精细检测
  • 高质量框定位
  • 小目标和复杂场景

里仍然很有竞争力。

只不过在很多实时场景里,
YOLO 一类单阶段方法更常见。


五、最常见误区

5.1 误区一:经典检测架构已经没必要学

不对。
它们很适合理解检测问题是怎样被系统拆开的。

5.2 误区二:两阶段就一定更慢且毫无价值

很多时候它仍然在质量上有优势。

5.3 误区三:Faster R-CNN 只是更快一点

它更重要的是把候选区域生成纳入了可学习体系。


小结

这节最重要的是建立一个演进判断:

R-CNN 家族的发展,本质上是在不断减少重复计算,把检测从“能做”推进到“更高效地做”。

只要这点看清楚,后面你再学 YOLO,就会更容易比较两条路线的取舍。


练习

  1. 想一想:为什么共享特征图会显著降低检测成本?
  2. 用自己的话解释:Faster R-CNN 比 Fast R-CNN 多解决了哪一步问题?
  3. 什么时候你会更偏向两阶段检测器?
  4. 为什么经典架构对理解检测任务仍然有价值?