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为[001515]
	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三种比例进行变换,如下图所示:

Faster RCNN系列——Anchor生成过程_第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系列——Anchor生成过程_第2张图片

  在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系列——Anchor生成过程_第3张图片

Anchor原理图

参考文章

Faster RCNN之Anchors的生成过程理解

你可能感兴趣的:(目标检测,深度学习,人工智能,机器学习)