Fast R-CNN:快速的基于区域的卷积神经网络.

R-CNN包括三个独立的模型,没有共享计算:卷积网络的图像分类和特征提取;支持向量机的目标识别;回归模型的边界框位置修正。因此R-CNN的推理速度较慢。

为了加快R-CNN的推理速度,Fast R-CNN把三个独立的模型统一到一个联合训练框架中,以此共享计算结果。为了避免使用卷积网络为每个感兴趣区域独立地提取特征向量,Fast R-CNN首先使用一个卷积网络处理整张图像,然后从输出特征映射中通过RoI Pooling分别提取不同RoI区域的特征,并通过不同的分支同时执行目标类别识别与边界框回归。

Fast R-CNN模型的工作流程如下:

  1. 在通用的图像分类任务(如$1000$类的ImageNet)上预训练一个卷积神经网络(如AlexNet, VGGNet, ResNet);
  2. 通过选择搜索算法提取感兴趣区域(region of interest, RoI),对每张图像提取约$2k$个区域,这些区域具有不同的尺寸,可能包含不同的目标;
  3. 把预训练网络的最后一个最大池化层替换为RoI Pooling层,RoI Pooling层接收RoI对应的特征映射区域,输出固定长度的特征向量;
  4. 目标类别识别分支采用$K+1$类别分类的分类网络,$K$是下游任务的类别数,并额外增加一个背景类;
  5. 边界框回归分支为$K$个类别预测RoI的边界框位置偏移。

Fast R-CNN的主要速度瓶颈在区域提议的选择搜索算法。

⚪ RoI Pooling

RoI Pooling是一种最大池化层,它把图像特征映射中的任意尺寸$H\times W$的区域映射为固定尺寸$h\times w$的特征。在实现时把输入区域划分为$H\times W$的窗口,然后对每个窗口应用最大池化操作。划分子区域的参数$s$只选一个特定的值,原文中选择$s=7$,即把候选区域的特征映射转换成$7×7$的子区域。

⚪ 损失函数

Fast R-CNN的损失函数是分类损失和定位损失的组合\(\mathcal{L}=\mathcal{L}_{cls}+\mathcal{L}_{box}\)。给定预测边界框坐标$p=(p_x,p_y,p_w,p_h)$及其标签$g=(g_x,g_y,g_w,g_h)$,分别代表边界框的中心位置及其宽度和高度。与R-CNN相同,回归分支学习中心位置的尺度不变变换以及宽度和高度的对数尺度变换:

\[\begin{aligned} \hat{g}_x &= p_w\hat{t}_x(p) + p_x \\ \hat{g}_y &= p_h\hat{t}_y(p) + p_y \\ \hat{g}_w &= p_w \exp(\hat{t}_w(p)) \\ \hat{g}_h &= p_h \exp(\hat{t}_h(p)) \end{aligned}\]

则回归分支的目标标签为:

\[\begin{aligned} t_x &= (g_x-p_x)/p_w \\ t_y &= (g_y-p_y)/p_h \\ t_w &= \log (g_w/p_w) \\ t_h &= \log (g_h/p_h) \\ \end{aligned}\]

给定预测类别概率分布$p=(p_0,…,p_K)$和标签类别$c$ ($0$表示背景类),则总损失函数为:

\[\begin{aligned} \mathcal{L}(p,c,\hat{t},t)&=\mathcal{L}_{cls}(p,c)+\mathbb{I}(c \neq 0)\mathcal{L}_{box}(\hat{t},t) \\ \mathcal{L}_{cls}(p,c) &= -\log p_c \\ \mathcal{L}_{box}(\hat{t},t) &= \sum_{i \in \{x,y,w,h\}}L_1^{smooth}(\hat{t}-t) \end{aligned}\]

其中边界框回归损失采用平滑L1损失,这是一种鲁棒的损失函数,对离群点不敏感:

\[L_1^{smooth}(x) = \begin{cases} 0.5x^2, & |x| < 1 \\ |x| - 0.5, & |x| \geq 1 \end{cases}\]