您的位置:首页 > Web前端

Faster RCNN论文解读

2018-01-18 10:25 651 查看

Faster RCNN论文解读

用了一段时间的Faster RCNN,现写下自己的理解,有不对的地方希望指正。

Faster RCNN是基于RCNNFast RCNN的基础上完成的,建议没有看过前两篇的先去了解一下。

论文首先说明,Fast RCNN如果不考虑region proposals的话它的检测时间接近实时,所以传统region proposal的算法(如Fast RCNN用的Seletive Search)的低效率已经成为了基于region这一类方法用时的瓶颈。同时,即使将传统算法使用GPU进行计算,虽然加快了region proposal的速度,但是由于无法进行参数共享,导致效率并不能得到提升。基于此,论文提出了Region Proposal Networks(RPN),通过共享网络的前几层参数可以和检测器共享计算,不仅减少了region proposal的时间,还增加了准确度。作者提出,RPN就像“注意力”机制一样,可以告诉检测器去哪里检测,如图1。



Region Proposal Networks(RPN):

RPN网络的作用就是输入任意大小的图像(论文中声明的,但是实践证明并不是任意大小,大概图像短边与长边的比例不要低于1/8)进入RPN,输出一系列的矩形框作为region proposal,并且每个矩形框伴随一个得分。由于最终的目标是为了让RPN和检测器的网络共享计算,所以在建立网络的时候,让图像先进行一系列的卷积和池化之后得到特征图,然后再对此特征图通过RPN网络得到region proposals,最终把这些proposals经过检测器检测,得到最终结果。

具体的操作如下(整体算法的结构如图2,以VGG16网络为例):



图像经过VGG16的主体网络卷积池化之后生成特征图feature map,在特征图上使用3x3的窗口进行滑动卷积,生成512维的rpn层(即图3中的intermediate layer),再对rpn层进行两次1x1的卷积,分别生成cls层和reg层(分类层和坐标回归层)。

anchor:

在特征图上进行3x3滑窗卷积的同时会在窗口的中心生成k个anchor(就是矩形框),如图3右边,所以reg层的维度是4k,对应着每个anchor具有4个坐标点;cls层的维度是2k,对应着每个anchor里关于是否有目标的得分。anchor的形状和大小是经过预先设定的,包含两个参数:scale和aspect ratios,论文中默认scale是[8²,16²,32²],aspect ratios是[1:2,1:1,2:1],这样每次滑窗中心就会产生9个anchor,即k=9。假设特征图的长宽是W、H的话,每次就会产生WHk个anchor。



这种方法的使用不仅使anchor和根据anchor产生的proposals具有转移不变形,并且能减少网络模型的体量。通过运用多种长宽比(aspect ratios)多种尺度的anchor,Faster RCNN只需要在单尺度图像上进行计算即可获得多尺度的proposals。

注意:这里的anchor的产生是在特征图上产生的,原始图经过resize到(600,X)或者(1000,Y)大小的时候,假设resize后的图像尺寸为[H,W],再经过VGG主体的4次池化缩小2^4=16倍,这时的特征图大小为[H/16,W/16]。而anchor的参数默认scale是[8²,16²,32²],aspect ratios是[1:2,1:1,2:1],这样就会产生[[5:10,8:8,10:5],[9:18,16:16,18:9],[18:36,32:32,36:18]](这里的数值是四舍五入的结果)这9个不同的anchor,若是映射到resize后的图像上,就是[[80:160,128:128,160:80],[162:324,256:256,324:162],[324:648,512:512,648:324]],可以看出产生的anchor的大小覆盖范围在80~648之间,基本上满足目标检测中的稍微小的目标及以上的检测。

Loss Fuction

在训练RPN的时候,论文指定每个anchor具有一个二元标签表示该anchor是否是目标,只在以下两种情况下指定anchor为正样本,也就是anchor是目标的情况:

1.当anchor与其中一个ground-truth框(即为人工标记的矩形框)具有最高的IoU时;

2.当anchor与任意ground-truth框的IoU高于0.7时。

(IoU:Intersection-over-Union,即两个矩形之间的交集与它们的并集的比例)

注意单个ground-truth框可能会标记多个anchor为正。通常情况下第二个条件已经足够产生合适的正样本了,但是为了防止第二个条件偶尔找不到正样本的情况发生,还是添加了第一个条件。论文把IoU低于0.3的样本赋为负样本(不是目标),其余的既不是正样本也不是负样本的anchor则对训练没有帮助,所以都摒弃了。

RPN的损失函数LRPNLRPN如下:



其中:

i是anchor的序号,

pipi是关于第i个anchor是否是目标的概率,

p∗ipi∗代表真实值groud-truth的标签,如果是1的话代表anchor是正样本,如果是0则是负样本,

titi是一个包含着预测目标边界框的4个坐标值的向量,

t∗iti∗是和其中一个正样本anchor相关的真实值的边界框

式中的分类损失函数LclsLcls是关于两个类别(是目标和不是目标)的log loss,回归损失函数LregLreg使用的是

,其中R()是smooth L1L1如下:



公式中的p∗iLregpi∗Lreg代表回归损失函数只在anchor是正样本的时候才有值(此时p∗ipi∗=1),当anchor是负样本时,p∗ipi∗=0。

λ是用来平衡NclsNcls和NregNreg的权重的参数,在默认情况下,cls项被统一到256,reg项是根据anchor的中心位置个数而定(例如2400)。默认设λ为10,这样cls和reg的权重大致相等。并且实验证明,λ的大小对于训练结果的好坏并不是很重要。

边界框回归

通常情况下,直接根据特征图生成的anchor不准确,需要跟RPN中reg层的坐标预测结合后经过回归才能使用,并且真实值的矩形框坐标也需要跟anchor进行回归。所以,与其说RPN中的reg层预测的数值是4个边界框坐标,不如说是为了其相应的anchor回归到合适坐标的4个参数。

回归的公式如下:



x,y,w,h表示矩形框的中心坐标x、y和它的宽度和高度,

x,xaxa,x∗x∗表示预测框、anchor、真实值框的中心坐标x,其他的y,w,h也是一样的表示。

这个公式可以把anchor回归到接近真实值框的程度,同时经过公式的计算,可以输出任意比例和大小的矩形框,并且其reg层的回归参数值是可以学习的。

以下是回归示例:



绿框是真实值框,红框是anchor框,经过上式的计算,得到蓝框,即为回归的结果。

RPN和Fast RCNN共享特征

RPN的高效率不仅在于它是可学习的预测,更重要的是它可以与Fast RCNN检测器共享特征。文中提及了三种共享特征的方法,其中第一种方法Alternating training是论文测试所主要用的方法,它分四个阶段训练,论文中有详述,感兴趣的同学可以自己看下,这里并不详细解读。

实际上第二种方法(end2end)更加实用,这种方法把网络看成一个整体,端对端训练,不仅减少了25-50%的训练时间,而且结果相比第一种更加出色(实测),所以建议大家使用这种方法进行训练。

其他细节

1.为了训练速度和训练精度的平衡,原始图像进入训练之前需要先进行resize,使图像的短边为600(或者长边为1000);

2.在训练过程产生的anchor中,忽视掉所有的超过图像边界的anchor:如在1000*600的图像中,大概会有20000(60*40*9)个anchor,去除掉超过边界的anchor之后,还剩6000个。论文中提到:若是不去除这些anchor的话,它们会带来大量的、难以纠正的错误,并且导致训练loss难以收敛。而在测试过程中,对于超出边界的anchor并不是删除,而是修剪掉其超过边界的部分

3.RPN得到的大量proposal可能会相互重叠,冗余度较高,论文根据这些proposal的cls得分对其区域采用非极大值抑制(NMS)去除冗余proposal,经过NMS后每张图还剩下大概2000个proposal。经过实验,NMS并不会降低检测的准确度,但是大量减少了无关的proposal。

Faster RCNN的论文的重点是RPN,其他的都是实验,感兴趣的同学可以看一下实验部分。到了这里Faster RCNN论文的主体已经解读完毕,为了算法的完整性,接下来我补充一下RPN之后检测器Fast RCNN的细节。

Fast RCNN

接着看图2,在NMS之后的2000个左右的样本中,选择128个正样本和128个负样本总计256个样本送入Fast RCNN检测器,对每个样本进行RoIpooling,得到7x7的特征图。

RoIPooling

RoIPooling是Fast RCNN所提出来的,目的是使不同大小的proposal池化到一个固定大小(如7x7)的特征图,方便后面统一计算。RoIPooling使用的是最大池化,假设proposal的尺寸是h*w,如果RoIPooling的目标大小是H*W的网格,那么会把proposal分成(h/H)*(w/H)个小窗口,对每个小窗口使用最大值池化,这样每个小窗口最终得到一个值进入H*W网格中,如图:



假设特征图的尺寸是21*14(图左),这样每个小窗口的大小就是3*2,在这每个小窗口中选择其最大值放入7*7的网格中(图右),即为RoIPooling层。

在完成RoIPooling之后,再经过两个全连接层(带dropout)后分成两个方向:一个使用softmax层输出类别的预测得分,另一个使用全连接层输出该预测的矩形框的四个坐标点。

损失函数

Fast RCNN的损失函数LRCNNLRCNN也包括两个,如下:



其中,

是关于正确分类u的log方式的损失函数,当u=1时,第二个损失函数LlocLloc才会有作用。

第二个损失函数LlocLloc中,v=(vx,vy,vw,vh)v=(vx,vy,vw,vh)是真实矩形框的参数,tu=(tux,tuy,tuw,tuh)tu=(txu,tyu,twu,thu)则是预测值。LlocLloc的损失函数定义如下:



λ和上述RPN中的λ具有一样的平衡作用,这里默认λ=1。

所以,总的损失函数Loss = LRPN+LRCNNLRPN+LRCNN

至此,Faster RCNN算法已经完全讲解完毕,希望对大家有帮助,对于不足的地方欢迎大家指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息