论文:《R-FCN: Object Detection via Region-based Fully Convolutional Networks》
概述
此论文是微软亚洲研究院的代季峰在2016年提出来的一篇目标检测的很牛的论文,相比较以前的rcnn、spp、fast_rcnn以及faster_rcnn在检测速度上有了很大的提升,我自己也在caffe框架里面用了R-FCN,网络结构主要是用了resnet(101效果是最好的),论文中也提了在检测效果上和以前的faster_rcnn是差不多的,但是其检测速度可是faster_rcnn的好几倍,这确实厉害了,还是值得运用的。
为了介绍R-FCN的创新点,下面先说说以前基于Region Proposal的主流的目标检测网络,主要有:rcnn、spp、fast_rcnn以及faster_rcnn,这些方法的网络结构一般都是被 RoI pooling 层分成两个子网络:
- 共享的全卷积子网
RoI-wise 的子网络
这样设计的一个主要的原因是借鉴自以前经典的分类网络结构(如 AlexNet、VGG等),这些网络结构都是卷积子网络,再接一个 pooling层,之后再接几个全连接层。很容易将分类网络的 spatial pooling 层对应到 RoI pooling,将分类网络转化成一个用于 detection 的网络。
这里有一个问题,就是多多少少会有subnet的重复计算。回忆最早的RCNN,每一个proposal都会独立经历一次CNN网络抽取feature,那么这个时候,这个subnet就是整个网络,非常非常慢。后来的fast_rcnn,先把整张image进行卷积计算,然后在最后一层通过ROI pooling把每一个proposal变成一个大小一致的map,对于每一个map,经过若干次fc层然后得到结果,在这个时候,这个subnet指的就是那若干层fc层。假如一幅图片的proposal有N个,所以这样经历subnet的计算也会有N次,subnet越深计算的效率越低。本文的想法就是不用这些subnet,让所有的计算都可以共享。
当前主流的分类网络(如 ResNet、GoogleNet)都是全卷积网络。所以很自然地想到将这样的分类的全卷积网络的结构应用到 Detection 网络上。
但是问题就来了
物体分类要求平移不变性越大越好 (图像中物体的移动不用区分),而物体检测要求有平移变化。所以,ImageNet 分类领先的结果证明尽可能有平移不变性的全卷积结构更受亲睐。另一方面,物体检测任务需要一些平移变化的定位表示。比如,物体的平移应该使网络产生响应,这些响应对描述候选框覆盖真实物体的好坏是有意义的。CNN随着网络深度的增加,网络对于位置(Position)的敏感度越来越低,也就是所谓的translation-invariance,但是在Detection的时候,需要对位置信息有很强的的敏感度。
ResNet 的论文中提出了,一种使用 ResNet 作为特征引擎的 Faster R-CNN 方法,将 RoI pooling 层插在两个卷积子网络之间。RoI-wise 子网络越深,那么对于有 N 个 Proposal 的图像,那么子网络就需要重复计算 N 次,虽然子网络越深,准确度可能越高,但是这应一定程度上是以牺牲训练和测试的效率速度为代价的(这一块我没有了解的很清楚)。
针对上述的所提出的问题,下面介绍一下R-FCN的创新点:
- 使用全卷积网络,从而实现了计算的全部的共享
- 创建position-sensitive score maps (位置敏感的得分图)来解决了图像分类平移不变性与对象检测平移变化之间的矛盾
position-sensitive score maps (位置敏感的得分图)介绍
为了解决translation variance 在检测和分类中的冲突,这篇paper设计了一种特殊的卷积层:position-sensitive score maps作为全卷积网络的输出,该卷积层输出 position-sensitive 的 score map,而且每个 score map 引入了位置的信息,如物体的顶部。在网络的最后一层,再接一个 position-sensitive RoI pooling 层完成对物体的检测分类。在整个网络框架中,所有可学习的层,都是卷积层,同时把空间位置信息引入特征学习中,使得整个网络可以进行 end-to-end 的学习。(后面会详细介绍position-sensitive score maps和position-sensitive RoI pooling是怎么操作的)。
网络主结构
论文也是采用了比较流行的检测策略,分为两步:
- 提取region proposal
- 对region proposal进行分类
对于提取region proposal ,论文也是采用了比较流行的RPN网络,其给出感兴趣区域。R-FCN 对该感兴趣区域进行分类。R-FCN 在与 RPN 共享的卷积层后多加1个卷积层,所以,R-FCN 与RPN一样,输入为整幅图像。但 R-FCN 最后1个卷积层的输出从整幅图像的卷积响应图像中分割出感兴趣区域的卷积响应图像。
文章采用 ResNet 101 的卷积层作为基础的卷积网络结构,去除其最后的一个fc层和平均池化层,resnet101最后一层的卷积层是2048d维的卷积层,文章是再接一个1024d维的1*1的卷积层用于降维,最后接一个产生 k*k(C+1) 个 score map 的 position-sensitive 的卷积层,然后接一个 position-sensitive RoI pooling 层,最后使用 Softmax 用于判断 RoI 的类别。与此同时还可以接一个产生 4*k* k 个 map 用于回归 Bounding box 的位置,同样应用 position-sensitive RoI pooling 层,最后得到一个回归的位置。
R-FCN 最后1个卷积层在整幅图像上为每类生成k*k个位置敏感分数图,有C类物体外加1个背景,因此有k*k(C+1)个通道的输出层。k*k个分数图对应描述位置的空间网格。比如,k×k=3×3,则9个分数图编码单个物体类的 {top−left,top−center,top−right,…,bottom−right}。
R-FCN 最后用位置敏感 RoI 池化层,给每个 RoI 1个分数。选择性池化图解:看上图的橙色响应图像 (top−left),抠出橙色方块 RoI,池化橙色方块 RoI 得到橙色小方块 (分数);其它颜色的响应图像同理。对所有颜色的小方块投票 (或池化) 得到1类的响应结果。产生完了这张map之后,再根据proposal产生一个长宽各为k,channel数目为C+1的score map。具体产生score map的方法是,假如k=3,C=20,那么score map的20个类每个类都有3*3的feature,一共9个格子,每一个格子都记录了空间信息。而这每一个类的每一个格子都对应前面那个channel数为3*3*21的大map的其中一个channel的map。现在把score map中的格子对应的区域的map中的信息取平均,然后这个平均值就是score map格子中的值。最后把score map的值进行vote(avg pooling)来形成一个21维的向量来做分类即可。