R-FCN: Object Detection via Region-based Fully Convolutional Networks
R-FCN: Object Detection via Region-based Fully Convolutional Networks
论文下载地址
源码地址
本篇论文是微软亚研何凯明代季峰的团队做的工作,虽然何凯明16年去了facebook,但是相关工作还在进行,代码还是公布在github上。感兴趣的可以从链接下载源码进行分析测试。
Introduce
论文主要提出了一种利用全卷积网络进行目标检测的方法。在目标检测中,会用到深度学习的网络框架。比如ALexNet和VGG一般来说,都是先经过一系列的卷积层,每层卷积以后会有一些pooling层,最后跟着若干全连接层。fast-rcnn,sppnet就是conv层后跟着spp pooling或者RoI pooling,然后再进行全连接层。
但是最近的网络结构,比如GoogleNet, ResNet都是采用了全卷积层,去除了Fc层,因为大量的参数都是在FC层上。直观的想法就是用全卷积网络来做目标检测,但是全卷积网络的分类效果远远大于目标检测的效果。为了解决这个问题,ResNet在更深的网络层中插入RoI-wise subnetwork,由于RoI的参数不共享,所以以损失速度的代价下提高了目标检测的精度。
分析分类和目标检测这两种任务,首先目标检测比分类level更高。更深入分析,可以发现:分类是要增加物体的平移不变性(不同的位置都是同一个物体);目标检测时减少物体的平移变化(目标检测需要画出物体所在的框)。但是平时常用的网络模型比如AlexNet,VGG,Google都是基于ImageNet的分类任务训练得到的,在目标检测的时候进行fine-tuning。由于得到的模型基于分类任务,那么会偏向于平移不变性,这和目标检测就出现了矛盾。所以作者提出了position-positive score maps 来解决这个矛盾。作者假定,更深的convolution layer对图像分类旋转不敏感。在ResNet中作者在深层的convolution layer中插入了RoI pooling layer,这种操作打破了Roi pooling前的平移不变性。但是ResNet这种方法牺牲了训练和测试有效性。表1介绍了ResNet和本文的插入的RoI-wise的位置。

本文为了解决分类的平移不变性,作者构建了position-sensitive score
maps。每一个position-sensitive score map融合位置信息。在position-sensitive score maps上,再添加一个RoI pooling layer融合所有的信息。整个网络可以通过端到端学习,图1显示了R-FCN的过程。作者用101层的Residual Net,R-FCN取得了83.6%的mAP在VOC2007上,2012上取得了82.0。同时时间170ms每张图片,是Faster RCNN的2.5倍以上。

Main approach
基于Region proposal的方法主要包括以下步骤:(i)region proposal (ii)region classification。尽管16年出现了YOLO,SSD这种不基于region proposal的方法,但是基于region proposal的方法精度更好。作者在本文中也是采用了region proposal的想法。RPN网络中,共享了conv 层的参数,本文也采用了这种方式。图2显示了本文中的方法和RPN网络的异同。

在R-FCN网络中,最后一个conv layer后每类产生了K^2大小position-sentitive score maps。所以,feature map的大小为K^2(C+1)。C代表的是分类的类别数目,+1代表背景。score map 对应着的spatial grid 来描述相对位置。例如K = 3,33的总共有9个spatial grid分别对应着一个类别物体的9中位置{top-left, top-center,top-right,…, bottom-right}。position-sentitive score maps总共产生K^2(C+1)mn的tensor。在position-sentitive score maps 以后跟着一个positive-sensitive的RoI pooling layer。使用33的RoI pooling,每一个RoI会生成一个k*k*(C+1)的feature map。对k*k*(c+1)的feature map 进行 average pooling,会产生(c+1)维的置信度,然后通过softmax既可得到属于哪个类别的可能性。具体参考图1。
作者又添加了边框回归,在k^2(c+1)的旁边加入了4K^2的conv layer用于预测位置。图1中未画出,综合上述预测每类的置信度,就得到了属于哪类和物体的坐标位置。
图3和图4可视化了网络对人分类的过程。


网络结构
作者才用了ReSNet-101网络,把ResNet-101的Fc层和average pooling层都移除,只用到Conv层。作者用了ResNet在imageNet的训练模型,进行fine-tuning。作者又把最后一个conv层2048维使用1024个1*1随机初始化的conv layer进行降维。然后添加的conv layer产生score maps。
训练过程
预先得到region proposals,R-FCN很容易进行端到端的训练。网络的损失函数和Fast RCNN一样,采用了多目标的损失函数,同时考虑了分类的损失,和位置的损失。
上式中, c^*代表ground truth, L_{cls}代表了分类的交叉熵损失, L_{reg}表示位置的损失, t^*表示ground truth的位置。 [c^* > 0]如果分类正确为1,分类错误为0,对分类错误的不进行位置损失。超参数 \lambda=1,表示分类损失和位置损失同等重要。在softmax分类过程中,作者设定与ground truth 的IoU阈值>0.5的设定为正样本,其他的为负样本。我之前SSD的博客中,也介绍了难分样本挖掘的思路,本篇论文也采用了这种方法,按照N proposals的损失排序,按照损失大小选取B个RoI作为负样本,避免分类过程中,正负样本的不均衡。
实验结果
作者分别再Psacal VOC07,12,COCO数据集上进行测试。和以下几种方法进行比较:
- Naive Faster R-CNN:使用ResNet-101计算共享的feature map,在最后一层使用RoI pooling,改为21类的softmax分类,同样采用atrous,个人理解的这里至Fast R-CNN
- Class -specific RPN: 使用Faster-RCNN训练的RPN网络,修改用于分类的卷积层输出为21类。公平起见,在ResNet-101 conv5使用atrous.
- R-FCN without position-sentivity 设定K=1,移除了position-sentivity。
VOC实验结果如下图所示:

COCO实验结果如下所示:

个人总结
目标检测的很多论文都是出自何凯明团队或者RBG大神之手。对这种论文,最大的感觉就是,总是能从网络的baseline中挖掘中值得改进的地方,每一个改进都能够提高目标检测的精度或者速度。这对于我以后的论文研究最值得学习的地方就是,不要放过任何一个不足之处,深挖就能找到入手点。与此同时,也与大家共同借鉴。paper reading出自于菜鸟进阶路上,不足之处,多多指教!
