Faster RCNN系列——Anchor生成过程
一、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 :Anchorratio_anchors = _ratio_enum(base_anchor, ratio)#将上述Anchor再进行尺度变化,得到最终的9种Anchorsanchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)for i in xrange (ratio anchors.shape [0])])井返回对应于feature map大小的Anchorsreturn anchors
传入参数中base_size=16
,表示feature map上每一个的感受野大小,即feature map上的每一个点对应输入图像上16×1616×1616×16大小的区域。ratios=[0.5, 1, 2]
,表示缩放比率;scales=2np.arange(3, 6)
,即scales=[23,24,25]=[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×1616×1616×16的基础框,按照1:21:21:2,1:11:11:1,2:12:12: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×8003×600×8003×600×800,下采样率为161616,feature map的大小为512×37×50512×37×50512×37×50,因此一共有37×50×9=1665037×50×9=1665037×50×9=16650个Anchors。而后通过分类网络与回归网络得到每一个Anchor的前景背景概率和偏移量,前景背景概率用来判断Anchor是前景的概率,回归网络则是将预测偏移量作用到Anchor.上使得Anchor更接近于真实物体坐标。
Anchor原理图
参考文章
Faster RCNN之Anchors的生成过程理解