Faster RCNN 用 RPN 优化了候选框初选的过程,提高了RCNN系列网络的综合性能

首先回顾一下R-CNN和Fast R-CNN


可以看到所谓R-CNN的缺陷,主要体现在RoI上

  1. RoI特征提取造成较大时间消耗 (每个RoI用CNN提取特征)和内存消耗 (RoI提取需要先存取)
  2. RoI获取过程时间消耗太大 (罪魁祸首Selective Search)

Fast R-CNN解决了RoI的第一个问题 (同时也搞定了多阶段训练的问题),而Faster R-CNN主要是解决RoI的第二个问题,用RPN来替代耗时巨大的Selective Search

Faster R-CNN分为两个模块,第一个模块是用于产生区域框的深度全卷积网络,第二个模块就是Fast R-CNN目标检测器

RPN网络

如图所示,RPN(Region Proposal Network)的作用就是以feature map作为输入,得到Region Proposal (候选区域)

特征图中的点与原图中的位置的对应关系只与CNN中经过的池化层数量有关,因为在Faster R-CNN中,所有的卷积层均为卷积核为3,步长为1,填充值为1,所有池化层均为窗口大小为2,步长为2,也就是说根据过卷积层长宽变化计算公式 $H = (H – size + 2 * padding) / stride + 1$,过卷积层后原图不会发生大小变化,而经过池化层长宽缩小为原来的一半,如果是四个池化层,则下采样率就是16

然后我们来看看在RPN的内部在做什么

根据原文的图中可以看到,先是用特征图中每个生成k个anchors (文中k=9),然后用anchors和特征去得到4k个偏移量 (reg layer) 和2k个分数 (cls layer)

Anchors

所以问题就来了,什么是Anchors,Anchors有什么用

Anchors的意思是锚,我们知道锚是一种停船所用的工具,给船限定了移动的范围,使得船停的更稳

那么这里的Anchors呢就是对于特征图上的点为中心生成k个固定比例的框,将这些框锚定到这个点上

首先对特征图上的 (0,0) 点,也就是原图中的区域 (0,0,15,15) 生成如下9个Anchors

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.]]

这里的锚框大小是根据reshape后的图像大小人为设定的,在处理中为了方便处理,会先将图像reshape为 $800 \times 600$ 大小,在处理完之后再reshape回去

得到第一组锚框之后,我们只要在特征图上平移锚点,就能得到原图对应区域的9个锚框

特征图上每个点 (256-d|256张特征图) 负责对原图对应区域的9个锚框进行学习训练

这里和Fast R-CNN中最后一步类似,训练两个分支,cls layer (输出量2k) 得到框内是前景 (物体|正样本) 的概率和是背景 (负样本) 的概率,reg layer负责计算偏移量 (输出量4k | x,y,w,h)

Faster R-CNN总览

总结一下Faster R-CNN (图源自知乎,链接见文末)

RPN部分先进行一次$3\times 3$的卷积结合周围特征点的空间信息,然后进入两个分支

  1. 通过softmax分类得到正负样本的概率
  2. 回归计算bbox偏移量

得到正样本对应的框并修正后就传入Fast R-CNN的部分进行后续的内容

所以总的来说,Faster相比于Fast,最为关键的一步,就是用RPN替换了Selective Search,具体做法是在图上布满手工设计的框,对框打分和修正,所以,本质上RPN就是一个bottom-up attention


更多的内容参考我觉得比较好的解读和原文