R-FCN
最近重新学习这篇论文,发现原来的理解里有一些偏差,所以这里重新学习一下。学习期间有两篇文章给我很大的帮助
中英文对照翻译
http://noahsnail.com/2018/01/22/2018-01-22-R-FCN论文翻译——中英文对照/
这篇文章里对平移不变性和平移可变性有着很好的解释
https://zhuanlan.zhihu.com/p/32903856
我写这篇主要是用自己的话描述了一下对敏感位置分数图的理解。多余的内容就是自己的复习了。
2016年是一个百花齐放的一年。微软研究院的Jifeng Dai, Kaiming He【3】等人提出了R-FCN,基于区域的全卷积网络。该网络几乎在整张图像上共享卷积层,所以不用再进行数以百次记的全连接网络。在faster中,Proposal进入到POIPooling是按照区域一个一个进入的,分别对每个区域提案进行后续的训练,训练是对每个区域单独进行的。这样看来,通常faster会产生300个Proposal。这样就会进行300次的全连接,所以耗时会很长,R-FCN想要把ROI后的结构向前挪来提升速度,这样会产生平移可变性问题,需要使用其他的方法加强结构的可变性,于是添加了Position-sensitive score maps(位置敏感分数图),以上是R-FCN的提出思路。下面详细介绍该网络。
文章开发了一个称为基于区域的全卷积网络(R-FCN)框架来进行目标检测。网络由共享的全卷积架构组成。为了解决平移可变性问题,加入了一组专门的卷积层作为FCN输出来构建一组位置敏感的分数图。这些分数图中的每一个都对关于相对空间位置(的位置信息进行编码例如,“在目标的左边”)。在这个FCN之上,我们添加了一个位置敏感的RoI池化层,它从这些分数图中获取信息,并且后面没有权重(卷积/fc)层。如图所示:
图1
图2R-FCN的总体架构。区域建议网络(RPN)[18]提出了候选RoI,然后将其应用于评分图上。所有可学习的权重层都是卷积的,并在整个图像上计算;每个RoI的计算成本可以忽略不计。
R-FCN将ROI分类为目标类别和背景最后一个卷积层为每个类别产生一堆大小为k2的位置敏感分数图,从而得到一个具有C个目标类别的k2(C+1)通道输出层(+1为背景)。一堆k2个分数图对应于描述相对位置的k×k空间网格。例如,对于k×k=3×3,大小为9的分数图编码目标类别在{左上,右上,右上,…,右下}的情况。在最后一个卷积层后还有一个ROI池化层,称作位置敏感ROI层。该层进行选择性池化,并且k×k个组块中的每一个仅聚合k×k分数图中一个得分图的响应。通过端到端的训练,这个RoI层可以管理最后一个卷积层来学习专门的位置敏感分数图。
图3 ROI重叠目标时可视化
图4 ROI不能正确重叠目标时的可视化
说的简单一点,将一个含有类别c的ROI划分为k×k个区域。希望这k×k个区域中含有对应物体的相应部位。当这些区域和部位各自对应后,分类器才会将ROI判定为该类别。敏感位置得分图就是为了判断ROI子区域是否含有物体的相应部位。现在取一个类别的大小为k2敏感位置得分图,表示原图中的哪些位置含有人的某个部位。而该得分图都是只属于“一个类别的一个部位的”。所以ROI的第i个子区域一定要到第i个得分图上去找对应区域的响应值。从上面的示意图可以看出,左上角对应人旁边的沙发,所以在第一张得分图中,人旁边的沙发的得分都是高的,将这些区域组合起来就得到了ROIPool
从这张图可以看出,通过RPN提取出来的ROI区域包含有坐标,可以定位到各得分图的各个对应子区域,然后在相应的位置进行池化:取单个子区域这个范围内的所有值的平均值。
位置敏感的分数图和位置敏感的RoI池化。为了将位置信息显式地编码到每个RoI中,我们用规则网格将每个RoI矩形分成k×k的组块。对于大小为w×h的RoI矩形,组块的大小为≈w/k×h/k。在我们的方法中,构建最后的卷积层为每个类别产生k2分数图。在第 (i,j)个组块(0≤i,j≤k−1)中,我们定义了一个位置敏感的RoI池化操作,它只在第(i,j)(i,j)个分数映射中进行池化:
r_c (i,j│Θ)=∑_((x,y)∈bin(i,j))▒〖z_(i,j,c) (x+x_0,y+y_0│Θ)/n〗
其中r_c (i,j)是第(i,j)个组块中第c个类别的池化响应,z_(i,j,c)是k2(C+1)分数图中的一个分数图,〖(x〗0,y_0)表示一个RoI的左上角,n是组块中的像素数量,Θ表示网络的所有可学习参数。第(i,j)个组块跨越⌊i w/k⌋≤x<⌈(i+1)w/k⌉和⌊j w/k⌋≤y<⌈(j+1)h/k⌉。公式(1)的操作如图1所示,其中颜色表示一对(i,j)。方程执行平均池化,但是也可以执行最大池化。k2位置敏感的分数会在RoI上投票。在本文中,我们通过对分数进行平均来简单地投票,为每个RoI产生一个(C+1)维向量:r_c (Θ)=∑(i,j)▒〖r_c (i,j|Θ)〗。然后,我们计算跨类别的softmax响应:s_c (Θ)=e^(r_c (Θ))/∑_(c,=0)c▒e(r_(c,) (Θ)) 。它们被用来评估训练期间的交叉熵损失以及在推断期间的RoI名。们以类似的方式进一步解决边界框回归。除了上面的k2(C+1)维卷积层,我们在边界框回归上附加了一个4k2维兄弟卷积层。在这组4k2维映射上执行位置敏感的RoI池化,为每个RoI生成一个4k2维的向量。然后通过平均投票聚合到4维向量中。这个4维向量将边界框参数化为t=(tx, ty, tw, th),参见[6]中的参数化。我们注意到为简单起见,我们执行类别不可知的边界框回归,但类别特定的对应部分(即,具有4k2C维输出层)是适用的。
之后的部分和faster就很相似了,例如迁移训练,四步交替训练 ,非极大值抑制,难例挖掘等等。最后还引入了空洞卷积,稍稍提高了mAP值。最终的实验验证了ROIPool的位置不能随便放,和faster相比,虽然mAP值的提升不大,但是大大缩短了预测所花的时间。