资讯详情

目标检测基石:R-CNN原理、候选区域与CNN特征提取全解析

📅 2026/10/16 23:23:11 | 华诺云谱 👁 阅读
目标检测基石:R-CNN原理、候选区域与CNN特征提取全解析
第一次接触物体检测的时候我脑子里的第一个疑问是这东西和图像分类到底有什么不一样分类就是把一张图打上一个标签比如猫或者狗简单直接。但检测要回答的问题复杂得多——图里有哪些物体它们各自在什么位置两个物体挨得很近怎么办物体被遮挡了怎么办这些问题让检测变成了一个既需要看见又需要定位的任务。而R-CNN恰好是深度学习全面接管目标检测之前最关键的引信之一。如果你是刚入门计算机视觉的新手或者已经把分类玩得很熟、想往检测方向迈一步那么从R-CNN读起是一段绕不开的路。它把候选区域、卷积神经网络、分类器和回归器拼装在一起虽然今天看来笨重又缓慢但几乎所有现代检测器都能从它身上找到影子。这篇博文会带你从头到尾把R-CNN的来龙去脉拆一遍结合我当年复现它时踩过的坑尽量把每个环节讲透。1. 从图像分类到物体检测概念与评价指标1.1 分类、定位、检测、分割到底差在哪图像分类是最基础的任务输入一张图片模型输出一个类别标签。如果图片里同时有猫和狗分类模型只会告诉你这张图里有猫或者这张图里有狗甚至可能只给出概率最高的那个。这对很多真实场景是不够的。物体检测要做两件事一是找出图里有哪几类目标二是用矩形框把每个目标的位置框出来。比如一张街景图检测结果可能是人1在左上角汽车2在右侧红绿灯在中间偏上。这里的矩形框通常用四个数字表示中心点坐标加宽高或者左上角坐标加右下角坐标。比检测更进一步的是实例分割它不仅要框出物体还要把每个物体的像素轮廓都抠出来。语义分割则是按像素对图像做分类但不区分同一类的不同个体。这里面的层级关系很有意思分类给的是是什么检测额外给了在哪里分割则把在哪里精细到像素级别。R-CNN解决的是检测任务它的输出就是一系列带类别标签的矩形框。1.2 mAP怎么算检测任务最重要的评价指标做分类时我们经常看准确率Accuracy和Top-1/Top-5错误率。但检测的输出是一堆框每个框有类别、有置信度、有位置到底怎么衡量模型好不好行业里最通用的指标是mAP也就是mean Average Precision平均精度均值。mAP的计算牵扯到两个概念交并比IoUIntersection over Union和召回率/精确率。IoU就是预测框和真实框的交集面积除以并集面积取值从0到1。通常设定一个阈值比如IoU大于0.5就认为这个预测框命中了某个真实框算作正样本。有了命中判定之后把所有预测框按置信度从高到低排序依次计算精确率被判定为正的样本里真正命中的比例和召回率真实目标里被成功找出的比例。每到一个置信度阈值就能算出一组精确率和召回率连起来画一条P-R曲线曲线下的面积就是Average PrecisionAP。对每个类别分别计算AP再取平均值就是mAP。我在第一次复现R-CNN时花在理解mAP上的时间几乎和写代码一样多。这里有几个容易混淆的地方mAP不是跑一次测试就得到的一个固定数它的计算方式非常依赖IoU阈值和置信度阈值。不同数据集的mAP口径可能完全不同比如传统Pascal VOC默认IoU0.5而新数据集会计算多个IoU阈值下的平均mAP比如从0.5到0.95每隔0.05取一次。所以看论文里报的mAP时一定要先弄清楚它的计算协议否则很容易被数字误导。2. R-CNN的技术底色为什么2014年它能引爆这个领域2.1 深度学习之前的目标检测长什么样在R-CNN出现之前目标检测的主流方法基本都建立在手工特征之上。经典路线是先通过滑动窗口或者候选区域生成一些可能包含物体的位置然后在每个位置提取HOG方向梯度直方图或者SIFT尺度不变特征变换这样的手工特征最后交给支持向量机分类器判断这块区域是什么类别。这类方法有几个很致命的毛病。首先是特征表达能力有限HOG擅长描述边缘和梯度但遇到遮挡、光照变化、外观多样性强的目标就很难招架。其次是滑动窗口采样效率极低为了找到物体需要在图像金字塔上以不同尺度、不同长宽比滑动窗口大部分窗口都是背景计算浪费非常严重。那时候Pascal VOC数据集上最好的检测器mAP也只有百分之三四十和今天动辄八十多甚至九十的成绩差距巨大。当时深度学习在图像分类上已经展现了极强的特征学习能力但没人直接把它搬来做检测主要有两个顾虑一是深度模型需要大量标注数据检测数据集的标注成本远高于分类二是检测涉及大量候选位置如果直接跑深度网络计算量难以承受。R-CNN的作者做了一个非常聪明的组合既然深度学习特征这么强那我干脆先用传统方法筛选出可能包含物体的候选区域然后只用深度网络对这些候选区域做分类。这样既避开了滑动窗口的暴力搜索又让深度特征用在了刀刃上。2.2 候选区域选择性搜索如何降低复杂度说到候选区域不能不提选择性搜索Selective Search。它的想法很直观一张自然图像里的物体往往是一些颜色、纹理、形状上相对一致的区域。选择性搜索先从像素级的超像素分割开始然后根据颜色相似度、纹理相似度、尺寸相似度和填充相似度把相邻的小区域不断合并最终生成一堆可能包含物体的候选框。用一个生活化比喻选择性搜索像是先用眼睛快速扫一圈把图里看起来像是一整块东西的区域都圈出来。它不关心具体是什么物体只负责告诉你这些地方可能有物体。相比滑动窗口它的候选框数量从几十万级降到一两千级而且覆盖率高不容易漏掉目标。R-CNN用选择性搜索大概生成2000个候选框。这个数量听起来还是很大但已经比滑窗少了好几个数量级。而且选择性搜索还有一个特点它生成的候选框不受固定比例限制能适应物体的多种形状。虽然今天看来这个阶段依然慢了但它是整条流水线中把猜物体位置和认物体类别解耦的关键一步。我自己后来实现选择性搜索时发现它的超参数对结果影响很大。比如合并初期用较小区域有利于保持边缘但物体如果被分割得太碎会合并失败如果合并太粗一个框可能同时包含多个物体。实际使用中往往要根据数据集的尺度分布适调配参数这部分经验在R-CNN之后也沿用到了很多传统检测方法中。3. R-CNN三大模块逐一拆解候选区域、CNN特征提取、支持向量机分类3.1 模块一选择性搜索提取约2000个候选区域R-CNN正式流程的第一步是对输入图片运行选择性搜索生成约2000个候选区域。之所以选择2000这个数量是当时实验得出的平衡点太少会漏检太多会拖慢后续特征提取。每个候选区域都要被后续步骤单独处理所以这一步的候选质量直接决定了整个检测器的上限。这里有个细节需要注意选择性搜索是在原始分辨率图像上运行的而不是先在缩放后的图上运行。因为物体在低分辨率下可能会丢失太多细节导致候选框定位不准。我的经验是图像尺寸越大生成的候选框越多但随之而来的是计算量增大。R-CNN默认的输入尺寸并不固定因为它的候选框大小不一需要后续裁剪缩放到统一尺寸。3.2 模块二CNN特征提取与微调策略拿到候选区域之后下一步就是把每个候选区域缩放到固定尺寸送入一个在大规模图像分类数据集上预训练过的卷积神经网络提取出一个固定长度的特征向量。这里有个工程上的细节候选区域的长宽比例五花八门直接拉伸变形会影响特征质量。R-CNN作者做了个实验最终采用了各向异性缩放也就是把候选区域直接强制缩放到227×227简单粗暴但有效。当时也有人尝试加边框填充padding再缩放但效果提升有限反而增加工程量。预训练模型在ImageNet上做分类学到的特征对物体类别有很强的区分能力。但分类任务和检测任务还是有细节差异比如分类的目标居中且完整检测的目标可能被截断或只露出一部分。为了让CNN特征更适合检测R-CNN引入了微调阶段用预训练权重初始化然后在检测数据集上继续训练但训练样本不是简单的所有候选框而是把与真实框IoU大于0.5的候选框当作正样本其他当作背景负样本。微调时的学习率要比较低我当时用0.001的量级因为是在预训练基础上微调学得太猛会把之前学到的通用特征摧毁。还有一个细节是正负样本配比如果背景样本太多网络会严重偏向输出背景类别。R-CNN训练时使用的是mini-batch采样每个批次固定包含一定比例的正样本和负样本保证类别均衡。3.3 模块三类别SVM与回归器修正边框微调完成后的CNN特征提取器并不是直接输出候选框的类别。R-CNN做了一件在今天看来很绕的事它把最后一个分类层换成支持向量机SVM为每个目标类别训练一个二分类SVM。为什么不用CNN自己的Softmax分类器作者在论文里分析的原因是CNN微调时使用的正样本定义IoU0.5的候选框比较宽松可能导致那部分内容其实不是准确的目标SVM正样本应该更严格一些。此外当时认为SVM在特征基础上做分类鲁棒性更好。后来Fast R-CNN证明Softmax也不差但在R-CNN那个年代为了追求极致性能SVM是重要选择。SVM的输出是一个得分。得分高的候选框被判定为包含某类目标。但此时框的位置是选择性搜索给出来的并不精准可能目标只占框的一小块或者框偏了。于是R-CNN还训练了一个线性回归器输入是CNN提取的特征预测的是候选框与真实框之间的偏移量中心点横纵坐标偏移、宽高缩放。边框回归这一步非常重要它通常能把定位误差降低好几个百分点mAP。我当时复现时一开始忽略了回归器只做了分类结果检测框明显偏大偏松。换上回归器之后框紧贴目标效果提升肉眼可见。回归器只在IoU特别大的候选框上训练通常是IoU0.6或者直接只取候选框与真实框重叠最大的那部分确保学的是微调校正而不是从零学习定位。4. 完整跑通R-CNN的实操记录与关键参数4.1 数据准备与候选区域生成细节如果从零复现R-CNN第一步是准备数据集。以Pascal VOC为例每张训练图都有标注文件里面写着每个目标的类别和真实框坐标。需要用选择性搜索为每张图生成候选框。很多现成实现里已经有selectivesearch函数但要注意生成模式有fast和quality之分。R-CNN用的是quality模式因为它更追求召回率。我实际测试过fast模式大约每张图0.1秒quality模式要0.3秒左右差了三倍但候选框的质量确实更好。生成的候选框要和标注框计算IoU然后打标签IoU超过0.5的记为正样本低于0.1的记为负样本。那中间0.1到0.5的怎么办直接丢掉。为什么把它们当作正样本会带来大量噪声当作负样本又会干扰SVM一个模糊两可的样本无论放在哪一边都会把分类边界搅浑。这个丢中间样本的做法在R-CNN里体现得很明显后续很多检测方法继承了这套忽略模糊区域的思想。有一个容易踩的坑正样本数量往往很少。一张图可能只有几个物体而候选框有2000个负样本几万个严重不平衡。训练SVM时会用难负样本挖掘hard negative mining即第一轮训练后把被误分为正样本的难负样本挑出来追加进训练集再重新训练。这有点像考试后把错题本重新做一遍模型会更在意那些看似是目标其实不是的区域。4.2 训练流程的四个阶段与超参选择完整的R-CNN训练分为四个阶段第一阶段是预训练CNN分类模型。大多数复现直接用公开的预训练权重不需要自己从头练。第二阶段是用检测数据集微调CNN把原来的一千类分类层换成类别数1的背景类用IoU0.5的候选框作为正样本学习率取预训练最后阶段的十分之一左右。第三阶段是在CNN提取的特征上训练每个类别的SVM用难负样本挖掘。第四阶段是训练边框回归器。这四个阶段是串行的每一轮都要保存中间结果。我当时复现时觉得最繁琐的是第二阶段和第三阶段之间的衔接微调后的CNN要去提取所有候选框的特征存在磁盘上作为SVM的输入。如果数据集很大特征文件会非常占空间。我记得用了约五万张训练图每张图两千个候选框每个候选框的特征4096维浮点数算下来要几十GB的磁盘。这还没算上各种中间文件。SVM训练阶段也有很多小坑。比如正则化参数C的选择太大容易过拟合太小分类边界太空。我当时用网格搜索调C从0.01到100范围取对数间隔最后选在10左右效果较好。边框回归器要标准化特征和回归目标否则训练不稳定。4.3 推理流程与NMS去重推理阶段更要仔细。输入一张新图先跑选择性搜索得到约2000个候选框然后对每个候选框裁剪、缩放、过CNN提特征再用SVM打分。但问题来了一个物体可能被很多候选框同时覆盖输出结果会有大量高度重叠的框这时候就需要非极大值抑制NMS来去重。NMS的思路很简单把所有框按SVM得分从高到低排序保留得分最高的框然后删除所有与它IoU超过某个阈值的其他框重复这个过程。这个IoU阈值就是NMS窗口。阈值设得太低会导致两个挨得很近的物体被误删一个设得太高又会留下大量重复框。在Pascal VOC上NMS阈值通常在0.3到0.5之间。我当时发现0.4比较平衡不过具体要根据应用场景去调。NMS之后还要对保留下来的框应用边框回归得到更精准的坐标。这里有一个细节容易被忽略回归器是基于CNN特征预测偏移量的如果候选框被NMS删掉了就没有必要再回归所以顺序是先NMS再回归还是先回归再NMS我自己的经验是先SVM打分然后做NMS得分高的先保留再对保留的框做回归这样计算量更小。有些实现是每个框先回归再NMS效果差别不大但回归后的框重叠度可能更高NMS反而会误删所以我倾向先NMS后回归。5. R-CNN的先天短板速度、存储与多阶段误差积累5.1 速度瓶颈每张图要跑约2000次CNNR-CNN推理一张图要跑约2000次完整的CNN前向计算。即使当时主流GPU跑一遍AlexNet需要约几十毫秒这2000次加起来也要接近一分钟甚至更久。CPU实现就更不用说了单张图等半分钟是常事。这在实验室里调参还能忍但放到真实场景里基本没法用。有意思的是R-CNN的作者显然也知道这个问题但他们的首要目标是把mAP拉上去先证明深度学习做检测的可行性速度问题可以后续解决。果然后面的优化很快就来了但R-CNN这种重复计算2000次的做法确实暴露了深度学习检测器在工程上的原始病根。5.2 多阶段训练与中间特征存储除了速度R-CNN的训练流程极其割裂。预训练、微调、SVM训练、回归器训练四个阶段各自为政。每一个阶段都要单独保存中间结果而且SVM训练依赖CNN特征CNN特征又要靠候选框提取。整个系统不是端到端的任何一处修改都可能要对前面阶段的产出重新计算一遍。我记得调试的时候最痛苦的就是改动了一个超参数结果所有中间特征都要重新提取。更别提磁盘占用特征文件动辄几十GB每次跑完都要小心清理。这也直接启发了Fast R-CNN的设计能不能让CNN自己直接输出类别和回归结果不做SVM不存中间特征5.3 从这些短板反向推导出后续优化的方向R-CNN的长短板非常鲜明短板的背后其实藏着三个优化方向。一是特征重复计算问题既然一张图有2000个候选框它们之间一定有大量重叠区域能不能让整个图像只过一次CNN再通过某种方式把候选区域对应的特征图抠出来这后来成了Fast R-CNN的出发点。二是多阶段训练问题SVM和回归器都依赖CNN特征如果把类别预测和边框回归也集成到网络中让所有模块可以联合训练整个系统就简洁多了落点也彻底打通。三是候选区域本身的生成方式选择性搜索是在CPU上运行的耗时不短而且它是独立于检测网络的能不能把候选区域生成也变成一个网络层这就是Faster R-CNN的答案。如果你完整复现过一遍R-CNN你会发现这套思路的延展性极好。它把检测拆成在外面的找区域和在里面的看内容两个阶段后来的两阶段检测器几乎都是在这个框架上演进的。理解了R-CNN的优缺点再看新论文时会觉得很多设计都是像拼图一样严丝合缝地补上了R-CNN留下的坑。6. 从R-CNN到Fast R-CNN再到Faster R-CNN演进逻辑与借鉴6.1 Fast R-CNN如何解决特征重复计算R-CNN最明显的浪费是每个候选框都要单独跑一遍CNN。Fast R-CNN的做法是把整张图像一次性输入CNN得到整个特征图然后用一个叫感兴趣区域池化RoI Pooling的操作把每个候选框对应的特征区域从特征图上截下来缩放到固定大小再送入后面的全连接层。这样整张图只需要跑一次CNN速度比R-CNN快了二十多倍。RoI Pooling的操作有点像一个自适应池化层它把候选框对应的特征区域划分成固定网格比如7×7每个网格做最大池化输出固定尺寸的特征。这个操作的精妙之处在于它不需要候选框在像素空间上是同一个尺寸候选框对应特征图的位置和尺寸不同都可以通过归一化网格提取出相同长度的特征向量。这样整个CNN就成了整图一次性前向后面的分类和回归都共享这个特征图。Fast R-CNN还把类别SVM换成了Softmax分类器把边框回归也合并进了网络一起训练。整个训练过程变成了多任务损失一个分支预测类别一个分支预测边框偏移。不再需要单独的SVM和回归器训练阶段也不需要保存中间特征到磁盘。这个改动极大简化了流程mAP还比R-CNN提升了一点。6.2 Faster R-CNN如何把候选区域也交给网络Fast R-CNN虽然快了但候选区域仍然用选择性搜索生成这一步依然耗时且无法和GPU上的网络跨界协同。Faster R-CNN的洞察是既然CNN已经提取了整图特征为什么不能直接在特征图上预测出候选框呢它引入了一个新组件叫区域提议网络RPNRegion Proposal Network。RPN在共享特征图上滑动一个窗口在每个位置同时预测多个预设尺寸和长宽比的锚点框是否存在目标并给出目标性得分和粗略的坐标偏移。这些锚点框经过筛选和NMS之后就代替了选择性搜索的候选框。然后整个系统可以端到端训练RPN和检测头共享CNN特征候选区域生成不再依赖CPU级的传统算法。这一步的意义非常深远。它让找区域和认物体这两件事在同一个框架下联合训练整个检测器的速度和精度都上了一个台阶。虽然后来又出现了大量单阶段检测器大多数追求极致的速度但两阶段方法在许多高精度场景依然是首选。R-CNN提出的候选区域CNN分类边框回归的组合在今天依然是一个清晰的思维模型。6.3 今天的检测器还保留了R-CNN的哪些遗产如果你去看现在的检测框架不管是两阶段的还是单阶段的几乎都能找到R-CNN的基因。锚点框的概念和RPN的候选区域思想一脉相承正负样本采样策略里IoU阈值的设定也沿用了R-CNN的经验NMS去重和边框回归几乎是所有检测器不可或缺的组件。我经常跟新人说不要觉得R-CNN过时就直接跳过那是一切检测思路的原点。很多今天看起来理所当然的设计其实都是在R-CNN的坑里边踩边改出来的。比如为什么正样本IoU阈值取0.5而不是0.7为什么难负样本挖掘有效为什么边框回归能纠正定位误差这些问题只有在R-CNN语境里才最容易讲清楚。再说回R-CNN之后的传承Fast R-CNN把分类和回归合并在网络里Faster R-CNN把候选区域也变成了网络层而后来的很多方法在特征金字塔、注意力机制上继续延伸。但先做区域提议再逐区域识别这个双阶段范式至今仍是高性能检测器的主流模式。单阶段检测器虽然跳过了显式的区域提议但很多设计哲学仍然在向R-CNN致敬。我个人在实际复现过程中的最大体会是R-CNN最大的价值不在它的最终精度或速度而在于它把问题拆解的清清楚楚。每一块组件都能单独理解单独调试对于新手来说是绝佳的入门教材。哪怕你没有真的跑一遍只要在纸上画出它的流程图把每一步的输入输出搞清楚再去看后续的检测器都会觉得通畅很多。最后分享一个小技巧如果你要读新出的检测论文先别急着看模型结构先问自己这个方法是两阶段还是单阶段的候选框怎么来的正负样本怎么定义损失函数里有几项这四个问题问下来其实就是在R-CNN的框架里找参照系。很多新方法听起来花哨本质上都是在R-CNN铺好的这条路上做优化。把R-CNN吃透你在目标检测这个领域就有了一个稳固的坐标系以后往里塞新知识都轻松得多。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑