论文信息:

如果后面准备继续读 Fast R-CNNFaster R-CNN,那 R-CNN 其实是最适合先讲的一篇。
原因很简单:后面两篇很多“看起来理所当然”的设计,都是在解决 R-CNN 留下来的问题。

所以这篇文章,我们先不急着讲加速,而是先把最原始、也最关键的问题讲清楚:

R-CNN 到底做了什么,为什么它会成为深度学习目标检测时代的起点?

一、先看图:这张图已经把 R-CNN 讲明白了一大半

在这里插入图片描述

这张图非常经典,因为它把 R-CNN 的核心流程压缩成了 4 步:

  1. 输入一张图像
  2. 先提取大约 2000 个候选区域
  3. 把每个候选区域变形成固定大小,送进 CNN 提特征
  4. 对每个候选区域做分类

如果只用一句话概括 R-CNN,我会这样说:

R-CNN 的本质,就是“先找可能有物体的区域,再对每个区域单独用 CNN 提特征并分类”。

图中最值得注意的几个词分别是:

  • Extract region proposals (~2k):说明它不是直接在整张图上密集滑窗,而是先生成一批候选框
  • warped region:说明每个候选框都要被拉伸到 CNN 能接受的固定输入尺寸
  • Compute CNN features:说明 CNN 在这里主要扮演的是特征提取器
  • Classify regions:说明最终判断是对每个候选区域分别进行的

后面整篇文章,其实就是把这 4 步逐层展开。

二、R-CNN 出现之前,目标检测卡在哪里

R-CNN 这篇论文开头就说得很直接:在它出现之前,PASCAL VOC 上的目标检测性能已经好几年没有出现真正意义上的突破了。
当时最强的方法,大多是比较复杂的组合系统,依赖:

  • SIFT
  • HOG
  • 空间金字塔
  • 上下文重打分
  • 多模型集成

这些方法并不是完全无效,但问题在于:

它们越来越复杂,可性能提升却越来越有限。

R-CNN 作者的判断很明确:既然图像分类任务已经开始被深度卷积网络改写,那目标检测是不是也能借助 CNN 的高容量特征表示得到突破?

但目标检测和图像分类不一样。
分类只需要回答“这张图里有什么”,而检测还要回答“这个东西在哪儿”。
也正因为如此,作者需要同时解决两个问题:

  1. 怎么把 CNN 用到“定位”这件事上
  2. 检测数据集规模不大,怎么训练一个高容量 CNN

R-CNN 的贡献,本质上就是把这两个问题一起回答了。

三、R-CNN 最核心的创新是什么

R-CNN 的创新不是“发明了 CNN”,也不是“发明了候选框”。
它真正厉害的地方,在于把两种原本分开的思路接到了一起:

  • 用传统的 bottom-up 方法先生成候选区域
  • 用 CNN 为每个候选区域提取强特征

这一步在今天看起来很自然,但在 2014 年其实非常关键。
因为在那之前,目标检测的主流特征还主要是 HOG 一类手工特征,而 R-CNN 直接把高容量 CNN 特征引入了检测流程。

论文标题里的 Regions with CNN features,说的就是这件事。

你也可以把 R-CNN 的方法压缩成下面这条流水线:

输入图像
-> Selective Search 生成约 2000 个候选框
-> 每个候选框裁出来并 warp 到固定大小
-> 逐个送进 CNN
-> 提取 4096 维特征
-> 用类别专属的线性 SVM 做分类
-> 再做边界框回归优化位置

这就是 R-CNN 的完整主线。

四、第一步:为什么要先提取约 2000 个候选区域

从图里可以看到,R-CNN 并不是对整张图像直接做密集分类,而是先做:

Extract region proposals (~2k)

论文里使用的是 Selective Search,测试时采用它的 fast mode,每张图大约提取 2000 个候选区域。

为什么要这样做?

因为如果直接在整张图上暴力滑窗,会遇到两个问题:

  1. 位置太多
  2. 尺度和长宽比变化太大

而候选区域方法的作用,就是先把“哪里可能有物体”这个搜索空间缩小。
也就是说,R-CNN 不是让 CNN 去全图盲找目标,而是先请一个 proposal 算法告诉它:

你重点看这 2000 个地方就行。

这个设计在当时非常实用,因为它绕开了深层 CNN 直接做精细滑窗定位的困难。

Selective Search 大概是怎么把这 2000 个候选框提出来的

很多人第一次看到这里都会问一句:

2000 个候选区域不是人工手画的,那它到底是怎么来的?

R-CNN 里常用的 proposal 方法是 Selective Search
它不是深度学习方法,而是一种传统视觉算法。你可以把它理解成:

先把图像分成很多小区域,再把相邻且相似的区域一层层合并;每次合并得到的新区域,都可能对应一个候选目标。

在这里插入图片描述

结合这张图看会更直观:

  • 左边三层彩色区域表示不同粒度的分割结果。最下面块更碎,越往上区域越大。
  • 算法会优先合并颜色、纹理、大小更接近的相邻区域,于是小块逐渐组成更完整的物体区域。
  • 右边蓝色和绿色矩形框,就是把这些合并后的区域取外接框得到的 proposals。

所以 Selective Search 的重点不是“一步找到最准确的框”,而是:

尽量在不同尺度、不同层级上,把真实目标覆盖进去。

这也就是为什么 R-CNN 里会保留约 2000 个候选框。
proposal 阶段追求的是高召回,宁可多给一些,也尽量不要漏掉真正的目标。

五、第二步:为什么每个候选区域都要被 warp

图里第三步前面专门写了一个词:

warped region

这一步很重要,因为 CNN 的输入尺寸是固定的。
论文中使用的网络来自 Krizhevsky 等人的 CNN,也就是后来大家熟悉的 AlexNet 路线,它要求输入是固定大小的图像块。

可候选框本身的形状是五花八门的:

  • 有的大
  • 有的小
  • 有的偏长
  • 有的偏扁

所以作者的做法是:

不管原始候选框多大、多长,统一把它 warp 到固定输入尺寸,再送进 CNN。

论文中使用的是:

227 x 227 RGB

而且作者还会在原始框周围保留一定上下文,再一起 warp 进去。
这也是为什么图里不是直接把框原封不动送进 CNN,而是先经过一个 warped region 的步骤。

这一招非常直接,甚至可以说有点“粗暴”,但它当时很有效。
因为它让任意大小的候选框都能被统一送入一个固定结构的 CNN 中。

六、第三步:R-CNN 里的 CNN 到底在做什么

很多人第一次读 R-CNN 时,会以为 CNN 在这里已经是一个端到端检测器了。
其实还不是。

在 R-CNN 里,CNN 更像是一个非常强的特征提取器。

论文中作者会把每个候选区域送进 CNN,然后从高层全连接层提取一个固定长度的特征向量。
具体来说,论文提到使用的是:

4096 维特征

也就是说,R-CNN 并不是直接拿 CNN 的最终分类输出来当检测结果,而是:

  1. 对每个候选区域跑一次 CNN
  2. 取出中间高维特征
  3. 再交给后面的分类器去做判断

这一点很关键,因为它解释了 R-CNN 为什么叫 Regions with CNN features
它强调的重点不是“CNN 直接完成检测”,而是“CNN 为候选区域提供了比 HOG 更强的特征表示”。

七、第四步:为什么后面还要接 SVM 分类器

从今天的眼光看,很多人会问:
既然已经有 CNN 了,为什么不直接用 softmax 输出类别,还要再训练一套 SVM?

这恰恰说明 R-CNN 带有明显的时代特征。

R-CNN 的检测阶段不是一个完整的端到端网络,而是分成了几部分:

  • CNN 负责抽特征
  • SVM 负责分类
  • 边界框回归器负责位置修正

论文中,作者为每个类别训练一个线性 SVM。
也就是说,对于每个候选区域,系统会判断:

  • 它是不是飞机
  • 它是不是人
  • 它是不是电视

你看图最右边那部分:

aeroplane? no.
person? yes.
tvmonitor? no.

讲的就是这个过程。

所以从结构上说,R-CNN 其实不是一个“纯粹的一体化检测网络”,而是一个:

候选框 + CNN 特征 + SVM 分类器

的组合系统。

八、边界框回归又是在干什么

如果你只做分类,还会留下一个问题:

候选框虽然大致框住了目标,但位置往往不够准。

所以论文又加了一个非常关键的模块:

Bounding Box Regression

它的作用可以理解成一句大白话:

候选框已经大概找对了地方,但还不够贴边,那我再学一个小回归器,把框往更准确的位置挪一挪。

这一步带来的收益很明显。
论文在 VOC 2010 上报告:

  • R-CNN50.2% mAP
  • R-CNN + Bounding Box Regression53.7% mAP

也就是说,仅仅加上边界框回归,就提升了:

+3.5 mAP

这说明 R-CNN 的候选区域已经足够有价值,而边界框回归进一步修正了定位误差。

九、R-CNN 为什么需要 pre-training 和 fine-tuning

R-CNN 这篇论文还有一个非常重要的贡献,经常容易被初学者忽略:

它明确证明了“先在大数据集上预训练,再在目标检测数据集上微调”这一范式是有效的。

原因也很现实。
目标检测数据集的标注成本比分类高得多,所以当时 PASCAL VOC 的检测数据量并不足以从零训练一个高容量 CNN。

作者的解决思路是:

  1. 先在大规模分类数据集 ILSVRC 上做监督预训练
  2. 再到 PASCAL VOC 上做检测任务微调

论文中一个非常经典的数字是:

fine-tuning 在 VOC 2007 上带来了 +8.0 mAP 的提升,使性能达到 54.2% mAP

这个结论在今天看几乎已经是深度学习常识,但在当时是非常有影响力的。
它告诉大家:即使检测数据不够大,只要先有大规模分类预训练,再做任务微调,依然能把深层 CNN 成功带到检测任务里。

十、R-CNN 的训练流程,其实一点也不“端到端”

R-CNN 虽然开创了深度学习检测时代,但它的训练流程其实相当“分阶段”。

大致可以拆成下面几步:

第一步:在 ImageNet 上预训练 CNN

先学到一个通用的视觉特征提取器。

第二步:在 VOC 检测数据上 fine-tune CNN

让网络从“分类特征”转向更适合检测的“区域特征”。

第三步:提取所有候选区域特征,训练类别专属 SVM

每个类别一个线性分类器。

第四步:训练边界框回归器

进一步修正定位精度。

所以 R-CNN 并不是后面那种真正意义上的端到端检测器。
它是一个多阶段训练、多模块拼接的系统。

这一点非常重要,因为后面的 Fast R-CNNFaster R-CNN,本质上都在试图解决这种流程过于笨重的问题。

十一、R-CNN 到底强在哪里

如果只从今天的角度看,R-CNN 当然不算快,也不算优雅。
但如果回到 2014 年,它的效果是非常震撼的。

论文中给出了几组很有代表性的结果。

1. 在 VOC 2012 上

论文摘要中提到,R-CNN 在 VOC 2012 上达到:

53.3% mAP

并且相对之前最好的结果实现了超过 30% 的相对提升。

2. 在 VOC 2010 上

使用边界框回归之后,R-CNN 达到:

53.7% mAP

而对比方法中:

  • UVA35.1% mAP
  • DPM v533.4% mAP

这说明 R-CNN 相比当时强基线已经不是“小幅领先”,而是明显拉开了差距。

3. 在 VOC 2007 上

论文表 2 中,经过 fine-tuning 并加入边界框回归后,R-CNN 达到:

58.5% mAP

同时作者还专门做了消融实验,证明:

  • fine-tuning 非常重要
  • 高层 CNN 特征明显优于传统 HOG 系方法
  • Bounding Box Regression 对定位精度有直接帮助

十二、R-CNN 最大的问题是什么

R-CNN 很强,但它也很慢。
而且它的“慢”不是一点点慢,而是结构性地慢。

问题主要出在这里:

每一个候选区域,都要单独跑一遍 CNN。

如果一张图有大约 2000 个候选框,那就意味着:

  • 同一张图的重叠区域会被重复计算很多次
  • 卷积特征无法在 proposal 之间共享

论文里提到,region proposal 和 feature 计算的耗时大约是:

13s / image on GPU
53s / image on CPU

这在今天当然是完全无法接受的。
但更重要的是,它暴露出了一个后续研究方向:

既然大部分候选框都来自同一张图,为什么不先对整张图做一次卷积,再共享特征?

这正是 Fast R-CNN 后来要解决的问题。

除了速度慢,R-CNN 还有两个明显缺点:

  • 训练流程分很多步,不够端到端
  • 特征需要提前缓存到磁盘,工程流程比较重

所以 R-CNN 的历史意义,不在于它已经完美,而在于它第一次真正把“候选区域 + CNN 特征”这条路线跑通了。

十三、为什么说 R-CNN 是后面两篇论文的起点

如果你准备继续读 Fast R-CNNFaster R-CNN,那 R-CNN 的价值会更明显。

因为后面两篇论文几乎都在回答 R-CNN 留下来的问题:

R-CNN 做对了什么

  • 它证明了 CNN 特征对检测非常有效
  • 它把候选区域检测路线和深度网络结合起来
  • 它建立了 two-stage detection 的早期雏形

R-CNN 做得不够好的地方

  • 每个候选框单独跑 CNN,太慢
  • 训练流程复杂,不够统一
  • proposal 依赖外部算法

于是后面的演化就很自然了:

  • Fast R-CNN:解决“每个 proposal 单独跑 CNN 太慢”的问题
  • Faster R-CNN:进一步解决“proposal 还依赖外部算法”的问题

所以如果把这三篇论文串起来看,你会发现它们其实是一条非常清晰的技术演进路线。

十四、小结:用一句话记住 R-CNN

如果让我用一句话总结这篇论文,我会这样说:

R-CNN 的关键意义,在于它首次系统地把候选区域方法和高容量 CNN 特征结合起来,显著提升了目标检测精度,同时也为后续 Fast R-CNN 和 Faster R-CNN 指明了该往哪里继续优化。

下一篇如果继续顺着这条线读,就非常适合讲 Fast R-CNN
因为读完 R-CNN 之后,读者脑子里自然会冒出一个问题:

候选框一个一个送进 CNN,真的太慢了,能不能整张图只卷积一次?

这正是 Fast R-CNN 出场的地方。

参考文献

  • Girshick, R., Donahue, J., Darrell, T., & Malik, J. (2014). Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation. CVPR 2014.

更多推荐