首次提出在faster-rcnn中,用于替代以前的SS算法或者滑动窗口+图像金字塔,用于生成候选框。
说明:下述预测的位置信息均为偏移量,这里为了理解方便才说为准确信息。
上图展示了RPN网络的具体结构。其中输入为特征图,输出为一系列候选框。可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
记录1:为什么这里采用映射的思想产生候选框?
为了应对原图中存在对于同一类别物体,可能会有尺寸的区别,比如在一张图中由于拍照的远近,会有近处的“车”尺寸大,远处的“车”尺寸小。为了应对这个问题,原始已有的办法,比如:多尺度训练,即将一张原图进行尺寸缩放,再喂给网络,例如SPP-Net、fast-Rcnn等;还有的采用多尺寸卷积核的方法。但是这些方法都会造成网络训练时间加长的问题。在本论文中,提出基于映射产生候选框的方法,可以解决上述问题。
记录2:何为anchors?
anchors说白了就是一组框的位置信息,每一个框的位置信息由左上角和右下角的信息组成。在特征图上的每一个点,对应原图一个区域(大小为16*16)。这个时候我们对于anchors的设计提出3种尺寸和3种长宽比,进而得到九种,其中长宽比分别为(1:2)(2:1) (1:1),尺寸分别有128、256、512(如下图右下角的蓝、红、绿)。也就是特征图上一个点,对应9个anchors,其中anchors在原图上抠取。这种设计使框尽量覆盖足够多的区域,并且考虑网络时间效率。
当然此时只是初步提出可能的anchors,后面还需要进行过滤,否则anchors太多。
记录3:如何设计选取初步的anchors?
上图左边最底层是通过主卷积干架提取的特征图“conv feature map”,然后先进行一个3*3的卷积操作(此时得到的特征图尺寸不变,只是又糅合了周围的特征),然后对于该特征图上的每一个点,映射到原图上,得到k个anchors,该点为锚点。
这里描述一下如何映射:首先假设主卷积采用VGG16,这个时候涉及到感受野的问题,我们知道在进行卷积时,其中conv、relu不改变图的尺寸,进行pool将尺寸变为远来的一半,假设经过了四个卷积,则此时得到的特征图是原来原图的1/16,则此时一个锚点映射到原图上对应一个16*16的区域,此时提出:对于映射得到的区域进行尺寸变换和长宽比变换,从而得到原图上的多个区域,即为anchors。
在原图上对框进行设计时,考虑:使框尽量覆盖足够多的区域,并且考虑网络的时间效率。对于框的设计提出3种尺寸和3种长宽比,进而得到九种,其中长宽比分别为(1:2)(2:1) (1:1),尺寸分别有1282、2562、512^2(如上图右侧的红、绿、蓝)。
记录4:得到anchors之后,如何对其进行分类,判断是前景还是背景?
该部分输入的特征图为原始图片的1/16,不妨记为W、H。对于大约2W个候选框,需要对这些候选框进行打标签(标签为2维,即该框是前景还是背景),才能进行有监督训练。那么如何进行打标签,论文中对于前景给出了两种标记方式,其一对于原图上的每一个ground truth,选取与其IOU最大的候选框,标记为前景,对于原图上的ground truth,只要与其IOU大于0.7,标记为前景;论文中对于背景,选取与ground truth的IOU小于0.3的候选框标记为背景。那么在0.3到0.7之间的候选框我们就不管了。从而对于每一个anchors标出前景或背景的标签。记得删去越界的候选框,然后从中选取256个数据进行训练,尽量保持1:1。
首先进行11的卷积,融合不同通道的特征,输出为:WH*(2*9)。这也正好对应输出特征图上每一个点对应9个anchors,每一个anchor分为两类。然后进行softmax分类,至于为什么前后进行reshape论文中提到和caffe的存储有关,这里不再赘述。
记录6:现在我们来看RPN层的回归部分。
该部分输入的特征图为原始图片的1/16,不妨记为W、H。首先进行11的卷积,融合不同通道的特征,输出为:WH*(4*9)。这也正好对应输出特征图上每一个点对应9个anchors,每一个anchor又有用于回归的四个变换量,其实是偏移量:
记录7:对于RPN如何设计设计损失函数?
整体损失函数为:
其中i为候选框的index(代表第几个anchor);代表预测index为i的anchor的类别,代表真实的index为i的anchor的类别,其中1为正例、0为负例;代表预测index为i的anchor的位置信息(包含x,y,w,h),代表真实的index为i的anchor的位置信息(包含x,y,w,h)。分类任务损失为逻辑回归损失;回归任务损失为SmoothL1损失,并且注意到前面乘了一个,代表我们只对于标签属于前景的anchor进行位置微调;参数用于权衡我们是看中分类还是看重回归,论文中采用=10,给出解释:由于 。
我们得到feature map,首先进行3*3卷积,尺寸不变,仅仅是再次融合周围特征,得到新的特征图;
对于新特征图上每一个点,映射回原图上的一个区域。生成候选框按照size=128128,256256,512*512,长宽比为1:2,2:1,1:1,对于新特征图上每一个点在原图上生成9个anchors,共大约2W个;
对候选框进行删除和打标签,分别为: a) 删去越界候选框; b) 对于每一个真实框,选取与其的IOU最大的候选框,标记为1;候选框与真实框IOU大于0.7,标记为1;候选框与真实框IOU小于0.3为0;其余舍去; c) 然后在剩下的候选框中随机选取256个进行训练,比例为1:1,假若正样本个数不够,只能利用负样本填充;
现在分为两个分支,分别进行分类训练和回归训练:
训练好分类和回归两部分之后,源码中会重新生成2W个候选框,进行分类和位置回归。然后进行如下过滤: a) 首先对于候选框与grounf truth的IOU小的直接删去; b) 这个时候再对候选框进行一个NMS过滤,阈值取0.7(也就是如果两个候选框IOU大于0.7,就代表其重叠率比较高,此时再看这两个候选框属于物体的概率(这个概率就是与ground truth的IOU),选取概率大的框,删去概率小的框); c) 这个时候在进行一个topN的选取,也就是按照每个候选框属于物体的概率(这个概率就是与ground truth的IOU)进行由大到小进行排序,选取前N个候选框 。注:所有参数初始化使用高斯初始化,标准差选择0.01;
我们得到feature map,首先进行3*3卷积,尺寸不变,仅仅是再次融合周围特征,得到新的特征图;
对于新特征图上每一个点,映射回原图上的一个区域。生成候选框按照size=128128,256256,512*512,长宽比为1:2,2:1,1:1,对于新特征图上每一个点在原图上生成9个anchors,共大约2W个;
对于越界的候选框进行clip操作(直接删去是在训练时采用的,但是在测试的时候,我们进行的是clip操作,就是将候选框中越界的部分剪去,留下剩下的部分);
通过分类和回归两步,得到候选框的类别概率和坐标偏移量,得到预测框;
在proposal层对预测框进行过滤: a) 首先对于预测框与grounf truth的IOU小的直接删去; b) 这个时候再对预测框进行一个NMS过滤,阈值取0.7(也就是如果两个候选框IOU大于0.7,就代表其重叠率比较高,此时再看这两个候选框属于物体的概率(这个概率就是与ground truth的IOU),选取概率大的框,删去概率小的框); c) 这个时候在进行一个topN的选取,也就是按照每个候选框属于物体的概率(这个概率就是与ground truth的IOU)进行由大到小进行排序,选取前N个预测框 。