论文原文:https://arxiv.org/pdf/1506.01497.pdf

项目代码在论文中有地址

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

作者:Shaoqing Ren, Kaiming He, Ross Girshick, Jian Sun

摘要

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>目前最先进的目标检测网络需要先用区域建议算法推测目标位置,像SPPnet[1]和Fast R-CNN[2]这些网络已经减少了检测网络的运行时间,这时计算区域建议就成了瓶颈问题。本文中,我们介绍一种区域建议网络(Region Proposal Network, RPN),它和检测网络共享全图的卷积特征,使得区域建议几乎不花时间。RPN是一个全卷积网络,在每个位置同时预测目标边界和objectness得分。RPN是端到端训练的,生成高质量区域建议框,用于Fast R-CNN来检测。通过一种简单的交替运行优化方法,RPN和Fast R-CNN可以在训练时共享卷积特征。对于非常深的VGG-16模型[3],我们的检测系统在GPU上的帧率为5fps(包含所有步骤),在PASCAL VOC 2007和PASCAL VOC 2012上实现了最高的目标检测准确率(2007是73.2%mAP,2012是70.4%mAP),每个图像用了300个建议框。

Introduction 介绍

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>最近在目标检测中取得的进步都是由区域建议方法(例如[4])和基于区域的卷积神经网络(R-CNN)[5]取得的成功来推动的。基于区域的CNN在[6]中刚提出时在计算上消耗很大,幸好后来这个消耗通过建议框之间共享卷积[1],[2]大大降低了。最近的Fast R-CNN[2]用非常深的网络[19]实现了近实时检测的速率,注意它忽略了生成区域建议框的时间。现在,建议框是最先进的检测系统中的计算瓶颈。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>区域建议方法典型地依赖于消耗小的特征和经济的获取方案。选择性搜索(Selective Search, SS)是最流行的方法之一,它基于设计好的低级特征贪心地融合超级像素。与高效检测网络[2]相比,SS要慢一个数量级,CPU中大约每个图像2s。EdgeBoxes[6]在建议框质量和速度之间做出了目前最好的权衡,大约每个图像0.2s。但无论如何,区域建议步骤花费了和检测网络差不多的时间。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>Fast R-CNN利用了GPU,而区域建议方法是在CPU上实现的,这个运行时间的比较是不公平的。一种明显提速生成建议框的方法是在GPU上实现它,这是一种工程上很有效的解决方案,但这个方法忽略了其后的检测网络,因而也错失了共享计算的重要机会。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>本文中,我们改变了算法——用深度网络计算建议框——这是一种简洁有效的解决方案,建议框计算几乎不会给检测网络的计算带来消耗。为了这个目的,我们介绍新颖的区域建议网络(Region Proposal Networks, RPN),它与最先进的目标检测网络[1],[2]共享卷积层。在测试时,通过共享卷积,计算建议框的边际成本是很小的(例如每个图像10ms)。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>我们观察到像Fast R-CNN这样的基于区域的检测器使用的卷积特征图也可以用来生成推荐区域。在这些卷积层的特征之上,我们通过添加一些额外的卷积网络引入一个RPN,可以和回归约束框、物体打分相并列。RPN是一种完全卷积网络(FCN),可以为特定任务进行端到端的训练来产生检测推荐。

一下理解摘抄自:https://www.jianshu.com/p/656343761fd5
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>这张图展示了利用”Anchor”机制来生成候选区域,候选区域生成最简单粗暴的方法就是用多尺度(scale),多视场(aspect ratio)的Sliding Window来生成。
1. 所谓多尺度(scale):可以简单的理解为将图片缩放成一系列图像,这些不同大小的图像就代表不同的尺度。尺度是一个相对的概念。如上图(a)所示。
2. 所谓多视场(aspect ratio):多视场这个是自己理解翻译的词。这个可以这么理解:对与图像中的某个目标比如猫,对猫的眼睛给个框,然后扩大这个框,把猫的脑袋也包括进来,然后继续扩大,把整个猫也包含进来。这来得到的一些框内的图像就算是多视场。如上图(b)所示
3. Sliding Window给出的候选区域就是多尺度,多视场的图像的集合,它给出的是不同尺度大小,不同视场大小的图像的集合。是一个暴力枚举所有可能区域的方法。而“Anchor”机制个人觉得可以理解为Sliding Window提取候选区域的一种近似。“Anchor”机制只使用3个scale,3个aspect ratio,即3x3共个9个候选框(参见图c,这里只画了3个,没画全)。这样得到的候选区域虽然会有误差,不过后面反正会有bounding box回归来修正误差,所以就无所谓了,只要不是差太多就行。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>我们的RPN是一种全卷积网络(fully-convolutional network, FCN,可以针对生成检测建议框的任务端到端地训练。为了统一RPN和Fast R-CNN目标检测网络,我们提出一种简单的训练方案,即保持建议框固定,在微调区域建议和微调目标检测之间交替进行。这个方案收敛很快,最后形成可让两个任务共享卷积特征的标准网络。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>我们在PASCAL VOC检测基准上全面评估了我们的方法,RPNs结合Fast R-CNNs可以比选择性搜索结合Fast R-CNN有更高的准确度。于此同时我们的方法摒弃了选择性搜索在测试阶段几乎所有的计算负担,有效推荐的运行时间只有区区的10毫秒。使用十分耗时的超深度模型,我们的检测方法仍然可以在GPU上达到5fps的速度,这使得物体检测系统在速度和精度上都变得更加实用。我们也报告了在MS COCO数据集上的结果,探究了PASCAL VOC上使用COCO数据集带来的提升。代码现在开放在 https://github.com/shaoqingren/faster_rcnn (in MATLAB)和https://github.com/rbgirshick/py-faster-rcnn (in Python)。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>本文的一个早期版本发布在[10]上。从那时起,RPN和Faster R-CNN的框架就已经被采用,并应用到其他的方法中,比如3D物体检测,基于组件的检测,实力分割[和图像字幕。我们的快速而有效的物体检测系统已经构建在应用在Pinterests这样的商业系统中,提升了用户交互体验。
<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>ILSVRC和COCO 2015竞赛中,Faster R-CNN和RPN是多项比赛的第一,包括ImageNet 检测,ImageNet定位,COCO检测和COCO分割。RPNs从数据中完全学会了推荐区域,而且使用更深或更有表达力的特征(比如101层的Resnet)效果会更好。Faster R-CNN和RPN也被各个比赛中的多个其他领先队伍所使用。这些结果都说明我们的方法不仅省时,而且准确率高。

RELATED WORK 相关工作

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>Region proposal方法有多种,比如:Selective Search, greedily merges superpixels, EdgeBoxes. 以Selective Search方法为例,相比于高效的检测网络部分,这部分的运行时间高了将近一个数量级,其他方法虽然有一定的提升,但是总的来说,region proposal 部分相比于 detection network 多花了很多时间,运行速度的瓶颈就在于此!作者本文的创新点就在于和传统的生成候选区域的算法不同,作者使用Region proposal network来进行Region proposals. 网络整体结构示意图如下:

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>对于一副输入图像,将其送入CNN提取特征,然后利用Region Proposal Network提取候选区域(这个过程利用了刚才说的Anchor机制,后面细说)。对每一个候选区域进行分类和bounding box回归,就可以得到检测的结果。不过这里候选区域提取是在CNN的最后一个feature map上提取的,那么问题来了,提取的候选区域怎么映射对应回原图呢?feature map上的框怎么对应上输入图像的框?实际上,就是很直接粗暴的方式:根据特征图和原图的比例,把特征图上的框按比例进行缩放。

RPN网络过程

<nobr aria&#45;hidden="true"> </nobr> <math xmlns="http&#58;&#47;&#47;www&#46;w3&#46;org&#47;1998&#47;Math&#47;MathML"> </math>一张图片进来,经过卷积核生成特征图片feature map,特征图上每个点产生k个建议框,对建议框做Rol pooling到相同的固定大小,最后分类。
下文摘抄自:https://blog.csdn.net/xinzhi8/article/details/77427345
建议框的产生原理:
一张图片经过卷积核产生特征图,那么特征图上的每个点应该对应原始图的某块区域,比如原始图pooling了4次,那么特征图的每个点对应着原始图16x16区域(2x2x2x2=16),既然一个点对应一个区域,那么区域是有大小方向的,论文中给出的比例是 1:1 , 1:2 , 2:1,大小是:128,256,和512。那么每个点对应的区域是9种情况,则一张50x50的特征图有50x50x9种框。
这就是RPN的优势之处,在卷积核之后产生建议框。
为什么不在卷积核之前产生建议框呢?采用RPN,则一张图片经过一次卷积网络产生特征图,在特征图上生成建议框,再分类。假设在卷积之前就做好50x50x9种框,则要有50x50x9张图片经过卷积网络产生特征图,再分类。RPN的计算速度明显快很多。而且RPN的框是在卷积核之后产生的,则这些建议框共享一个神经网络,而不是每个框对应一个神经网络。
图例:

RPN的平移不变性

在计算机视觉中的一个挑战就是平移不变性:比如人脸识别任务中,小的人脸(24*24的分辨率)和大的人脸(1080*720)如何在同一个训练好权值的网络中都能正确识别。若是平移了图像中的目标,则建议框也应该平移,也应该能用同样的函数预测建议框。
传统有两种主流的解决方式:
第一、对图像或feature map层进行尺度\宽高的采样;
第二、对滤波器进行尺度\宽高的采样(或可以认为是滑动窗口).
但Faster R-CNN解决该问题的具体实现是:通过卷积核中心(用来生成推荐窗口的Anchor)进行尺度、宽高比的采样,使用3种尺度和3种比例来产生9种anchor。

窗口分类和位置修正

分类层(cls_score)输出每一个位置上,9个anchor属于前景和背景的概率。
窗口回归层(bbox_pred)输出每一个位置上,9个anchor对应窗口应该平移缩放的参数(x,y,w,h)。
对于每一个位置来说,分类层从256维特征中输出属于前景和背景的概率;窗口回归层从256维特征中输出4个平移缩放参数。

损失函数

为了训练RPN,我们给每个anchor分配一个二进制的标签。我们分配正标签给两类anchor:
(i)与某个ground truth(GT)包围盒有最高的IoU(Intersection-over-Union,交集并集之比)重叠的anchor(也许不到0.7)
(ii)与任意GT包围盒有大于0.7的IoU交叠的anchor。注意到一个GT包围盒可能分配正标签给多个anchor。我们分配负标签给与所有GT包围盒的IoU比率都低于0.3的anchor。非正非负的anchor对训练目标没有任何作用。
有了这些定义,我们遵循Fast R-CNN[5]中的多任务损失,最小化目标函数。我们对一个图像的损失函数定义为

这里,i是一个mini-batch中anchor的索引,Pi是anchor i是目标的预测概率。如果anchor为正,GT标签Pi* 就是1,如果anchor为负,Pi* 就是0。ti是一个向量,表示预测的包围盒的4个参数化坐标,ti* 是与正anchor对应的GT包围盒的坐标向量。分类损失*Lcls是两个类别的对数损失
对于回归损失*,我们用来计算,其中R是[5]中定义的鲁棒的损失函数(smooth L1)

Pi* Lreg这一项意味着只有正anchor(Pi* =1)才有回归损失,其他情况就没有(Pi* =0)。cls层和reg层的输出分别由{pi}和{ti}组成,这两项分别由Ncls和Nreg以及一个平衡权重λ归一化(早期实现及公开的代码中,λ=10,cls项的归一化值为mini-batch的大小,即Ncls=256,reg项的归一化值为anchor位置的数量,即Nreg~2,400,这样cls和reg项差不多是等权重的。
对于回归,我们学习[6]采用4个坐标:

x,y,w,h指的是包围盒中心的(x, y)坐标、宽、高。变量x,xa,x*分别指预测的包围盒、anchor的包围盒、GT的包围盒(对y,w,h也是一样)的x坐标。可以理解为从anchor包围盒到附近的GT包围盒的包围盒回归。

实验结果

  1. 与Selective Search方法(黑)相比,当每张图生成的候选区域从2000减少到300时,本文RPN方法(红蓝)的召回率下降不大。说明RPN方法的目的性更明确。
  2. 使用更大的Microsoft COCO训练,直接在PASCAL VOC上测试,准确率提升6%。说明faster RCNN迁移性良好,没有over fitting。

参考文章:

https://blog.csdn.net/qq_17448289/article/details/52871461
https://blog.csdn.net/shenxiaolu1984/article/details/51152614
https://blog.csdn.net/xinzhi8/article/details/77427345