Fast R-CNN(2015):开山鼻祖模型的进化,引入ROI Pooling

Fast R-CNN(2015):开山鼻祖模型的进化,引入ROI Pooling

导出时间:2025/11/23 20:25:46

1、Fast R-CNN的背景和动机

1.1、回顾 R-CNN 的问题(为什么需要改进?)

R-CNN 虽然在当年实现了“划时代的突破”,但用起来却非常笨重,有三个致命缺陷:
  1. 计算冗余,太慢 🐢
    • 一张图片里,R-CNN 要对大约 2000 个候选框,逐个送进 CNN。
    • 相当于把同一张图片重复计算 2000 次,效率极其低下。
    • 举个例子:在 PASCAL VOC 数据集上,R-CNN 处理一张图要 数十秒,几乎不能用在实际场景。
👉 就像工厂流水线上,每个零件都要从头重新加工一遍,完全没有复用效率。

  1. 训练复杂 😵
    • R-CNN 要分三步训练: ① 微调 CNN → ② 训练 SVM 分类器 → ③ 训练边界框回归器。
    • 各部分割裂,不能“端到端”一起优化。
👉 就像警察办案:一个部门只训练观察力,另一个部门只训练判断力,第三个部门只训练标尺对齐——最后要把三拨人凑一起,流程超级麻烦。

  1. 存储开销大 💾
    • R-CNN 会把每个候选框的 CNN 特征(4096 维)存到硬盘上。
    • 对大数据集来说,光存储就要几个百 GB。
👉 就像侦探调查时,要把每个嫌疑人的长篇报告都复印存档,资料室爆满。

1.2、Fast R-CNN 的动机(为什么提出它?)

Ross Girshick(R-CNN 的作者)在 2015 年提出 Fast R-CNN,主要是为了解决上述三大问题:
  1. 减少重复计算 → 加快速度
    • 能不能整张图只跑一次 CNN?
    • 得到特征图(feature map)之后,再从特征图上切出候选区域的特征,而不是每个候选框都重复跑 CNN。
    • 这样候选框共享卷积计算,速度直接提升几个数量级。

  1. 端到端训练 → 简化流程
    • 能不能把 CNN 特征提取、分类、边界框回归全都放进一个网络里,一次性训练?
    • Fast R-CNN 就这样做到了,把流程整合到一个统一的框架里。

  1. 丢掉大规模存储 → 内存友好
    • Fast R-CNN 不再保存中间的候选框特征,而是直接在 GPU 内存里计算和更新。
    • 避免了 R-CNN 那种“硬盘爆炸”的情况。

1.3、一句话总结背景与动机

  • 背景:R-CNN 解决了“深度学习能不能做检测”的问题,但它速度太慢、训练太复杂、存储太浪费。
  • 动机:Fast R-CNN 想要一个更高效、更简洁的目标检测框架:
    • (共享卷积特征)、
    • (端到端优化)、
    • (减少存储开销)。


2、 Fast R-CNN 的整体流程(对比 R-CNN)

image.png
  1. 整张图过一次“大型扫描仪”(Deep ConvNet)
  • 左边的图是一张输入图像(牛仔+马)。
  • 我们不再像 R-CNN 那样,把每个框单独送进 CNN 里算 2000 次。
  • Fast R-CNN 只需要 整张图过一次卷积神经网络,得到一张“特征地图”。
👉 类比:你进机场安检,不用每个人拆开检查 2000 次,而是直接让大家一起过安检门,扫描仪一次搞定。

  1. 把候选框投影到特征地图(RoI Projection)
  • 在原图里,传统算法(Selective Search)自动提前给我们画出一些“可疑区域”(比如红色方框框住牛仔)。
  • 我们把这些区域映射到“特征地图”上。
👉 类比:安检时,系统在扫描结果上用方框标出“可能有问题的地方”。

  1. RoI Pooling:把框“压缩成统一大小”
  • 不同的候选框大小不一样,有的大(整个牛仔+马),有的小(牛仔的脸)。
  • 但神经网络的全连接层要求输入大小必须固定。
  • RoI Pooling 就是一个“自动裁剪+压缩”的工具,把每个候选框都缩放成一样大小的“特征小方块”(比如 7×7)。
👉 类比:就像把大件行李、小件包裹都放进同样大小的托盘里,这样后面的机器才能统一处理。

  1. RoI 特征向量 → 全连接层(FCs)
  • RoI Pooling 得到固定大小的“特征小方块”,再展平成一个“特征向量”。
  • 送进全连接层,提取更高级的抽象信息。
👉 类比:安检员拿到托盘里的东西,做进一步精细分析。

  1. 两个结果输出:分类 + 框微调
  • Softmax 分类器:判断这个区域里是什么 → 是“人”?是“马”?还是背景?
  • BBox regressor(边界框回归器):对框的位置做微调,让方框更准确地贴合目标。
👉 类比:安检员最后结论:① 托盘里确实是“人”,② 重新画个更精确的红框,把人的范围标清楚。
方面
R-CNN
Fast R-CNN
相同点/不同点
优化的好处
候选框生成
使用 Selective Search(约 2000 个 RoI)
仍然使用 Selective Search(约 2000 个 RoI)
✅ 相同
——(候选框部分还未优化,等到 Faster R-CNN 才改进)
CNN 特征提取
每个候选框单独裁剪 → 输入 CNN 计算特征
整张图只过一次 CNN,得到共享特征图
❌ 不同
减少重复计算,大幅提升速度
候选框特征获取
直接裁剪图像区域送 CNN
在共享特征图上用 RoI Pooling 提取固定大小特征
❌ 不同
保证输入大小统一,计算更高效
分类器
用 SVM 分类
用 Softmax 分类
❌ 不同
整合进网络,避免额外训练步骤
边界框回归
单独训练一个线性回归器
融合进网络,多任务一起训练
❌ 不同
更精准,训练更简单
训练方式
分三步:① 微调 CNN ② 训练 SVM ③ 训练回归器
端到端,多任务联合训练(分类+回归一起优化)
❌ 不同
训练流程简化,更稳定
存储开销
需要存储每个候选框的特征(上百 GB)
不存储中间特征,直接在 GPU 里处理
❌ 不同
大幅降低存储需求
速度
非常慢(几十秒/张图)
快很多(几百毫秒/张图)
❌ 不同
更接近实际应用需求
精度
提升了传统方法,但受限于效率
精度相当甚至更好
❌ 不同
兼顾“更快”和“更准”


3、Fast R-CNN 仍然存在的缺陷

  1. 候选框(Region Proposals)生成太慢 🚶‍♂️
    • Fast R-CNN 虽然共享了卷积计算,但 候选框还是靠 Selective Search 生成
    • Selective Search 是一个“传统算法”,在 CPU 上运行,一张图大约要 2 秒钟。
    • 这成为整个系统的瓶颈:网络部分已经很快,但候选框生成拖后腿。
👉 类比:你安检时,X 光机(CNN)很快,但工作人员(Selective Search)手动在屏幕上画方框,速度还是很慢。

  1. 不是完全端到端 🔀
    • 候选框生成和后续网络(CNN+分类+回归)还是两个独立步骤。
    • 网络只能学“分类”和“微调”,但不会学“如何生成候选框”。
👉 类比:侦探自己能识别人,但还要依赖别人帮他先圈“嫌疑区域”,不能从头到尾独立完成。

  1. 候选框数量大 📦
    • 一张图 2000 个候选框,即使后面计算快了,数量依然庞大。
    • 很多候选框其实是“冗余”的(比如 10 个几乎重叠的框)。
👉 类比:机场安检抓了 2000 个嫌疑人来复查,虽然检查快了,但嫌疑人还是太多。

4、Faster R-CNN 的改进(核心创新:RPN)

Faster R-CNN 的关键在于:把候选框生成这一步,也交给 CNN 来做
候选框生成、分类、边界框回归,全部整合在一个网络里训练。
从 Fast R-CNN 的 秒级 → Faster R-CNN 的 百毫秒级,真正接近实时。