一、简介
1、R-FCN可以看做是Faster RCNN的改进版,速度上提高了差不多3倍左右,mAP也有一点提升,主要的目的是进行了加速
2、当然这个算法还是属于候选窗+深度学习分类和回归系列的,也就是会包含rpn网络给出候选框建议。
3、
下面的这个表是共享参数的层数
这篇讲解的很棒
二、原理
1、
这篇论文是NIPS 2016的一篇论文,主要贡献在于解决了“分类网络的位置不敏感性(translation-invariance in image classification)”与“检测网络的位置敏感性(translation-variance in object detection)”之间的矛盾,在提升精度的同时利用“位置敏感得分图(position-sensitive score maps)”提升了检测速度。
一方面,当对一个目标进行分类任务时,我们希望学到模型中的位置不变性(location invariance):无论这只猫出现在图中的哪个位置,我们都想将它分类成一只猫。另一方面,当进行目标检测任务时,我们希望学习到位置可变性(location variance):如果这只猫在左上角,那么我们希望在图像左上角这个位置画一个框。所以,问题出现了,如果想在网络中 100% 共享卷积计算的话,我们应该如何在位置不变性(location invariance)和位置可变性(location variance)之间做出权衡呢?
2、提速
为什么R-FCN相比Faster RCNN会有明显的提速呢?以主网络为ResNet101为例,在Faster RCNN中,ROI Pooling层的输入是在conv4_x,在做完ROI Pooling后会继续接conv5_x,conv5_x包含9个卷积层,另外在conv5_x后还有几个全连接层,这些层的计算都直接作用在每个roi上,因此存在许多重复计算。如果主网络换成VGG也类似,只不过重复计算的层数会少一些,主要是一些全连接层。而在R-FCN中,所有能共享的层都在ROI Pooling之前做好了,因此在ROI Pooling后基本不会有太多的重复计算。为了要在ROI Pooling之前实现层共享,一方面将conv5_x的计算移到Pooling层之前,但这样依然还存在一些全连接层的重复计算,因此再引入position-sensitive score map和position-sensitive ROI Pooling,使得经过Pooling后简单地执行一些操作就能得到回归和分类结果,而不再像Faster RCNN一样用几个全连接层去得到结果。
3、position-sensitive score map
map群的通道数 channels= 当确定一个rol之后,相当于一个rol在每一个类中的每一个bin(rol的一小块)都对应一张map,也就是说每一个map对于一个rol来说,只是用来计算rol中的某一块 属于某个类别的分数,也就是我们后面池化的时候,比如说针对人这个类,那我选择 中对于人这个类的个map中的比如第1个map(这个map对应rol的左上角那个第一块),那这个map的作用就是针对人这个类,计算rol的左上角的那块的分数,我们利用也只利用这个map的左上角那块,池化的时候就是在这一小块里的像素去求平均值,这样得到池化后的第一个值,紧接着我们选择针对人这个类,中的rol中的第二小块,对应的那个map的相同位置的那一小块像素求均值,这样得到第二个值,一样一直计算就会得到这个图可以看见不同位置的得颜色不一样(从不同的map计算得来的),这个不同位置的值就是前面map群中的某一个map的对应的位置像素的均值,(注意这里每一小块只是一个值,不同于前面的一小块是包含很多像素的),然后求出一个类的个值之后,再求其他的类的值,最后放在一起就是上面这个图。把一个类的个值加起来之后,就是这个rol在这个类上面的得分,然后会得到c+1个得分,再经过softmax之后算出来属于哪个类就行了。
4、概念
position-sensitive score map 就是这个特征矩阵,
- Position-sensitive RoI pooling:
这个只是一种操作,就是在position-sensitive score map上根据不同的类别,不同的map,上的rol中的某一块的位置来进行平均池化。
参考
https://zhuanlan.zhihu.com/p/30867916