摘要:
我们提出了基于区域的、全卷积网络来进行精确、有效的目标检测。之前的Fast/Faster RCNN网络,在每个region上都应用了计算复杂度高的子网络,而RFCN则是使用在整张图上计算共享的全卷积网络。
文章提出了一种位置敏感的特征图来解决图像分类的平移不变性需求和目标检测的平移可变性之间的矛盾。本文采用了全卷积的图像分类器(比如ResNet101)作为主网络。
1.引言
之前的目标检测网络可以由ROI Pooling层分为前后两个子网络:一个共享的,全卷积的,独立于ROI的子网络;和一个不共享计算的、对每个ROI进行的子网络。
这主要因为先进的分类框架,比如AlexNet,或者VGGNet都是由两个子网络构成的–一个卷积网络,再加上一个空间池化层,再加上几层全连接层。因此,在图像分类网络中的空间池化层就很自然的变成了目标检测网络中的ROI Pooling层。
但是最近先进的图像分类网络比如ResNet和GoogleNet都是设计成全是卷积层。类比这些,很自然的想到全部使用卷积层来构建共享的、卷积网络。但是,这样子的全卷积网络用于目标检测任务精度会远远低于分类准确率。为了修正该问题,Faster RCNN作者在使用ResNet作为backbone时,在两个卷积层块中间加了一个ROI Pooling层,来创造了一个更深的,ROI-Wise的子网络来提高精度,同时也因为每个ROI之间的计算不共享,速度受到了影响。
之前提到了,目标检测的平移可变性和图像分类的平移不变性之间是个矛盾。一方面,对于图像级别的分类任务来说,平移不变性体现在一张图片内的目标如果移动了应该是分辨不出来的。因此在ImageNet分类竞赛里,具有深度全卷积的框架更加受偏爱并且有领先的结果。另一方面,目标检测任务某种程度上需要平移可变的定位信息表达。比如在一个候选框中物体平移,应该能够产生这个候选框与目标之间重叠信息的响应。
RFCN网络包含了共享的、全卷积网络(和FCN中一样)。为了在FCN网络中包含进平移可变的信息,我们用FCN的输出构建了一个位置敏感的分数图。每张分数图都编码了位置信息,比如相对目标左上方的空间信息。在FCN顶层,再加上一个位置敏感的ROI Pooling层,来从这些分数图中获取信息,后面没有需要权值的卷积或全连接层,这样就能端到端的学习。
2.方法
overview
RCNN系列方法都采用两阶段的目标检测方法:region proposal和region classification。 尽管像SSD和YOLO这样不用region proposal的方法的确存在,但是基于region的方法仍然是具有领先的准确率。我们用RPN网络来提取候选区域,然后在RPN和RFCN之间共享特征。
图1表示框架:
position-sensitive score map:
给定ROI,RFCN可以将ROI分为目标类别或者背景。在RFCN中,所有需要学习的权重都是卷积层并且是整张图共享的。最后一层卷积层在每个类别产生一叠$k^2$个position-sensitive score map,因此共有$k^2(C+1)$通道的输出。$k^2$的score maps对于了$k\times k$的描述相对位置的空间网格,比如当$k=3$时,表示一类目标的左上、左中、上方、右上……右下的位置。
position-sensitive ROI Pooling layer:
RFCN以一个位置敏感的ROI 池化层。该层整合了最后一层卷积层的输出并且为每个ROI产生分数。和SPP 和Fast RCNN中不一样(ROI pooling是对所有通道做的),我们的位置敏感的ROI层实行selective pooling,并且每个$k\times k$的bin汇总了$k\times k$张分数图中的一张分数图的响应。 详细介绍如下:
Bcakbone architecture
本文的RFCN实现实基于ResNet101的,其他的比如VGG也行。
ResNet101:
有100层卷积层,加一个全局的平均池化,再加一个1000类的全连接层。我们将平均池化层和全连接层去除,只是用卷积层来计算特征图。使用预训练模型来初始化网络。最后一个卷积Block是2048维的,为了降维,我们在最后加上一个随机初始化的1024-d的$1\times1$的卷积层。最后接上生成$k^2(C+1)$个通道的position-sensitive score map的卷积层。
和其他方法的对比:
Position-sensitive score maps & Position-sensitive ROI Pooling.
通过一个网格将每个ROI矩形分割成$k\times k$个bin。一个尺寸为$w\times h$的矩形,一个bin的尺寸为$\approx \frac{w}{k} \times \frac{h}{k}$.本文方法使用最后一层卷积层来构造$k^2$个scoremap。在第$(i,h)-th$个bin$(0\le i,j\le k-1)$中,我们定义第$(i,j)$张分数图上的池化操作如下:
$$
r_c(i,j|\Theta)=\sum_{(x,y)\in bin(i,j)}z_{i,j,c}(x+x_0,y+y_0)|\Theta)/n \qquad(1)
$$
其中,$r_c(i,j)$表示第$(i,j)$个bin,第$c$类的池化后的响应。
$z_{i,j,c}$是$k^2(C+1)$张特征图中的一张,即对应的通道,$x_0,y_0$表示一个ROI左上角的位置,即起始点。$n$表示这个bin中的像素个数。$\Theta$表示网络中所有学习的参数。第$(i,j)$个bin的范围是
$$
[i\frac{w}{k}\le x\le [(i+1)\frac{w}{k}]] \ [j\frac{h}{k}\le y <[(j+1)\frac{h}{k}]]
$$
式1表示的就是图1的操作,一种颜色代表一对$(i,j)$,实行的是平均池化,最大池化也行。
分类:
这$k^2$张分数图进行投票,本文直接平均投票,为每个ROI产生一个$C+1$维的向量:$r_c(\Theta)=\sum_{i,j}r_c(i,j|\Theta)$.然后计算类别之间的softmax响应:
$$
s_c(\Theta)=e^{r_c(\Theta)}/\sum_{c’=0}^Ce^{r_{c’(\Theta)}}
$$
他们用来评估训练和测试时的交叉熵损失。
回归:
除了上面$k^2(C+1)$维的卷积层外,我们又加了一个并行的$4k^2-d$的卷积层来进行boungding box 回归。位置敏感的ROI Pooling操作在这$4k^2$的图上进行,并为每个ROI产生一个$4k^2-d$维的向量。再通过一个平均池化进行投票变成一个4维的向量。这个4维的向量包含了一个bounding box的信息$t=(t_x,t_y,t_w,t_h)$.注意。我们进行bounding box回归时,为了简单忽略了类别。
训练:
定义交叉熵损失和边界框回归损失和为损失函数。函数定义如下:
$$
L(s, t_{x,y,w,h})=L_{cls}(s_{c^})+\lambda[c^>0]L_{reg}(t,t^)\=-log\left(\frac{e^{r_{c^}(\Theta)}}{\sum^{C}{c’=0}e^{r{c’}(\Theta)}}\right)+\lambda[c^>0]L_{reg}(t,t^)
$$
$\lambda=1$。正样本定义:IOU>0.5的样本。
在线hard例子挖掘:假设每个图像前向产生$N$个区域,计算所有proposal的损失,对每个损失排序,选择损失最高的$B$个ROIs.
训练细节见原文。
前向:
图像最短边600像素,每张图300个ROI。冲量0.9,权值衰减0.0005.……
可视化
图3,4中,我们可视化了RFCN学习的位置敏感分数图。这些特别的分数图在一个目标的特定的相对位置上会强烈的响应。
如果一个候选框和一个目标的ground truth精确地重叠,那么该ROI的$k^2$个bin中大部分都会被强烈激活,他们投票的分数也会特别高。反之,投票分数会很低。
如图: