天天看点

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 学习笔记

论文: R-FCN: Object Detection via Region-based Fully Convolutional Networks [NIPS 2016]

代码: https://github.com/daijifeng001/r-fcn

作者: Jifeng Dai, Yi Li, Kaiming He, Jian Sun

一、R-FCN的提出

这篇论文的主要出发点有两个:

  • Faster RCNN中检测部分(Fast-RCNN)需要对每一个RoI进行独立、耗时大(两个全连接层)的计算
  • 图像分类的平移不变性和目标检测的平移变化性(translation variance)

Two-stage的目标检测算法如Fast RCNN, Faster RCNN等,可以通过RoI pooling层分成两部分: (1)和RoIs独立的、且所有RoIs共享的全卷积子网络;(2) 对逐个RoI进行分类和回归的不共享计算的子网络。

受启发于分类网络

AlexNet, VGGNets都是基于这样的网络设计: 全卷积网络(含spatial pooling layer) + 几个全连接层。但是GoogLeNets和ResNets的设计是fully convolutional(只有最后一层是全连接的,当fine-tune成目标检测任务的时候会把移除和替换),因此对于目标检测一种很自然的想法就是使用全卷积网络层构建共享的(提取特征的)子网络,而且在RoI-wise子网络中没有隐藏层。

与分类网络的不同

但是需要注意到,分类网络是需要平移不变性的,目标检测却是平移变化(translation variance)的。

一般来讲,图像分类网络中较深的卷积层对平移的敏感性降低。为了解决这个难题,ResNet论文中的解决方案是把RoI插入中间的卷积层;这样RoI之后的卷积层不再具有平移不变性。但是此设计引入了大量的region-wise 层,如table1所示,因此牺牲了训练和测试的效率。

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 学习笔记

为了解决高效、且平移变化性(translation variance)的问题,论文中提出了Region-based Fully Convolution Network(R-FCN)。R-FCN的主要创新点有两个:(1)提出了position-sensitive maps和position-sensitive pooling; (2)所有RoIs共享计算,分类层无参数层(卷积核全连接层),提高了效率。

二、R-FCN介绍

2.1 Position-sensitive score maps

在骨干网络的最后一个卷积层,对于每个类别(category)产生一组 k 2 k^2 k2position-sensitive score maps,因此对于有C类的数据集,会产生一个 k 2 ( C + 1 ) k^2(C + 1) k2(C+1)通道的输出(+1对对于背景),如fig1所示。其中 k 2 k^2 k2个score maps对应着 k 2 k^2 k2个描述相对位置的空间grid。对于k = 3时, 3 * 3 = 9个score maps编码了一个object category的top-left, to-center, top-right, …, bottom-right信息等。

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 学习笔记

通过end-to-end的训练,这个RoI层指导最后一个卷积层学习position-sensitive score maps。如fig3,如果候选框与真实object重叠,RoI中的 k 2 k^2 k2个bins的大多数bins将会被激活,从而具有较高值。如fig4,如果一个候选框不能和一个真实的object重叠,RoI中的一些bins将不能被激活,从而会导致score较低。

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 学习笔记

Postion-sensitive RoI pooling(PSRoI pooling)对position-sensitive score maps进行操作得到一个 k 2 k^2 k2大小 C + 1 C + 1 C+1通道的特征图,用于最后的分类。这份PSRoI pooling是逐个RoI进行的。具体操作如下:

对每一个RoI矩形,通过长方形的grdi把它divide成 k ∗ k k * k k∗k bins。对于一个 w ∗ h w * h w∗h的RoI,一个bin大小约为 w k ∗ h k \frac{w}{k} * \frac{h}{k} kw​∗kh​。Position-sensitive是包含 k 2 ( C + 1 ) k^2(C+1) k2(C+1)个通道的特征图。对于第 ( i , j ) (i, j) (i,j)bin, 0 = < i , j < = k − 1 0 =< i,j <= k-1 0=<i,j<=k−1,position-sensitive RoI pooling(PSRoI pooling)操作如下:

r c ( i , j ∣ Θ ) = Σ ( x , y ) ∈ b i n ( i , j ) z i , j , c ( x + x 0 , y + y 0 ∣ Θ ) / n r_c(i, j|\Theta) = \Sigma_{(x, y) \in bin(i, j)}z_{i, j, c}(x+x_0, y + y_0 | \Theta) / n rc​(i,j∣Θ)=Σ(x,y)∈bin(i,j)​zi,j,c​(x+x0​,y+y0​∣Θ)/n

( x 0 , y 0 ) (x_0, y_0) (x0​,y0​)表示RoI的top-left corner, z i , j , c z_{i, j, c} zi,j,c​表示 k 2 ( C + 1 ) k^2(C+1) k2(C+1)个score maps中的 ( i , j , c ) (i, j, c) (i,j,c) score map, r c ( i , j ) r_c(i, j) rc​(i,j)表示对于 c c c类的第 ( i , j ) (i, j) (i,j)bin的response,也就是在 c c c个feature map, ( i , j ) (i, j) (i,j)位置的值。

公式看似复杂,但其实不难理解。经过PSRoI pooling,会产生 C + 1 C + 1 C+1个 k 2 k^2 k2大小的特征图,对于 c c c特征图的 ( i , j ) (i, j) (i,j)位置的值,它只会从 k 2 ( C + 1 ) k^2(C + 1) k2(C+1)个score maps中的一个score map[i, j, c]进行average pooling(论文中提到max pooling也是可以的)得到,而且pooling的大小就是RoI的 ( i , j ) (i, j) (i,j)bin所对应在score maps上的区域。(这种思想第一次遇到,理解起来可能乖乖的,但后面有不少检测的论文(Light-head RCNN, ThunderNet)都基于这种PSRoI pooling, 还是要努力的理解一下)

然后 k 2 k^2 k2个positive-scores开始对这个RoI进行投票。论文中采取了平均投票法, r c ( Θ ) = Σ i , j r c ( i , j ∣ Θ ) r_c(\Theta) = \Sigma_{i, j}r_c(i, j|\Theta) rc​(Θ)=Σi,j​rc​(i,j∣Θ),产生了 C + 1 C + 1 C+1维的特征向量,然后计算softmax responses: s c ( Θ ) = e r c ( Θ ) / Σ c ′ e r c ′ ( Θ ) s_c(\Theta) = e^{r_c(\Theta)}/\Sigma_{c'}e^{r_{c'}(\Theta)} sc​(Θ)=erc​(Θ)/Σc′​erc′​(Θ)。在训练时用来计算交叉熵loss,在预测时用来排序RoIs。

论文中以同样的方式解决了boudinng box的回归问题。除了预测 k 2 ( C + 1 ) k^2(C+1) k2(C+1)维的卷积层,增加了一个 4 k 2 4k^2 4k2通道的sibling层。PSRoI pooling在这 4 k 2 4k^2 4k2score maps上进行,对于每一个RoI产生一个 4 k 2 4k^2 4k2维的向量,然后通过average voting产生了一个4维的向量 t = ( t x , t y , t w , t h ) t = (t_x, t_y, t_w, t_h) t=(tx​,ty​,tw​,th​),编码信息如R-CNN, Fast R-CNN, Faster RCNN所示:

t x = ( x − x a ) / w a , t y = ( y − y a ) / h a t_x = (x - x_a) / w_a, t_y = (y - y_a) / h_a tx​=(x−xa​)/wa​,ty​=(y−ya​)/ha​

t w = l o g ( w / w a ) , t h = l o g ( h / h a ) t_w = log(w / w_a), t_h = log(h / h_a) tw​=log(w/wa​),th​=log(h/ha​)

ROI层之后没有可学习的层,可实现几乎cost-free的region-wise计算,增加了训练和预测的速度。

2.2 R-FCN训练和预测

Loss函数: L ( s , t x , y , w , h ) = L c l s ( s c ∗ ) + λ [ c ∗ > 0 ] L r e g ( t , t ∗ ) L(s, t_{x, y, w, h}) = L_{cls}(s_{c^*}) + \lambda[c^* > 0]L_{reg}(t, t^*) L(s,tx,y,w,h​)=Lcls​(sc∗​)+λ[c∗>0]Lreg​(t,t∗), 即分类损失和回归损失,分类损失采用的交叉熵损失,回归损失是smooth L1 loss。

当RoI与任意一个groung-truth box的IoU大于0.5时是正样本,其它的为负样本。这个和原来的设置也不太一样。

论文中在训练时采用了online hard example mining(OHEM)。

其它的一些训练参数就不详细介绍了。

在测试时论文也是选用300个RoIs,后处理nms采用的IoU阈值为0.3。

论文在骨干网络部分对ResNet进行了修改,将原始的stride=32改成了stride=16: 在conv5部分将stride从2改成了1,并使用了atrous卷积。这使得模型的AP提升了2.6points。

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 学习笔记

三、R-FCN的实验结果

R-FCN与其它的全卷积策略进行了对比,实验结果如Table2所示。

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 学习笔记

R-FCN与使用ResNet101的Faster-RCNN的对比,如Table3、Table4和Table5所示。

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 学习笔记

继续阅读