R-CNN 家族发展史:从“扫街 47 秒”到“一眼定位”,一张图看懂目标检测的进化论
📍系列路标|本系列共 7 篇,按“原理演进 → 逐篇拆解 → 流派对比 → 代码与选型”编排:
- ✅第 1 篇|R-CNN 发展史(本篇)——四代模型因何而生、各解决了什么问题。
- ⏳第 2 篇|R-CNN 拆解——从一张图片出发,走完“先猜后认”的完整流程。
- ⏳第 3 篇|Fast R-CNN 拆解——RoI Pooling 如何把 47 秒压到 0.3 秒。
- ⏳第 4 篇|Faster R-CNN 拆解——RPN 如何让网络自己学会“找框”。
- ⏳第 5 篇|Mask R-CNN 拆解——从“框住”到“像素级抠图”的最后一公里。
- ⏳第 6 篇|R-CNN vs YOLO——两阶段与单阶段,谁快谁准谁更适合你。
- ⏳第 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),此后几乎寸步难进。它有两大致命软肋:
- 不知道该去哪找:只能“滑窗”——让一个窗口从左上角挪到右下角,还要换好几档大小反复扫,像在草原上地毯式找一根针;
- 认不出抽象特征: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 行。思路一句话:先猜后认,分三步走:
- 猜位置:用传统算法 Selective Search 把一张图切出约2000 个“可能是物体”的候选框(CPU 上完成);
- 看内容:把每个候选框缩放成统一尺寸,分别送进 CNN 提特征——注意,每个框都要完整跑一遍网络;
- 下结论:用 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 行。上一代的痛点是“重复计算”,这一代的解法是四个字:共享特征。
- 整张图只过一次 CNN,得到一张“全图特征图”;
- 引入RoI Pooling:候选框不再自己跑 CNN,而是拿着坐标,直接从特征图上“抠”出自己那块区域的特征;
- 分类和框回归塞进同一个网络一起学——训练从“三段式”变成“一步到位”。
升级成果:
- 速度:测试约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-CNN | 2014(CVPR) | CNN + 候选区域:深度学习首次做检测 | 约 47 秒 | 66.0% | 太慢、训练繁琐、存储爆炸 |
| Fast R-CNN | 2015(ICCV) | 整图共享卷积 + RoI Pooling,单网络多任务 | 约 0.32 秒(网络部分) | 70.0%(07+12) | 找候选框还在 CPU(约 2 秒) |
| Faster R-CNN | 2015(NIPS) | RPN 让网络自己找框,纯 GPU 端到端 | 约 0.198 秒(5fps) | 73.2%(07+12) | 只会给“框”,给不了轮廓 |
| Mask R-CNN | 2017(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)。