论文地址:https://arxiv.org/pdf/1506.01497.pdf
Python官方版本:https://github.com/rbgirshick/py-faster-rcnn
Faster R-CNN源自2016年发表在cs.CV上的论文《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》,使用RPN(建议区域网络)的实时物体检测,Faster R-CNN不仅明显地加快了目标检测速度,在模型精确度方面也有提升。
R-CNN将卷积网络技术应用于目标检测任务之后,明显提高了检测效果,但速度非常慢;之后SPPnets和Fast R-CNN优化了图像特征提取部分,如Fast R-CNN的输入是图片以及备选区域列表,然后计算整张图片的特征,再用池化方法计算每一备选区的特征,替代了R-CNN对每个备选区分别代入网络提取特征,提高了检测速度,减少了资源占用,训练速度提升9倍,预测速度提升213倍;R-CNN和Fast R-CNN主要着眼于改进对备选区的分类和精调,而如何得到备选区列表又成为了检测过程中的下一个瓶颈。
简单地理解,Fast R-CNN改进了怎么看(区域的具体分类和精调区域边框),Faster R-CNN改进了看什么(重点关注图像中哪些区域)。
论文中提出了区域建立网络Region Proposal Network RPN,使用全图的卷积特征计算一个用于检测的网络,同时与Fast R-CNN底层共用卷积特征,最终可建构end-to-end的网络,每张图片计算300个备选区域,最终使检测速度达到实时可用的程度——所有步骤整体用时每秒5帧。
备选区域
获取备选区域最简单的方法是穷举或者使用滑动窗口计算所有可能区域,但这样做产生了太多的冗余区域,且计算成本太高;之前最常用的方法是选择性搜索Selective Search,它是一种基于底层特征合并区域的贪婪算法(合并底层特征相同的区域作为候选区),在CPU上运行,检测每张图需要2秒,EdgeBoxes算法对检测的质量和速度都进行了改进,但是每张图0.2秒的时间仍然较慢。本文中介绍的Faster R-CNN合利地利用了GPU资源,与其它任务共享卷积特征,计算每张图的备选区域仅用0.01秒。
模型结构
FASTER R-CNN分成两部分,第一部分用RPN计算备选区,第二部分用Fast R-CNN计算备选区的具体分类和精调区域边框。
RPN (Region Proposal Networks)
RPN部分将任意大小的图片作为输入,将一系列的备选区域位置作为输出,每一备选区带有相对于各个类别的打分。具体由全连接网络实现,下面是RPN的示意图。
利用滑动窗口从卷积特征中截取nxn(此处n=3,假设卷积层输出包含256个通道)的区域,将这些小区域分别送入供分类cls和回归reg使用的两个全连接层计算最终结果。
Anchors
锚点Anchors是滑动窗口的中心,如上图中的红框是一个Box,其中点就是Anchor,以该Anchor为中心根据不同的尺度和长宽比,可计算k个以它为中心的box,如上图中间部分所示(k默认为9:3种尺度,每种尺度3种长宽比)。每一个box可看作是一个小切片,用分类层cls layer计算box是否属于目标区域,得到两个值(后面详述),用回归层reg layer计算box的四个顶点位置。该方法产生的层输出大小为2k+4k,基于锚点的区域选择方法具有平移不变性。
对于不同尺度和不同的长宽比的图片,最基本的处理方法是缩放图片大小,如下图(a)中所示;更常用的算法是使用金字塔方法计算,它需要多次缩放操作,如图中(b)中所示;本中提出了锚点Anchor的金字塔方法,如下图(c)所示,它只需要使用从单张图片中提取的卷积特征,又无需缩放。
损失函数
在分类方面,论文为每一Anchor设计了两种类别标签(是否属于待识别的分类),阳性标签和阴性标签。阳性包括两种判别方法:Anchor与真实目标框的IoU最大;Anchor与真实目标框IoU大于0.7。这样一个真实目标框可能对应多个Anchor。阴性的判别方法是Anchor与所有目标的IoU都小于0.3。即非阴性也非阳性的锚点无助于训练模型。
具体的损失函数定义如下:
其中i是各个锚点的索引值;p为预测锚点属于某一类别的概率,p为ground-truth(属于该类别为1,否则为0);t为预测的区域位置, t为位置的ground-truth;Lcls是分类的损失函数,使用log loss计算;Lreg是回归的损失函数,使用smooth L1计算(上篇Fast R-CNN中已详述),Lreg前面的p*表示在分类正确时计算回归损失。λ用于均衡分类和回归二者的比例;1/N为标准化项。
回归部分计算方法如下:
其中x,y,w,h分别是矩形框的中心点和宽高,x,xa,x*分别是预测值,锚点值,ground-truch值,可以看到,t值都是基于锚点计算的相对值。回归方法不同于以往基于RoI(感兴趣区域)的方法,之前是使用特征池化提取任意大小的RoI区域特征,学到的参数在各个区域之间共享;而文中方法基于不同尺度和长宽比训练不同的回归参数,k个回归器之间并不共享参数,由于使用了基于锚点的设计,回归模型可以预测各种大小不同的区域。
RPN与Fast R-CNN共享参数
文中讨论了三种RPN与Fast R-CNN结合的方式:
第一种是交叉迭代训练方法,先训练RPN,用RPN提取出的区域训练Fast R-CNN,然后用Fast R-CNN调参后的网络再一次训练RPN……往复迭代。文中的实验主要使用此方法。
第二种是近似的联合训练,它将RPN作为Fast R-CNN的Attention层使用,结合两种损失函数调参。如下图所示:
这种方法也被包含在作者发布的源码之中,训练时间减少了25%-50%。
第三种方法是非近似的联合训练,由于RPN输出的备选框也是输入的函数,备选框又作为Fast R-CNN的输入,理论上说,从Fast R-CNN角度看,上层也应对RPN调参,作者认为应再引入一个RoI warping层,具体方法未在文中详述。
论文中具体使用的方法分为四步:第一步使用预训练的CNN模型,精调训练RPN网络,第二步使用第一步训练出的RPN区域代入Fast R-CNN训练模型,模型用预训练的CNN初始化参数,此时参数还未共享;第三步使用第二步精调后的网络参数训练RPN网络,此时锁住卷积层参数,只对上层参数精调;第四步锁住卷积层参数,用第三步RPN的输出训练Fast R-CNN。以上步骤可迭代进行,但对模型效果提升不大,因此文中只使用了以上四步。
表中列出了训练时具体的Anchors尺寸和比例。
在训练时忽略了跨图边界的锚点(anchor boxes that cross image boundaries),在预测时使用全连接网络处理整张图片,因而会产生一些跨图边界的区域,使用图像边界剪裁。对于备选区域重叠的情况,使用NMS方法去掉冗余区域(IoU阈值设为0.7),这样既不影响模型效果,还减少了可选区域数量,NMS处理之后选取Top-N区域作为传递给Fast R-CNN的备选区域,在训练部分使用了前2000个区域,在预测部分进行了多种测试,在下面的实验部分详述。
实验
下图为在PASCAL VOC 2007数据集中的测试结果:
SS和EB分别是Selective Search和EdgeBoxes 模型的缩写,其上层都使用Fast R-CNN网络,图中的share表示RPN与Fast R-CNN共享卷积层参数,在测试阶段更少的备选区域节约了计算资源。
图中第二部分为消融测试结果,从中可得出一些结论,首先,共享参数的模型效果更好;在使用100个备选区的情况下,由于备选区使用的是排序后的topN个区域,模型效果仍达到了55.1%;另一个极端的测试是使用6000个备选区域,未进行NMS去冗余处理,其得分为55.2%,由此可见,NMS并未影响模型效果。
另外,还尝试去掉了RPN中的分类器(no cls),这样无法计算类别得分和使用NMS只能随机选择一些备选区域,在仅使用100个备选区的情况下,效果明显变差,这说明在RPN部分使用类别打分很重要。去掉对备选区的回归,在只使用锚点区域的情况下,得分也有下降,这说明锚点区域比较粗糙,仍需要进一步精调。在使用表达能力更强的VGG网络后,模型效果也有提升。
从下图表可以看到,使用不同的数据集训练模型,使用VOC 07数据集测试的效果,数据量越大,模型效果越好。
下表展示了使用不同Anchor的对比效果:
下图展示了IoU与召回率的关系,可以看到对IoU要求越严苛,区域的命中率就越低,在300-2000范围内,由于做了排序后保留了topN区域,备选区域数量的减少对RPN影响不大,但在仅使用300个备选区的情况下,其它模型受影响比较严重。
文中使用的是两阶段训练模型,第一阶段用RPN计算可选区域,第二阶段用Fast R-CNN对可选区域打分和调整,那么可否合二为一?作者的实验结果如下:
实验证明两阶段训练明显好于单阶段训练。
网友评论