Faster RCNN中RPN理解
如果把RPN看作一个黑盒子的话,我们最关心的问题是,输入和输出。RPN输入的是一张图片(更准确来说是feature map),输出输出一系列的矩形object proposals。
训练步骤:1.将图片输入到VGG或ZF的可共享的卷积层中,得到最后可共享的卷积层的feature map。
2.用一个小网络来卷积这个feature map
2.1在滑动窗口的feature map的每个点上设置9个矩形窗口(3种长宽比*3种尺度),称作锚点(Anchor)。
2.2将卷积的结果分别输入到两个小的1*1的网络中reg(回归,求目标框的位置)和cls(分类,确定该框中是不是目标)
3.训练集标记好了每个框的位置,和reg输出的框的位置比较,用梯度下降来训练网络
图片节选自https://www.bilibili.com/video/av21846607/?p=6(视频也不错,推荐看看)
可能结果不是很准确,只能大致确定框的位置,后面fast rcnn会进一步精确。这也是两阶段法比一阶段法(YOLO等)准确的原因
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果还有什么细节不懂,又不愿意看英文论文的,可以参考我翻译的中文版,来看一下细节
Region Proposal Networks(RPN)
RPN网络把一个任意大小的图片作为输入,输出一系列的矩形object proposals,每个object proposals都带一个objectness score。我们用一个全卷积网络来实现这个过程。因为我们的最终目标是与Fast R-CNN目标检测网络来共享计算,所以我们假设两个网络有一系列相同的卷积层。我们研究了the Zeiler and Fergus model(ZF),(包含5个可共享的卷积层),the Simonyan and Zisserman model(VGG-16 (包含13个可共享的卷积层)。
为了生成region proposals,我们在卷积得到的feature map上滑动一个小的窗口,这个feature map 是最后一个共享卷积层的输出。这个小网络需要对输入的feature map使用一个n*n窗口。每个滑动窗口都映射到一个低维特征(ZF是256维,VGG是512维,后面跟一个ReLU激活函数)。这个特征被输入到两个平行的全连接层中(一个box-regression层(reg),一个box-classification层(cls))。我们在这篇论文中使用了n=3,使输入图像上有效的接受域很大(ZF 171个像素,VGG 228个像素)。这个迷你网络在图3(左)的位置上进行了说明。注意,由于迷你网络以滑动窗口的方式运行,所以全连接层在所有空间位置共享。这个体系结构是用一个n*n的卷积层来实现的,后面是两个1*1的平行的卷积层(分别是reg和cls)。
1.1Anchors(锚点)
在每个滑动窗口位置,我们同时预测多个region proposals,其中每个位置的最大可能建议的数量表示为k。所以reg层有4 k输出来编码k个box的坐标(可能是一个角的坐标(x,y)+width+height),cls层输出2 k的分数来估计每个proposal是object的概率或者不是的概率。这k个proposals是k个参考框的参数化,我们把这些proposals叫做Anchors(锚点)。锚点位于滑动窗口中,并与比例和纵横比相关联。默认情况下,我们使用3个尺度和3个纵横比,在每个滑动位置上产生k=9个锚点。对于W *H大小的卷积特性图(通常为2,400),总共有W*H*k个锚点
平移不变性的锚点
我们的方法的一个重要特性是是平移不变性,锚点本身和计算锚点的函数都是平移不变的。如果在图像中平移一个目标,那么proposal也会跟着平移,这时,同一个函数需要能够在任何位置都预测到这个proposal。我们的方法可以保证这种平移不变性。作为比较,the MultiBox method使用k聚类方法生成800个锚点,这不是平移不变的。因此,MultiBox并不保证当一个对象被平移式,会生成相同的proposal。
平移不变性也减少了模型的尺寸,当锚点数k=9时MultiBox有一个(4+1)*800维全连接的输出层,而我们的方法有一个(4+2)*9维的卷积输出层。因此,我们输出层的参数比MultiBox少两个数量级(原文有具体的数,这里没有具体翻译)。如果考虑到feature projection层,我们的建议层仍然比MultiBox的参数少了一个数量级。我们希望我们的方法在像PASCAL VOC这样的小数据集上的风险更小
多尺度锚点作为回归参考
我们的锚点设计提出了一种解决多个尺度(和纵横比)的新方案。如图所示,有两种流行的多尺度预测方法。
(a.建立了图像和特征图的金字塔,分类器在所有的尺度上运行。b. 具有多个尺寸/大小的过滤器金字塔在feature map上运行。c. 我们在回归函数中使用了参考框的金字塔。)
第一种方法是基于图像/特征金字塔,例如,在DPM和基于cnn方法的方法。这些图像在多个尺度上进行了调整,并且为每个尺度计算特征图(占用或深度卷积特性)(图1(a))。这种方法通常很有用,但很耗费时间。第二种方法是在feature map上使用多个尺度(和/或方面比率)的滑动窗口。例如,在DPM中,不同方面比率的模型分别使用不同的过滤大小(如5 7和7 5)进行单独训练。如果这种方法用于处理多个尺度,它可以被认为是一个过滤器金字塔(图1(b))。第二种方法通常是与第一种方法共同使用的
相比而言,我们基于锚点的方法建立在锚点金字塔上,这更节省成本。我们的方法对多个尺度和纵横比的锚点框进行了分类和回归。它只依赖于单一尺度的图像和feature map,并使用单一大小的过滤器(feature map上的滑动窗口)。我们通过实验展示了这个方案对处理多个尺度和大小的影响(表8)。
由于这种多尺度设计是基于锚点的,我们可以简单地使用在单尺度图像上计算的卷积特性,也可以使用Fast R-CNN检测器。多尺度锚点的设计是共享特性的关键组成,使处理尺度时不需要额外的成本。
1.2损失函数
为了训练RPNs,我们将一个二进制类标签(是否是object)分配给每个锚点。会给这两种锚点设置成正标签:1)跟真值框的交并比最高的。2)跟真值框的交并比大于0.7的。因此,一个真值框可以对应多个正标签的锚点。通常第二个条件足以确定正样本,我们还用第一种情况的原因是,有的时候第二种情况找不到正样本。如果一个锚点跟所有真值框的交并比小于0.3,那马我们就把它设为负样本。正负样本之间的这些样本对训练没有贡献。
有了这些定义,我们在fast R-CNN的多任务损失之后最小化一个目标函数,一张图片的损失函数定义为:
i 是每个小批量中锚点的序号,p是锚点i是目标的概率p*是标签(只能是0或1),t是预测框的4个参数,t*是标定框的参数Lcls是分类损失函数,Lreg是回归损失函数p*i*Lreg表示回归只对正样本进行(负样本p*i=0)。cls和reg分别输出pi和ti。
这两部分由Ncls(小批量的大小决定,这里是256)和Nreg(锚点位置数量决定,这里是2400)进行规范化,并通过一个平衡参数λ进行加权。默认情况下,我们设置=10,因此cls和reg部分的权重大致相同。我们通过实验证明,结果对在大范围内λ的值不敏感。我们还注意到,上面的标准化是不需要的,可以被简化。
对于边界框回归,我们采用了以下4个坐标的参数化:
x,y,w,和h表示框的中心坐标以及它的宽度和高度。变量x、xa和x*分别代表预测的框、锚点框和真值框(y、w、h类似)。这可以认为是锚点框向附近真值框回归。
我们用与以前基于ROI(感兴趣的区域)方法不同的方法实现了有界的回归。原来的方法在从任意大小的RoIs中集合的特性上执行有界的回归,并且所有区域大小都共享回归权重。在我们的公式中,用于回归的特性在feature maps上具有相同的空间大小(3*3)。为了计算不同的尺寸,我们学习了一组k个有界的回归。每一个回归器负责一个尺度和一个纵横比,而k个回归器不共享权重。因此,由于锚点的设计,仍然可以预测各种大小的框,即使这些特征是固定的大小/比例。
1.3 训练RPNs
RPN可以通过反向传播和随机梯度下降来端到端训练。我们遵循以图像为中心的采样策略,开始训练这个网络。每个小批次都来自同一张照片,照片包含许多正负锚点示例。对所有锚点的损失函数进行优化是可行的,但这将偏向于负样本,因为它们多。相反,我们在一个图像中随机抽取256个锚点来计算一个小批的损失函数,其中采样的正和负锚点的比例是1:1。如果一个图像中有少于128个正的样本,我们用负样本填充。
我们随机地初始化所有的新层,方法是用标准偏差0.01的零均值高斯分布来初始化权重。通常,所有其他层(共享卷积层)都是通过预先培训练一个用于ImageNet分类的模型来初始化的。我们对ZF网络的所有层进行调优,并对VGG网络的conv3_1层进行调优,以节省内存。我们对60 k小批量的学习速率为0.001,在PASCAL VOC数据集上的下一个20 k小批量的学习速率是0.0001。我们使用0.9的步长和0.0005的重量衰减。用Caffe实现的。