论文链接:https://arxiv.org/pdf/1605.06409.pdf
1. Introduction
明确本文提出的目的,首先回顾一下Faster rcnn,如下图,可以将faster rcnn分为三部分
- 网络部分,用来对图像提取特征,与region无关
- 第二部分是RPN对anchors进行操作,需要映射到区域
- 第三部分,要对2找出的anchors,进行卷积,全链接操作,这部分是费时的
在原始的faster rcnn网络中,比如利用VGG,和AlexNet为架构的,经过ROI后要对每个anchor进行全链接操作,这部分要对每个anchor都进行操作,假设进过RPN后300个anchor,那就要计算300次全链接,这个计算量是恐怖的。当后来全卷积网络例如残差网络(Resnet), GoogleNet等被提出后,很自然的想到用这些全卷积网络代替原始的网络,当时是想隐藏第3部分,但是实际情况证明这样的精度会下降,必须在ROIPooling继续添加卷积操作,Faster RCNN中用的ResNet(前91层共享,插入ROI pooling,后10层不共享),但是这部分的conv并不是所有的anchors共享的,必须一个一个anchor进行操作,可能有人会不理解为什么不共享一起操作,非要一个一个计算,我没有看Resnet的Faster rcnn源码,不过卷积的输入是[batch,h, w,c],而ROIPooling的输出每个anchor的样式是[batch, 7,7,1024]也就是说维度已经满足输入了,所以必须一个一个anchor进行计算,因为计算不共享,所以肯定计算速度会很慢,于是作者就想把这部分不共享的计算移动到ROIPooling之前,将所有的图片卷积共享。
于是本文提出的目的就知道了:加快目标检测的过程,减少时间
2 RFCN方法
先看一下整体,分为上下两部分,上部分是和faster rcnn一样的RPN层,不说这一部分,下面分为两部分看,一部分是主干网络,一部分是带颜色的那部分
-
主干网络
Backbone architecture: ResNet 101——去掉原始ResNet101的最后一层全连接层,保留前100层,再接一个111024的全卷积层(100层输出是2048,为了降维,再引入了一个11的卷积层)。
k 2 ( C + 1 ) k^2(C+1) k2(C+1)的conv: ResNet101的输出是WH1024,用 K 2 ( C + 1 ) K^2(C+1) K2(C+1)个102411的卷积核去卷积即可得到 K 2 ( C + 1 ) K^2(C+1) K2(C+1)个大小为WH的position sensitive的score map。这步的卷积操作就是在做prediction。k = 3,表示把一个ROI划分成3*3,对应的9个位置分别是:上左(左上角),上中,上右,中左,中中,中右,下左,下中,下右(右下角) -
k^2(C+1)个feature map
共有kk = 9个颜色,每个颜色的立体块**(WH*(C+1))表示的是不同位置存在目标的概率值**(第一块黄色表示的是左上角位置,最后一块淡蓝色表示的是右下角位置)。共有k^2*(C+1)个feature map。我们要产生一个维度是C+1的向量,代表每个类别的可能性,最后用softmax确定到底属于哪个类别,计算每个类别的可能性的时候都需要计算九部分。假设我们要计算类别=1的可能性,假设计算的结果如下,我们对所有得分求均值得到avg=0.46,接下来按同样的道理计算得到所有的类别的得分,最后利用softmax计算得出最符合情况的类别
-
边框的回归计算
- 如图2.1的位置敏感maps是有k2(C+1)个通道的,我们依然从基CNN的feature map部分连接出一个4k2通道的maps(与位置敏感maps并列),用来做候选框坐标微调,如上面表格所示;
- 如分类部分的步骤1-4一样的操作,最后得到一个1∗4的向量,即x,y,w,h
- 按照之前的那些模型一样去计算目标函数即可
3 总结:
本文提出是为了加速两阶段方法的inference速度,将ROIPooling后面的网络层尽可能地移动到这之前,让能进行共享的计算竟可能共享,这一点很多人都能想到,但是怎么样才能保证加速的同时精度不下降,这是有难度的,本文的亮点是采用了位置敏感得分图,将roi分成k*k部分,计算每一部分的得分求均值,每个类别都会有一个这样的得分,最后求softmax。
个人思考
利用位置敏感得分图的方式计算进行分类,效果好勉强可以理解,但是对坐标进行回归的时候也采用同样的方式,让我有点接受不了,毕竟一个是分类问题,一个是回归问题,虽说本质二者差不多,但是用同样的方式计算是否有欠妥当?或者说,本文是实验先行,毕竟实验结果好,但是可解释性有点差