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)不再要求存储特征
网络结构
总体结构:图片送入卷积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费时、影响图片尺度、改变图片长宽比例的问题。
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]𝐿𝑙𝑜𝑐(𝑡𝑢,𝑣)
损失函数包含了分类损失和回归损失。
分类损失:
𝐿𝑐𝑙𝑠(𝑝,𝑢)=−𝑙𝑜𝑔 𝑝𝑢
回归损失:
其中,
𝜆是用于平衡两个任务的超参,这里设置为1,因为groud-truth regression目标被标准化。
(5)小批量采样
按上面的采样方法,N=2,R=128,从1张图片中取64个RoI。取25%的RoI和目标计算IoU,要求IoU>0.5。
(6)RoI的反向传播
整个fast rcnn在计算前向时,图片都是独立的(这也导致了不能batch检测)。计算反向传播和普通池化层计算有些区别。
因为一张图片会产生很多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进行分类,对候选区域的位置进行回归。