目标检测之R-FCN

abstract

  • 论文地址:http://cn.arxiv.org/abs/1605.06409
  • 论文提出了一种高效准确的基于全卷积神经网络的目标检测方案。
  • 之前的fastRCNN,fasterRCNN等网路在每个roi上都会使用一个耗时的subnetwork用于后续的分类和检测,本文的方法在几乎所有计算中都实现了网络参数的共享。论文中提出了position-sensitive score maps,用于解决分类问题中的平移不变性与检测问题中的平移变换性的矛盾。
  • 论文的方法可以使用目标分类的backbone用于特征提取,测试结果证明论文方法比fasterRCNN快2.5~20倍。

introduction

  • 之前基于深度学习的目标检测方案一般都包括2个subnetwork
    • shared fully convolutional subnetwork,用于计算特征,这部分与后续的任务(检测、分类等)是独立的。
    • roi-wise subnetwork,对每个roi进行处理,这一部分没有共享计算(即使roi之间有重叠的部分,也会重复计算roi上面对应部分的卷积)。在分类任务中,通常是spatial pooling layer+fc layer;在目标检测任务中,一般被换成了roi pooling+fc layer
  • 检测模型的性能主要是由分类精度定位精度来确定的,由于网络层数很多,分类精度一般都很高,但是roi subnetwork后面的fc layer不具有平移变换性,这导致之前检测模型的定位精度较差。为了解决这个问题,resnet中roi pooling layer被强行加到2个cnn layer set之间,从而使得roi subnetwork也有定位精度,这个提升了模型的精度,但是roi之间仍然没有能够实现共享计算,十分耗时。
  • 作者提出了一个假设:更深层次的网络在分类任务中对平移不敏感,在resnet中,roi subnetwork降低了模型的平移不变性(分类信息被破坏了),而后面的CNN layer就不再具有平移不变性了(定位精度会高一些),但是每个roi还是单独计算的,并没有实现信息的共享。
  • 下图是本文方法的key idea,主要就是引入了positive-sensitive score maps的概念,在得到shared feature map之后,首先进行卷积,得到所有的positive-sensitive score maps,之后针对每个roi进行pooling,得到C+1个channel的$k \times k$的feature map,经过vote之后,对于每个roi都得到$1 \times 1 \times (C+1)$的结果,softmax即可得到每个类别的概率。

20181202-RFCN key idea.png

R-FCN

overview

  • RFCN的architecture如下。

20181202-RFCN architecture.png

  • RFCN最后是一个position-sensitive RoI pooling layer,它会聚集最后一个CNN layer的输出($k \times k\times (C+1)$ channel的那个),然后得到一个score。使用selective pooling的方法,即对于特定的类别,每个$k \times k$的bin都只对这个$k \times k$个score map中的一个进行pooling(top left的话,就使用top left对应的layer进行pooling)。

Backbone architecture

  • 作者主要使用了resnet-101作者backbone,其他的网络结构也是可行的。使用resnet在ImageNet上的预训练模型进行初始化,由于最后一层是2014-d的feature map,使用$1X1$的卷积进行降维,至$kXkX(C+1)$个channel(即后面用到的PS score map),参数是随机初始化。

Position-sensitive score maps & Position-sensitive RoI pooling

  • 对于一个$w \times h$的roi来说,pooling成$k \times k$大小之后,每个bin的size是$(w/k) \times (h/k)$。对于$(i,j)$-th bin,PS roipooling的计算方法如下

$${r_c}(i,j|\Theta ) = \sum\limits_{(x,y) \in bin(i,j)} {z_{i,j,c}(x + {x_0},y + {y_0}|\Theta )/n}$$

$(i,j)$-th bin中包含的元素的范围是

$$\left\lfloor {i\frac w k} \right\rfloor \le x < \left\lceil {(i + 1)\frac w k} \right\rceil$$ and
$$\left\lfloor {i\frac h k} \right\rfloor \le y < \left\lceil {(i + 1)\frac h k} \right\rceil$$

即$k \times k$的pooling result上的不同位置都是由之前PS score map上的不同位置进行pooling得到(使用了average pooling,但是max pooling也是可以的)。这也就是positive-sensitive的由来。

之后再对$C+1$个channel的$k \times k$的feature map做vote,在这里直接对feature map取平均,得到$1 \times 1\times (C+1)$的输出,经过softmax之后,即特定roi对应的所属类别的概率。

  • 此外也需要对RPN得到的roi进行bbox regression,与PS roi pooling类似,首先使用$4k^2$-d的kernel进行卷积(4是因为需要xywh4中信息),然后再使用average voting得到最终的4d vector,即bbox regression的参数。
  • 主要的特点就是:所有的CNN都是在PS score map之前,之后再roi subnetwork中没有任何需要学习的参数。

    training

  • 使用pretrained RPN,端到端的训练RFCN,主要是基于classification error+bbox regression error。
  • 在训练的时候,也可以直接使用OHEM,因为共享的roi计算对于困难样本挖掘来说几乎不耗费时间。
  • 因为共享了roi部分的计算,因此proposal的个数对网络的计算耗时并不是太影响(fasterRCNN中,每个roi之后还加了一个fc layer,proposal个数对计算耗时影响很大)。

visualization

  • RFCN在inference的过程中,可视化如下

20181202-RFCN vis.png

如果proposal与gt相差太多的话,voting之后是不会被识别为前景的特定物体的。

experiments

  • 与fasterRCNN在Pascal VOC上的对比结果如下

20181202-RFCN-experiment.png

可以看出,在训练时间,测试时间以及精度方面,RFCN都是更加优秀的;当然在精度方面比Faster R-CNN +++(使用iterative bbox regression、context与multi scale testing)要稍微差一些。

  • 在coco上的检测结果如下

20181202-RFCN-experiment.png

Conclusion and Future Work

  • 主要就是提出了RFCN这种新的目标检测框架。
  • 本文的模型还保持着相对简单的模型结构,目前语义分割和目标检测方面有很多新的网络模块出现,之后可以将这些相结合,进一步改善模型性能。