经典检测架构
本节定位
经典检测架构最值得学的不是“模型名”,而是它们一路在解决同一个问题:
怎么在保证检测质量的同时,把检测速度提上来。
R-CNN 家族的发展史,本质上就是“把重复计算越来越多地省掉”的历史。
学习目标
- 理解 R-CNN 家族为什么重要
- 理解 region proposal 在检测早期路线中的作用
- 理解 Fast / Faster R-CNN 分别优化了哪一层瓶颈
- 建立两阶段检测器的核心直觉
一、R-CNN 系列在做什么?
1.1 基本套路
两阶段检测的典型思路是:
- 先提出候选区域
- 再对候选区域做分类和框回归
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,就会更容易比较两条路线的取舍。
练习
- 想一想:为什么共享特征图会显著降低检测成本?
- 用自己的话解释:Faster R-CNN 比 Fast R-CNN 多解决了哪一步问题?
- 什么时候你会更偏向两阶段检测器?
- 为什么经典架构对理解检测任务仍然有价值?