R-FCN论文翻译
R-FCN: Object Detection viaRegion-based Fully Convolutional Networks
2018-02-06 11:43:35
代码地址:https://github.com/daijifeng001/r-fcn(matlab版)
摘要
我们使用R-FCN(region-based, fully convolutional networks)进行精确和有效的物体检测。对比之前的区域检测器(Fast/Faster R-CNN [6 , 18] 应用于每一个区域子网格要花费数百次),我们的区域检测是基于整幅图片的全卷积计算。为了达到这个目标,我们使用了一个“位敏得分地图”(position-sensitive score maps)来权衡在图像分类中的平移不变性和在物体检测中的平移变换性这样一种两难境地。我们的方法采用了全卷积图片分类主干部分,例如用于物体检测的最新的残差网络(ResNets)[9],在PASCAL VOC(e.g.,83.6% mAP on the 2007 set)数据集的实验上,我们使用了101层ResNet达到了很好的效果。同时,我们仅仅使用了170ms/每张图片,比Faster R-CNN匹配快了2.5~20倍左右。公开的代码可以在此网站中访问到:https://github.com/daijifeng001/r-fcn
1 简介
比较流行的关于物体检测的深度网络[8,6,18]可以通过RoI pooling layer[6]分成两个子网络:(i)独立于RoI的共享的、全卷积的子网络,(ii)不共享计算的RoI-wise子网络。这种分解[8]来源于较早之前的分类框架,例如:AlexNet[10]和VGGNets[23],它们由两个子网络组成,一个是以spatial pooling layer结束的卷积子网络,另一个是若干个fully-connected(fc) layers。因此,在图片分类网络中的spatial pooling layrer很自然的在本实验中被转变成了物体检测网络[8,6,18]中的RoI pooling layer。
但是最近最好的图片分类的网络,例如残差网络(ResNets)[9]和GoogleNets都是用全卷积设计的。通过分析,使用所有的卷积层去构建一个进行物体检测的共享的卷积网络是一件十分自然的事,而不把RoI-wise 子网作为隐藏层。然而,通过实证调查,这个天真的想法需要考虑到极差的检测精度与网络的较高的分类精度不匹配的问题。为了解决这个问题,在残差网络(ResNet)[9]中, Faster R-CNN检测器的RoI pooling layer 中插入了两组卷积层,它们创造了一个更深的RoI-wise子网来提高准确度,由于每个RoI的计算不共享,因此速度会比原来的要慢。
我们认为上述设计主要是为了解决图片分类的平移不变性与物体检测之间的平移变换性之间的矛盾。一方面,图像级别的分类任务侧重于平移不变性(在一幅图片中平移一个物体而不改变它的判别结果),因此深度全卷积网络结构很适合处理这类图片分类的问题。通过在ImageNet classification [9,24,26]上的良好表现得以证明。
图1:基于R-FCN的物体检测核心思想。在本插图中,通过全卷积网络产生一个kxk=3x3的position-sensitive score maps.对于每一个在RoI中的kxk个bins,pooling仅仅在k²个maps中的其中一个呈现(通过不同的颜色进行标记)
另一方面,目标检测任务需要定义物体的具体位置,从某种程度上说是平移可变换的。例如,平移一个候选框和物体的重叠程度。我们假定在图片分类网络中,卷积层越深,对平移越不敏感。为了解决这个两难境地(图片分类中的平移不变性和目标检测中的平移变换性),在ResNet文献[9]中的检测算法中插入了RoI pooling layer到卷积层——这个区域特异性操作破坏了平移不变性,而且当评估不同区域时,post-RoI卷积层不再是平移不变的了。然而,这种设计牺牲了训练和测试的效率,因为它引入了大量的region-wise layers(表1)。
在本篇文献中,我们开发出了一个称之为R-FCN(Region-based Fully Convolutional Network)的框架来用于物体检测。我们的网络由共享的全卷积结构组成,就像FCN一样[15]。为了把平移变换特性融合进FCN中,我们创建了一个位敏得分地图(position-sensitive score maps)来编码位置信息,从而表征相关的空间位置。在FCN的顶层,我们附加了一个position-sensitive RoI pooling layer 来统领这些得分地图的信息,这些得分地图不带任何权重层(卷积或全连接层)。整个结构是端对端的学习。所有可学习的层在整幅图片中都是可卷积的并且可共享的,并且可以编码用于物体检测的空间信息。图 1说明了这个关键的思路,表1比较了区域检测的各种算法。
使用101层的Residual Net[9]作为主干,我们的R-FCN在PASCAL VOC 2007测试集上达到了83.6%的mAP,在2012测试集上达到了82.0%的mAP。同时,我们的结果实现了170ms/每张图片的速度,比Faster R-CNN+ResNet-101 [9] 快了2.5~20倍。这个实验结果说明了我们的方法成功的解决了基于全卷积网络的图像级别的分类问题中的平移不变性和平移变换性之间的矛盾,就像ResNet能够被有效的转换成全卷积目标检测器(fully convolutional object detectors.)一样。详细的代码参见:https://github.com/daijifeng001/r-fcn
2 方法
概述
对于下面的R-CNN[7],我们采用了两种流行的目标检测策略[7,8,6,1,18,22]:region proposal和region classification。尽管不依赖于region proposal的方法确实存在(比如[17,14])。region-bases system(基于区域的系统)在一些benchmark[5,13,20]上依然具有最好的准确率。我们通过Region Proposal Network(RPN)来抽取候选区域,它自身是一个全卷积结构。接下来[18],我们在RPN和R-FCN中共享这些特性。图 2展示了整个系统的结构。
图2:R-FCN的整体架构。Region Proposal Network(RPN)产生候选区域,然后RoI会被应用与得分maps。所有可学习的权重层在整幅图片中都是可卷积的并且是可计算的。每个RoI的计算开销都是可以忽略的。
考虑到proposal region, R-FCN结构用来将ROI分类为物体和背景。在R-FCN中,所有可学习的权重层都是可卷积的并且是在整幅图片中进行计算。最后一个卷积层针对于每一个物体类别产生一堆K²个position-sensitive score maps 。因此有k²(C+1)个通道输出层(C个物体目录项+1个背景)。这K²个得分地图由K×k个空间网格来描述相对位置。例如,对于K×K = 3×3,这9个得分地图将物体类别编码为9种情况(top-left,top-center,top-right,......,bottom-right)。
R-FCN以position-sensitive RoI pooling layer作为结束层。他将最后一个卷积层的输出结果聚集起来,然后产生每一个ROI的得分记录。和[8][6]不同,我们的position-sensitive RoI层产生的是selective pooling,并且k×k的每个条目仅仅聚集来自于k×k得分地图堆里面的一个得分地图。通过端对端的训练,RoI 层带领最后一层卷积层去学习特征化的position-sensitive score maps。图 1说明了这个过程。图 3、图 4是两个可视化的例子。本算法的具体细节介绍参见后面的条目。
Backbone architecture
本文献中的R-FCN算法是基于ResNet-101[9]的,虽然其他的深度学习网络[10][23]也可以应用。RstNet-101有100个带global average pooling的卷积层,有一个1000级的fc层(fully-connected)。我们去掉了global average pooling和fc layer,然后只使用卷积层来计算feature maps。We use the ResNet-101 released by the authors of [9], pre-trained on ImageNet [20]。在ResNet-101中,最后一个卷积块是2048-d(2048维度)我们附加了一个随机初始化的1024d的1×1的卷积层来降低维度(更精确的,我们增加了卷积层的深度),然后我们使用了k²(C+1)个通道的卷积层来产生得分地图,下面会有具体的介绍。
Position-sensitive socre maps & position-sentitive RoI pooling
为了在每个RoI中明确编码位置信息,我们通过一个网格把每个RoI分成k×k个bins。对于w×h的RoI区域,每一个bin的大小≈w/k×h/k[8][6]。在我们的方法中,最后一个卷积层是被用来为每个类别产生k²个得分地图。在第i行第j列的bin(0≤i , j≤k-1)中,我们定义了一个position-sensitive RoI pooling 操作,仅仅将结果汇集到在第(i,j)个得分图上:
在这个公式中:rc是针对于第c个目录的第(i,j)个bin的pooled response;Zi,j,c是k²(C+1)个得分图的其中一个图;(x0,y0)表示RoI的左上角;n表示bin中像素的个数;θ表示网络中的所有可学习的参数。第(i,j)个bin的范围是:
关于上述等式,在图1中有解释,其中一个颜色代表一个(i,j)对。上述等式使用的是平均池化,当然最大池化也有很好的表现。
这K²个得分图用来对ROI区域进行投票。在本篇论文中我们通过平均得分来对ROI区域进行投票,从而产生(C+1)维的向量:
然后我们计算了每一个目录项的softmax响应:
在训练和评级的时候,他们被用来估计交叉熵损失(cross-entropy loss)。
进一步的,我们用相似的方法定位了边界框回归(bounding box regression)[7][6]。在k²(C+1)个卷积层,我们附加了一个4k²个卷积层用于边界框回归。Position-sensitive RoI pooling 在4k²的map中表现出来,对于每一个RoI,产生一个4k²位的向量,然后通过平均投票被聚合为一个4维向量。这个4维用 t = (t_x, t_y, t_w, t_h) 参数化一个边框[6]。需要注意的是,为了简单起见我们利用的是类别无关的边界框回归,但是对应的特殊类别也是可以使用的(比如,一个4k²个输出层)。
Position-sensitive score maps 有一部分的灵感来自于实例级的语义分割FCNs[3]。进一步的,我们引入了position-sensitive RoI pooling layer 来统领物体检测得分图的学习。在ROI层之后,没有可学习的层,所以能够进行几乎无代价的区域级计算,从而来加快训练和测试。
训练
在预先计算了region proposals之后,端对端地训练R-FCN结构是非常简单的。接下来[6],我们的损失函数(loss fuction)的定义由两部分组成:交叉熵损失(cross-entropy loss)和边界回归损失(box regression loss):
上式中,C*是RoI的真实标签(C* = 0表示的是背景):
是用于分类的交叉熵损失函数(cross-entropy loss):
L_reg 是边界回归损失函数(bounding box regression loss)如[6]中定义的一样;
t* 表示真实边框。[C*>0]指的是,如果参数为真,则等于1,否则为0;
λ 被初始化设置为1[6]。
当RoI与实际边框的重叠部分至少有0.5的IOU时,那么我们认为是positive examples,否则是negative example。
在训练时,我们的方法采用OHEM(online hard example mining)是非常容易的。每个RoI区域的计算是可忽略的,从而使得样例挖掘(example mining)近乎是cost-free的。假定每张图片有N个proposals,在前向传播时,我们计算所有N个proposals的损失。然后我们对所有ROI按照损失进行排序。然后挑选B个具有最高损失的ROI。Backpropagation[19](反向传播算法)是基于选择的样例来演算的。因为我们的每个ROI的计算都是近似可以忽略的,所以forward time基本上不会受N的影响。而OHEM Fast R-CNN[22]可能是会花费双倍的时间。在下表3中,我们提供了一个详细的时间数据。
我们使用了0.0005的权重衰减系数和0.9的动量。缺省情况下,我们使用单尺度(single-scale)的训练:图片被统一调整为600个像素的大小[6][18]。每个GPU处理1张图片,选取B=128ROI来用于反向传播。我们使用了8个GPU来训练模型(所以有效的小批量(mini-batch)大小是8×)。我们微调了R-FCN,对于20k个mini-batches我们使用了0.001的学习速率;而对于VOC上的10k个mini-batches,我们使用了0.0001的学习速率。为了让R-FCN拥有带RPN的特征,我们采用了4步交替训练[18],在RPN和R-FCN中交替训练。
测试
正如图2所描述的,RPN和R-FCN共享的特征地图(feature maps)在一个单尺度为600的图像上被计算。然后RPN部分选择出了ROI,而R-FCN部分评估了catagogy-wise scores和regresses bounding boxes(针对每一个物体项 的得分)和regresses bounding boxs。在测试阶段,我们评估了300个ROI区域,进行了公平的比较。结果通过non-maximum suppression(NMS)来进行后处理,使用了0.3IoU[7]的阈值,作为标准练习。
多孔算法和步长
我们的全卷积网络架构是在用于语义分割的FCN基础上进行修改的,并享有它的好处。特别的,我们将ResNet-101的stride从32像素减少到16像素,从而增加了得分图分辨率。在conv4[9]之前的所有层(包括conv4)(步长为16)保持不变,在第一个conv5块的stride=2改为stride=1,在conv5阶段的所有的卷积滤波都被“hole algorithm”[2][15]进行修改,用来补偿步长的减小。为了公平起见的比较,RPN是在conv4阶段的顶层(和R-FCN共享)进行计算的。正如在[9]中使用Faster R-CNN一样,所以RPN没有被影响。下表显示的是R-FCN的结果。(KxK=7x7,no hard example mining)trous trick将mAP提高了2.6个点。
可视化
在图 3和图 4中,我们展示了当kxk=3x3时,通过R-FCN学习到的position-sensitive score maps。这些特征图受到物体的具体相对位置的强烈影响。例如:“top-center-sensitive”score map对于那些top-center位置关系的物体显示了较高的分数。如果一个候选框与真实物体精确的重合了(图 3),那么大多数的k²个bins会被强烈的激活,然后会得到较高的分数。相反的,如果候选边框与真实物体并没有完全准确的重合(图 4),那么在ROI里的有一些k^2bins不会被激活,从而导致得分很低。
3 相关工作
R-CNN[7]已经说明了带深度网络的区域候选[27][28]的有效性。R-CNN计算那些关于裁剪不正常的覆盖区域的卷积网络,并且计算在区域直接是不共享的。SPPnet[8],Fast R-CNN[6]和Faster R-CNN[18]是半卷积的(semi-convolutional),在卷积子网络中是计算共享的,在另一个子网络是各自计算独立的区域。
已经有物体检测器可以被认为是全卷积模型。OverFeat [21] 通过在共享的卷积特征图上滑动多尺度窗口来检测目标。同样的,在Fast R-CNN[6]和[12]中,也在研究能取代候选区域的滑动窗口。在这些情况下,可以将单尺度的滑动窗口改造成一个单层的卷积层。在Faster R-CNN中的RPN组件是一个全卷积检测器,用来预测是一个关于多尺寸的参考边框的实际边框。原始的RPN是class-agnostic(class无关的)。但是对应的clss-specific是可应用的,接下来我们会演示的。
另一个用于物体检测的是fc layer(fully-connected)用来基于整幅图片的完整物体检测,如[25][4][17]。
4 实验
4.1 在PASCAL VOC上的实验
我们在PASCAL VOC[5]上进行了实验,PASCAL VOC上有20个物体目录项。我们在VOC2007和VOC2012的联合训练集上进行模型的训练,接下来[6],然后在VOC2007测试集上进行了测试。通过mean Average Precision(mAP)来测量物体检测的精度。
Comparisons with Other Fully Convolutional Strategies.虽然全卷积检测器很容易获取,但是实验证明它的精度非常高。我们使用ResNet-101网络研究了如下几种全卷积(或者近似是卷积的,每个ROI仅含有一个fc层)策略:
Naïve Faster R-CNN. 正如简介里面介绍的,它在ResNet-101中使用所有的卷积层来计算共享的特征图,并且在最后一个卷积层(con5之后)采用了ROI pooling。在每个ROI只有少量21-class fc layer被计算(所以变化的基本上是全卷积层)。a trous trick被用来进行公平的比较。
Class-specific RPN. RPN在[18]中进行训练,其中,2-class(表明是否是物体)卷积分类层被替换为21-class卷积分类层。为了公平的比较,对于class-specific RPN,我们使用了带a trous trick的ResNet-101的conv5 layer。
R-FCN without position-sensitivity. 通过设置K = 1,我们移除了R-FCN的position-sensitivity。这等价于每个ROI中的global pooling。
分析。Table2显示了分析结果。我们注意到,在ResNet[9]的论文中,标准Faster R-CNN达到了76.4%的mAP(见Table3),它是由ResNet-101组成的,并且在conv4和conv5之后添加了ROI pooling layer。作为对比,简单Faster R-CNN(在conv5之后添加了ROI pooling)只有相对较低的68.9%mAP(Table2)。这个对比通过实践证明了,通过在Faster R-CNN的系统中插入ROI pooling layer来获取空间信息的重要性。相似的观点在文献[19]中有提到。
4.2 在MS COCO上的实验
接下来,我们在MS COCO数据集上进行了测试,该数据集拥有80个物体目录项。我们的实验使用了80k 训练集,40k 评估集,20k 测试集。对于90k的迭代,我们使用了0.001的学习率;对于30k的迭代,我们使用了0.0001的学习速率,使用的有效mini-batch的大小是8.我们将训练[18]从4步扩展到5步,当特征共享时,这种调整轻微地提高了精确度。当然,2步训练已经足够提高精度了,但是特征是不共享的。
结果在Table6中展示。我们的尺度R-FCN的基线结果是48.9%/27.6%,和Faster R-CNN的48.4%/27.2%是相近的。但是我们的测试速度比它快了2.5倍。当物体较小时[13],我们的方法表现的效果更好。我们的多尺度R-FCN在评估集上的结果是49.1%/27.8%;在测试集上的结果是51.5%/29.2%。考虑到COCO的物体尺度具有很大的范围,我们进一步估算了多尺度测试[9],使用了{200,400,600,800,1000}等不同尺度。mAP的结果是53.2%/31.5%非常接近。不仅如此,我们的方法更加简单,并且没有添加类似于context或者iterative box regression[9]的东西,并且在训练和测试上更快。
5 总结与展望
我们提出的RFCN是一个简单、精确、有效的用于物体检测的框架。我们的系统很自然的采用了最先进的图片分类框架,就像基于全卷积的ResNets一样。我们的方法比Faster R-CNN更精确,并且在训练和预测上都比它要快。
我们特意使本篇论文中给出的R-FCN看起来简单。其实仍然存在一系列的FCNS的正交扩展用来进行语义分割(如[2]),还有一些基于区域方法的扩展用来进行物体检测(比如[9][1][12])。很高兴我们的系统能够享受到这些成果。
参考文献
最后是我的github地址:https://github.com/huipengzhang,里面有很多深度学习相关的工程和学习资料,感兴趣的朋友可以看下。