Fast RCNN是对RCNN论文的改进。

 

RCNN简介:

(1)image input;
(2)利用selective search 算法在图像中从上到下提取2000个左右的Region Proposal;
(3)将每个Region Proposal缩放(warp)成227*227的大小并输入到CNN,将CNN的fc7层的输出作为特征;
(4)将每个Region Proposal提取的CNN特征输入到SVM进行分类;
(5)对于SVM分好类的Region Proposal做边框回归,用Bounding box回归值校正原来的建议窗口,生成预测窗口坐标.
缺陷:
(1) 训练分为多个阶段,步骤繁琐:微调网络+训练SVM+训练边框回归器;
(2) 训练耗时,占用磁盘空间大;5000张图像产生几百G的特征文件;
(3) 速度慢:使用GPU,VGG16模型处理一张图像需要47s;
(4) 测试速度慢:每个候选区域需要运行整个前向CNN计算;
(5) SVM和回归是事后操作,在SVM和回归过程中CNN特征没有被学习更新.

相比于RCNN, fast rcnn解决的问题在于:

(1)在最后一个卷积后加入了ROI pooling layer,这使输入的图片可以多尺度,且共享了计算。

(2)RCNN在训练过程时,直接对bounding-box进行回归训练,不能在卷积层进行更新。fast rcnn在卷积上就对位置进行了回归。

fast rcnn的贡献点:

(1)提高了mAP

(2)训练了单阶段的多任务损失

(3)训练更新了所有网络层

(4)不再要求存储特征

 

网络结构

fast RCNN 论文 fast rcnn详解_fast RCNN 论文

总体结构:图片送入卷积backbone做特征提取得到feature map。feature map送入ROI pooling用于得到定长的特征向量(ROI featrue vector),每个特征向量被送入到两个兄弟输出层:一个完成k+1分类(k个类别+1个背景),一个用于完成bbox回归。

下面详细解释各个模块:

(1)ROI pooling

ROI pooling的做法来源于spp net,解决的是输入特征图的尺度不一问题。图为spp的做法。通过使用4*4、2*2、1*1的网格对特征图做池化,可以得到4*4+2*2+1*1的定长向量,这就解决了固定输入图片尺度的resize费时、影响图片尺度、改变图片长宽比例的问题。

fast RCNN 论文 fast rcnn详解_池化_02

ROI通过设置超参HxW用于表示ROI做池化块数。本文中使用矩形对特征图做RoI池化,用四个值(r, c, h, w)表示矩形,(r, c)表示左上角,(h, w)表示右下角。RoI使用最大池化对每个子窗口进行池化。子窗口的大小为h/H x w/W。RoI在每个特征图通道独立应用池化。相比于spp,RoI的区别是只有一个金字塔层。

(2)预训练网络的使用

fast rcnn中用了3个预训练网络(3个backbone),每个包含了5个最大池化层,5到13个卷积层。其他改变:

a. 最后一个最大池化层由RoI Pooling替换,设置了参数H和W(vgg16中H=W=7)。

b. 最后的全连接层和softmax被替换成2个兄弟层,分别完成K+1类的softmax分类,和bbox的回归。

c. 网络的数据输入被调整为,图片的列表和图片对应RoI的列表。

(3)检测模块微调

spp中有个很大的问题,spp层训练困难,原因是每个RoI都有很大的感知域,大到覆盖了整个输入图像。

改进方法是使用SGD,首先采样N个图片,再在每个图片采样R/N个ROIs。比如,N=2,R=128,可以比从128个图片中采样1个RoI快64倍。通过实验观察发现,没有不收敛。

(4)多任务损失

fast rcnn包含两个输出层。第一个,每个RoI输出离散的分布,p=(p0, p1, ..., pk),包括了K+1类,p由全连接层+softmax计算得来。第二个输出做bbox(x, y ,w, h)的回归。

损失函数如下:

 

𝐿(𝑝,𝑢,𝑡𝑢,𝑣)=𝐿𝑐𝑙𝑠(𝑝,𝑢)+𝜆[𝑢⩾1]𝐿𝑙𝑜𝑐(𝑡𝑢,𝑣)

损失函数包含了分类损失和回归损失。

分类损失:

𝐿𝑐𝑙𝑠(𝑝,𝑢)=−𝑙𝑜𝑔 𝑝𝑢

回归损失:

 

fast RCNN 论文 fast rcnn详解_池化_03

其中,

fast RCNN 论文 fast rcnn详解_卷积_04

𝜆是用于平衡两个任务的超参,这里设置为1,因为groud-truth regression目标被标准化。

(5)小批量采样

按上面的采样方法,N=2,R=128,从1张图片中取64个RoI。取25%的RoI和目标计算IoU,要求IoU>0.5。

(6)RoI的反向传播

整个fast rcnn在计算前向时,图片都是独立的(这也导致了不能batch检测)。计算反向传播和普通池化层计算有些区别。

fast RCNN 论文 fast rcnn详解_fast RCNN 论文_05

因为一张图片会产生很多roi,这写roi可能有交集,如上图,那么在左边x23位置,如果两次池化都是最大值,那么这个位置的梯度就由n次池化做累加。

(7)SGD超参数

全连接层使用softmax进行分类,bbox回归使用0均值高斯分布进行初始化,标准差分别为0.01和0.001。

(8)SVD分解

把全连接层由uv的计算量改为t(u+v),相当于中间加一层。

实验

1. fast rcnn的主要检测流程:

(1). 输入一张待检测图像;

(2). 提取候选区域:利用Selective Search算法在输入图像中提取出候选区域,并把这些候选区域按照空间位置关系映射到最后的卷积特征层;

(3). 区域归一化:对于卷积特征层上的每个候选区域进行RoI Pooling操作,得到固定维度的特征;

(4). 分类与回归:将提取到的特征输入全连接层,然后用Softmax进行分类,对候选区域的位置进行回归。