RPN(Region Proposal Network)介绍

RPN(Region Proposal Network)

RPN简单来说就是输入一张图片可以得到很多待选框的一个网络,再详细一点就是:

RPN的本质是对所有候选框进行判定,前景概率为多少,如果是前景那么其候选框所需要的修正因子应该是多少。

image-20210718150049697

首先经过backbone提取特征:

​ 首先拿到一张原图时,我们要先利用backbone获得feature map,可以看到上图中右部从feature map中获得了一个256维的向量,这个256来自于哪儿里呢?其实就是feature map的深度,而我们的backbone是ZF时,提取出的feature map深度就是256的。官方也提到可以用VGG16来当作backbone,这样得到的feature map深度就是512的了。当然上图举的例子是ZF做backbone时的情况。

​ 同时也要注意获得256维向量是通过滑动窗口获得的,即3*3的滑动窗口扫面feature map的每一处,padding 1个,步长也是1, 就正好覆盖了feature map。

找出anchor box:

​ feature map上的每一个点都可以映射回原图,映射方法如下图,首先计算$x$方向上的$stride_x$,$y$方向上的$stride_y$,这两个是怎么计算的呢? 举个例子,比如输入的图像是500*600的,经过backbone得到的feature map大小是100*150,那么$stride_x = 500/100 = 5,stride_y =600/150=4$。 此时我们查看feature map上每个点$(a,b)$映射回原图的坐标就是$(astride_x,bstride_y)$。

image-20210718151219049

找到原图坐标后,在原图出画出k个anchor box:

作者给出了九种的anchor box:

1
2
3
4
5
6
7
8
9
[[ -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.]]

其中每行的4个值 $(x_1,y_1,x_2,y_2) $表矩形左上和右下角点坐标。9个矩形共有3种形状,长宽比为大约为$1:2, 1:1, 2:1$三种,实际上通过anchors就引入了检测中常用到的多尺度方法。在代码中,作者把任意大小的输入图像reshape成800x600。然后再用九个anchor box来包围,其实就几乎覆盖到了各种各样尺度的目标。

image-20210718155228975

image-20210718152947759

到此Anchor box就找到了

调整anchor box:

image-20210718153802828

除了刚才介绍的结构,这里还一个$2k\ score$和$4k\ coordinates$。 这两个就是对anchor box进行调整的。对于feature map的每一个点都会在原图生成$k$个anchor box。

  • 每个anchor box都有2个概率,即是背景(无目标物)的概率和是前景(有目标物)的概率, 所以每个点有$2k$个score
  • 每个anchor box都有4个回归参数,即是包围框的左上角点和包围框的长宽,所以每个点有$4k$个coordinates,帮助我们调整anchor box的位置与大小。

image-20210718154621051

请注意RPN网络找的目标可以有多个,因此我们只区分是前景概率和是背景概率,我们在RPN中并不关心这个到底是前景中的哪儿一个目标。举个例子,想获得人和车的预选包围框,车和人都算是前景。

感受野问题:

  • 对于ZF网络作为Backbone,他的感受野是171。
  • 对于VGG网络作为Backbone,他的感受野是228。

那么这就有一个问题,我们在feature map中的每一个点要映射回原图,而你的感受野只有171*171这么大, 为什么anchor box要有256*256,甚至是512*512这么大的?

作者给出的看法是:

image-20210718155328374

即感受野小于实际物体的包围框是有可能的,因为我们人也可以看到物体的一部分就大概猜出物体的整体大小。实际中,这个方法也确实是work的。

减少候选框:

  1. 对于1张1000*600*3的图像,大约有60*40*9个anchor
  2. 忽略跨越边界的anchor,大约剩下6k个anchor
  3. RPN生成的候选框存在大量的重叠,基于候选框的得分,采用非极大值抑制,IoU设置尾0.7,最后只剩2k个候选框

请注意上面的anchor和候选框不是同一个东西,anchor经过4k个回归参数的调整后才叫候选框。

RPN训练方式:

RPN每次从待选anchor中抽取256个anchors,每次让正负样本比为1:1。如果正样本少于128,假设为x,那么我们就让负样本为256-x。

这里是怎么定义正负样本的呢?

正样本: 我们的anchor与ground-truth box最大的IoU>0.7,那么就可以认为是正样本,如果最大的都不大于0.7,那么我们就把IoU最大的Anchor作为正样本即可。

负样本: 我们的anchor与所有的ground-truth box的IoU<0.3,那么就可以认为是负样本。

正负样本之外的我们就会丢弃掉。

loss函数:

image-20210718165644649

分类损失函数:

首先说分类损失,原文给的是Softmax Cross Entorpy Loss来计算的:

image-20210718173721552

1代表是前景,0代表是背景,那么:

比如第一个anchor实际是前景,而预测前景概率是0.9,那么$L = -log(0.9)$,第二个是背景,而背景概率是0.2,那么$L = -log(0.2)$。

在pytorch官方实现的方式是用二分类的交叉熵损失Binart Cross Entropy

image-20210718180649938

也就是说这里只需要预测K个值即可。

边界框损失函数:

image-20210718181104344

Faster-RCNN整体是怎么训练的?

我们知道RPN的提出让Faster R-CNN真正做到了end-to-end,使得网络之间关系更加密切,效果更好。

现在的Faster R-CNN直接采用RPN Loss+Fast R-CNN Loss来做。

但是原文中采用分别训练RPN和Fast R-CNN Loss:

image-20210718182153148