1.4.1 区域候选网络
1.提出动机
由于CNN具有强大的拟合能力,很自然地我们可以想到使用CNN提取候选区域,因此,便产生了Faster R-CNN最核心的模块:区域候选网络(region proposal network,RPN)。通过SPP-Net的实验得知,CNN可以很好地提取图像语义信息,例如图像的形状、边缘等。所以,这些特征理论上也应该能够用于提取候选区域(这也符合深度学习解决一切图像问题的思想)。在Faster R-CNN的论文中给RPN的定义如下:RPN是一种可以进行端到端训练的全卷积网络,主要用来生成候选区域。
2.RPN与Fast R-CNN
RPN最核心的结构是一个叫作锚点(anchor)的模块。锚点是通过在Conv5上使用大小为3×3、步长为1的滑窗,在输入图像上取得的一系列检测框。在取锚点时,同一个中心点取3个尺度、3个比例,共9个锚点。Faster R-CNN使用的候选区域便是用RPN标注了标签为正的锚点。从另一个角度讲,RPN的思想类似于注意力机制,注意力机制中“where to look”要看的地方便是锚点。
在Faster R-CNN中,RPN用来生成候选区域,Fast R-CNN使用RPN生成的候选区域进行目标检测,且二者共享CNN的参数,这便是Faster R-CNN的核心框架(见图1.12)。由此可见,RPN和Fast R-CNN是相辅相成的,在Faster R-CNN的论文中使用了交叉训练的方法训练该网络,RPN和Fast R-CNN两个模块互相用对方优化好的参数,具体内容会在1.4.2节介绍。
图1.12 Faster R-CNN的核心框架
Faster R-CNN分成两个核心部分:
● 使用RPN生成候选区域;
● 使用这些候选区域的Fast R-CNN。
首先我们要确定RPN的输入与输出,RPN的输入是任意尺寸的图像,输出是候选区域的坐标和它们的置信度得分。当然,由于RPN是一个多任务的监督学习,因此我们也需要图像的真值框。RPN是一个多任务模块,它的任务有两个,任务一是计算当前锚点是前景的概率和是背景的概率,所以是两个二分类问题;任务二是预测锚点中前景区域的坐标(x, y, w, h),所以是一个回归任务,该回归任务预测4个值。RPN对每一组不同尺度的锚点区域,都会单独训练一组多任务损失,且这些任务参数不共享。这么做是为了避免多个锚点无法和单一的真值框对应的问题。所以,如果有k个锚点,那么RPN是一个有6×k个输出的模型。
3.RPN的锚点
首先,RPN的滑窗(步长为1)是在特征层(Conv5层)进行的,通过3×3卷积将该窗口内容映射为特征向量(图1.13中的256维的特征向量)。根据卷积的位移不变性,要将Conv5层特征映射到输入图像感受野的中心点只需要乘降采样尺度即可。由于VGG使用的都是same卷积,降采样尺度等于所有池化的步长的积,如式(1.10)所示。相对位移便是特征图上的位移除以降采样尺度。
图1.13 RPN的滑窗
(1.10)
因此,在特征层上的步长为1的滑窗也可以理解为在输入图像上步长为_feat_stride的滑窗。例如,一个最短边缩放到600的4 : 3的输入图像,经过4次降采样后,特征图的大小为。进行步长为1的滑窗后,得到了W×H×k个锚点。由于部分锚点边界超过了图像,这部分锚点会被忽略,因此并不是所有锚点都参与采样。
特征图上的一个点可以对应输入图像上的一个区域,这个区域便是感受野。在感受野的每个中心取9个锚点,这9个锚点有3个尺度,分别是1282、2562和5122,每个尺度有3个比例,分别是1 : 1、1 : 2和2 : 1。代码中锚点的坐标为:
[[ -84. -40. 99. 55.] [-176. -88. 191. 103.] [-360. -184. 375. 199.] [ -56. -56. 71. 71.] [-120. -120. 135. 135.] [-248. -248. 263. 263.] [ -36. -80. 51. 95.] [ -80. -168. 95. 183.] [-168. -344. 183. 359.]]
可视化该锚点,得到图1.14,其中黄色部分代表中心点的感受野。在这个锚点列表中,会有很多数值为负的锚点,在实际的实现过程中,锚点的值会被向上/向下进行截断,因此不会有超出图像边界的问题。
图1.14 Faster R-CNN的锚点可视化
根据SPP-Net所介绍的感受野的知识,我们知道特征图上的一个点对应的感受野是输入图像的一个区域,该区域可以根据CNN结构反向递推得出。我们可以计算出VGG-16的感受野的大小是228,递推过程总结如图1.15所示,图中Convi-j表示的是第i个网络块的第j个卷积,箭头上方的数字表示该层的感受野的大小[14]。虽然Faster R-CNN的论文中说这种锚点并没有经过精心设计,但我认为这批锚点表现好不是没有原因的。这些锚点分别覆盖被感受野包围、和感受野大小类似以及完全将感受野覆盖3种情况,可见这样设计锚点覆盖的情况还是非常全面的。
[14] 由于RPN的特征向量是从Conv5层经过大小为3×3的卷积核获得的,因此应该从3开始向前递推。
图1.15 RPN的滑窗
在输出特征图中,每个中心对应了9个不同的锚点,进而会产生9种不同的预测结果。Faster R-CNN根据9种不同尺寸和比例的锚点,独立地训练9个不同的回归模型,这些模型的参数是不共享的,这就是RPN的模型有6k个输出的原因,如图1.16所示。
图1.16 RPN的输出层
4.损失函数
对接近2000个锚点都进行分类是不太现实的。一个原因是这2000个锚点的数量过于庞大,会影响训练速度;另一个原因是这2000个锚点绝大多数都是负样本锚点,正负样本的分布极其不均衡。RPN的分类任务使用的是名为“Image-centric”的采样方法,即每次采样少量的图像,然后从图像中随机采样锚点正负样本。具体来讲,RPN每次随机采样一幅图像,然后在每幅图像中采样256个锚点,并尽量保证正负样本的比例是1 : 1。由于负样本的数量超过128,因此当正样本数量不够时,将使用负样本补充。在回归任务中,RPN使用的是全部锚点。
RPN的损失函数是一个多任务的损失函数,其中分类任务Lcls用来判断该锚点是正样本还是负样本,回归任务用来检测目标的检测框,表示为式(1.11):
(1.11)
式(1.11)中,Ncls和Nreg分别是参与分类和检测的样本数,其中Ncls=256,Nreg=2000。是样本的标签值(对于正样本,值为1;对于负样本,值为0),它乘Lreg表明只有正样本参与检测框的计算,λ是用来平衡两个任务的参数,因为Ncls和Nreg的差距过大,在Faster R-CNN的实验中,λ的值为。
在检测任务中,Faster R-CNN采用的是R-CNN提出的针对锚点(候选区域)的相对位置的预测。假设模型预测框的坐标为(x, y, w, h),真值框的坐标为(x*, y*, w*, h*),锚点的坐标为(xa, ya, wa, ha),那么预测框关于锚点的相对位置的计算方式如式(1.12)。同理,真值框相对于锚点的相对位置的计算方式如式(1.13)。
(1.12)
(1.13)
因为在RPN中只有正负两类样本,所以Lcls使用的是二类交叉熵损失函数,而Lreg使用的是Fast R-CNN中采用的Smooth L1损失。