概述:
一些基本概念(IOU,NMS)等请看这里。
摘要:算法主要解决两个问题:
1、提出区域建议网络RPN,快速生成候选区域;
2、通过交替训练,使RPN和Fast-RCNN网络共享参数。
RPN是Faster R-CNN提出来的,是为了进行最后的box预测的预先粗选框架。

在虚线之上是基础网络类似VGG16,ZF网络。这里的target是背景。
首先是3x3的卷积(图中有256个输出),然后通过1x1卷积输出分为两路,其中一路输出是目标和非目标的概率,另一路输出box相关的四个参数,包括box的中心坐标x和y,box宽w和长h。
在这里,对于每一个位置来说,分类层从256维特征中输出属于前景和背景的概率;窗口回归层从256维特征中输出4个平移缩放参数。
关于9种anchor
这是rpn网络的核心,对于特征图中的每个点,这里给出9种box框架,论文中基准窗大小为16,给了(8、16、32)三种倍数和(0.5、1、2)三种比例,这样能够得到一共9种尺度的anchor。如图:

训练RPN网络
RPN网络的loss function是对RPN提取的框进行训练的,也就是针对box框中,是否有物体,和box坐标的粗略回归。这里的训练,每次针对一张图片,这里需要给RPN网络中预测box框进行标记。怎么标记:
论文中采用了这样的规则:
- 1)假如某anchor与任一目标区域的IoU最大,则该anchor判定为有目标;
- 2)假如某anchor与任一目标区域的IoU>0.7,则判定为有目标;
- 3)假如某anchor与任一目标区域的IoU<0.3,则判定为背景。所谓IoU,就是预测box和真实box的覆盖率,其值等于两个box的交集除以两个box的并集。其它的anchor不参与训练(跨越图像边界的anchor弃去不用,跨越图像边界的anchor弃去不用)。
于是,代价函数定义为:



bbox回归只对包含目标的anchor计算误差,如果anchor不包含目标,box输出位置无所谓。所以对于bbox的ground truth,只考虑判定为有目标的anchor,并将其标注的坐标作为ground truth。此外,计算bbox误差时,不是比较四个角的坐标,而是tx,ty,tw,th,具体计算如下:

作者采用四步训练法:
1) 单独训练RPN网络,网络参数由预训练模型载入;
2) 单独训练Fast-RCNN网络,将第一步RPN的输出候选区域作为检测网络的输入。具体而言,RPN输出一个候选框,通过候选框截取原图像,并将截取后的图像通过几次conv-pool,然后再通过roi-pooling和fc再输出两条支路,一条是目标分类softmax,另一条是bbox回归。截止到现在,两个网络并没有共享参数,只是分开训练了;
3) 再次训练RPN,此时固定网络公共部分的参数,只更新RPN独有部分的参数;
4) 那RPN的结果再次微调Fast-RCNN网络,固定网络公共部分的参数,只更新Fast-RCNN独有部分的参数。
5 ) 实现细节,比如RPN网络得到的大约2万个anchor不是都直接给Fast-RCNN,因为有很多重叠的框。文章通过非极大值抑制的方法,设定IoU为0.7的阈值,即仅保留覆盖率不超过0.7的局部最大分数的box(粗筛)。最后留下大约2000个anchor,然后再取前N个box(比如300个)给Fast-RCNN。Fast-RCNN将输出300个判定类别及其box,对类别分数采用阈值为0.3的非极大值抑制(精筛),并仅取分数大于某个分数的目标结果(比如,只取分数60分以上的结果)。
如下图所示这是训练RPN网络:

roi_pool层
roi_pool层是最接近全连接层的一个特征图。这要作用就是把RPN网络推荐的区域进行池化,reshape到一个固定的尺寸。

roi_pool层将每个候选区域均匀分成M×N块,对每块进行max pooling。将特征图上大小不一的候选区域转变为大小统一的数据,送入下一层。
整体的流程:
来自Faster RCNN论文解读

参考:
Faster-RCNN算法精读
网友评论