
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 家族共用一个反直觉但极其有效的思路化整为零——先把图切成一个个候选区域再逐个判断“这里面是什么、框要不要修一下”。二、发展史总览四代模型一代修一个“硬伤”先看全景图再逐代细讲图 2R-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-CNN2014CVPR——把 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-CNN2015ICCV——让 2000 个候选框“拼车”共享一次卷积对应上图第 2 行。上一代的痛点是“重复计算”这一代的解法是四个字共享特征。整张图只过一次 CNN得到一张“全图特征图”引入RoI Pooling候选框不再自己跑 CNN而是拿着坐标直接从特征图上“抠”出自己那块区域的特征分类和框回归塞进同一个网络一起学——训练从“三段式”变成“一步到位”。升级成果速度测试约0.32 秒/张网络部分比 R-CNN 快146 倍再做一层 SVD 压缩可到 213 倍训练84 小时 →9.5 小时而且再也不需要几百 GB 的特征缓存精度VOC2007 mAP 从 66.0% 升到70.0%0712 联合训练数据——又准又快。为什么必须升级47 秒一张图连做研究都嫌慢更别说落地。但 Fast R-CNN 自己也留了个大尾巴候选框还得靠 CPU 上的 Selective Search 现场猜每张图要花 1.52 秒占了系统总耗时的大头。于是——“找框”成了新的瓶颈。3.3 第 3 代Faster R-CNN2015NIPS——连“找框”也学会RPN 登场对应上图第 3 行。请重点看这一行的黄色环节消失了。上一代把“认框”做到了极致系统里最慢的只剩“找框”。Faster R-CNN 的答案很绝干脆把“找框”也训练成一个神经网络——RPN区域建议网络RPN 在特征图的每个位置上预置一些大小、长宽比不同的anchor锚框一边判断“这个框里有没有物体”一边修正“框该多大、往哪挪”RPN 与检测网络共享卷积特征“找框”的成本从 CPU 的约 2 秒降到 GPU 的约 10 毫秒最终串成RPN猜在哪→ RoI Pooling抠特征→ 分类回归认是什么这就是后来所有“两阶段检测器”沿用至今的教科书范式。升级成果速度全流程198ms/张 ≈ 5fpsVGG16找框识别一把抓换轻量 ZF 网络可达 17fps对比 R-CNN 快了约240 倍精度VOC2007 mAP 升到73.2%0712比“Fast R-CNN CPU 选框”还高江湖地位COCO / ILSVRC2015 年竞赛多个冠军方案的地基。为什么必须升级升级之前检测系统是“一头识别坐火箭、一头找框赶牛车”——只要找框还在 CPU 上爬系统就永远到不了实时。RPN 把找框并进网络后检测第一次变成纯 GPU、端到端、接近实时的完整系统。3.4 第 4 代Mask R-CNN2017ICCV——从“框住”到“像素级抠出来”对应上图第 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 与测试环境略有差异请只看数量级和趋势图 4R-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 端到端、5fpsFaster R-CNN但只会给“框”→痛点Mask 分支 RoIAlign像素级输出Mask R-CNN所以为什么“必须”一代代升级因为每一代的新能力都会立刻暴露新的短板不够快就没法用不能端到端就不好训只会给框就满足不了越来越细的需求。技术的演进从来不是“想升级就升级”而是问题一步一步逼出来的。四、结尾一张表看全整个家族4.1 家族全览表模型年份会议一句话核心创新每张图耗时GPUVOC2007 mAP留给下一代的问题R-CNN2014CVPRCNN 候选区域深度学习首次做检测约 47 秒66.0%太慢、训练繁琐、存储爆炸Fast R-CNN2015ICCV整图共享卷积 RoI Pooling单网络多任务约 0.32 秒网络部分70.0%0712找候选框还在 CPU约 2 秒Faster R-CNN2015NIPSRPN 让网络自己找框纯 GPU 端到端约 0.198 秒5fps73.2%0712只会给“框”给不了轮廓Mask R-CNN2017ICCV并行 Mask 分支 RoIAlign像素级输出约 0.2 秒5fps—转战 COCO更吃算力数据单阶段流派登场 注数值均引自各论文公开结果统一使用 VGG16Mask R-CNN 为 ResNet-101-FPNFast / Faster 的 70.0% / 73.2% 使用 VOC0712 联合训练R-CNN 的 66.0% 为 VOC07 训练。速度会随 GPU 型号与实现方式浮动请以论文原文为准。4.2 一个还没解答的问题到这里这张表回答了“谁解决了谁的问题”但还留下一个更关键的空白每代模型具体是怎么做到的Selective Search 凭什么能从一张图里“猜”出约 2000 个候选框RoI Pooling 如何把大小不一的候选框变成统一尺寸的特征RPN 如何判断“框住 vs 不框住”一组 anchor 又凭什么覆盖各种形状的物体这些问题的答案才是 R-CNN 家族真正值钱的技术内核也是后续各篇逐一代入细节的主线。而这一切的起点是 2014 年那个最“笨”也最“敢”的模型——R-CNN 自己。 数据与事实来源R-CNNarXiv:1311.2524· Fast R-CNNarXiv:1504.08083· Faster R-CNNarXiv:1506.01497· Mask R-CNNarXiv:1703.06870。