《R-FCN: Object Detection via Region-based Fully Convolutional Networks》论文详解

《R-FCN: Object Detection via Region-based Fully Convolutional Networks》

作者公布的代码地址(caffe版):https://github.com/daijifeng001/r-fcn

这篇文章主要目的还是想再在fasterrcnn的基础上,加快物体检测的速度,但是网络加速时需要注意,物体检测其实是有两个目标的,一个是检测一个是分类。fasterrcnn的做法是将任务分为两个阶段,也就是rpn前和rpn后,具体可以参考Faster R-CNN文章详细解读

文章认为分类是需要平移不变性的(translation invariance),即即使物体在图像中存在位置变化,网络应该仍然能正确的进行分类。而定位却需要对物体平移敏感。网络越深则对于位置越不敏感。rpn的提出就能很好的解决这种问题。rpn网络之前的步骤都是特征共享的,当网络深的时候,为了使得定位准确,加了rpn结构,但是rpn后每次有个roi区域就要进行一次定位和分类任务,这样就会导致网络速度慢。为了加速,文章提出了rfcn结构。

这里插一句题外话,虽然文章没说cnn网络是否具有平移不变性,但是读着总感觉有那个意思,这一点其实是有争议的,看文章《Why do deep convolutional networks generalize so poorly to small image transformations? 》,实验验证cnn网络其实是没有平移不变性的

一、网络结构

网络结构如下图所示
《R-FCN: Object Detection via Region-based Fully Convolutional Networks》论文详解

图中能看出该网络仍存在rpn的结构,但为什么可以加速,原因就在后面的彩色部分,这部分也是文章提出的重点内容。

彩色部分层叫做位置敏感分数图(position-sensitive score maps),为了方便理解这部分,我们先讨论分类任务。

假设现在待分类的有C类(不包括背景),加背景就是C+1类,roi pooling的大小是k×kk \times k的,那么对于分类任务来说,position-sensitive score maps输出的通道数为k2(C+1)k^2(C+1)。这个数是有讲究的,在roipooling的时候是将roi分为k×kk \times k大小进行pooling操作的,那现在roi区域怎么来,这里就是与fasterrcnn的区别了。现在position-sensitive score maps每个部分负责一个k×kk \times kroi的区域,如上图黄色负责左上角,灰色负责右下角,那么一个k×kk \times k就是从对应的颜色map中抽一部分特征来合成roi区域,合成后的通道数为C+1,长宽为kk,最后进过一个k×kk \times k的roipooling和一个softmax就可以得到C+1类的概率了。

对于定位来说也是类似,只是position-sensitive score maps的通道数为k24k^2*4,四个值同fasterrcnn。

对于抽取position-sensitive score maps的部分,如下两图所示
《R-FCN: Object Detection via Region-based Fully Convolutional Networks》论文详解
《R-FCN: Object Detection via Region-based Fully Convolutional Networks》论文详解

二、训练与推断部分

训练的loss和推断部分也是可以沿用fasterrcnn那套就不详细说明了。Faster R-CNN文章详细解读

通过position-sensitive score maps的提出,可以认为网络都是共享的,不像fasterrcnn那样被rpn分为两部分。对更极端的rcnn来说,rpn部分是传统算法提出来的,也就整个网络都是rpn后的处理操作,那它就没有共享的卷积(这里共享的卷积是对于整幅图来说的)。对于resnet-101,文章给出的如下表格来说明不同算法的卷积层数的分布:
《R-FCN: Object Detection via Region-based Fully Convolutional Networks》论文详解