☰
R-CNN 家族发展史:从“扫街 47 秒”到“一眼定位”,一张图看懂目标检测的进化论
2026/9/30 2:23:38 网站建设 项目流程

R-CNN 家族发展史:从“扫街 47 秒”到“一眼定位”,一张图看懂目标检测的进化论

📍系列路标|本系列共 7 篇,按“原理演进 → 逐篇拆解 → 流派对比 → 代码与选型”编排:

  1. ✅第 1 篇|R-CNN 发展史(本篇)——四代模型因何而生、各解决了什么问题。
  2. ⏳第 2 篇|R-CNN 拆解——从一张图片出发,走完“先猜后认”的完整流程。
  3. ⏳第 3 篇|Fast R-CNN 拆解——RoI Pooling 如何把 47 秒压到 0.3 秒。
  4. ⏳第 4 篇|Faster R-CNN 拆解——RPN 如何让网络自己学会“找框”。
  5. ⏳第 5 篇|Mask R-CNN 拆解——从“框住”到“像素级抠图”的最后一公里。
  6. ⏳第 6 篇|R-CNN vs YOLO——两阶段与单阶段,谁快谁准谁更适合你。
  7. ⏳第 7 篇|手撕代码与工业选型——从零实现一个检测器 + 真实项目里到底选谁。

一、背景:目标检测这么难,凭什么 R-CNN 能破局?

1.1 先统一认知:到底什么叫“目标检测”?

图 1|目标检测要同时回答两个问题:它是什么 + 它在哪里(示意场景为简单几何图形,非真实照片)

🤔 怎么读这张图?左边是“人”的视角:0.2 秒就看明白“天上有太阳、草地有房子和树”;右边是“机器”必须交出的答题卡:把每个目标用一个虚线框圈起来,再写上类别和置信度(有多大把握)。

  • 一张 224×224 的普通照片,对电脑来说只是约 15 万个颜色数字(224×224×3)——它一开始根本不知道“太阳”长什么样;
  • 目标检测 =分类(这是什么)+定位(用一个框圈住,框 = x、y、宽、高四个数字);
  • 难点在于:物体有大有小、有歪有斜、会被遮挡,背景里还藏着无数“长得像物体”的东西,想“圈得又准又全”非常难。

1.2 2014 年之前:传统方法的两座大山

在深度学习登场前,检测界的老大是DPM(一种基于 HOG 手工特征的模型),它已经是“人肉设计特征”这条路的极限(2010 年 VOC 数据集约 33.4% mAP),此后几乎寸步难进。它有两大致命软肋:

  1. 不知道该去哪找:只能“滑窗”——让一个窗口从左上角挪到右下角,还要换好几档大小反复扫,像在草原上地毯式找一根针;
  2. 认不出抽象特征:HOG 这类特征是人写死的(统计梯度方向),换个光照、姿势、背景,效果立刻崩盘。

而 2012 年,AlexNet 在图像分类大赛上碾压全场——电脑的“眼睛”诞生了。大家马上想:能不能让这双眼睛也学会“找东西”?于是 2014 年,R-CNN 出场:它把“先猜东西大概在哪(Region),再用CNN仔细看”这套思路拼成了一个大杀器,一举拉开“深度学习目标检测”的序幕。

1.3 为什么不能把“分类网络”直接拿来做检测?

这是理解整个家族最重要的问题。分类网络输入一张整图、输出“这是什么”;而检测要求位置必须对准。直接把分类网络搬过来会处处碰壁:

  • 分类只关心“有没有猫”,不关心“猫占哪几格像素”,网络天然会把位置信息一点点“抹平”;
  • 于是 R-CNN 家族共用一个反直觉但极其有效的思路:化整为零——先把图切成一个个候选区域,再逐个判断“这里面是什么、框要不要修一下”。

二、发展史总览:四代模型,一代修一个“硬伤”

先看全景图,再逐代细讲:

图 2|R-CNN 家族进化时间轴:绿卡 = 本代核心升级,红卡 = 留给下一代的“新问题”

🤔 怎么读这张图?从下往上读:时间轴上依次排开四代模型,每代头顶一张绿卡(它干了什么大事)和一张红卡(它留下了什么麻烦)。你会发现一条铁律——每一代都在修上一代最痛的地方,同时必然留下一个新的小坑:

  • 第 1 代 R-CNN:把深度学习带进检测,可“一张图 47 秒”直接劝退所有人;
  • 第 2 代 Fast R-CNN:共享卷积、提速 146 倍,可“找候选框”还卡在 CPU 上;
  • 第 3 代 Faster R-CNN:连“找框”也训练成网络,真正端到端、每秒 5 帧;
  • 第 4 代 Mask R-CNN:让网络不但“框住”,还能“逐像素抠出”物体轮廓。

这就像盖房子:打好地基嫌墙砌得慢,就换预制框架;框架搭好又嫌窗户漏风,再换密封条……这种“瓶颈驱动”的演进,正是许多算法家族共同的成长模式。


三、逐代拆解:每一代升级了什么?解决了什么?为什么必须升级?

先记住下面这张“流水线对比图”,后面每一节的内容都能在图上找到对应的一行:

图 3|四代模型的内部流水线对比:灰 = 输入图片;黄 = 仍需外部 CPU 的传统环节;蓝 = 深度学习自己干的活;绿 = 输出

🤔 怎么读这张图?四行分别画了四代模型“从图到框”的处理流程。黄色越少,说明越不需要外部工具;蓝色越多,说明网络自己越全能。请注意第一、二代里刺眼的“黄色环节”,再看第三代它如何消失——这个家族的进化方向,就是“把一切交给网络”。

3.1 第 1 代:R-CNN(2014,CVPR)——把 CNN 第一次搬进目标检测

对应上图第 1 行。思路一句话:先猜后认,分三步走:

  1. 猜位置:用传统算法 Selective Search 把一张图切出约2000 个“可能是物体”的候选框(CPU 上完成);
  2. 看内容:把每个候选框缩放成统一尺寸,分别送进 CNN 提特征——注意,每个框都要完整跑一遍网络;
  3. 下结论:用 SVM 判断“这是什么类别”,再用一个回归器把框“修得更加贴边”。

它解决了什么?这是史上第一次用 CNN 做检测:在 VOC2010 上把 mAP 从传统巅峰 DPM 的 33.4% 直接拉到53.7%——一口气涨了约 20 个百分点。从这一刻起,深度学习正式接管目标检测。

为什么必须升级?因为它的“准”是拿“笨”换来的,痛点肉眼可见:

R-CNN 的三大痛点有多痛
推理极慢一张图约47 秒:约 2000 个候选框 × 每框一遍完整 CNN
训练繁琐要分三段训练(预训练 → 微调 CNN → 训 SVM → 训回归器),合计约84 小时
存储爆炸每个候选框的特征要先存盘,几百 GB 磁盘都装不下

3.2 第 2 代:Fast R-CNN(2015,ICCV)——让 2000 个候选框“拼车”共享一次卷积

对应上图第 2 行。上一代的痛点是“重复计算”,这一代的解法是四个字:共享特征。

  1. 整张图只过一次 CNN,得到一张“全图特征图”;
  2. 引入RoI Pooling:候选框不再自己跑 CNN,而是拿着坐标,直接从特征图上“抠”出自己那块区域的特征;
  3. 分类和框回归塞进同一个网络一起学——训练从“三段式”变成“一步到位”。

升级成果:

  • 速度:测试约0.32 秒/张(网络部分),比 R-CNN 快146 倍(再做一层 SVD 压缩可到 213 倍);
  • 训练:84 小时 →9.5 小时,而且再也不需要几百 GB 的特征缓存;
  • 精度:VOC2007 mAP 从 66.0% 升到70.0%(07+12 联合训练数据)——又准又快。

为什么必须升级?47 秒一张图,连做研究都嫌慢,更别说落地。但 Fast R-CNN 自己也留了个大尾巴:候选框还得靠 CPU 上的 Selective Search 现场猜,每张图要花 1.5~2 秒,占了系统总耗时的大头。于是——“找框”,成了新的瓶颈。

3.3 第 3 代:Faster R-CNN(2015,NIPS)——连“找框”也学会:RPN 登场

对应上图第 3 行。请重点看:这一行的黄色环节消失了。

上一代把“认框”做到了极致,系统里最慢的只剩“找框”。Faster R-CNN 的答案很绝:干脆把“找框”也训练成一个神经网络——RPN(区域建议网络):

  • RPN 在特征图的每个位置上预置一些大小、长宽比不同的anchor(锚框),一边判断“这个框里有没有物体”,一边修正“框该多大、往哪挪”;
  • RPN 与检测网络共享卷积特征,“找框”的成本从 CPU 的约 2 秒降到 GPU 的约 10 毫秒;
  • 最终串成RPN(猜在哪)→ RoI Pooling(抠特征)→ 分类+回归(认是什么),这就是后来所有“两阶段检测器”沿用至今的教科书范式。

升级成果:

  • 速度:全流程198ms/张 ≈ 5fps(VGG16,找框识别一把抓;换轻量 ZF 网络可达 17fps),对比 R-CNN 快了约240 倍;
  • 精度:VOC2007 mAP 升到73.2%(07+12),比“Fast R-CNN + CPU 选框”还高;
  • 江湖地位:COCO / ILSVRC2015 年竞赛多个冠军方案的地基。

为什么必须升级?升级之前,检测系统是“一头(识别)坐火箭、一头(找框)赶牛车”——只要找框还在 CPU 上爬,系统就永远到不了实时。RPN 把找框并进网络后,检测第一次变成纯 GPU、端到端、接近实时的完整系统。

3.4 第 4 代:Mask R-CNN(2017,ICCV)——从“框住”到“像素级抠出来”

对应上图第 4 行。Faster R-CNN 已经“既快又准”,但它的输出只有框:框住一只长颈鹿,你知道它大致在哪,却不知道四肢的轮廓。Mask R-CNN 把任务再升一级,做起实例分割(给每个物体输出逐像素的轮廓):

  • 加分支:在“分类+回归”旁边,并行加一条Mask 分支,逐像素判断“这个像素属不属于该物体”;
  • 修 bug:原 RoI Pooling 取特征时会“四舍五入”,造成像素对不齐——画框无所谓,画轮廓就是灾难。作者提出RoIAlign,用插值消除错位,论文里 mask 精度因此提升约 10%~50%;
  • 结果:检测(框)+实例分割(轮廓)双输出,速度仍约 5fps,只比 Faster R-CNN 多一点点开销;顺手还能做人体的关键点检测。

它有多成功?ICCV 2017 最佳论文;以单模型就超越了 COCO 2016 实例分割挑战赛冠军(对方还堆了多尺度、OHEM 等全套技巧),检测、分割、关键点三条赛道通吃。

它留下的“作业”:任务越精细,对算力、数据、标注的要求越高;同时,“先框后认”这套两阶段流程虽然准,却把速度的上限留给了另一条路线——不依赖候选框、单次前向直出结果的单阶段检测器(如 YOLO)。

3.5 成绩单 & “为什么必须升级”的本质

把四代的公开数据摆在一起看(数值引自各论文,GPU 与测试环境略有差异,请只看数量级和趋势):

图 4|R-CNN 家族的“成绩单”:左 = 每张图的处理时间(对数坐标,越短越快);右 = VOC2007 检测精度(越高越准)

🤔 怎么读这张图?左边那根孤零零顶到天的大红柱是 R-CNN 的 47 秒;到 Faster R-CNN 只剩约 0.2 秒——快了约 240 倍。与此同时,右边的精度柱还一路走高:66.0% → 70.0% → 73.2%,又快又准。这正是这个家族最迷人的地方:升级不是为了牺牲,而是双赢。

把四代串起来,就是一条完整的“瓶颈驱动进化”链:

手工特征精度见顶 →(痛点)深度学习进场做检测(R-CNN),但重复计算太慢
→(痛点)共享卷积提速 146 倍(Fast R-CNN),但 CPU 找框成了新瓶颈
→(痛点)RPN 端到端、5fps(Faster R-CNN),但只会给“框”
→(痛点)Mask 分支 + RoIAlign,像素级输出(Mask R-CNN)

所以,为什么“必须”一代代升级?因为每一代的新能力,都会立刻暴露新的短板:不够快就没法用,不能端到端就不好训,只会给框就满足不了越来越细的需求。技术的演进从来不是“想升级就升级”,而是问题一步一步逼出来的。


四、结尾:一张表看全整个家族

4.1 家族全览表

模型年份(会议)一句话核心创新每张图耗时(GPU)VOC2007 mAP留给下一代的问题
R-CNN2014(CVPR)CNN + 候选区域:深度学习首次做检测约 47 秒66.0%太慢、训练繁琐、存储爆炸
Fast R-CNN2015(ICCV)整图共享卷积 + RoI Pooling,单网络多任务约 0.32 秒(网络部分)70.0%(07+12)找候选框还在 CPU(约 2 秒)
Faster R-CNN2015(NIPS)RPN 让网络自己找框,纯 GPU 端到端约 0.198 秒(5fps)73.2%(07+12)只会给“框”,给不了轮廓
Mask R-CNN2017(ICCV)并行 Mask 分支 + RoIAlign:像素级输出约 0.2 秒(5fps)—(转战 COCO)更吃算力数据,单阶段流派登场

📌 注:数值均引自各论文公开结果,统一使用 VGG16(Mask R-CNN 为 ResNet-101-FPN);Fast / Faster 的 70.0% / 73.2% 使用 VOC07+12 联合训练,R-CNN 的 66.0% 为 VOC07 训练。速度会随 GPU 型号与实现方式浮动,请以论文原文为准。

4.2 一个还没解答的问题

到这里,这张表回答了“谁解决了谁的问题”,但还留下一个更关键的空白:每代模型具体是怎么做到的?

  • Selective Search 凭什么能从一张图里“猜”出约 2000 个候选框?
  • RoI Pooling 如何把大小不一的候选框变成统一尺寸的特征?
  • RPN 如何判断“框住 vs 不框住”,一组 anchor 又凭什么覆盖各种形状的物体?

这些问题的答案,才是 R-CNN 家族真正值钱的技术内核,也是后续各篇逐一代入细节的主线。而这一切的起点,是 2014 年那个最“笨”也最“敢”的模型——R-CNN 自己。


📚 数据与事实来源:R-CNN(arXiv:1311.2524)· Fast R-CNN(arXiv:1504.08083)· Faster R-CNN(arXiv:1506.01497)· Mask R-CNN(arXiv:1703.06870)。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询