Faster R-CNN = RPN(生成候选框) + Fast R-CNN(分类+回归),两者共享同一个CNN骨干网络。
1、整体架构
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1. 共享卷积特征提取 | 输入整张图片,通过CNN骨干网络(如VGG16、ResNet)提取共享特征图。 | 这张特征图被RPN 和检测网络共用,实现计算共享。 |
| 2. RPN生成候选框 | 在特征图上滑动一个小网络 ,在每个位置生成锚框(Anchor Boxes),并判断每个锚框是"前景(有物体)"还是"背景",同时微调锚框位置。 | 输出约300个高质量的候选框(Proposals),替代了Selective Search。 |
| 3. RoI Pooling / RoI Align | 将RPN输出的候选框映射到共享特征图上,使用RoI Pooling(或更精确的RoI Align)将其池化为固定大小。 | 与Fast R-CNN完全相同。 |
| 4. 分类与回归 | 将池化后的特征送入全连接层,通过Softmax做类别分类 ,通过边界框回归器做位置精修。 | 与Fast R-CNN完全相同。 |
2、RPN
2.1 RPN的工作流程
-
滑动窗口 :在共享特征图上,用一个 3×3 的卷积核滑动,每个窗口位置对应特征图上的一个点。
-
锚框(Anchor Boxes) :在每个滑动窗口位置,预定义 k 个不同尺度和长宽比的锚框 。通常设置 3种尺度 × 3种长宽比 = 9个锚框。
-
尺度:如 {128², 256², 512²} 像素(在原图上的尺寸)
-
长宽比:如 {1:1, 1:2, 2:1}
-
-
两个并行的分支(在3×3卷积之后):
-
分类分支(2k个输出) :判断每个锚框是"前景(object)"还是"背景(background)",输出
2k个分数(每个锚框两个分数)。 -
回归分支(4k个输出) :微调每个锚框的位置,输出
4k个坐标偏移量(dx, dy, dw, dh)。
-
-
生成Proposals :根据分类得分排序,取前N个(如训练时取2000个,推理时取300个),再经过NMS去重,得到最终的候选框。
关键理解 :RPN本身并不做具体类别的识别,它只做二分类 (有没有物体)和粗定位。具体是什么物体,留给后面的检测网络来做。
2.2 锚框(Anchor)的设计哲学
面试官常问:"为什么要设计这么多锚框?"
-
解决多尺度问题 :物体在原图中的尺寸差异很大(如小汽车vs.大卡车)。如果只用单一尺度的框,模型很难覆盖所有情况。通过预定义多种尺度和长宽比,让模型只需要学习"微调"而不是"从零预测",降低了学习难度。
-
平移不变性 :锚框是密集地铺在特征图每个位置上的,保证了检测器对物体位置的平移具有不变性。
-
密度与效率的平衡:锚框的数量(如9个/位置)既保证了足够的覆盖率,又不至于计算量过大。
2.3 RPN的训练标签分配(正负样本定义)
这是面试中极易被追问的细节,你需要清晰地说出以下规则:
| 样本类型 | 判定条件 |
|---|---|
| 正样本 | ① 与某个Ground Truth框的IoU > 0.7 ;② 与某个Ground Truth框有最大IoU(确保每个GT至少有一个锚框负责)。 |
| 负样本 | 与所有Ground Truth框的IoU < 0.3。 |
| 忽略样本 | IoU在 0.3, 0.7 之间的锚框,不参与训练。 |
为什么这样设计? 保证正负样本平衡(通常正:负 ≈ 1:1),同时避免模糊样本(部分重叠)对训练造成干扰。
3、训练策略
Faster R-CNN有两个网络(RPN + 检测网络)共享同一个CNN骨干,如何训练是一个关键问题。
| 训练方式 | 做法 | 优缺点 |
|---|---|---|
| 交替训练(Alternating Training) | 原始论文采用的方式。① 先单独训练RPN;② 用RPN产生的候选框训练检测网络;③ 用检测网络微调RPN(共享卷积层);④ 再微调检测网络。迭代多次。 | 稳定但繁琐,训练时间长。 |
| 近似联合训练(Approximate Joint Training) | 将RPN和检测网络合并为一个网络 ,前向时RPN生成候选框,反向时梯度在RoI Pooling处截断,不传到RPN。 | 训练速度快,效果略差但可接受,工业界常用。 |
| 端到端联合训练 | 完全端到端,梯度从检测网络传回RPN。但这需要RoI Pooling是可微的,后来RoI Align解决了这个问题。 | 理论上最优,但实现复杂。 |
4、面试问题
-
问1:RPN和检测网络是如何共享特征的?
- 答 :两者共用同一个CNN骨干网络的输出(如VGG16的
conv5_3层)。前向时,RPN和检测网络都从这个共享特征图上获取数据。反向传播时,两个网络的梯度都会累积到共享的卷积层上,一起更新。
- 答 :两者共用同一个CNN骨干网络的输出(如VGG16的
-
问2:为什么RPN要用3×3的卷积核,而不是更大的?
- 答 :3×3是感受野与计算量的平衡。在特征图上,3×3的窗口对应原图上一个较大的区域(取决于下采样倍数,如VGG16中对应约228×228像素),已经足够覆盖锚框的上下文信息。更大的卷积核会增加计算量,收益不大。
-
问3:RPN为什么输出2k个分数,而不是k个?
- 答 :因为RPN做的是二分类 (前景/背景),所以每个锚框需要2个输出。这在训练时用于计算二分类交叉熵损失。
-
问4:NMS在RPN和检测网络中分别扮演什么角色?
- 答 :在RPN中,NMS用于筛选候选框 ,将数千个锚框精简为几百个高质量的Proposals(IoU阈值通常设为0.7)。在检测网络中,NMS用于去除重复的最终检测框,避免同一个物体被多次检出(IoU阈值通常设为0.3-0.5)。