论文原文链接:https://arxiv.org/abs/1506.01497
作者博士论文链接:http://cdmd.cnki.com.cn/Article/CDMD-10358-1016103247.htm
(博士论文中很多地方相当于论文的翻译,而且更详细,推荐看)

虽然网上已经有一大堆优秀的博客介绍了Faster R-CNN,但还是希望自己也写一遍,加深理解。

摘要

最先进的目标检测网络基于候选区域算法来生成候选目标位置。像SPP-net和Fast R–CNN这样先进的模型已经减少了目标检测网络的运行时间,也暴露出候选区域的计算(速度)是一个瓶颈。本文介绍一种候选区域网络(RPN),这中网络可以和检测网络共享整个图像的卷积特征,从而使生成候选区域的时间成本几乎降为0。RPN网络实际上是一个全卷积网络,它可以同时预测目标的边界框以及对应的置信度。RPN通过端到端的训练来产生高质量的候选区域,之后用于Fast R-CNN作目标检测。我们进一步通过共享卷积特征将RPN和Fast R-CNN合并成一个网络。利用最近神经网络中流行的“注意力”机制, RPN会告诉这个网络应该去关注哪里。当使用VGG-16模型的时候,我们的检测系统在GPU上的检测速度为5fps(包含所有的步骤),并且在PASCAL VOC 2007、VOC 2012和MS COCO数据集上取得了最好的检测精度(每个图像只使用300个候选区域)。在ILSVRC和COCO 2015年的比赛中,一些任务中的第一名用的方法是基于Faster R-CNN和RPN的。代码在网上已公开。

背景和动机

Fast R-CNN仍然采用选择性搜索算法来生成候选区域,这成了目标检测速度的瓶颈。选择性搜索算法的速度在CPU上大概为每张图片2秒,远达不到实时性的要求。作者因而提出区域生成网络(Region Proposal Networks, RPN),利用卷积神经网络直接生成高质量的候选区域,速度大概是每张图片10毫秒。

模型

Faster R-CNN分为两个部分:(1)一个全卷积网络(RPN网络)用于生成候选区域;(2)Fast R-CNN模块,利用生成的候选区域进行目标检测。


目标定位和检测系列(7):Faster R-CNN

RPN网络

RPN网络是一个全卷积网络,它的输入是一张任意大小的图片,输出是系列候选矩形框(包含位置信息和置信度信息)。在具体的实现上,RPN以一个卷积神经网络的输出特征图作为输入(当使用ZF网络时,为5个卷积层后的输出特征图,在输入为224×224时,特征图大小为13×13)。之后在特征图上使用大小为n×n的卷积核(滑窗)进行卷积(如3×3),最后分别接入两个不同的1×1卷积层用于分类和回归。对于分类,采用softmax输出每个滑窗对应的原图区域(感受野)包含目标和不包含目标的概率。对于回归,输出对应目标区域的位置信息。

Anchor (锚点)

由于需要检测的目标大小和长宽比都不同,为了适应各种目标的检测,作者在RPN网络中引入锚点的机制。具体来将,就是在上面每个滑窗的位置,以滑窗的中心为中心产生k个不同的大小和长宽比的区域(文中采用3种大小和3种长宽比,所以k=9),然后映射到原图上。对于一个W×H的特征图,当滑窗的步长取1时,会生成WHk个锚点(每个位置生成k个锚点,一共有WH个位置)。


目标定位和检测系列(7):Faster R-CNN

加入Anchor机制后,RPN网络的分类层输出的维度是2k(2对应是否为目标的概率,用softmax函数),回归层输出的维度是4k(4对应矩形框的位置,即左上角和右下角的坐标)。

多尺度Anchor和平移不变性

平移不变性是计算机视觉中很重要的一点。对于一个识别或者检测问题,当图像中的目标位置发生变化时,模型应该同样能识别或者检测出目标。卷积神经网络中解决平移不变性的思路有两种:
(1)对输入图像进行多尺度采样,即用不同的大小和长宽比的原图输入网络(图像金字塔);
(2)滤波器(滑窗)采用多尺度。

而作者在Faster R-CNN中采用的是基于Anchor的多尺度,即单一尺度的输入图片、单一尺度的滑窗、多尺度的Anchor的机制。这种方法相当于上面两种有着更高的计算效率。

损失函数

和Fast R-CNN一样,Faster R-CNN的损失函数依然由类别损失和位置回归损失两部分组成,如下:


目标定位和检测系列(7):Faster R-CNN

其中,i是一个Batch中的一个锚点的标号,pi是该锚点被预测是目标的概率。当锚点为正样本时,对应的pi值为1,反之为0。ti是一个4维向量,由预测的边界框位置确定,对应的ti由标注框确定,直观上,titi越接近,说明预测的框越准确(下面边界框回归会详细介绍)。

Lcls采用对数损失,即Lcls=log(p)

Lcls(pi,pi)={log(p)if pi=1log(1p)if pi=0

Lreg采用鲁棒回归损失(smooth L1)即:

Lreg(ti,ti)=R(titi)={0.5(titi)2if |titi|<1|titi|0.5others

这里需要重点说下边界框回归,其实这个概念在R-CNN中就已经提出来了。Fast R-CNN和Faster R-CNN一直在沿用。它的作用是为了提高候选框的精度。对于一个包含目标的矩形框,它和标注的矩形框(ground truth)之间可能还有些差距,这个时候我们希望通过回归的方式来逐渐逼近标注框。


目标定位和检测系列(7):Faster R-CNN

如上图所示,我们希望矩形框P=(Px,Py,Pw,Ph)通过回归的方式变换成G=(Gx,Gy,Gw,Gh),理想情况下,G应该无限逼近ground truth G。从PG的变换可以用下面的公式表示:

Gx=Pwdx(P)+PxGy=Phdy(P)+PyGw=Pwedw(P)Gh=Phedh(P)

上式中,前两个公式相当于对矩形框的中心坐标做平移变换,后两个公式相当于对宽和高做尺度变换,dx(P)dy(P)dw(P)dh(P)是变换的参数,由矩形框所在的特征图上的对应区域的特征ϕ(P)确定。当矩形框P和ground truth G很接近的时候(即重叠程度比较大),可以把这个变换近似看成线性变换来处理,即dx(P)dy(P)dw(P)dh(P)可以看作是ϕ(P)的线性函数,记作d(P)=wTϕ(P)不难发现,当

dx(P)=(GxPx)/Pwtxdy(P)=(GyPy)/Phtydw(P)=log(Gw/Pw)thdh(P)=log(Gh/Ph)th

时,结果为ground truth G,因此,我们可以把t当作优化的目标构造正则化最小二乘损失函数来优化w,如下:

w=argminiN(tiw^Tϕ(Pi))2+λ||w^||2

在Faster R-CNN中,会针对k个锚点分别训练k个回归器,这k个回归器参数不共享。

训练过程

Faster R-CNN的训练过程分成4个步骤:

  1. 训练区域生成网络。利用ImageNet预训练好的网络进行微调。
  2. 利用第一步生成的候选区域训练Fast R-CNN检测网络(网络是预训练好的)。
  3. 利用第二步训练好的检测网络初始化区域生成网络,固定所有共享的卷积层,只微调区域生成网络特有的参数(实现共享卷积层)。
  4. 保持共享的卷积层不变,微调检测网络特有的参数。

检测结果

模型 训练集 测试集 mAP 每张图片处理速度
Faster R-CNN, VGG-16 VOC 2007 train VOC 2007 test 69.9 198ms
Faster R-CNN, VGG-16 VOC 2007+2012 train VOC 2007 test 73.2 198ms
Faster R-CNN, VGG-16 VOC 2012 train VOC 2012 test 67.0 198ms
Faster R-CNN, VGG-16 VOC 2007 train&test + VOC 2012 train VOC 2012 test 70.4 198ms

在使用VGG-16作为预训练模型时,检测速度是5fps,当使用ZF作为预训练模型时,检测速度是17fps,当然,精度会随之下降。