想象你是一位刚入职皇家图书馆的见习管理员,馆长交给你一项任务:在藏书百万的图书馆里,找出所有“关于交通工具的图册”。你当然可以拿着放大镜,从第一排书架开始,一格一格地推进——这就是传统滑动窗口的做法:在整幅图像上穷举所有可能的位置和尺寸,每个窗口都要仔细检查,耗时惊人而且常常漏检。 聪明的你一定想到了更好的办法:先花几分钟快速浏览图书馆的整体布局,凭经验圈出几十个“可能藏有图册”的书架区域,然后再对这些可疑区域逐一精读。这种“先粗筛、再精读”的思路,正是R-CNN在2014年横空出世时带来的革命性范式——它让计算机第一次能以接近人类的方式高效地“找东西”。从此,目标检测从蛮力穷举时代迈入了“两阶段”智能时代。
掌握R-CNN的两阶段思想,你就拿到了理解现代目标检测(Fast R-CNN、Faster R-CNN乃至YOLO系列)的万能钥匙,这是计算机视觉从业者的必修第一课。
可视化演示
展示R-CNN两阶段检测范式:Selective Search候选区域生成→CNN特征提取→SVM分类→边界框回归,及候选区域可视化效果。
本节配有交互动效(进入视口后自动加载,约 3KB)。
两阶段检测流程 Selective Search生成约2000个候选区域,结合颜色纹理相似度层次化合并 每个候选区域独立通过CNN提取4096维特征,再用SVM分类 边界框回归微调定位精度,三阶段独立训练是主要局限 Pipeline: SS → CNN → SVM → BBox 逐区域推理导致单图需47秒。
两阶段思想
回到皇家图书馆。如果你的方案是“先圈出可疑书架,再逐一精读”,那么你已经在不知不觉中踩进了两阶段检测的思想河流。2014年,Ross Girshick 等人提出的 R-CNN(Region-based CNN)正是把这种“先粗筛、再精读”的智慧变成了计算机视觉的正式范式。在此之前的传统目标检测,依赖滑动窗口在整幅图像上穷举所有可能的矩形区域,每个区域都要提取手工特征(如 HOG)再送入分类器——就像让图书管理员把每一本书都抽出来翻一遍目录,工作量巨大且效率低下。
R-CNN 的两阶段思想,简单来说是:第一阶段,用 Selectiv Search 从图像中快速挑选出约 2000 个“可能存在目标”的候选区域(Region Proposal);第二阶段,让卷积神经网络(CNN)对这 2000 个候选区域逐一提取特征,再交给 SVM 分类器判断“这里面是什么”,最后用边界框回归器把框的位置修得更准。这相当于从“翻遍每一本书”进化为“先看书架外观判断哪些书可能相关,再精读这些书的内容”。
这个范式的革命性在于:它第一次让深度学习真正落地到目标检测任务中,并且取得了碾压传统方法的精度。2013 年之前,最好的检测器在 PASCAL VOC 数据集上的 mAP(平均精度均值)约为 35%;R-CNN 一举将其提升到 53.7%,接近翻倍。从此,“候选区域 + CNN”成为目标检测领域的新圣经,开启了深度学习目标检测的黄金时代。
候选区域生成
图书馆管理员在“粗筛”阶段,靠的是多年经验——书的厚度、封面的颜色、摆放的位置、相邻书籍的主题,这些线索都能帮助判断“这里可能有交通工具图册”。R-CNN 的粗筛工具叫 Selective Search(选择性搜索),它的思路与此惊人相似:先把图像分割成许多小的超像素块,然后根据颜色、纹理、大小、形状相似度等线索,迭代地把相似的相邻区域合并成更大的区域。每合并一次,就生成一个候选框。这个过程相当于把“凌乱的书堆”不断归并成“主题分明的书架格”,每个格子就是一个候选区域。
通过这种启发式合并,一张图像通常能生成约 2000 个候选区域。为什么是 2000 而不是 20000 或者 200?这是精度与速度的平衡:候选太少会漏掉真正的目标,候选太多会拖慢后续的 CNN 精读速度。Selective Search 的聪明之处在于,它利用图像本身的颜色和纹理线索来“猜”目标可能在哪儿,而不是像滑动窗口那样漫无目的地扫描。
当然,Selective Search 也有局限:它始终是一种“与任务无关”的通用候选生成方法,它不知道你要找的是猫还是车,因此总会有一些漏检和误检。这个缺陷后来促成了 Faster R-CNN 中的 Region Proposal Network(RPN)——让网络自己学习如何生成候选区域。不过在 R-CNN 时代,Selective Search 已经足够惊艳:它将目标检测从“在 10 万+ 窗口中穷举”压缩到“在 2000 个候选框中精读”,计算量降低了两个数量级。
特征提取流程
假设现在你已经拿到了 2000 个可疑书架格子(候选区域),下一步就是逐一“精读”每本书的内容。但书有大有小、有横有竖,精读之前必须先把它们统一成标准尺寸。R-CNN 的做法是:对每个候选区域做裁剪(crop)和缩放(warp),统一变成 227×227 像素 的固定尺寸图像——这是当时 AlexNet 网络要求的输入大小。
接着,把这 227×227 的图像送入一个在大规模数据集(ImageNet)上预训练过的 CNN 模型(AlexNet),进行前向传播。这个 CNN 就像一位经过千锤百炼的“图书内容分析专家”,它的卷积层逐层提取从边缘、纹理到物体部件、完整物体语义的特征,最终在全连接层输出一个 4096 维的特征向量。这个向量就是对候选区域内容的“浓缩描述”——类似于你用 4096 个关键词给一本书做了摘要。
R-CNN 的精妙之处在于“迁移学习”:它不需要从零开始训练 CNN,而是复用 ImageNet 上预训练好的 AlexNet 权重,然后针对目标检测任务做 微调(fine-tuning)。微调时,把原来 1000 类的分类层替换为需要检测的类别数(比如 PASCAL VOC 的 21 类,含背景),用候选区域数据继续训练。这样做的好处是:预训练已经让 CNN 学会了通用的视觉特征(边缘、纹理、形状),微调则让这些特征“适配”到目标检测的具体任务上,所需的数据量和训练时间都大大减少。
SVM分类器
精读完每本书,你需要判断它到底属不属于“交通工具图册”。R-CNN 没有直接用 CNN 末端的 Softmax 分类器,而是为每个目标类别单独训练一个 SVM(支持向量机)二分类器。打个比方:图书馆雇了 20 位“方向专家”——一位只负责“猫”,一位只负责“狗”,一位只负责“汽车”……每位专家只回答一个问题:“这本书是不是我负责的那个类别?”
为什么不用现成的 Softmax,而要额外费劲训练 SVM?这是 R-CNN 论文里的一个关键设计决策。Softmax 分类器在训练时用的是“一个候选区域对应一个类别标签”的方式,但候选区域往往不精确:一个框可能只包含了目标的一半,或者把目标连同大量背景一起框进来。这时候 Softmax 很难处理好这种“粗粒度标签”下的分类。而 SVM 配合“难负样本挖掘(hard negative mining)”能更好地应对这类问题——它会把那些“看起来像但实际不是”的困难负样本挑出来重点训练,让分类边界更加鲁棒。
具体地,对每个类别训练一个 SVM 时:正样本是对该类别目标的 Ground Truth 框(以及 IoU ≥ 0.5 的候选框),负样本是与所有目标框 IoU < 0.3 的候选区域(背景区域),中间地带(0.3 ≤ IoU < 0.5)的样本则忽略不计。经过这种严格的正负样本划分后,每个 SVM 都学会了“精准识别自己类别的关键特征”。当 2000 个候选区域的 4096 维特征向量依次通过所有 SVM 时,每个候选框都会得到一组类别得分,得分最高的类别就是它“最像”的目标。
边界框回归
分类器告诉你“这本书是交通工具图册”,但候选框本身可能不够精确——框大了,把旁边书架也圈了进来;框小了,图册的边角被切掉了。这时候就需要 边界框回归(Bounding Box Regression) 来“精修”位置。这相当于:图书管理员精读后发现目标在书架的第三层靠左位置,于是把最初圈定的区域微调一下,让框更准地贴合目标。
边界框回归的思路很直接:学习从候选框 (P) 到真实目标框 (G) 之间的映射关系。假设候选框的中心坐标是 ($P_x$, $P_y$),宽高为 ($P_w$, $P_h$),真实框为 ($G_x$, $G_y$, $G_w$, $G_h$),回归器要预测四个变换参数:中心坐标的平移量 ($d_x(P)$, $d_y(P)$) 和宽高的缩放量 ($d_w(P)$, $d_h(P)$)。这些参数通过对 CNN 提取的 4096 维特征做线性回归来学习:
回归器的训练目标是让 $\hat{G}$ 尽量接近 $G$,使用 L2 损失函数(均方误差)。训练时只使用“与真实框 IoU > 0.6 且类别正确”的候选框作为正样本,因为只有这些框才包含足够的目标信息,值得精修。通过回归,候选框的定位精度显著提升,mAP 大约能再涨 3-5 个百分点——看似不多,但在竞争激烈的检测任务中已是宝贵收益。
- 中心横坐标修正预测候选框中心需要向右或向左移动多少。
- 中心纵坐标修正预测候选框中心的上下移动量。
- 宽度缩放预测候选框宽度需要放大的倍数(取对数后再指数)。
- 高度缩放预测候选框高度的缩放倍数。
速度瓶颈分析
故事到这里,我们不得不面对 R-CNN 的一个致命伤——速度。R-CNN 处理一张图像大约需要 47~59 秒(GPU 上),这意味着它离实时检测(≥30 帧/秒)差了整整三个数量级。为什么这么慢?我们回到图书馆的比喻:你精读一本好书需要 10 分钟,而 2000 本可疑书籍中大部分最终被证明不相关——但你依然得一本一本地翻开、阅读、作摘要。R-CNN 的问题就在这:2000 个候选区域中真正包含目标的可能只有几十个,但每个候选区域都要独立地通过一次完整的 CNN 前向传播,这 2000 次前向传播耗费了绝大部分计算时间。
更浪费的是,这 2000 个候选区域之间大量重叠。相邻的候选框共享了几乎相同的图像内容,但 R-CNN 的架构决定了它无法共享这些重复计算——每个框从头开始走一遍 CNN。打个比方:你拿到的一套书,前 1900 本都来自同一个书架区,它们的内容大范围重叠,但你还是被迫把每本都从头读到尾,而不是先读懂这个书架区的公共背景,再只关注每本书的差异部分。
正是这个瓶颈,催生了后续的一连串改进:SPP-Net 在 CNN 的最后一个卷积层后加入空间金字塔池化,让整幅图像只经过一次 CNN 前向传播,各候选区域的特征从共享的特征图上“抠”出来——这相当于先把整个图书馆的书架结构扫描一遍存成索引,再查索引找书。Fast R-CNN 进一步把 SVM 和边界框回归整合进同一个网络,用 Softmax 替代 SVM,实现了单阶段的“精读 + 分类 + 回归”联合训练。Faster R-CNN 则干脆用 Region Proposal Network 替换 Selective Search,让候选区域生成也变成可学习的模块,真正实现端到端的两阶段检测。
训练流程
R-CNN 的训练流程堪称“三段式流水线”,每一步都有明确分工,就像皇家图书馆的新人培训计划:先在综合大学(ImageNet)接受通识教育(预训练),再到专业学院用目标检测数据进修(微调),最后在各个细分方向(SVM 分类、边界框回归)考取执照。这个流程虽然繁琐,但在 2014 年深度学习工程实践尚不成熟的背景下,是极具可操作性的最优解。
第一步:预训练与微调。 先在 ImageNet 大规模分类数据集上预训练 AlexNet 模型,让它学会通用的视觉特征。然后把最后的 1000 类分类层替换成目标检测数据集的类别数(如 21 类),用候选区域(含正负样本)继续对网络进行微调。微调时,正样本是与真实目标框 IoU ≥ 0.5 的候选区域,负样本是 IoU < 0.5 的背景区域。微调采用的 SGD 学习率设为预训练阶段的 1/10,因为预训练已经让参数处于一个较好的位置,只需要小幅调整。
第二步:SVM 分类器训练。 从 CNN 的 FC7 层提取每个候选区域的 4096 维特征,用这些特征训练每个类别的二分类 SVM。正样本是各类目标的 Ground Truth 框,负样本是 IoU < 0.3 的候选框。这里有个小细节:SVM 训练用的特征来自微调后的 CNN,但 SVM 本身是独立于 CNN 之外训练和推理的——这意味着特征提取和分类是两个解耦的模块。
第三步:边界框回归器训练。 对每个类别训练一个线性回归器,输入是 CNN 的 pool5 层特征(而非 FC7 层),输出是 4 个边界框修正参数。训练样本是 IoU > 0.6 的候选框及其对应的真实框。为什么要用 pool5 的特征而不是 FC7?因为池化层特征保留了更多空间位置信息,对“几何修正”任务更有帮助——这就像一个修图师傅需要看原始照片而不是看过度的美颜滤镜。
发展演进
R-CNN 的故事并没有止步于它自己,而是点燃了整个目标检测领域的燎原之火。沿着“两阶段”这条主线,我们可以清晰地看到技术演进的逻辑链条:R-CNN 把“候选 + CNN”的组合做到极致精度,但也暴露了“重复计算”的软肋;于是后续工作逐一拆解、优化这个软肋。每个后继者都像一位站在巨人肩膀上的改进者,他们反复追问同一个问题:“R-CNN 的哪一步可以做得更快?”
SPP-Net(2014 年末) 率先打破了“每个候选区域都要独立过 CNN”的魔咒。它的核心洞察是:如果让整幅图像只过一次 CNN,然后在最后一个卷积层的特征图上,为每个候选区域做空间金字塔池化(SPP),就能一次性提取所有候选区域的特征。这相当于图书馆管理员不再逐本读书,而是对整个图书馆拍一张高清全景图,再裁剪出每本书的局部放大图——计算量从 2000 次 CNN 前向降为 1 次。
Fast R-CNN(2015 年) 在 SPP-Net 的基础上做出关键简化:把 SVM 换成 Softmax 分类器,把边界框回归器并入同一个网络,用单阶段训练替代三段式流水线。它只对每个候选区域做一次 RoI(Region of Interest)池化(SPP 的简化版),然后共享后续的全连接层计算。Fast R-CNN 把训练时间从 R-CNN 的 84 小时降到 9.5 小时,测试速度从 59 秒/图提升到 0.3 秒/图,精度还略有提升。
Faster R-CNN(2015 年末) 则彻底解决了候选区域生成的瓶颈:用 Region Proposal Network(RPN)取代 Selective Search,让网络自己学习“哪里可能有目标”。RPN 是轻量级的全卷积网络,它和检测网络共享卷积特征,通过锚点(anchor)机制直接输出候选框及其置信度。至此,两阶段检测真正实现了端到端的训练和推理——整条流水线(候选生成 → 特征提取 → 分类 → 回归)成为一个可微分的整体。
AI 应用场景
自动驾驶中的车辆检测
阶段:目标定位与感知
解决的问题:自动驾驶系统需要实时识别道路上的车辆、行人、交通标志。传统滑动窗口方法在车载计算平台上根本无法满足实时性要求,且精度不足容易造成安全事故。R-CNN 的两阶段思想启发了后续的 Faster R-CNN 等网络,它们在车载平台上先快速生成候选区域,再对候选区域精细分类和定位,为自动驾驶提供了可靠的视觉感知基础。
具体案例:特斯拉的 Autopilot 视觉系统在早期阶段借鉴了两阶段检测思想——先用轻量级网络快速扫描图像找到“可疑目标区域”,再用更精细的网络对每个区域做确认。虽然现在的方案已经演进到更高效的端到端架构,但“候选区域 + 精细分类”的核心脉络始终贯穿其中。
医学影像中的病灶检测
阶段:医学影像分析
解决的问题:CT 或 X 光片中的病灶(如肺结节、肿瘤)往往只占图像的极小部分,在全图上穷举扫描效率极低且容易漏检。R-CNN 的两阶段思路启发医疗 AI 系统:第一阶段用候选区域生成方法快速找出“可疑阴影”,第二阶段用 CNN 对这些可疑区域做精确判断,减少漏诊率。
具体案例:肺结节检测系统中,算法先在 CT 影像的每一层上用类似 Selectiv Search 的方法生成候选结节区域(通常每层 50-100 个),再用 3D CNN 对每个候选区域做良恶性分类,最终输出可疑结节的位置和恶性概率。这一流程帮助放射科医生把阅片时间从 20 分钟缩短到 5 分钟。
安防监控中的异常行为识别
阶段:视频理解与事件检测
解决的问题:在监控视频中检测异常行为(如闯入、奔跑、聚集)时,需要先从视频帧中定位到“人”的位置,再做行为分析。两阶段思想在这里很自然:先检测人(候选区域 + 分类),再对每个人做行为识别(时序模型)。
具体案例:某智慧园区安防系统使用两阶段检测管线:第一阶段的轻量检测器在每帧画面中定位所有行人,第二阶段的行为识别模型对每个行人的运动轨迹和姿态序列做分析,判断是否存在攀爬围墙、倒地等异常事件。整个管线在边缘服务器上以 15 帧/秒的速度运行,误报率控制在 5% 以内。
Python 演示
import cv2import numpy as npfrom sklearn.svm import LinearSVC def generate_candidates(image_path): """阶段一:Selective Search 生成候选区域""" img = cv2.imread(image_path) ss = cv2.ximgproc.segmentation.createSelectiveSearchSegmentation() ss.setBaseImage(img) ss.switchToSelectiveSearchFast() rects = ss.process() return img, rects[:2000] # 取前 2000 个候选框 def extract_cnn_features(img, rects): """阶段二:对每个候选区域提取特征(简化版用颜色直方图模拟)""" features = [] for x, y, w, h in rects[:50]: # 演示只处理前 50 个 crop = img[y:y+h, x:x+w] crop = cv2.resize(crop, (227, 227)) hist = cv2.calcHist([crop], [0, 1, 2], None, [8, 8, 8], [0, 256, 0, 256, 0, 256]) hist = cv2.normalize(hist, hist).flatten() features.append(hist) return np.array(features) def train_svm_and_classify(features, labels): """阶段三:训练 SVM 并分类(两阶段检测的核心分类模块)""" svm = LinearSVC(max_iter=5000) svm.fit(features, labels) return svm def bbox_regression(candidates, feats, svm): """阶段四:边界框回归(简化为按分类得分排序取 top 框)""" scores = svm.decision_function(feats) top_idx = np.argsort(scores)[-3:] # 取得分最高的 3 个框 return top_idx, scores def main(): img, rects = generate_candidates('demo.jpg') feats = extract_cnn_features(img, rects) labels = np.array([1 if i % 5 == 0 else -1 for i in range(len(feats))]) svm = train_svm_and_classify(feats, labels) top_idx, scores = bbox_regression(rects, feats, svm) for i in top_idx: x, y, w, h = rects[i] print(f"检测到目标候选框: ({x}, {y}, {w}, {h}) 得分={scores[i]:.3f}") if __name__ == '__main__': main()
ss.switchToSelectiveSearchFast()切换到快速模式的 Selectiv Search,生成候选区域更高效rects[:2000]为控制计算量,只保留前 2000 个候选框,这是 R-CNN 论文的关键超参数cv2.resize(crop, (227, 227))所有候选区域统一缩放到 227×227,满足 CNN 输入要求cv2.calcHist(...)用 3D 颜色直方图模拟 CNN 特征提取(真实 R-CNN 用 4096 维深度特征)LinearSVC(max_iter=5000)线性 SVM 分类器,对应 R-CNN 中“每类一个 SVM”的设计svm.decision_function(feats)获得每个候选框的分类置信度得分np.argsort(scores)[-3:]选取得分最高的 3 个框作为最终检测结果
常见误区
误区既然候选区域是“广撒网”,那生成的候选框越多,检测效果肯定越好。我把 Selectiv Search 的候选框数量从 2000 调到 10000,精度应该能大幅提升吧?
正解候选区域数量并不是越多越好。当候选框从 2000 增加到 10000 后,真正被“漏掉”的目标并不会显著减少(因为 Selectiv Search 的召回率在 2000 个框时已经很高),但后续 CNN 需要处理的特征数量增加了 5 倍,计算开销急剧上升。更关键的是,过多的候选框会引入更多 IoU 处于模糊地带(0.3~0.5)的“灰色样本”,反而可能干扰 SVM 分类器的决策边界。这就像图书管理员圈定了 10000 个可疑书架,看起来更全面了,但实际上大部分都是无关区域,反而让自己精疲力竭、错失真正的好书。
为何常见:人们本能地认为“召回率越高越好”,却忽略了检测任务中精度与速度的权衡,以及过度召回带来的负面样本噪声。
误区R-CNN 不是用深度神经网络做目标检测吗?那它一定是像分类网络那样,输入图像、输出检测结果,整个流程端到端训练的吧?
正解R-CNN 的训练是典型的三段式流水线,并非端到端:①在 ImageNet 上预训练 CNN,再用候选区域微调;②用 CNN 提取的特征训练 SVM 分类器;③用 pool5 特征训练边界框回归器。这三个模块是独立训练、独立推理的。SVM 和回归器并不知道 CNN 内部的参数如何——它们的训练不会反向传播到 CNN 中。直到 Fast R-CNN 才把这些模块统一到一个网络里实现端到端训练。这就像一个工厂的三个工序由不同团队独立优化,虽然最终产品不错,但各环节之间的配合远未达到全局最优。
为何常见:现代深度学习框架(PyTorch/TensorFlow)的自动化求导让“端到端”变得太自然了,初学者容易把历史早期工作的实现方式与现在的技术范式混淆。
误区R-CNN 的 CNN 最后不是有 Softmax 分类吗?为什么还要额外训练 SVM?直接用 CNN 自己的 Softmax 输出不就行了吗?反正都是分类。
正解实验中,如果直接用微调后 CNN 的 Softmax 输出作为分类结果,mAP 大约为 50.2%;而用 SVM 后能达到 53.7%,相差 3.5 个百分点。原因是 Softmax 是在“一个候选区域对应一个类别”的多分类设定下训练的,但 R-CNN 的候选区域质量参差不齐——很多框只包含目标的一部分或大量背景。SVM 配合严格的 IoU 阈值(正样本 IoU ≥ 0.5、负样本 IoU < 0.3)和难负样本挖掘,能够建立更鲁棒的类别边界。这就像 Softmax 是一位“多面手”,什么都能评一句;而 SVM 是“专业鉴定师”,在自己领域内判断更精准。
为何常见:初学者看到 CNN 输出层有 Softmax,就误以为它是用于分类的部分,忽略了 R-CNN 设计中 SVM 是针对“候选区域分类”这一特定问题做的专门优化。
误区边界框回归器既然能修正位置,那无论初始候选框偏离目标多远,它都应该能把框拉回到正确位置吧?
正解边界框回归器的能力是有限的——它本质上是一个线性回归模型,只能学习“与目标框 IoU 较高”的候选框到真实框之间的微调映射。R-CNN 的训练样本只包含 IoU > 0.6 的候选框(即大致已经框住目标的框),对 IoU 低于 0.6 的框,回归器根本就没有学习过如何修正。而且线性变换(平移 + 缩放)无法应对“候选框完全偏离目标”这种非线性情况。这就像一位裁缝可以帮身材相近的顾客微调衣服尺寸,但没法把一件 XS 码的衣服改造成 XXXL 码——前提条件差得太远,再好的手艺也无能为力。
为何常见:人们容易高估回归模型的能力,忽视了它本质上是在“好的初始值附近做局部精修”这一前提条件。
误区R-CNN 的候选区域是不是用 CNN 在图像上滑动窗口得到的?毕竟它叫“基于区域的 CNN”嘛。
正解这是概念混淆。R-CNN 的候选区域完全由传统的图像分割算法 Selectiv Search 生成,与 CNN 没有任何关系。Selectiv Search 基于颜色、纹理等低层视觉线索做区域合并;CNN 是在候选区域生成之后才介入的,负责特征提取。滑动窗口是传统目标检测(如 DPM)的做法,在图像上穷举所有位置和尺度,计算量巨大。R-CNN 的创新恰恰在于“用 Selectiv Search 替代滑动窗口”,把全图扫描变成稀疏候选。直到 Faster R-CNN 的 RPN 出现,候选区域生成才和 CNN 结合——但那时用的是锚点机制,也不是滑动窗口式的穷举。
为何常见:名称中的“Region“和”CNN“容易让人想当然地认为候选区域也是 CNN 生成的,忽略了 R-CNN 名字中的”C”代表的是图片特征提取部分。
面试题
Q1. R-CNN 中第一阶段 Selectiv Search 的主要作用是什么?
- A.对图像做语义分割
- B.生成约 2000 个候选区域← 正确答案
- C.提取 CNN 特征
- D.训练 SVM 分类器
答案:B。Selectiv Search 在 R-CNN 中担任“粗筛”角色,它基于颜色、纹理等线索迭代合并相似区域,生成约 2000 个候选区域供后续 CNN 精读。语义分割是另一个任务;特征提取和 SVM 分类分别是第二、三阶段的工作。
Q2. R-CNN 将候选区域送入 CNN 之前,需要做什么预处理?
- A.缩放到 227×227 像素← 正确答案
- B.转换为灰度图
- C.做直方图均衡化
- D.做数据增强
答案:A。R-CNN 使用 AlexNet 作为特征提取器,其输入尺寸固定为 227×227。因此每个候选区域需要先被裁剪(scrop)并缩放(warp)到这个尺寸才能送入网络。灰度化和直方图均衡化都不是必须步骤。
Q3. 下列关于 R-CNN 的训练流程,说法正确的是?
- A.整个网络是端到端训练的
- B.CNN、SVM、边界框回归器是独立分阶段训练的← 正确答案
- C.SVM 和 CNN 同时联合优化
- D.边界框回归器和 CNN 共享训练参数
答案:B。R-CNN 的训练是经典的三段式:先在 ImageNet 预训练 CNN 并微调,再用 CNN 提取的特征训练 SVM,最后用 pool5 特征训练回归器。三个模块独立推理,互不反向传播,直到 Fast R-CNN 才实现端到端。
Q4. R-CNN 中为什么用 SVM 而不是直接用 CNN 的 Softmax 做分类?
- A.SVM 训练速度更快
- B.SVM 搭配难负样本挖掘对粗粒度候选框分类更鲁棒← 正确答案
- C.Softmax 无法处理多分类问题
- D.SVM 不需要特征输入
答案:B。候选区域往往与真实目标框有偏差(框大半框小半),Softmax 在这种粗粒度标签下表现不佳。SVM 配合严格的 IoU 阈值(正样本 IoU≥0.5,负样本 IoU<0.3)划分和难负样本挖掘,分类边界更鲁棒,mAP 比 Softmax 高约 3.5 个百分点。
Q5. R-CNN 处理一张图像大约需要多少时间(GPU 上)?
- A.0.03 秒
- B.0.3 秒
- C.3 秒
- D.约 50 秒← 正确答案
答案:D。R-CNN 对 2000 个候选区域每个都要独立过一次完整的 CNN 前向传播,存在大量重叠区域的重复计算,导致其在 GPU 上也需约 47~59 秒才能处理一张图。这正是后续 SPP-Net、Fast R-CNN 着力优化的痛点。
Q6. 边界框回归的训练样本应该满足什么条件?
- A.任意候选区域都可以作为训练样本
- B.与真实框 IoU > 0.6 且类别正确的候选框← 正确答案
- C.与真实框 IoU < 0.3 的背景框
- D.所有 Selectiv Search 生成的候选框
答案:B。只有 IoU > 0.6 的候选框才与真实框足够接近,回归器能从中学习到有效的“微调”映射。IoU 太低的框与真实框差距过大,线性回归模型无法处理这种“跨数量级”的修正;背景框则完全不包含目标信息。
Q7. 下列哪些是 R-CNN 的明显缺陷?
- A.候选区域之间重复计算导致速度慢← 正确答案
- B.需要分阶段训练多个模块,流程繁琐← 正确答案
- C.无法处理多类目标检测
- D.不能做到端到端训练← 正确答案
答案:ABD。R-CNN 的三大痛点:①2000 个重叠候选框各自独立过 CNN,重复计算严重;②CNN、SVM、回归器三段式训练繁琐且无法联合优化;③因模块独立不是端到端的。但它可以处理多类目标——每个类别一个 SVM 即可。
Q8. Fast R-CNN 相比 R-CNN 最核心的改进是什么?
- A.用 RPN 替代 Selectiv Search
- B.引入 RoI 池化共享卷积计算,实现单阶段训练← 正确答案
- C.用更大的 CNN 模型
- D.增加候选区域数量
答案:B。Fast R-CNN 的核心创新是 RoI 池化——整幅图只过一次 CNN,各候选区域从共享特征图中提取特征,避免了 R-CNN 的重复计算。它还把 SVM 换成 Softmax、回归器并入网络,实现了端到端训练。用 RPN 替代 Selectiv Search 是 Faster R-CNN 的贡献。
Q9. 关于 R-CNN 的 SVM 训练,下列描述正确的是?
- A.每个目标类别训练一个独立的二分类 SVM← 正确答案
- B.正样本是 IoU ≥ 0.5 的候选框
- C.负样本是 IoU < 0.3 的候选框← 正确答案
- D.忽略 IoU 在 0.3 到 0.5 之间的候选框← 正确答案
答案:ACD。R-CNN 为每个类别训练一个二分类 SVM。正样本仅使用 Ground Truth 框(IoU=1),而非所有 IoU≥0.5 的框;负样本是 IoU < 0.3 的背景框;IoU 在 0.3~0.5 之间的候选框既不算正也不算负、直接忽略,以建立清晰的分类边界。
Q10. SPP-Net 解决了 R-CNN 的什么核心问题?
- A.候选区域质量问题
- B.SVM 分类精度不足
- C.每个候选区域重复过 CNN 的冗余计算← 正确答案
- D.边界框回归不准确
答案:C。SPP-Net 的关键洞察是让整幅图像只过一次 CNN,在最后一个卷积层的特征图上用空间金字塔池化提取每个候选区域的特征,将 2000 次 CNN 前向传播降为 1 次,大幅提升速度。Fast R-CNN 的 RoI 池化正是 SPP 的简化特例。