一、论文相关信息

时间:2016年
题目:R-FCN: Object Detection via Region-based Fully Convolutional Networks
paper地址:https://arxiv.org/abs/1605.06409
code: https://github.com/daijifeng001/r-fcn.
作者:Jifeng Dai 等

二、论文详情

背景与介绍

之前的region-based 目标检测框架如Fast-RCNN, Faster-RCNN等可用被分为两个子网络,一个是用于提取特征的骨干网,一个是基于每个RoI的分类子网络,这两个子网络以RoI层界分开。前面的骨干网独立于具体的RoI,所有的RoI都共享这部分的计算,而后面的那部分子网络则是单独对于每个RoI的,计算资源不共享,第二个子网络需要针对每个ROI做计算,这样会做很多重复性的工作,导致很大的计算资源消耗,所以R-FCN的一大出发点就是解决这个问题,通过使用卷积网络让几乎所有计算都共享。
深层的卷积层对位置偏移是不敏感的,对于平移不变的分类任务来说能表现很好,但是当引入到对位置变化敏感的目标检测时检测精度就下降很多。

这里的位置敏感举例:当一个预测框中的内容变化后,模型对这个内容变化之后预测框与之IoU变化有响应。

为了解决这个问题,ResNet中将ROI层给放到了卷积层中间,即RoI层之后接一个针对每个RoI的卷积子网络。这样的话虽然之后的卷积网络对位置敏感了,但是由于基于region-wise,效率很低。

而这篇文章提出了基于区域的全卷积网络来解决这个问题。为了将位置变化融合进FCN,在骨干网之后添加一系列通过卷积得到的位置敏感得分图作为FCN的输出,在FCN上面添加一个位置敏感的ROI池化层获取这些得分图的信息。这样整个网络中可学习层都是卷积层,端到端的训练,在整幅图片上共享计算,并且编码了用于目标检测的位置信息。

R-FCN的架构图:

R-FCN论文详解笔记
网络由backbone(ResNet-101的前100层),RPN(生成 RoIs),backbone后的跟的最后一层卷积层,这一层有两个分支,分别对应的是分类分支和回归分支,这两个分支的卷积层产生若干位置敏感的score maps,然后RPN得到的RoI在这些maps上通过位置敏感的一个RoI pooling做池化操作,得到RoI-wise的结果。上图只显示了一个分支,没有体现完善。

backbone后的卷积层(分类分支为例)对每个category输出k×k个 position-sensitive score maps,也就是 k×k个channel,那么C个种类+背景就会有k×k(C+1)channels。其中,对于每个种类,其k×k个maps中,每个maps分别编码该类物体位置上的一部分,例如如果人用的k×k是3×3=9,则9个maps中每个maps分别对应人的左上,中上(头),右上,,,右下(右脚)等。
R-FCN以一个位置敏感的RoI pooling layer结尾,该层聚合了最后一个卷积层的输出并且生成每个RoI的得分。这里position-sensitive RoI layer作选择性的pooling,即对于每个类,pooling layer 输出的k×k个bins中的每个bin只聚合k×k个score map中的一个。观察上图中bin中的颜色可知。

具体细节如位置敏感的score maps、RoI pooling layer等在后面还会讲到。

骨干网络结构(backbone)

论文中的backbone基于ResNet-101,ResNet-101有100个卷积层跟着一个全局平均池化层和一个1000分类的全连接层,这里将全局平均池化层和全连接层去掉,然后只使用卷积层来计算特征图。由于ResNet-101最后一个卷积层输出是2048-d,这里使用一个随机初始化的1×1卷积作降维,然后跟着用k×k(C + 1)-channel的卷积层来生成score maps。
generate RoI
通过RPN来生成RoIs,RPN本身是一个全卷积的架构。

位置敏感的score maps 和位置敏感的RoI pooling

为了明确的将位置信息编码到每个RoI中,通过一个规则网格将每个RoI举行分成k×k个bins,对于每个w ×h尺寸的RoI 矩形,其每个bin的尺寸为(w/k) ×(h/k)。最后一个卷积层针对每个类输出k×k个score map,对于其中的第(i,j)个bin (0 ≤ i, j ≤ k − 1),我们对一个位置敏感的RoI pooling 去对第(i,j)个score map做池化操作。

下式,极为改池化操作的式子:
R-FCN论文详解笔记
其中θ代表的是网络的所有可学习参数,rc(i,j)是c类别第(i,j)个bin的响应值,zi,j,c则是C类别的score maps中对应的那个score map。x0,y0指的是改RoI的左上角位置。x,y是bin中的坐标值,取整数。R-FCN论文详解笔记

式子与下图对应:
R-FCN论文详解笔记

我的疑问:我认为这里x0,y0取RoI左上角的话,那么x,y的取值范围一个是RoI的范围,而不是bin的范围,否则每个bin的值都是该bin对应哪个map以RoI左上角开始的一个小的bin大小的池化接结果了。暂时搁置疑问。

然后每个bin的值决定该类的得分,这里简单的将每个bin的值相加作为该类的得分。然后将每个类的得分输入一个softmax函数得出其类别估计得分。该输出会用于计算交叉熵损失以及在inference的时候给RoIs排序。

bounding box regression

对于bounding box regression也是相似的方法,除了以上kk(C + 1)-d的卷积层,再加上一个4kk维的旁支卷积层做边框回归。然后位置敏感的RoI pooling就对改卷积层输出的4kk个maps做池化,产生4kk维的向量(for each RoI)。然后该向量通过被聚合到一个4维的向量,这个4维向量 t = (tx, ty, tw, th)用于该RoI的边框回归。注意,这里为了简化执行的类别无关的边框回归,也可应用类别相关的边框回归(将维度置为4kkC)。

由于RoI层之后没有需要学习的layer了,所以region-wise 的计算几乎忽略不计。

Train

损失函数:由分类的交叉熵损失和回归损失组成。
R-FCN论文详解笔记
cs是ground truth label,0为背景,意思只在非背景时计算回归损失。 Lreg沿用Fast RCNN中定义的,t表示ground truth box。λ=1。
IoU阈值为0.5,大于等于0.5为positive,否则negative。

online hard example mining (OHEM)

假定每个图片N个proposal,forward之后得到这N个proposal的loss,然后根据loss sort所有RoIs(both positive and negative)并选择前B个最高损失值的RoIs。然后在这选中的RoIs上执行back propagation。由于RoI-wise 计算可忽略,因此时间成本基本不受N的影响。

其他参数

weight decay =0.0005 , momentum = 0.9 。
采用单一尺寸图片训练,resize到最短边为600pixels。
每个GPU存一个图片,然后选择B=128,作者使用8个GPU,所以mini-batch size就是8的倍数。
VOC上,前20k mini-batches使用0.001的学习率,后10k使用0.0001。
为了使RPN和R-FCN共享参数,像Faster RCNN那样采用4步法交替训练RPN和R-FCN。

Inference

输入图片,backbone提取特则得到feature maps,然后RPN部分提出RoIs,针对每个RoI R-FCN部分估计其类别得分和边框回归参数。
结果使用0.3的IoU阈值来做nms非极大值抑制。(作者为了与其他方法公平比较,实验时RoIs只使用了300个)

Visualization of position-sensitive score maps

当RoI与ground truth贴合时候的sore maps:
R-FCN论文详解笔记
当RoI与ground truth不重合时的score maps:
R-FCN论文详解笔记

结果:

放上了使用ResNet-101做骨干网,情况下Faster R-CNN和R-FCN的对比。使用了在线难样本挖掘(HNEM),固定了前向传播时的RoIs个数N,选取128个样本反向传播,300个RoIs用于检测inference。
R-FCN论文详解笔记

note

  • 当把R-FCN的k设置为1时,最后一个卷积层只产生一个score map,RoI pooling layer也只通过一个1*1网格生成一个bin的池化结果,于是这部分从一个position sensitive RoI Pooling layer 就退化成了一个average RoI pooling layer了,这时就会失去其位置敏感特性,无法拟合。

  • 文章中提到A trous 这个trick,用于把resnet最后一个池化层的步长从2减小到1,这样原图到特征图的stride(即缩小了多少倍)就从32变成了16,从而提高了RPN 和R-FCN共享的feature map的分辨率。然后我没有仔细查这个A trous,待补充或者就不会补充了。????

相关文章: