1、详细工作流程
| 步骤 | 操作 | 与R-CNN的差异 |
|---|---|---|
| 1. 生成候选区域 | 同样使用Selective Search,生成约2000个候选框。 | 无变化,候选框生成依然独立。 |
| 2. 整图特征提取 | 将整张图片输入CNN,得到一张共享的、高分辨率的特征图(Feature Map)。 | 核心改进!整图只过一次CNN,计算量锐减。 |
| 3. 映射与池化 | 将每个候选框的坐标映射到特征图上对应的区域。然后对该区域使用RoI Pooling,将其池化为固定大小(如7×7)的特征图。 | 关键创新!引入RoI Pooling层,解决不同尺寸候选框需要统一大小的问题,且操作发生在特征图上而非原图上。 |
| 4. 全连接与分类回归 | 将池化后的特征图展开,输入到全连接层,得到一个特征向量。然后通过两个并行的输出分支:一个Softmax做类别分类,一个边界框回归器做位置微调。 | 重要改进!将分类和回归合并到一个网络中,实现多任务Loss联合训练,不再需要SVM。 |
2、创新点
创新1:RoI Pooling(Region of Interest Pooling)
这是Fast R-CNN的灵魂组件。
解决的问题:R-CNN需要将每个候选区域裁剪并缩放到固定尺寸(如227×227),这个过程会破坏图像长宽比,且非常耗时。
Fast R-CNN的做法:它将候选区域映射到特征图上(比如将原图上的100×200的框,映射到缩小了16倍的特征图上,就变成了约6×12的区域),然后对这个非整数、不同尺寸的区域,用最大池化(Max Pooling)将其统一池化为固定大小(如7×7)。
具体操作(面试官可能会追问细节):假设要把一个
h×w的区域池化为H×W(如7×7),则将其划分为H×W个网格,每个网格大小约为h/H × w/W,然后对每个网格取最大值。这样无论输入尺寸如何,输出都是H×W。
创新2:多任务损失函数(Multi-task Loss)
Fast R-CNN将分类和回归融合在一个网络里联合训练。
分类Loss:使用Softmax的交叉熵损失,判断RoI属于哪个类别(K个目标类 + 1个背景类)。
回归Loss:使用Smooth L1损失,微调边界框的位置。它只对“有物体”的RoI计算回归损失,背景框不参与回归训练。
总损失:
L = L_cls + λ * L_loc,其中λ控制两者权重。
为什么用Smooth L1而不是L2?因为L2损失对离群点(outlier)非常敏感,梯度会很大,导致训练不稳定。Smooth L1在误差较小时梯度平滑,在误差较大时梯度饱和,更鲁棒。
3、与RCNNDA全面对比
| 对比维度 | R-CNN | Fast R-CNN |
|---|---|---|
| 特征提取方式 | 每个候选区域独立过CNN,2000次前向传播 | 整图只过一次CNN,1次前向传播 |
| 尺寸统一方式 | 将候选区域裁剪/缩放到固定尺寸(如227×227) | 使用RoI Pooling在特征图上池化为固定大小 |
| 训练流程 | 三阶段(预训练CNN → 训练SVM → 训练回归器) | 端到端单阶段(一个网络,一个Loss联合训练) |
| 分类器 | 使用SVM(每个类别一个二分类器) | 使用Softmax(多分类,与CNN融合) |
| 训练速度 | 慢,需大量磁盘存储特征 | 快约9倍(训练),快约200倍(推理) |
| 存储开销 | 需要存储每个候选框的特征向量到硬盘 | 不需要,特征在内存中即时计算 |
| 精度(mAP) | 约58.5% (PASCAL VOC 2012) | 约66%(PASCAL VOC 2012),明显提升 |
4、面试考点
问1:为什么Fast R-CNN能实现端到端训练,而R-CNN不能?
答:因为Fast R-CNN将分类器和回归器都设计为神经网络层(Softmax和全连接回归),并统一用反向传播优化。而R-CNN的SVM是独立的机器学习模型,其损失无法回传到CNN,因此无法联合训练。
问2:RoI Pooling与R-CNN的裁剪缩放有什么本质不同?
答:R-CNN是在原图RGB像素上做裁剪缩放,会改变图像的视觉内容;而RoI Pooling是在CNN提取的深层特征图上操作,它是对特征做池化,不改变原图,且计算发生在GPU上,速度快得多。
问3:RoI Pooling的反向传播是怎么做的?
答:RoI Pooling的反向传播与标准Max Pooling类似,但更复杂一些。每个池化后的输出单元对应原始特征图上一个
h/H × w/W的网格。反向传播时,梯度只传递给该网格中最大值所在的位置。由于不同RoI可能重叠,一个特征图上的位置可能被多个RoI的梯度累加。
为什么RoI Pooling的反向传播是“稀疏”的?
理解这个稀疏性非常重要,它直接影响了网络的学习能力。
原因:前向传播时,每个输出单元只“激活”了输入特征图上的一个像素。反向传播时,梯度自然也只流经这一条路径。
后果:这意味着只有被选为最大值的“胜利者”像素才能获得梯度并更新权重。其他大量的像素,即使它们也可能包含了有用的信息,也不会接收到任何反馈信号,因而无法学习。
这就是RoI Pooling的主要缺点之一,也是后续方法(如RoI Align)试图改进的关键点。RoI Align通过使用双线性插值,让每个输出像素结合周围多个输入像素的信息,从而实现了密集的梯度回传,使网络能够学习到更精细的特征。