论文链接:https://arxiv.org/abs/1506.01497
作者:Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun
发布时间: 2015 2015 年 6 6 月发布, 2016 2016 年 1 1 月月最后修改
之前最先进的目标检测模型如Fast RCNN和SPPnet都受限于候选区域的计算,导致不能实现实时检测。在本论文中,作者引入了Region Proposal Network(RPN)模块,通过分享整张图片的卷积特征,从而基本不耗时间地提取候选区域。
RPN 网络是一个全卷积网络(FCN),其能够在每个位置同时预测对象边框以及给对象打分。训练RPN产生网络端对端的候选区域,用以提供给Fast RCNN检测。作者通过共享RPN模块和Fast RCNN模块的卷积特征来把它们结合成一个网络,就像最近很流行的神经网络术语“注意力机制”所说的那样,这个RPN模块将会告诉我们要“看”哪儿。
通过RPN,每张图片只需要 提供300个候选区域【对比Fast RCNN的每张图片2000张候选区域】。
其他方法
区域候选(Region Proposal)方法通常是依赖于低级和浅层的特征的推理方案。
选择性搜索(Selective Search)方法是工程化低级特征的贪婪算法(超像素级,也就是像素的集合),其是基于CPU运算的,每张图片大概需要 2s 2 s 时间。边缘箱(Edge boxes)是2014年(Locating object proposals from Edges)提出的方法,是候选区域质量和速度的折中,每张图片大概需要 0.2s 0.2 s 时间。然而,这花费的时间也和网络检测的时间一样。
本文
RPNs是从数据中学习候选区域的,所以该网络模型可以提取深层的、“昂贵”的特征。
本论文提出了一种使用GPU运算的,基本不花费时间于候选区域的检测网络(大概每张图片 10ms 10 m s ):用一个深层卷积网络计算候选区域。也就是后面会提到的RPN网络,其与最先进的检测网络(Fast RCNN)共享卷积层。作者认为,基于区域的探测器(region-based detectors)【该探测器应该就是一般的卷积神经网络锁需要的卷积核】也可以用于生成候选区域【提取共性特征的卷积层得到的feather maps也可以用于RPN中】。在卷积特征之前添加一些额外的卷积层用于构建RPN,这些卷积层会同时在一些常规网格中进行边框回归和分类。
RPN用于预测候选区域,因此作者引入了一种anchor boxes的定义,该定义大概就是RPN预测出来的不同尺度和长宽比的区域边框。该方法的提出,可以避免使用不同尺度和长宽比的过滤器或枚举图片。
Faster RCNN的结构如上图所示,其可以分成两个模块,四个层次:
两个模块:
四个层次:
可以看出,Faster RCNN和Fast RCNN的区别仅在于提取候选区域的方式不同而已。
Region Proposal Network
RPN是一个全卷积神经网络,所以可以接收任何大小的输入,其输出是一系列矩形的区域建议,并且每一个区域都有一个对象分数。
需要注意的是,RPN的输入是和Fast RCNN共享的卷积层,文中用了两种网络(ZF,VGG-16)作为Fast RCNN的基础,在经过通用的卷积层提取特征后,这两种网络的feature maps的channel的维度分别为 256和512 256 和 512 ,feature maps的每一个“网格点”的感受野大小分别为 171和228 171 和 228 。
如下图所示,RPN先用 3∗3 3 ∗ 3 的卷积核处理输入的层,以提取区域建议的信息;再分别用 1∗1∗256∗18(9∗2) 1 ∗ 1 ∗ 256 ∗ 18 ( 9 ∗ 2 ) 【文中的k设置为9】和 1∗1∗256∗36(9∗4) 1 ∗ 1 ∗ 256 ∗ 36 ( 9 ∗ 4 ) 的卷积核计算每个“网格点”的anchor分类和anchor回归。【每个“网格点”都有不小的感受野,换句话说就是拥有原图一定大小的信息,不同channels的网格点是不同特征信息,但对应的是同一个区域。这个 1∗1 1 ∗ 1 的卷积核用于区分前背景,只是前序步骤,后面还有计算概率的步骤;回归步骤是计算anchor(实现定义的不同大小的,但中心点一样的方框)的回归;计算分类和回归是为了提取不同大小的proposals】【至于如何从概率和回归提取proposals,而且不经过映射计算的(文中说用GPU提取的),我也不太清楚,后面撸源码回来解决】
Anchors
卷积核遍历的每个位置都是同时预测了多个区域提议,这个区域提议的最大个数设置为 k k 。因此回归层有与 k k 个边框相对应的 4k 4 k 个输出,分类层有预测前景和背景的 k k 个输出,这k个推测边框我们叫做anchors。anchor在每个滑动区域的中心,每个anchor的尺寸和长宽比都不同。(文中默认 3 3 个尺寸, 3 3 个长宽比,因此每个位置有 9 9 个anchor)。对于尺寸为 W∗H W ∗ H 的feature maps(一般约 2400 2400 ),有 W∗H∗k W ∗ H ∗ k 个anchor。
Loss Function
对于每一个anchor,RPN都给他标记( 正类是有对象,负类是没有对象)。这里设定两种类为正类:⑴ 与其中一个ground-truth box有最高IoU的anchor(s)。⑵ 和任意ground-truth box有高于0.7IoU的anchor(s)【 一般来说第二点就够了,但为了防止有的区域在第二点面前不能标记为正类,比如所有anchor和ground-truth都小于 0.7 0.7 】。作者将和所有ground-truth boxes都IoU低于0.3的样本标记为负样本,只有正、负样本才对训练起作用。【 就是使用硬负样本,大概意思就是使用质量更好的样本】
至于代价函数,其定义与Fast RCNN的多任务损失函数基本一样,只不过多尝试了些系数以正规化比例,但影响并不大( 就是基本不需要,可以简化成Fast RCNN的公式)。
在SPPnet和Fast RCNN中的边框回归都是用于任意尺寸的proposal上的,而回归的权重对于所有尺寸都是共享的【 不同尺寸的proposal通过RoI池化层后有相同大小的特征向量】,只是对不同分类进行单独的边框回归。而在RPN中的边框回归是作用于相同尺寸的区域( 有 k k 种固定的,实现设计好尺寸和长宽比的anchor作用于原图,即有 k k 种固定大小的区域(anchor随着卷积层操作后的映射)作用于特征图),因此对于每一种尺寸和长宽比的边框都进行一种边框回归。这 k k 种回归并不共享参数,因而实现固定好大小和比例的anchor也能预测不同大小的proposal【经过RPN网络的边框回归能产生不同大小和比例的proposal,然后输入RoI层,进入正常的Fast RCNN操作】。
训练RPNs
RPN可以使用SGD优化算法反向传播端对端训练。每个mini-batch提取的区域都来自同一张图片,其中有很多anchor样本。训练的时候当然可以使用全部anchor样本,但这样会导致模型偏向负样本,因为负样本占绝大数。所以提取样本的策略为从一张图片随机选取256个样本,其中正负样本个数都为128。(如果正样本数不足128,则用负样本补充)
在RPN的“新层”中的初始化使用 0 0 均值 、 0.01 0.01 标准差的高斯分布中抽取参数;在其他层(就是原本Fast RCNN的那些层,比如和RPN共享的卷积层即之后的全连接层)使用ImageNet分类的预训练模型(如ZFnet和VGGnet)。前 60k 60 k 的 mini−batches m i n i − b a t c h e s 的模型学习率为 0.001 0.001 ,接下来的 20k 20 k 的 mini−batches m i n i − b a t c h e s 的模型学习率为 0.0001 0.0001 【训练的数据集为PASCAL VOC】。模型的优化算法为动量梯度下降,其动量为 0.9 0.9 ,权重衰减为 0.0005 0.0005 。
RPN和Fast RCNN的共享特征
我们的模型是将RPN和Fast RCNN结合起来形成的统一模型,所以我们需要一个学习算法来学习这个统一的网络。我们有三种学习统一模型共享特征的方式:
非近似联合训练:即联合训练,和上面的近似联合训练不同的是,该方法不将proposal作为固定的输入,而是将其作为原始输入的函数,使得RoI的误差可以通过proposal的bbox信息完成反向传播。【该方法可以在论文(Instance-aware semantic segmentation via multi-task network cascades)中学习】
最终,网络的训练方法可以被称为 4 4 步训练方法(使用交替方法来学习共享特征)。
学习RPN,作为学习区域提取任务的端对端模型训练。训练完后,提取proposal并存储起来(该网络像之前说的那样用ImageNet预训练网络初始化)
之所以说四步训练,是因为文中表示该模型只需要迭代这么四步(两次分别训练),再往后的迭代带来的改进基本可以忽略了。
训练细节
输入预处理,将输入统一缩放成 (1000,600) ( 1000 , 600 ) 大小。(多尺度特征提取可能可以提到准确率,但不能很好地折中速度和准确率)。文中使用的模型(ZFnet,VGGnet)的共享卷积之后,感受野(也就是stride的乘积)为 16 16 ,也就是说对于 (1000,600) ( 1000 , 600 ) 的图像在经过卷积层后,其每个像素点代表之前 16 16 个像素点的信息,这对于PASCAL VOC的图像(一般约 (500,375) ( 500 , 375 ) 大小)对应的就是原图像的 10 10 个像素点( 600/375∗10=16 600 / 375 ∗ 10 = 16 )。【步幅乘积这么大都能提供好的结果,使用更小的步幅可能能得到更好的结果,但不是本文要讨论的内容】
anchors选择,选定anchors为三个尺度 {1282,2562,5122} { 128 2 , 256 2 , 512 2 } 和三个长宽比 {1:1,1:2,2:1} { 1 : 1 , 1 : 2 , 2 : 1 } 的卷积,共九个。(这些anchors没有特意为了某数据集精心设计,按照结果来说,应该是没有必要调整,其三个边框的大小基本可以覆盖了整张图片)。
anchors筛选,⑴ 在训练时,作者把所有越过“边界”的anchors都忽略了(对于 1000∗600 1000 ∗ 600 的图片,其大概有 20000 20000 个anchors (1000/16∗600/16∗9=21093) ( 1000 / 16 ∗ 600 / 16 ∗ 9 = 21093 ) 。删去越过边界的,大概还剩下 6000 6000 个。)。若不删掉这些过界的anchors,那么RPN将会推荐较大的,相对比较错误的区域,同时训练也不会收敛。⑵ 在测试时,作者却留下这些过界的anchors,在整张图片上卷积,只需要将其产生的越过边界的proposals裁剪成符合图片边界的区域。
proposals筛选,经过RPN提取的proposals有很高的重叠率,对其进行非最大值抑制以删除重叠率较高的框。本文设置NMS的IoU为 0.7 0.7 。经过非最大值抑制后,每张图片大概能剩下2000个区域。然后选取Top-N的区域用于检测。在训练的时候,选取 2000 2000 个区域;但在测试时,区域选取的数目又不同。
为什么不直接使用RPN输出的bbox呢?
RPN的回归是对anchors提取的proposals的回归,是作用于固定尺度,且anchor之间相对变化较小的。而后面Fast RCNN的回归则是对对象的回归。这两个回归的分工不同,所以RPN回归的输出是anchor的个数,Fast RCNN回归的输出是class的个数。
anchors是在feature maps上还是在data_input上?
在RPN分类和回归层之前的卷积层,其上每一点都是 3∗3 3 ∗ 3 卷积核中心点的直接对应,而 3∗3 3 ∗ 3 卷积核中心点对应输入图像(经过re-scale后的图片, 1000∗600 1000 ∗ 600 )上的位置(点)就是我们所说的anchors的中心点。【所以在判断类别的时候,会需要输入一个im_info信息,提供的是步长的积,这里是 16 16 】