个人博客: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).

相关工作

SS, OverFeat, RCNN, SPP-net, Fast RCNN

Faster RCNN

Faster RCNN的架构如下图:

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

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:

一张图片上的所有的anchor:

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

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

RPN如下图左边:

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

这里解释一下上面的结构:特征图作为输入,首先进行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

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

(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的意义如下:

其中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,损失函数计算如下:

式中的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公式如下:

公式(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组成,如下:

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。由此,两个网络共享特征提取器并且组成一个单一网络。上面这个过程可以迭代进行,但是提升不大。

训练的流程图如下:

实现细节

Faster RCNN:

在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大小。

上图表明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得到的结果:

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

RPN的消融实验

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

VGG-16的性能

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

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

各方法运行时间比较:

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

超参数的敏感性

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

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

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

Recall-to-IoU的影响

在MS COCO上实验

参考文献

[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

最详细的Faster RCNN论文笔记相关推荐

  1. Faster R-CNN论文笔记——FR

    转载自:http://blog.csdn.net/qq_17448289/article/details/52871461 在介绍Faster R-CNN之前,先来介绍一些前验知识,为Faster R ...

  2. 最详细的Mask R-CNN论文笔记

    个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-111.html 论文:Kaiming He Georgia G ...

  3. Faster R-CNN 论文笔记

    论文地址:https://arxiv.org/abs/1506.01497 Fast R-CNN提出后,降低目标检测时间的主要瓶颈就来到了待选区域的计算上,于是诞生了Faster R-CNN.作者提出 ...

  4. 何恺明大神巨作:Faster R-CNN 论文笔记

    视频链接:https://www.bilibili.com/video/BV1j5411e7aH/ 何恺明大神奠基Two-stage目标检测算法的一篇巨作. 1.看abstract时候的问题(看其他部 ...

  5. 最详细的Fast RCNN论文笔记

    个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-75.html 论文:Ross Girshick.Fast R- ...

  6. (目标检测)Faster R-CNN 论文解读+复现

    Faster R-CNN xyang 声明:本篇文章借用了他人理解,如有侵权,请联系,另如需转载,请注明出处 关于最新最全的目标检测论文,可以查看awesome-object-detection &l ...

  7. faster rcnn论文_【论文解读】精读Faster RCNN

    Faster R-CNN论文链接: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 推荐代 ...

  8. 【Faster R-CNN论文精度系列】从Faster R-CNN源码中,我们“学习”到了什么?

    [Faster R-CNN论文精度系列] (如下为建议阅读顺序) 1[Faster R-CNN论文精度系列]从Faster R-CNN源码中,我们"学习"到了什么? 2[Faste ...

  9. Faster R-CNN论文翻译笔记

    百度网盘论文链接,提取码:kk89 https://pan.baidu.com/s/12RDu3WLgH5WcV_Mo3q02xg 或者去arxiv下载<Faster R-CNN: Toward ...

最新文章

  1. 学了python能干啥-python都可以做什么用
  2. Python的字符串
  3. html请求接口_前端工程师吐后端工程师(第八讲)——接口的开发
  4. Kafka关键参数设置
  5. linux fedora35 buff/cache 占用过高解决方法(适用于大部分linux)
  6. (王道408考研操作系统)第三章内存管理-第二节2:请求分页管理方式
  7. Kotlin学习笔记 第四章 Java调用Kotlin
  8. SDOI 2009 BIll的挑战
  9. FFmpeg源代码简单分析:libswscale的sws_getContext()
  10. 如何解决注塑成型中的毛边问题?
  11. 微信H5支付浏览器支付
  12. hiberfil.sys是什么文件?可以删除吗?
  13. 现代软件工程 第九章 【项目经理】练习与讨论
  14. 正态分布的由来及推导
  15. This probably means that Tcl wasn‘t installed properly
  16. ios3怎么取消长按弹出菜单_ios13长按多功能怎么关闭-手机数据恢复精灵
  17. SpannableStringBuilder: SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length关于edittext找不到输入值这个
  18. 华为数字化转型之道 实践篇 第六章 数字化重构业务运作模式
  19. 黑客安全专家郭盛华:逃避僵尸网络恶意软件攻击的13种方法
  20. 社交网络中基于位置的影响力最大化 CIKM2015 译文

热门文章

  1. php隐藏api,PHP 在 Laravel 中动态隐藏 API 字段
  2. grafana的+按钮_基于 Prometheus、Grafana 的 EMQ X 物联网 MQTT 服务器可视化运维监控...
  3. 在html5中能使用dom么,html5 – 如何在TypeScript中使用DOMStringMap?
  4. c语言作业题整理,C语言考试模拟练习题
  5. 2021年肇庆高考成绩查询,2021年肇庆高中学校排名及录取分数线排名
  6. Linux中errno的含义
  7. 欧拉回路基本概念+判断+求解
  8. 微信 小程序布局 scroll-view
  9. cogs 167. [USACO Mar07] 月度花费
  10. 使用过滤器解决SQL注入和跨站点脚本编制