这篇论文发表在
NIPS2015
上。region proposal
计算出现瓶颈,因此引入RPN
网络,与检测网络共享整幅图像的的卷积特征,所以region proposal
几乎是没有代价的。Faster R-CNN
能够达到实时,并且精确度高。
Introduction
R-CNN
实际扮演的是分类器,它并不能预测出检测框,只能对检测框进行精修,因此它的准确度主要取决于selective search
部分。在之前的方法中proposal
是预测时间的瓶颈。
本文使用深度卷积神经网络RPN(Region Proposal Network)
计算proposal
。在卷积特征的顶部,通过增加一些额外的卷积层,能够在一个规则网格上的每个位置同时回归bounding box
并且给出目标得分。RPN
是一种全卷积网络,并且可以端到端地训练从而生成proposal
。
网络结构如下:

与R-CNN
,SPP-Net
,Fast R-CNN
相比,Faster R-CNN
的主要不同在于,不是在原始图像上提取proposal
,而是先对原始图像进行卷积得到feature map
,然后利用RPN
在feature map
上提取proposal
。
Faster R-CNN
Faster R-CNN
由两个模块构成:用于生成region
的全卷积网络RPN
;Fast R-CNN
检测器。RPN
模块告诉Fast R-CNN
检测器应该“看”哪里。
Region Proposal Networks (RPN)
RPN
采用任意尺寸的图像作为输入,然后输出一系列的带有目标得分(是否有目标)的proposal
。这一过程使用一个全卷积网络。
- 为生成
region proposal
,在最后一个共享的卷积层输出的feature map
上使用一个n×n
的滑动窗(本文n=3
) - 在每一个滑动窗的位置,同时预测多个
region proposal
,每个位置最大可能的region proposal
个数定义为k
,文中是9
。reg
层输出就为4k
,cls
层输出为2k
个分数,对应于每一个region proposal
为目标或非目标的概率。 - 每一个
anchor
被放置在滑动窗的中心。默认使用3
个尺度和3
个高宽比,所以每一个滑动窗位置上有9
个anchor
。对于一个W×H
的卷积feature map
而言,共有WHk
个ahchor
。 - 每一个滑动窗被映射为一个低维特征,其实就是一个
3x3
的卷积核,卷积后得到1
个数值,256
个通道在一个窗口卷积后就是256-d
的特征,后面跟随ReLu
激活函数。然后经过其他层,最后被输入进两个并行的全连接层:box-regression layer
(reg
) 和box-classification layer
(cls
)
本文的方法具有平移不变性,anchor
和相对于anchor
的proposal
都是平移不变的。也就是说,如果图像中的目标被平移,proposal
也应该平移,并且网络依然可以去预测任何位置的proposal
。这种平移不变性通过FCN
中的方法保证。平移不变性也减少了模型尺寸。
Multi-Scale Anchors as Regression References
多尺度预测一般有两种方法:
- 基于图像/
feature
金字塔的:SPPnet
,Fast R-CNN
- 在
feature map
上使用多尺度的滑动窗,如DMP

本文基于anchor
金字塔,实现多尺度是根据多尺度和多个高宽比的anchor
做分类和回归。这种方法只依赖单尺度的图像和feature map
,并且只使用单尺度的filter
(feature map
上的滑动窗,就是前面说的3x3
)。
在SPPnet
和Fast R-CNN
中,bounding box
回归是在从任意大小的RoI
池化得到的特征上实现的,回归的权重被所有的region
尺寸共享。Faster R-CNN
针对不同尺寸,学习k
个bounding-box
回归器,每一个回归器只负责一个尺度和高宽比,k
个回归器之间不共享权重。在后面的Details
里会讲到,使用了36
个1x1
的卷积实现回归的。因为这样的anchor
设计,即使特征是固定尺寸或尺度的,也可能预测出不同尺寸的box
。
Loss Function
- 为训练
RPN
,对每一个anchor
分配一个二分类标签:目标或非目标。 - 把一个正标签分配给两种
anchor
:与一个ground-truth box
有着最高IoU
的一个或多个anchor
;与任一个ground-truth box
的IoU
大于0.7
的一个anchor
。注意一个ground-truth box
可能给多个anchor
分配了正的标签。(这里我的理解是:每一个ground truth
对应的正样本anchor
应该与它IoU
最高的,但是同时也把那些与它IoU
大于0.7
的anchor
也当做正的,因为涉及到训练深度神经网络需要样本量比较大,因此需要放松条件,不仅是非常符合要求的被选为正样本,也要考虑那些比较符合要求的) - 负标签分配给那些与所有的
ground-truth box
的IoU
都低于0.3
的anchor
。那些与真实值IoU
为[0,0.2]
的anchor
不参与训练。
使用multi-task loss
:
$$L({p_i},{t_i}) = \frac {1} {N_{cls}} \sum_i L_{cls}(p_i, p_i^*) + \lambda \frac 1 {N_{reg}} \sum_i p_i^* L_{reg}(t_i,t_i^*)$$
带$p_i^*$(值为1或0)是第i
个anchor
是否为目标的真实值,只有anchor
为正样本时,回归的损失才会被算入。
Training RPNs
- 一个
mini-batch
使用一张图像,在其中采样256
个anchor
,正负anchor
的比例是1:1
,如果正的样本少于负的,则用负样本去填充这个batch
,用这256
个anchor
计算损失 - 使用均值为
0
,标准差为为0.01
的高斯分布随机初始化所有新添加的层,其他的共享卷积层使用ImageNet
上预训练的模型初始化
Sharing Features for RPN and Fast R-CNN
使用交替训练(Alternating Training
)实现RPN
和Fast R-CNN
共享卷积特征,分为4步:
- 使用
ImageNet
预训练的模型初始化网络,并且为region proposal
任务微调网络。 - 使用
RPN
网络生成的proposal
,通过Fast R-CNN
训练一个单独的检测网络。这个检测网络也是使用ImageNet
预训练模型初始化的。到此时,两个网络并没有共享卷积层。 - 使用检测网络初始化
RPN
的训练,但是固定共享卷积层,只微调RPN
特有的层,实现了两个网络共享卷积层。 - 固定共享卷积,微调
Fast R-CNN
特有的层。如此,两个网络共享了相同的卷积层,并且形成了一个统一的网络。
Details

- 输入图像经过
CNN
,这里是VGG16
,得到feature map
feature map
首先输入给RPN
,做了3x3
的卷积,然后分两路:假如前一步3x3
卷积后的特征尺寸是是WxHxC
,在输入给softmax
前使用了18
个1x1xC
的卷积,得到WxHx18
的矩阵,然后分类每个anchor
是不是目标;使用36
个1x1
的卷积,得到WxHx36
的矩阵,相当于feature map
上每一个位置都有9
个anchor
,这样得到回归后proposal
的位置。RoI Pooling
根据RPN
的输出,从feature map
里提取proposal
对应的特征,并且池化成固定尺寸的输出- 最后是全连接层,分类
proposal
是哪一类目标;回归bounding box
Faster R-CNN进行了两次bounding box
回归,一次是在RPN
网络,针对anchor
进行回归,目的是使proposal
的位置更加接近真实值;一次是在全连接层之后,进行最后的位置回归。
上图中有4
个池化层,VGG
的特点是每次都是在池化层改变feature map
的尺寸。在RPN
开始使用的3x3
卷积也是保持feature map
尺寸不变的,因此原始图像到RPN
的feature map
被缩放了16
倍,所以要想将proposal
映射会原图,只需要乘以一个缩放因子。
对于一幅1000x600
的图像,经卷积后得到60x40x9 = 20000
个anchor
(1000/16,600/16
)
- 在训练阶段,一幅图中会有约
6000
个anchor
会超过图像的边界,这部分被去除掉;在测试阶段,对于越过边界的anchor
,把它修正到边界上。 - 设置
0.7
的阈值进行NMS
后,留下约2000
的候选框 - 再对剩下的排序它们的得分,提取
top-N
个作为最终的proposal
。文中经过试验选取前300
个效果最好。