一、RPN模块概述
RPN模块的输入、输出如下:
- 输入:feature map(输入图像经过特征提取网络后得到的特征图)、物体标签(训练集中所有物体的类别和边框信息)
- 输出:Proposal(生成的建议框)、分类Loss、回归Loss
二、Anchor生成
Anchor的本质是在原图大小上的一系列的矩形框,Anchor的生成过程和深度学习没有任何的关系,他的本质只是你设定好一些规则,并依据这些规则,在图像中生成不同尺寸,不同长宽比的框,并希望这些框能够最终覆盖你的物体。
Anchor生成的核心代码如下:
def generate_anchors(base_size=16, ratios=[0.5, 1, 2], scales=2**np.arange(3, 6)) :
#首先创建一个基本Anchor为[0,0,15,15]
base_ anchor = np.array([1, 1, base_ size, base_ size])一1
#将基本Anchor进行宽高变化,生成三种宽高比的s :Anchor
ratio_anchors = _ratio_enum(base_anchor, ratio)
#将上述Anchor再进行尺度变化,得到最终的9种Anchors
anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)
for i in xrange (ratio anchors.shape [0])])
井返回对应于feature map大小的Anchors
return anchors
传入参数中base_size=16
,表示feature map上每一个的感受野大小,即feature map上的每一个点对应输入图像上
16
×
16
16×16
16×16大小的区域。ratios=[0.5, 1, 2]
,表示缩放比率;scales=2**np.arange(3, 6)
,即
s
c
a
l
e
s
=
[
2
3
,
2
4
,
2
5
]
=
[
8
,
16
,
32
]
scales=[2^{3}, 2^{4}, 2^{5}]=[8, 16, 32]
scales=[23,24,25]=[8,16,32],表示缩放倍数。
base_ anchor = np.array([1, 1, base_ size, base_ size]) - 1
这是一个左上角坐标为(0, 0),宽和高都为15的框,大小为16×16,之后的Anchor框都是在这个框的基础上,通过比率和倍数变换得到的。
ratio_anchors = _ratio_ enum(base_anchor, ratio)
将上述生成的 16 × 16 16×16 16×16的基础框,按照 1 : 2 1:2 1:2, 1 : 1 1:1 1:1, 2 : 1 2:1 2:1三种比例进行变换,如下图所示:
anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)
for i in xrange (ratio anchors.shape [0])])
将上述生成的Anchor按照 [ 8 , 16 , 32 ] [8, 16, 32] [8,16,32]的倍率进行变换,如下图所示:
在Faster RCNN中,输入图像的大小为 3 × 600 × 800 3×600×800 3×600×800,下采样率为 16 16 16,feature map的大小为 512 × 37 × 50 512×37×50 512×37×50,因此一共有 37 × 50 × 9 = 16650 37×50×9=16650 37×50×9=16650个Anchors。而后通过分类网络与回归网络得到每一个Anchor的前景背景概率和偏移量,前景背景概率用来判断Anchor是前景的概率,回归网络则是将预测偏移量作用到Anchor.上使得Anchor更接近于真实物体坐标。
参考文章
Faster RCNN之Anchors的生成过程理解