一、共享卷积计算
- 这是Fast R-CNN相对于R-CNN最核心、最根本的效率提升,直接催生了其"快"的特性。
1. R-CNN的问题:重复计算的地狱
- R-CNN使用 "区域优先 " 的流程:
- 先通过选择性搜索提取约2000个候选区域。
- 然后将每个候选区域分别、独立地输入CNN,进行特征提取。
- 这就导致了灾难性的计算冗余:一张图片中,2000个候选区域之间高度重叠(都包含同一只猫的各个部分),背景区域也被反复计算。想象一下,你用同一个复杂的公式,对2000个几乎相同的数据分别计算,而不是先算出公用的中间结果------这是巨大的浪费。
2. Fast R-CNN的解决方案:特征图共享
- Fast R-CNN(以及其前身SPP-Net)采用了 "特征图优先 " 的流程,这是一个范式转变 :
-
步骤说明:
- 整图一次前向传播:将完整的输入图像一次性送入CNN的主干网络(如VGG16的卷积层部分)。
- 生成共享特征图 :经过所有卷积层后,输出一张整图的、高维的、下采样的特征图。
- 例如,输入一张224x224的图片,经过VGG16的卷积层后,会得到一张7x7x512的特征图(空间尺寸7x7,通道数512)。
- 这张特征图上的每个像素点(7x7网格中的一个位置),都对应着原图上一个大区域的抽象特征。
- 区域映射:将选择性搜索得到的原始像素坐标下的候选框,根据CNN的下采样比例(如32倍),映射到这张共享特征图上的对应位置。这个映射后的区域称为 "兴趣区域"。
-
思想精髓:
- "先提取全局特征,再从中抠出局部特征",而不是"为每个局部重复提取全局特征"。
- 性能提升的量化对比:
- R-CNN:2000个区域 x 每个区域的前向传播计算量。
- Fast R-CNN:1次整图前向传播的计算量 + 2000次简单的区域映射和池化操作。
- 结果:测试速度从R-CNN的几十秒/图提升到Fast R-CNN的零点几秒/图。
-
二、空间金字塔池化及其演进
- SPP是解决"如何将任意大小的RoI转换为固定大小输入"这一关键问题的创新。Fast R-CNN中的RoI池化是其简化但核心的版本。
1. 问题背景:CNN的全连接层需要固定输入
- CNN末端的全连接层(如VGG16的FC6, FC7)要求输入向量的维度是固定的。但映射到特征图上的RoI,其尺寸各不相同(有的长,有的扁)。我们必须找到一种方法,将不同尺寸的RoI特征转换为统一尺寸。
2. SPP-Net的解决方案:空间金字塔池化
- SPP-Net提出了一个优雅的解决方案:在特征图上进行多尺度的池化。
- 工作原理 :
- 对于一个任意尺寸(如h x w)的RoI特征块。
- 我们定义几个固定的输出尺度,例如一个金字塔结构:[4x4, 2x2, 1x1]。
- 对每个输出尺度:
- 将RoI划分为对应数量的网格(如对于4x4的输出,就将h x w的区域划分成4x4=16个格子)。
- 在每个格子里进行最大池化,得到一个值。
- 这样,4x4的输出就得到16个值,2x2得到4个值,1x1得到1个值。
- 将所有尺度的输出值拼接成一个一维向量。例如,(16+4+1) * 通道数512 = 21*512 = 10752维的固定长度向量。
- 这个固定长度的向量就可以送入后续的全连接层。
- 优势:
- 解决尺寸问题:完美适配任意形状的输入区域。
- 提升模型鲁棒性:多尺度池化使模型对物体的尺度变化和轻微形变更具鲁棒性,因为信息在不同粒度上被保留了。
3. Fast R-CNN的改进:简化版SPP -> RoI池化
- Fast R-CNN的作者认为SPP的金字塔结构(多尺度)虽然有效,但可以进一步简化以提升效率。他们采用了单尺度池化,并将其命名为 "RoI池化层"。
- RoI池化工作原理 :
- 指定一个固定的目标输出尺寸,例如 7x7。
- 对于一个尺寸为 h x w 的输入RoI特征块,计算网格大小:
- 每个网格的高度 = h / 7
- 每个网格的宽度 = w / 7
- (结果可能是浮点数,需要进行取整操作来划分网格边界,这是RoI池化实现中的一个关键细节,通常采用"量化"操作)。
- 在每个7x7的网格内进行最大池化,最终输出一个固定的 7x7 特征图。
- 将这个7x7的特征图展平,送入后续的全连接层。
三、为什么RoI池化就够了?
- 在实践中,单尺度的RoI池化在保证绝大部分性能的同时,极大地简化了计算和实现。模型通过数据增强和深度网络本身已经具备了一定的尺度不变性。RoI池化成为了后续几乎所有两阶段检测器(Faster R-CNN, Mask R-CNN)的标准组件。
- 进阶:Mask R-CNN进一步将RoI池化改进为 RoI对齐,解决了RoI池化中两次量化(区域坐标映射量化和网格划分量化)带来的特征不匹配问题,实现了像素级的精确定位。