Fast RCNN 在训练速度上达到 RCNN 的9倍,测试速度达到其213倍,同时在PASCAL VOC 2012测试集上mAP达到66%

RCNN和SPPnet

首先回顾一下RCNN中存在的一些问题

  1. 训练是多阶段的 (CNN + SVM + bbox regressor)
  2. 训练耗时占空间 (每个候选框的特征需提取并保存)
  3. 测试速度慢 (47s/img)

SPPnet是RCNN的改良版本,在RCNN中,需要先提取候选框中的特征,然后将每个候选框的特征单独输入CNN中做卷积操作,而SPPnet的核心思想就是从feature map中提取ROI(候选框)特征

这将面临两个问题:

  1. 原始图像的候选框如何映射到特征图 (卷积层的输出)
  2. 候选框对应的特征如何满足全连接层的输入要求 (特征无法像图片一样拉伸或者填充)

为了解决全连接层输入大小固定的问题,SPPnet提出了空间金字塔池化 (SPP,spatial pyramid pooling),不管输入的特征图大小,均用三种不同尺度的滤波器做池化,最终得到$4\times 4$,$2\times 2$,$1\times 1$大小的256通道的特征图,级联得到固定大小的输出

而映射问题,本质上就是去找到特征图的区域,使得其感受野近似原来的候选框,这里采用的是用步长之积对原坐标进行缩放的方式来定位

计算公式为:

左上角坐标:$\lfloor x/S \rfloor+1$,$\lfloor y/S \rfloor+1$

右下角坐标:$\lceil x/S \rceil-1$,$\lceil y/S \rceil-1$

其中$S$为池化和卷积的步长之积

SPPnet在测试阶段比RCNN快了$10 \sim 100$倍,在训练阶段快了3倍,但是SPPnet依然也存在一些问题

  1. 训练是多阶段的这一点没有改善
  2. 很难通过fine-tuning对SPP-layer之前的网络进行参数微调,当网络深度加深时很难保证精度

Fast R-CNN

Fast R-CNN的基本架构如下,图描述的非常清楚

主要特点有:

  1. 沿用SPPnet将一整张图作为CNN的输入来提取特征的方法
  2. 用RoI池化替代SPP-layer
  3. 将分类 (softmax产生N+1类) 和回归 (对N个目标类的4个位置坐标输出) 放在一起训练

RoI池化层

RoI池化层的目的是将所有输出固定为$H \times W$

文章中将所有RoI用四元组$(r,c,h,w)$定义,即左上角坐标和长宽,RoI池化层的工作原理是将$h \times w$的RoI窗口划分为$H \times W$小块,每块大小为$h/H \times w/W$,最大池化每个小块中的值,输出对应的网格单元,这样就能得到固定大小的输出

SPPnet很难更新空间金字塔池化层前的卷积层是因为反向传播非常低效,其低效性源于每个RoI巨大的感受野 (通常是全图)

为了解决这个问题,作者将采样方式从以RoI为中心的采样转化为以图片为中心的采样,之前的R-CNN和SPPnet都是采用RoI为中心的采样,每个SGD的mini-batch中包含不同图像的样本,不能共享卷积计算,图片为中心的采样是分层采样,先对图像采样(N),然后在采样图像对候选区域采样(R/N,R为批次输入),N调小之后,在一个batch中可以有更多的图在正反向传播时共享特征,提高效率

多任务损失

Fast R-CNN中有两个同级的输出层,分类和回归,分类的目的是计算概率$p=(p_0,\dots,p_K)$,回归则得到物体类的平移和缩放$t^k=(t^k_x,t^k_y,t^k_w,t^k_h)$,两个输出相对应的GT为物体标签类别$u$和回归目标$v$

总的损失函数为

$L_{cls}(p,u)=-log\ p_u$是类别u的负对数损失,最小化正确类别的负对数损失,本质上就是在做最大似然估计

$\lambda$用来调节多任务loss之间的平衡,$[u\ge1]$则限定物体首先存在然后计算第二项loss (背景则不计算第二项)

Loss的第二部分则是对每个坐标或偏移量计算$Smooth_{L1}$

计算公式如下

测试流程

  1. 提取图片的候选框 (Selective Search)
  2. 将框和全图传入CNN网络提取RoI特征
  3. 将RoI特征传入RoI池化层得到大小固定的输入
  4. 通过一系列FC层在最后一层分支分别对框回归和对物体分类
  5. 用对bbox进行回归得到的偏移量对bbox进行修正,并根据NMS对bbox进行筛选