FEATURED · 精选文章

目标检测论文阅读(二):Fast R-CNN 为什么能把 R-CNN 变快这么多

发布时间 / 2026/8/17 19:43:38
来源 / 创域科博编辑部
栏目 / 资讯中心
目标检测论文阅读(二):Fast R-CNN 为什么能把 R-CNN 变快这么多 论文信息论文标题Fast R-CNN作者Ross Girshick会议ICCV 2015arXiv 摘要页https://arxiv.org/abs/1504.08083ICCV 官方页面https://www.cv-foundation.org/openaccess/content_iccv_2015/html/Girshick_Fast_R-CNN_ICCV_2015_paper.html官方 PDFhttps://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Girshick_Fast_R-CNN_ICCV_2015_paper.pdf上一篇我们已经讲过R-CNN。R-CNN 很重要因为它第一次真正把“候选区域 CNN 特征”这条路线跑通了但它也留下了一个特别明显的问题每张图大约有 2000 个 proposal而每个 proposal 都要单独跑一次 CNN这实在太慢了。所以到了Fast R-CNN作者要解决的核心问题就非常明确能不能只对整张图做一次卷积然后让所有 proposal 共享这次卷积计算这篇文章就专门讲清楚 Fast R-CNN 到底快在哪里以及它为什么会成为 Faster R-CNN 之前最关键的一步。这里先纠正一个特别常见的误区Fast R-CNN本身不负责生成 proposal。它做的事情是先接收外部 proposal再在共享特征图上用RoI Pooling读取这些 proposal 的特征。也就是说Fast R-CNN 的“快”来自共享卷积特征而不是来自“自己学会了 proposal 生成”。一、先用一句话概括 Fast R-CNN如果只用一句话概括 Fast R-CNN我会这样说Fast R-CNN 的核心思想是先对整张图做一次卷积得到共享特征图再通过RoI Pooling从这张特征图里为每个 proposal 取出固定长度特征最后同时完成分类和边界框回归。和 R-CNN 相比它最大的变化不是 proposal 数量变了而是CNN 不再对每个 proposal 单独跑一遍proposal 之间开始共享卷积特征训练流程也从多阶段变成了单阶段多任务训练但有一点不要混淆Fast R-CNN使用的 proposal 仍然来自Selective Search等外部算法它是在特征图上读取 proposal 特征它不是在特征图上生成 proposal这三点加在一起Fast R-CNN 才真正“快”了起来。二、R-CNN 的问题到底出在哪理解 Fast R-CNN最好先回头看一眼 R-CNN 的瓶颈。R-CNN 的流程是这样的输入图像 - Selective Search 生成约 2000 个 proposal - 每个 proposal 单独 warp - 每个 proposal 单独送进 CNN - 提取特征 - SVM 分类 - Bounding Box Regression这里真正拖慢系统的不是 proposal 本身而是同一张图里高度重叠的 2000 个候选框被反复、重复地做了 2000 次卷积。这会带来三个问题1. 测试速度太慢R-CNN 需要对每个 proposal 单独做前向传播所以计算大量重复。2. 训练流程很繁琐R-CNN 需要分多步训练先 fine-tune CNN再提特征再训练 SVM再训练边界框回归器3. 存储开销很大为了后续训练 SVM 和回归器R-CNN 往往要把 proposal 特征提前提取并写入磁盘。Fast R-CNN 的出发点就是把这三件事一起改掉。三、Fast R-CNN 到底改了什么Fast R-CNN 的整体流程可以压缩成下面这条主线输入图像 - 整图卷积 - 得到共享 conv feature map - 对每个 proposal 做 RoI Pooling - 全连接层 - 两个输出分支 - softmax 分类 - 边界框回归这个流程和 R-CNN 的最大不同在于卷积计算的位置变了。在 R-CNN 里先裁 proposal再对每个 proposal 跑 CNN在 Fast R-CNN 里先对整张图跑 CNN再从共享特征图里读取每个 proposal 的区域特征这一步看起来像只是“顺序调了一下”但其实几乎改变了整个计算结构。四、为什么“整张图先卷积一次”这么关键这一点是 Fast R-CNN 的灵魂。一张图里的很多 proposal 彼此高度重叠。比如一只狗的不同候选框往往只是边界稍微大一点、小一点或者左边多一点、右边少一点。如果像 R-CNN 那样每个 proposal 都单独卷积就会出现同一块狗脸反复被算很多次同一块背景反复被算很多次这显然很浪费。Fast R-CNN 的思路是既然这些 proposal 都来自同一张图那我先把整张图的卷积特征一次性算出来后面的 proposal 直接共享这张特征图就行。于是卷积层从“按 proposal 重复计算”变成了“整图只算一次”。这也是 Fast R-CNN 速度提升最根本的来源。五、RoI Pooling 到底是什么但这里马上会遇到一个新问题。虽然整张图的卷积特征只算一次了可 proposal 的大小还是各不相同有的大有的小有的长有的扁而后面的全连接层需要固定长度输入。所以作者引入了一个非常关键的模块RoI Pooling你可以把它理解成一句很直白的话不管 proposal 在原图里多大我都先把它映射到共享特征图上再切成固定数量的小格子然后每个格子做一次 max pooling最后得到固定大小的输出。结合这张图看就很好懂上面的红色和绿色 proposal形状并不一样它们都来自同一张共享 feature map经过RoI Pooling之后都会被变成固定长度的7 x 7表示论文里举的例子是把每个 RoI 变成一个固定大小的特征图比如7 x 7这样一来不同大小的 proposal 就都能被统一变成同样尺寸的表示后面就可以接相同的全连接层。所以RoI Pooling的作用可以概括成一句话它负责把“大小不一的候选区域”变成“固定大小的特征表示”。这里还要特别强调一点这和 R-CNN 里的 warp 不是一回事。在R-CNN里proposal 是先从原图里裁出来再强行warp成固定大小然后单独送进 CNN。而在Fast R-CNN里整张图已经先卷积完了RoI Pooling做的是先在共享特征图上找到 proposal 对应的位置再把这块区域池化成固定大小所以 Fast R-CNN 真正省下来的就是对每个 proposal 单独做卷积这一步。六、Fast R-CNN 是怎么分类和回归的在RoI Pooling之后每个 proposal 都会得到一个固定大小的特征图。接着这些特征进入全连接层再分成两条输出分支1. 分类分支输出K 1类的 softmax 概率K个真实目标类别1个背景类这和 R-CNN 用 SVM 的思路不一样。Fast R-CNN 直接在网络里用 softmax 输出类别概率不再单独训练一套外部 SVM。2. 回归分支为每个类别输出 4 个边界框回归参数也就是4K这一步负责进一步微调 proposal 的位置。所以对每个 RoI 来说Fast R-CNN 会同时回答两个问题1. 它属于哪个类别2. 它的框应该怎么再调准一点这也正是后面多任务损失要同时优化的两件事。七、多任务损失为什么重要R-CNN 的训练流程很碎CNN 用一套损失SVM 单独训练边界框回归再单独训练Fast R-CNN 则把分类和回归放到了同一个网络里用一个多任务损失联合训练。论文中的损失可以写成L Lcls λ [u 1] Lloc它的意思并不复杂Lcls分类损失判断这个 RoI 属于哪个类别Lloc定位损失学习怎么修正边界框只有前景 RoI 才参与定位损失也就是说背景区域只需要学“我是背景”不需要学“框怎么调”。这一设计的重要性在于Fast R-CNN 不再像 R-CNN 那样把分类和定位拆成多个独立训练阶段而是一次 fine-tuning 里联合优化两件事。这让训练流程变得更简单也更统一。八、Fast R-CNN 的训练为什么比 R-CNN 优雅得多论文里明确强调Fast R-CNN 的优势不只是测试快训练也快得多。1. 不再需要特征缓存到磁盘R-CNN 为了训练 SVM 和回归器往往要提前提取特征并存盘。这会消耗大量时间和存储空间。Fast R-CNN 直接在网络中完成训练不需要这一步。2. 单阶段 fine-tuningFast R-CNN 用一次 fine-tuning 就把分类和边界框回归都学了不再需要softmax 训完再训 SVMSVM 训完再训 bbox regressor3. 可以更新所有网络层相比 SPPnetFast R-CNN 的一个关键改进是它可以通过 RoI Pooling 层反向传播因此能够更新更前面的卷积层。这点对深层网络尤其重要。论文里专门做了消融实验发现对于VGG16这类深网络仅仅 fine-tune 全连接层是不够的卷积层也需要跟着学。九、Fast R-CNN 到底快了多少这一点是整篇论文最有冲击力的地方之一。论文摘要里就直接给出结论相比R-CNN训练VGG16时快9x测试时快213x在 PASCAL VOC 2012 上精度还更高论文表 4 给出的更具体结果也很经典。对于VGG16R-CNN测试约47.0 s / imageFast R-CNN测试约0.32 s / image使用截断 SVD 后可降到0.22 s / image训练时间方面R-CNN约84 hFast R-CNN约9.5 h这意味着Fast R-CNN 不只是“快一点”而是从结构上把 R-CNN 那种重复卷积的低效方式彻底改掉了。十、Fast R-CNN 的精度提升体现在哪Fast R-CNN 不只是速度上大幅提升精度也没有牺牲反而进一步增强了。1. VOC 2007在VOC 2007 test上使用VGG16R-CNN BB66.0% mAPFast R-CNN66.9% mAP使用07 12 trainval训练时可达到70.0% mAP2. VOC 2010在VOC 2010 test上使用0712训练集时68.8% mAP3. VOC 2012在VOC 2012 test上使用VGG16R-CNN BB62.4% mAPFast R-CNN65.7% mAP若使用0712训练可达68.4% mAP所以 Fast R-CNN 很重要的一点是它不仅加速了检测还在更统一的训练方式下把精度也继续往上推了一步。十一、Fast R-CNN 相比 SPPnet 又强在哪很多人学到这里会问既然已经有SPPnet可以共享卷积特征Fast R-CNN 为什么还要再来一次答案在于SPPnet虽然已经避免了 R-CNN 那种 proposal 级重复卷积但它还有训练上的限制。论文指出SPPnet 的 fine-tuning 不能有效更新空间金字塔池化之前的卷积层。这会带来什么问题对于像 VGG16 这样更深的网络前面的卷积层如果不能一起更新精度会受到限制。Fast R-CNN 通过RoI Pooling end-to-end backprop把这一点补上了。所以它相对 SPPnet 的优势可以概括为训练更简单训练更快测试更快可以更新全部层在深网络上更准确十二、Fast R-CNN 还有什么没解决Fast R-CNN 已经把 R-CNN 最大的瓶颈之一解决掉了但它还没有走到终点。它仍然有一个明显限制proposal 还是外部给的。也就是说Fast R-CNN 虽然已经做到整图共享卷积RoI Pooling单网络分类和回归但它还是需要先依赖Selective Search这样的 proposal 算法才能拿到候选区域。这意味着整套系统虽然已经比 R-CNN 快很多但 proposal 本身仍然是外部模块仍然会成为新的速度瓶颈。这也正是下一篇Faster R-CNN要出场的原因。十三、小结用一句话记住 Fast R-CNN如果让我用一句话总结 Fast R-CNN我会这样说Fast R-CNN 的关键突破是把“每个 proposal 单独卷积一次”改成了“整张图卷积一次、所有 proposal 共享特征图”再借助 RoI Pooling 和多任务损失把目标检测训练成了一个更快、更统一、也更准确的系统。如果把三篇论文串起来看它们的技术演进其实非常清楚R-CNN证明 CNN 特征对目标检测很有效Fast R-CNN解决 proposal 级重复卷积导致的低效问题Faster R-CNN进一步把 proposal 本身也并入网络所以读完 Fast R-CNN 之后下一步就非常自然了既然检测网络已经能共享整图卷积特征那 proposal 能不能也共享这些特征这正是 Faster R-CNN 的核心问题。参考文献Girshick, R. (2015).Fast R-CNN. ICCV 2015.Girshick, R., Donahue, J., Darrell, T., Malik, J. (2014).Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation. CVPR 2014.
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻