Faster RCNN论文笔记

 个人博客:http://www.chenjianqu.com/

原文链接:http://www.chenjianqu.com/show-76.html

 论文:Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

素质三连

1.论文贡献

提出RPN网络用于候选区域生成。

将RPN与Fast RCNN融合成目标检测的端对端网络,称为Faster RCNN

2.实验结果   

检测速度达到5fps,在VOC 2007,2012和MS COCO数据集上达到sota

在ILSVRC和COCO 2015比赛中获得冠军

3.存在的问题

速度还可以更快。

模型提出

    RCNN的运行速度是很慢的,因为它需要对逐个对proposal提取特征,这导致检测一张图片可能需要花费几十秒。SPP-net的出现,令各个proposal的特征提取共享计算,使得检测速度大大提升,但是它和RCNN一样都需要分阶段训练。而Fast RCNN将回归器、分类器、特征提取器融合在一起,不仅模型可以单阶段训练,而且检测速度和精度都得到提升。但在模型中,检测过程都不是端对端的,它们都使用独立的区域推荐(region proposal)算法,比如SS或EdgeBox,这些算法的运行速度都较慢(SS一张图片在CPU上需要2s,EdgeBoxes也需要0.2s),区域推荐算法成为目标检测速度的瓶颈。

    本文提出一种基于CNN的区域推荐算法,称为Region Proposal Networks(RPNs)。通过共享卷积层,RPN的计算花费很小。在用于提取特征的卷积神经网络的顶端,通过增加额外的卷积层构造RPN(因此RPN是一种FCN),用于同时回归每个位置的候选框和置信度。作者提出”anchor”的概念,即每个输入位置得到未回归之前的矩形框。

    将RPNs和Fast RCNN统一起来得到Faster RCNN,这里提出了一种训练Faster RCNN的方法:在保持目标检测方案不变的情况下,对候选框生成方案进行微调,然后对目标检测进行微调。

    模型在VOC数据集上进行评估,结果显示RPNs+Fast RCNNs精度高于SS+Fast RCNNs,同时RPNs的运行所需时间只需要10ms,而SS则需要1s以上。在使用VGG作为特征提取器的情况下,RPNs+Fast RCNNs仍在可以达到5fps的速度,这使得实时目标检测成为可能。

    在ILSVRC和COCO 2015比赛中,Faster RCNN和RPN都是第一名网络的基础。代码开源:

    https://github.com/shaoqingren/faster_rcnn (in MATLAB) 

    https://github.com/rbgirshick/py-faster-rcnn (in Python).

    

相关工作

    SSOverFeatRCNNSPP-netFast RCNN

Faster RCNN

    Faster RCNN的架构如下图:

a.jpg

    下面是具体的网络结构图:

1.jpg

RPN

    理论上RPN接收图片作为输入,输出为一组矩形候选框,但是为了减小计算量,RPN可以和Fast RCNN共享特征提取的计算,因此实际上RPN接收特征图作为输入。为了产生候选框,可以在特征图上滑动一个小网络,这个小网络的输入是nxn(如3x3)滑动窗口,输出是特征向量(如256d)。这个特征向量随后被喂入两个FC层:回归器(reg)分类器(cls)。这里使用n=3,对应的感受野是很大的(对应到原始图片上ZF是171,VGG是228)。

    对上面说的每个滑动窗口,预测k个region proposals,所以reg有4k个输出,每个region proposal由4个实数标记边界,cls有2k个输出,代表每个region proposal是目标还是背景的置信度。每个候选框称为anchor,每个滑动窗口有3个尺度、3个长宽比的anchors,即每个滑动窗口有k=9个anchor。对于宽高为WxH的特征图,总共产生WHk个anchors。如是下图是一个位置的anchor:

3.jpg

    一张图片上的所有的anchor:

b.jpg

    分类器(cls)的作用:判断各个anchor是positive还是negative,判断方法在后面。

    回归器(reg)的作用:对每个positive anchor,修正其大小和比例(长宽比),输出更加准确的proposal,具体后面有。

    RPN如下图左边:

c.jpg

    这个小网络自然地可以使用3x3卷积实现,而FC层则可以使用1x1卷积实现。那么RPN的具体结构如下:

2.jpg

    这里解释一下上面的结构:特征图作为输入,首先进行3x3卷积得到每个位置上的特征向量,这些特征向量仍然组成一个特征图。接下来有两个分支,下面的分支是回归器(reg),上面的分支是分类器(cls)。两个分支都进行1x1卷积,1x1卷积的作用[NIN]。分类器1x1卷积输出的通道数是2k=18。回归器1x1卷积通道数是4k=36。之所以后面接一个reshape是因为Faster RCNN在Caffe实现机制的原因。还可以看到有一个im_info输入,这是要输入图片的宽高,去掉超出图片范围的proposal。

    所以RPN的过程就是,在对每个位置都生成几个anchor,然后分类器判断哪些anchor是有目标的,对于有目标的anchor,对其进行回归,得到更加精确的proposal。

平移不变性

    RPN的有一个重要特性是平移不变性:如果图片中的目标位置改变,那么RPN也能生成正确的proposal。相比之下,MultiBox方法的使用k-means产生800个anchors却不具有平移不变性。

    平移不变性可以减小网络,MultiBox有(4+1)x800维的FC输出层,而k为9时,RPN只有(4+2)x9维(4是reg输出,2是cls输出,9是每个滑动窗口的anchor数)的卷积输出层(1x1卷积)。使用VGG-16的RPN输出层只有512x(4+2)x9=2.8x10^4(512是每个滑动窗口的输出特征向量长度)的参数,而使用GoogLeNet的MultiBox的输出层有1536x(4+1)x800=6.1x10^6参数。如果考虑特征投射层,则参数相差的更多。而更少的参数意味着更低风险的过拟合。

多尺度Anchors

下图是解决多尺度问题的几个方案:

djpg.jpg

(a)是基于图片/特征图金字塔解决多尺度问题,比如Fast RCNN和SPPNet中使用到,这种方法的计算量较大。

(b)是使用多尺度/多比例的滑动窗口,比如DPM,也可以看作卷积核金字塔。该方法通常与(a)方法联合使用。

(c)是RPN提出了解决多尺度问题的另一种方案:推荐区域金字塔。这也是anchor的金字塔,每个滑动窗口生成多尺度/多比例的anchor。这种方法的效率更高。由于多尺度Anchor的使用,使得输入图片可以使用单尺度。

损失函数

Anchor的标签

    为了训练RPN,需要给每个anchor一个binary class label,表示该anchor是否为一个目标。

    Positive label:(i)和ground-truth box的IoU最高的anchor,(ii)和ground-truth box的IoU大于0.7的anchor。注意一个ground-truth box可能对应几个positive anchor。通常第二种情况就可以满足需求,但偶尔也需要第一种。

    Negative label:和ground-truth box的IoU小于0.3的anchor。

    其他的Anchor do not contribute to the training objective。

回归器的输出

    回归器的输出是表示一个bounding box的4个参数tx,ty,tw,th的意义如下:

e.jpg

    其中x,y是候选框的中心点的坐标,w,h是其宽和高。x、xa、x*分别表示predicted box、anchor box、ground-truth box的边。这可以看作从anchor box到ground-truth box的bounding-box回归。至于为什么是这个公式,可以参考[https://zhuanlan.zhihu.com/p/31426458]

    Faster RCNN中边框回归的方法不同于Fast RCNN和SPP-Net,在后两者中,对任意大小的RoI得到固定长度的特征,然后将特征喂入回归器得到bounding box,回归器的权重被所有RoI共享。而在RPN中,使用1x1卷积实现回归器,这意味着每个位置使用的权重是不一样的。而且每个尺度和长宽比使用的回归器也不同,即每个位置有k个回归器。

损失函数

    和Fast RCNN类似,使用multi-task loss,损失函数计算如下:

f.jpg

    式中的i是mini-batch中anchor的索引,pi是anchor i的置信度。若anchor i是Positive时,ground-truth label pi*是1,否则pi*是0。ti是有4个参数的向量,这四个参数代表预测的bounding box的边界,ti*是ground-truth box。

    式中的分类损失是log loss。回归损失的Lreg(ti,ti*)=R(ti-ti*),R是鲁棒的损失函数smooth L1,pi*Lreg(ti,ti*)表示当anchor为positive时,pi*=1,该项才有用。Smooth L1公式如下:

g.jpg

    公式(1)中的两项损失都使用Ncls和Nreg进行归一化,并使用超参数lambda平衡两个损失。在作者的实现中,Ncls等于mini-batch的大小,Nreg等于anchor的数量,比较好的lambda=10,这样两个损失才大概相等,但实验显示结果对模型lambda值不敏感,实验结果还显示上述的归一化不是必需的,可以简化。

RPN训练参数

    RPN端对端的使用反向传播和SGD进行训练。训练采样和Fast RCNN一样使用“image-centric”,即每个mini-batch由单张图片得到的positive anchors和negative anchor。mini-batch的大小为256,其中随机采样正负样本的比率为1:1,如果正样本的数量少于128,则用负样本补上。

    新的层的权重初始化:高斯分布,均值为0,方差为0.01。特征提取层的权重是在ImageNet预训练的,架构从ZF net到VGG net。学习率:前60k为0.001,后20k为0.0001。使用0.9的动量,权重衰减为0.0005。数据集:PASCAL VOC。框架:Caffe

RPN和Fast RCNN的训练

    Faster RCNN由RPN和Fast RCNN组成,如下:

a.jpg

    Fast RCNN和RPN可以独立训练,但是这两个网络需要共享特征提取层,下面是三种令两个网络共享conv layers的方法:

    (i)Alternating training。使用在ImageNet上预训练的参数初始化特征提取器,然后使用预训练权重训练RPN,再使用RPN生成proposals和使用预训练权重训练Fast RCNN,然后Fast RCNN微调后的权重再用来初始化RPN,迭代这个过程。本论文中的所有实验就是使用的这个方法。

    (ii)Approximate joint training。像Figure 2一样,将RPN和Fast RCNN合并为一个网络。前向传播时,使用RPN产生的proposals训练Fast RCNN,反向传播时,特征提取层使用的loss来自RPN loss和Fast RCNN loss的联合。这个方法很容易实现,但是这种方法会忽略掉边界的梯度,所以它是近似的。这个方法能产生接近结果,而且训练时间比(i)要少25-50%.

    (iii)Non-approximate joint training。上面说了RPN预测的bounding box也是Fast RCNN的输入,所以理论上反向传播使用到bounding box边界的梯度应该是有用的。但是在(ii)中,这些梯度被无视了。因此该方法中,需要一个RoI池化层使得box的边界可微。这是一个nontrivial problem,可以使用RoI warping解决这个问题[论文:Instance-aware semantic segmentation via multi-task network cascades]

4步Alternating Training

    通过4步对Faster RCNN进行训练。

    第一步,像3.1.3描述的那样使用训练RPN,特征提取器使用预训练权重进行初始化,端对端进行fine-tune。

    第二步,使用RPN生成的proposal训练Fast RCNN,特征提取器同样使用预训练权重。关于Fast RCNN的训练和其它细节,可参阅我的上一篇阅读笔记[]

    第一步和第二步都还没共享特征提取器。

    第三步,训练RPN,特征提取器使用Fast RCNN的权重,但是冻结特征提取器权重,只微调RPN层。

    现在两个网络共享特征提取器。

    最后一步,冻结特征提取器的权重,微调Fast RCNN。由此,两个网络共享特征提取器并且组成一个单一网络。上面这个过程可以迭代进行,但是提升不大。

    训练的流程图如下:

5.jpg

实现细节

    Faster RCNN:

1.jpg

    在RPN得到proposal之后,应用到RoI pooling,得到特征向量喂入bounding box回归器和分类器,即可得到每个proposal的置信度。

    Faster RCNN在单尺度上训练和测试模型,该尺度为:短边s=600。多尺度或许可以提高模型的精度,但是运行速度会下降。当s=600时,无论是使用ZF net还是VGG net,最后一层特征图相邻像素的stride=10。即使这样,检测精度仍然很高。因此如果减小stride,精度会得到提升。

    RPN使用3种尺度的Anchor:128^2 256^2 512^2,以及3中比例:1:1 1:2 2:1。这个超参数不用那么谨慎,它对结果影响不大。Figure 3(right)显示Faster RCNN能检测的范围和长宽比是很大的。下表显示在使用ZF net的情况下每个anchor学到的平均proposal大小。

h.jpg

    上图表明RPN可以预测比该anchor的感受野更大的bounding box,只看到物体的一部分而预测整个物体的范围,这是可能的。对于超出图片范围的bounding box,则无视该anchor。对于一个1000x600的图片,大概有20000 (60x40x9)个anchors。除去超出范围的anchor,还有大概6000个anchors。如果使用超出范围的anchor进行训练,则会引入大的,很难取修正的误差项,从而导致训练不收敛。测试时,对于超出范围的anchor,把超出的部分切掉。

    在RPN的最后应用NMS,IoU阈值为0.7。RPN最后只剩下2000个proposal,最后根据分数输出top-N个proposal给Fast RCNN。

实验

在PASCAL VOC上实验

    在VOC 2007和VOC 2012上进行实验,使用的预训练模型为ZF-net的’fast’版本和VGG-16。下表的上半部分显示不同region proposal和不同ConvNets得到的结果:

i.jpg

    观察上表发现,RPN+Fast RCNN训练和测试可以达到59.9%的mAP,高于其它方案。这表明RPN和Fast RCNN共享参数的表现最好。

RPN的消融实验

    Table 2的下半部分是RPN的消融实验。

VGG-16的性能

    下表使用VGG-16在不同region proposal和数据集上的结果:

j.jpg

k.jpg

    结果表明数据越多,Faster RCNN表现越好,表现最好的是COCO+07+12训练得到的模型,达到了SOTA,较之Fast RCNN大幅提升。更详细的结果如下:

l.jpg

m.jpg

sjpg.jpg

各方法运行时间比较:

n.jpg

    对每张图片SS大概需要1-2s的时间,平均为1.5s。Fast RCNN with VGG-16需要花费320ms在2000个proposal上,使用SVD分解的话需要223ms。相比之下,Faster RCNN所需的时间少的多。

超参数的敏感性

    下表显示Anchor超参数对mAP的影响:

o.jpg

    下表显示等式1中的lambda值对mAP的影响:

p.jpg

    从上面可以看到,模型对超参数并不十分敏感。

Recall-to-IoU的影响

q.jpg

r.jpg

在MS COCO上实验

x1.jpg

x2.jpg

x3.jpg

参考文献

[0]Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun.Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

[1]白裳.一文读懂Faster RCNN.https://zhuanlan.zhihu.com/p/31426458.2019-12-23

发布了74 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37394634/article/details/103976630