0
点赞
收藏
分享

微信扫一扫

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


  • 作者链接:代季峰,何恺明,孙剑
  • 论文链接:论文传送门
  • 代码链接:matlab版,python版

方法概括

R-FCN解决问题——目标检测

整个R-FCN的结构

  • 一个base的conv网络如ResNet101, 一个RPN(Faster RCNN来的),一个position sensitive的prediction层,最后的ROI pooling+投票的决策层

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接

关键思想

  • 分类需要特征具有平移不变性,检测则要求对目标的平移做出准确响应。现在的大部分CNN在分类上可以做的很好,但用在检测上效果不佳。SPP,Faster R-CNN类的方法在ROI pooling前都是卷积,是具备平移不变性的,但一旦插入ROI pooling之后,后面的网络结构就不再具备平移不变性了。因此,本文想提出来的position sensitive score map这个概念是能把目标的位置信息融合进ROI pooling。

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接_02

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接_03

  • 对于region-based的检测方法,以Faster R-CNN为例,实际上是分成了几个subnetwork,第一个用来在整张图上做比较耗时的conv,这些操作与region无关,是计算共享的。第二个subnetwork是用来产生候选的boundingbox(如RPN),第三个subnetwork用来分类或进一步对box进行regression(如Fast RCNN),这个subnetwork和region是有关系的,必须每个region单独跑网络,衔接在这个subnetwork和前两个subnetwork中间的就是ROI pooling。我们希望的是,耗时的卷积都尽量移到前面共享的subnetwork上。因此,和Faster RCNN中用的ResNet(前91层共享,插入ROI pooling,后10层不共享)策略不同,本文把所有的101层都放在了前面共享的subnetwork。最后用来prediction的卷积只有1层,大大减少了计算量。

R-FCN: Object Detection via Region-based Fully Convolutional Networks_卷积_04

方法细节

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接_05

  • Backbone architecture:
  • k^2(C+1)的conv:

R-FCN: Object Detection via Region-based Fully Convolutional Networks_卷积_06

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接_07

  • k^2(C+1)个feature map的物理意义: 共有k*k = 9个颜色,每个颜色的立体块(W*H*(C+1))表示的是不同位置存在目标的概率值(第一块黄色表示的是左上角位置,最后一块淡蓝色表示的是右下角位置)。共有k^2*(C+1)个feature map。每个feature map,z(i,j,c)是第i+k(j-1)个立体块上的第c个map(1<= i,j <=3)。(i,j)决定了9种位置的某一种位置,假设为左上角位置(i=j=1),c决定了哪一类,假设为person类。在z(i,j,c)这个feature map上的某一个像素的位置是(x,y),像素值是value,则value表示的是原图对应的(x,y)这个位置上可能是人(c=‘person’)且是人的左上部位(i=j=1)的概率值。

 

  • ROI pooling: 就是faster RCNN中的ROI pooling,也就是一层的SPP结构。主要用来将不同大小的ROI对应的feature map映射成同样维度的特征,思路是不论对多大的ROI,规定在上面画一个n*n 个bin的网格,每个网格里的所有像素值做一个pooling(平均),这样不论图像多大,pooling后的ROI特征维度都是n*n。注意一点ROI pooling是每个feature map单独做,不是多个channel一起的。

 

  • ROI pooling的输入和输出:ROI pooling操作的输入(对于C+1个类)是k^2*(C+1)*W' *H'(W'和H'是ROI的宽度和高度)的score map上某ROI对应的那个立体块,且该立体块组成一个新的k^2*(C+1)*W' *H'的立体块:每个颜色的立体块(C+1)都只抠出对应位置的一个bin,把这k*k个bin组成新的立体块,大小为(C+1)*W'*H'。例如,下图中的第一块黄色只取左上角的bin,最后一块淡蓝色只取右下角的bin。所有的bin重新组合后就变成了类似右图的那个薄的立体块(图中的这个是池化后的输出,即每个面上的每个bin上已经是一个像素。池化前这个bin对应的是一个区域,是多个像素)。ROI pooling的输出为为一个(C+1)*k*k的立体块,如下图中的右图。更详细的有关ROI pooling的操作如公式(1)所示:

R-FCN: Object Detection via Region-based Fully Convolutional Networks_目标检测_08

  

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接_09

 

R-FCN: Object Detection via Region-based Fully Convolutional Networks_目标检测_10

 

R-FCN: Object Detection via Region-based Fully Convolutional Networks_卷积_11

  

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接_12

R-FCN: Object Detection via Region-based Fully Convolutional Networks_卷积_13

                          

R-FCN: Object Detection via Region-based Fully Convolutional Networks_目标检测_14

R-FCN: Object Detection via Region-based Fully Convolutional Networks_卷积_15

R-FCN: Object Detection via Region-based Fully Convolutional Networks_卷积_16

 

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接_17

R-FCN: Object Detection via Region-based Fully Convolutional Networks_卷积_18

 

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接_19

R-FCN: Object Detection via Region-based Fully Convolutional Networks_卷积_20

  • vote投票:k*k个bin直接进行求和(每个类单独做)得到每一类的score,并进行softmax得到每类的最终得分,并用于计算损失

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接_21

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接_22

R-FCN: Object Detection via Region-based Fully Convolutional Networks_目标检测_23

  • 损失函数:和faster RCNN类似,由分类loss和回归loss组成,分类用交叉熵损失(log loss),回归用L1-smooth损失

R-FCN: Object Detection via Region-based Fully Convolutional Networks_目标检测_24

  • 训练的样本选择策略:online hard example mining (OHEM,参考文献1) 。主要思想就是对样本按loss进行排序,选择前面loss较小的,这个策略主要用来对负样本进行筛选,使得正负样本更加平衡。
  • 训练细节:
  • decay = 0.0005
  • momentum = 0.9
  • single-scale training: 修改输入图像大小,短边 600 pixels [6, 18].
  • 8 GPUs (这样有效地mini-batch size 就是8×), each GPU holds 1 image and selects B = 128 RoIs for backprop.
  • fine-tune learning rate = 0.001 for 20k mini-batches,  0.0001 for 10k mini-batches on VOC.
  • the 4-step alternating training between training RPN and training R-FCN.(类似于Faster RCNN)
  • 使用atrous(hole算法)

R-FCN: Object Detection via Region-based Fully Convolutional Networks_目标检测_25

实验结果

VOC2007和VOC2010上与Faster R-CNN的对比:R-FCN比Faster RCNN好!

R-FCN: Object Detection via Region-based Fully Convolutional Networks_目标检测_26

R-FCN: Object Detection via Region-based Fully Convolutional Networks_目标检测_27

R-FCN: Object Detection via Region-based Fully Convolutional Networks_目标检测_28

深度影响对比:101深度最好!

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接_29

候选区域选择算法对比:RPN比SS,EB好!

 

R-FCN: Object Detection via Region-based Fully Convolutional Networks_目标检测_30

 

COCO库上与Faster R-CNN的对比:R-FCN比Faster RCNN好!

效果示例:

R-FCN: Object Detection via Region-based Fully Convolutional Networks_卷积_31

总结

  • R-FCN是在Faster R-CNN的框架上进行改造,
  • 第一,把base的VGG16换为ResNet;
  • 第二,把Fast R-CNN换成了先用卷积做prediction,再进行ROI pooling。由于ROI pooling会丢失位置信息,故在pooling前加入位置信息,即指定不同score map是负责检测目标的不同位置。pooling后把不同位置得到的score map进行组合就能复现原来的位置信息。

难点理解:

R-FCN是微软亚洲研究院的代季峰在2016年提出的一种全新的目标检测结构。它对传统的Faster R-CNN结构进行了改造,将ROI层后的卷积都移到了ROI层前,并利用一种位置敏感的特征图来评估各个类别的概率,使其在保持较高定位准确度的同时,大幅提高检测速率。

网上很容易找到关于R-FCN的各种文章,所以不再重复介绍它的结构,只是选几个容易引起误解的点做深入解读。

理解难点1:平移不变性和平移可变性

再来看个Faster R-CNN + ResNet-101结构的例子。如果在Faster R-CNN中没有ROI层,直接对整个feature map进行分类和位置的回归,由于ResNet的结构较深,平移可变性较差,检测出来的坐标会极度不准确。如果在ResNet中间(图1 conv4与conv5间)加个ROI层结果就不一样了,ROI层提取出的proposal中,有的对应前景label,有的对应背景label,proposal位置的偏移就有可能造成label分类(前景和背景分类)的不同。偏移后原来的前景很有可能变成了背景,原来的背景很有可能变成了前景,换句话说分类loss对proposal的位置是敏感的,这种情况ROI层给深层网络带来了平移可变性。如果把ROI加到ResNet的最后一层(图1 conv5后)结果又是怎样呢?conv5的第一个卷积stride是2,造成conv5输出的feature map更小,这时proposal的一个小偏移在conv5输出上很有可能都感知不到,即proposal对应的label没有改变,所以conv5后虽然有ROI也对平移可变性没有什么帮助,识别出来的位置准确度会很差。

R-FCN: Object Detection via Region-based Fully Convolutional Networks_目标检测_32

图1:ResNet-101的结构

论文中作者给了测试的数据:ROI放在ResNet-101的conv5后,mAP是68.9%;ROI放到conv5前(就是标准的FasterR-CNN结构)的mAP是76.4%,差距是巨大的,这能证明平移可变性对目标检测的重要性。

理解难点2:R-FCN结构的由来

R-FCN要解决的根本问题是Faster R-CNN检测速度慢的问题,速度慢是因为ROI层后的结构对不同的proposal是不共享的,试想下如果有300个proposal,ROI后的全连接网络就要计算300次,这个耗时就太吓人了。所以作者把ROI后的结构往前挪来提升速度,但光是挪动下还不行,ROI在conv5后会引起上节提到的平移可变性问题,必须通过其他方法加强结构的可变性,所以作者就想出了通过添加Position-sensitive score map来达到这个目的。

理解难点3:Position-sensitivescore map的结构

图1的ResNet-101应用到R-FCN时会把最后的average pool和1000-d fc全连接层都去掉了,仅保留前100层,再新加一个1x1x1024的卷积层用来降维(从2048维降到1024维),和一个很特殊的卷积来生成k2 *(C+1)维的Position-sensitive score map。其中的C是要分类的类别数,比如PASCAL VOC类别就是20,加上1表示加上一个背景分类;k是之后的ROI Pooling中对ROI区域要划分的小格数,比如论文中k=3就是对ROI在长宽方向各三等分形成9个小区域(如图2)。Position-sensitivescore map的值对小区域相对于ROI中的位置很敏感,为什么这么说后面会解释。

R-FCN: Object Detection via Region-based Fully Convolutional Networks_全连接_33

图2:Position-sensitive score map的结构

图2中最后一个特殊卷积输出Position-sensitive score map后,就要做ROI Pooling了,和Faster R-CNN中的ROI Pooling一样要对9个小区域分别进行pooling,要注意的是R-FCN中9个小区域并不是在所有k2 * (C+1)维度上都做pooling,每个小区域只会在对应的(C+1)个维度上作pooling,比如ROI左上角的区域就在前C+1个维度上pooling,左中位置的区域就在C+2到2C+2间的维度上作pooling,以此类推。pooling后输出的是C+1维度的k*k数据,每个维度上的k*k个数据再加到一起(图2的vote过程)形成C+1个单点数据,就代表了C+1个类别的分类概率。

对于目标定位的输出和上面的分类输出过程类似,只是维度不再是k2 * (C+1),而是k2*4,表示9个小区域的[dx,dy,dw,dh]4个偏移坐标。

理解难点4:Position-sensitive score map为什么会带来平移可变性

Position-sensitive score map的概念最早来自另一篇实例分割的论文Instance-sensitiveFully Convolutional Networks (https://arxiv.org/pdf/1603.08678.pdf)。图3是示意图,中间的9张图对应Position-sensitivescore map的9个维度的输出。拿左上角的图说明:它的每一个点代表该点正好出现在目标左上角的概率(更准确的说应该是得分,因为还没做softmax),也可以理解是该点右下方正好是目标的概率。要注意的是:“目标左上角的概率”的概念并不局限于图中画的绿色框范围,而是整张图上的每一个点,这是新学习者很容易引起误解的地方。同理其余8张图各自对应了目标正上侧、右上侧、左中侧、正中侧、右中侧、左下侧、正下侧、右下侧的概率。在训练时,一个ROI的9个小区域从每张图的对应区域去Pooling出一个结果,组成新的图(图3右侧的9宫格图),如果ROI刚好覆盖groundtruth,这个新的区域就标记为前景(label=1)。

这里有个关键点要解释,为什么每张图都能携带相对位置信息?因为从图3提取1~9号小方格时,每个小方格在每张图上的位置并不相同,而是在上下左右方向上有偏移,当组合出来的9宫格对应ground truth时,小方格1就对应了 ground truth左上角的位置,小方格2对应了ground truth正上方的位置,依此类推,所以用这种9宫格训练目标时就有了相对目标位置的信息在里面 。

R-FCN: Object Detection via Region-based Fully Convolutional Networks_卷积_34

图3:Position-sensitive score map

 

举报

相关推荐

0 条评论