R-FCN

R-FCN主要的贡献在于保证精度基本不变的前提下,inference的速度有了两倍以上的提升。

Introduction

标准的faster rcnn(这里特指Deep Residual Learning for Image Recognition[1]里面提出的基于resnet骨干的,与最早在faster-rcnn那篇论文中提出的方法稍有区别)可以看做由两部分构成,前一半的网络用于提取图片的特征,其计算是可以贡献的,后面的另一半网络用于对每一个ROI区域单独计算类别概率和bounding box的位置修正。由于后面那个网络是对每个ROI单独进行计算,这样计算量就会比较大,也就造成了train和inference的速度都比较慢。因此R-FCN提出了一种叫Position-sensitive RoI pooling的操作避免了每个ROI都需要两个小网络来单独计算类别概率和位置坐标的问题,在提速的同时保证了精度的基本不变。

在最早版本的faster rcnn[2]中,作者使用了vgg16作为backbone,在最后的卷积层之后接了两个全连接层分别用来预测类别和坐标修正,两者之间使用ROI pooling层进行相连。但是后来发现如果使用全部的卷积层来构建backbone,在ROI pooling之后没有任何隐层,检测的正确率其实是比较低的。文中作者的原话是:However, as empirically investigated in this work, this naïve solution turns out to have considerably inferior detection accuracy that does not match the network’s superior classification accuracy. 为了解决这一问题,在resnet的那篇paper中[1],作者将ROI pooling的位置进行了前移, 放到了conv4_x的最后的conv5_x开始的位置,这样做虽然提高了AP,但是无疑也增加了计算量,因为ROI pooling之后的特征没法共享,每个ROI区域都需要单独计算。因此,这就出现了一对矛盾:如果把ROI pooling层放到最后面去,后面不再跟其他的hidden layers,那么计算速度是快了,但是AP就比较低。反之,如果前移ROI pooling层的位置,后面再接一堆的hidden layers,AP是提高了,但是速度却变慢了。那么有没有办法既不增加计算量,又提高AP呢?本文就是为了解决这个矛盾提出来的。

Method

对于上面提到的问题,作者对于分类任务,更希望特征具有平移不变性(translation-invariant),而对于检测任务,我们更希望特征具有平移可变性(translation-variant)。就是说,对于分类任务,一个物体如果在图片中的位置或形状发生了改变,希望它在最后的特征图的响应能基本保持不变,这样我们不会因为小的扰动而把它错分到其他的类中。但是对于检测任务,如果一个物体在原图中发生了形变,我们希望在最后的特征图中其响应也能有相应的变化,这样才能保证我们的检测出来的bounding box位置跟着改变。作者认为对于那种比较深层的特征,其对形变的敏感度比较低,也就是具有更多的translation-invariant的特性。[1]通过在较低层的位置插入ROI pooling layer打破了translation invariance,由于其后面的特征是对每个ROI单独计算,也就不再具有translation invariance。但是这种做法训练和测试时的效率都较低。这篇文章提出的Region-based Fully Convolutional Network (R-FCN)主要在faster rcnn的基础上做了以下几方面的改进,在速度和精度上取得了比较好的tradeoff。

Position-sensitive score maps

首先,resnet101的最后一层卷积层输出的channels为2048,作者首先加了一个随机初始化的1x1x1024的卷积层对通道数进行降维。然后并行的接了两个1x1,通道数为k^2*(C+1)和4*k^2的卷积层,作者将其称之为position-sensitive score maps,因此这两个maps分别是对类别和坐标的。至于这里的k结合后面的Position-sensitive RoI pooling来解释会比较好理解。

Position-sensitive RoI pooling

Position-sensitive RoI pooling可以说是这篇文章最大的改进点了,这里我们以类别的那个分支为例(坐标的分支也是类似的)。输入的图片经过backbone后产生了一个feature maps,然后通过上面说的新加的层产生Position-sensitive score maps,它的channels为k^2(C+1),长和宽同经过backbone产生的feature maps一样。然后我们对通过RPN网络产生的一个ROI区域做kxk的Position-sensitive RoI pooling。具体的做法是这样的,假设k=3,对于3x3中的第一块,我们使用Position-sensitive score maps做左边的那个淡绿色的特征切片中的对应区域,将里面的特征通过求average的方式得到了Position-sensitive RoI pooling后特征图中的第一块。同样的,对于第二块则采用Position-sensitive score maps中对应颜色的那个特征切片,然后在对应的位置求average……最后就得到了一个kk(C+1)的特征图,然后通过投票的方式得到一个C+1为的向量,文中的投票采用的是求average的方法。最后通过softmax进行归一化取最大值作为这个roi的概率。

Experiment

以上的两个表分别是在VOC还有COCO上的实验结果,可以看到相比于naive faster rcnn[2],R-FCN和改进版的faster-rcnn[1]AP都有较大幅度的提高。而R-FCN和改进版的faster-rcnn相比虽然精度上差不多,但是速度有了2倍多的提升。

下面的两个图对kxk=3x3的Position-sensitive score maps进行了可视化,可以看到在3x3的格子中,左上的那块格子具有较高响应值的区域刚好就是物体(人)的左上角,下面中间那个格子对应的score map中刚好是人的中下部位的激活值较大。这样采用Position-sensitive RoI pooling,对于像figure 3这样的bounding box刚好覆盖了整个人,则投票后输出的类别概率就是人。但是像图4这种只覆盖了部分区域,投票后输出的概率就是背景。


References

  1. Deep Residual Learning for Image Recognition
  2. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
  3. R-FCN: Object Detection via Region-based Fully Convolutional Networks

Related