真实面经题目 · 原创解析
Faster R-CNN 相比 R-CNN / Fast R-CNN 改进了什么,RPN 为什么能让目标检测更快?
这题考的是两阶段检测器的演进逻辑:R-CNN 慢在每个候选框重复跑 CNN,Fast R-CNN 共享卷积但仍依赖外部候选框,Faster R-CNN 用 RPN 在共享特征上生成候选框从而端到端加速。
真实面经题目 · 原创解析
这题考的是两阶段检测器的演进逻辑:R-CNN 慢在每个候选框重复跑 CNN,Fast R-CNN 共享卷积但仍依赖外部候选框,Faster R-CNN 用 RPN 在共享特征上生成候选框从而端到端加速。
我会按 R-CNN、Fast R-CNN、Faster R-CNN 的瓶颈演进来回答。R-CNN 先用选择性搜索生成大量候选框,再把每个候选框裁剪缩放后分别送入 CNN 提特征,最后做分类和边框回归,所以慢在每个 proposal 都重复计算卷积,而且训练流程分离。Fast R-CNN 的改进是整张图只跑一次卷积,候选框在共享 feature map 上通过 ROI Pooling 取特征,再统一分类和回归,速度和训练统一性都提升了;但它仍然依赖选择性搜索等外部 proposal 方法,这部分不是神经网络、速度慢、难以端到端优化。Faster R-CNN 的关键就是引入 RPN,在同一张共享特征图上用小网络滑动生成 objectness 分数和边框偏移,基于 anchors 快速产生候选框,再交给检测头分类和精修。RPN 更快的原因是 proposal 生成不再依赖 CPU 上的传统选择性搜索,而是复用 backbone 特征,用密集卷积一次性预测候选区域,并且能和检测网络联合训练。取舍上,Faster R-CNN 精度和泛化好,但仍是两阶段结构,延迟通常高于单阶段检测器;工程选择要看 mAP、召回率、proposal 数量、NMS、输入分辨率和端到端延迟。
R-CNN 先生成大量候选区域,再把每个候选区域独立裁剪、缩放并送入 CNN。由于一张图可能有上千个 proposal,卷积特征被重复计算很多次。再加上特征提取、分类器、边框回归分阶段训练,整体速度慢、存储开销大、训练流程复杂。
Fast R-CNN 的关键改进是整张图片只经过一次 CNN,得到共享 feature map。每个候选框通过 ROI Pooling 或类似操作在 feature map 上取固定长度特征,然后进入分类和边框回归分支。这样大幅减少重复卷积,也让检测头训练更统一。
虽然 Fast R-CNN 加快了检测头,但候选框仍来自选择性搜索等传统算法。外部 proposal 通常运行慢,和神经网络主干不能共享计算,也不能在同一个目标函数下端到端优化。这使得 proposal 生成成为新的速度瓶颈。
Faster R-CNN 引入 Region Proposal Network。RPN 在 backbone 输出的 feature map 上滑动,用 anchors 表示不同尺度和长宽比的候选框,对每个位置预测 objectness 和边框偏移。它生成少量高质量 proposals,再交给后续检测头做具体类别分类和更精细的边框回归。
RPN 不需要对每个候选框重新跑 CNN,也不需要依赖独立的传统候选框算法。它只是在共享 feature map 上增加轻量卷积分支,密集预测候选区域。proposal 生成从外部耗时步骤变成网络内部的 GPU 友好计算,因此端到端检测速度明显提升。
RPN 不是只追求少生成框,而是在 proposal 数量、候选框召回率、定位质量和后续分类精度之间取平衡。工程上会调 anchors、NMS 阈值、pre/post-NMS top-K、输入尺度和 backbone。Faster R-CNN 精度强、定位好,但两阶段流程仍有延迟,实时场景可能需要单阶段检测器或更轻量 backbone。
RPN 的 objectness 只判断该 anchor 是否可能包含目标,不关心具体类别;后续检测头才对 proposal 做多类别分类并进一步回归边框。
anchor 是预设在 feature map 每个位置上的参考框,覆盖不同尺度和长宽比。RPN 不直接从零预测任意框,而是预测相对 anchor 的偏移和目标概率。
第一阶段 RPN 生成候选区域,第二阶段检测头对候选区域做类别判断和边框精修。虽然两阶段共享特征并可联合训练,但流程上仍先 proposal 后分类回归。
如果更看重定位精度、小目标召回和可解释的候选框流程,Faster R-CNN 有优势;如果更看重实时性、部署成本和吞吐,单阶段检测器通常更合适。最终要用目标数据集比较 mAP、召回、延迟和资源占用。
会。RPN 的候选框召回和定位质量决定后续检测头能看到哪些区域。若 proposal 漏掉目标,后续分类再强也无法找回,所以要关注不同 IoU 阈值下的 proposal recall。