faster rcnn生成全图anchors

本博客记录faster rcnn中,生成整张图片的anchors的过程,并可视化,加深理解。

为了方便可视化,我们假设:原图大小为10 * 10,featureMap_size = (5,5), base_size = 2, ratios = [0.5, 1, 2], scales=[0.5,1,2]。

首先,是生成feature map上,(0,0)位置对应的anchors。

base_anchors = generate_anchors(base_size, ratios, scales)
base_anchors = [[ 0.25  0.5   0.75  0.5 ]
 				[ 0.5   0.5   0.5   0.5 ]
 				[ 0.75  0.5   0.25  0.5 ]
 				[-0.5   0.    1.5   1.  ]
 				[ 0.    0.    1.    1.  ]
 				[ 0.5   0.    0.5   1.  ]
 				[-2.   -1.    3.    2.  ]
 				[-1.   -1.    2.    2.  ]
 				[ 0.   -1.    1.    2.  ]]

即,在感知野大小为2*2, ratios = [0.5,1,2], scales = [0.5,1,2]的情况下,每个feature map上的点对应3 * 3 = 9种不同形状大小的anchors。其中,feature map上(0,0)点对应的9个anchors的是base_anchors。关于generate_anchors()的理解,可以参考博客:https://blog.csdn.net/sinat_33486980/article/details/81099093。

有了第(0,0)个位置上对应的anchors,接下来,我们的目标是:通过base_anchors与偏移量,求出feature map上每个点对应的anchors。

如下图,假设在feature map上,(0,0)坐标点仅对应一个anchor,坐标点为(0,0,1,1)。那么,如何得到feature map上,(0,1)坐标点所对应的anchor呢?由于感知野的大小为2,所以,求(0,1)坐标点对应的anchor,只需横坐标不变,纵坐标+2即可,即(0,0,1,1)+(0,2,0,2) = (0,2,1,3)。以此类推,得到其他点对应的anchor。

faster rcnn生成全图anchors_第1张图片

代码如下:

# x轴方向上的偏移量
shift_x = np.arange(featureMap_size[0]) * base_size
# y轴方向上的偏移量
shift_y = np.arange(featureMap_size[1]) * base_size
# 将x轴方向与y轴方向上的偏移量对应起来
shift_x, shift_y = np.meshgrid(shift_x, shift_y)
# 将偏移量表示为(x1,y1,x2,y2)的形式,即:每个坐标点应偏移多少
shifts = np.vstack((shift_x.ravel(), shift_y.ravel(),
                    shift_x.ravel(), shift_y.ravel())).transpose()
# feature map上的每个点对应的anchors数量
anchors_num = base_anchors.shape[0]
A = anchors_num
# 一共有多少个偏移量,该值=featureMap_size[0]*featureMap_size[1]
K = shifts.shape[0]
# 此处,利用numpy的广播机制,对A个anchors做k次偏移量,得到A*K个anchors
all_anchors = (base_anchors.reshape((1, A, 4)) +
               shifts.reshape((1, K, 4)).transpose((1, 0, 2)))
all_anchors = all_anchors.reshape((K * A, 4))

# 在 10*10 的原图大小上,画出anchors
# plt.figure(figsize=(10, 10))
img = np.ones((10, 10, 3))
plt.imshow(img, extent=(0, 10, 10, 0))
axs = plt.gca()  # get current axies
for i in range(0, all_anchors.shape[0]):
    box = all_anchors[i]
    rec = patches.Rectangle((box[0], box[1]), box[2] - box[0] + 1, box[3] - box[1] + 1, edgecolor='r', facecolor='none')
    axs.add_patch(rec)

plt.show()

结果:

faster rcnn生成全图anchors_第2张图片

代码地址:https://github.com/penbury/code_for_blogs/tree/master/anchor_gen

你可能感兴趣的:(faster,rcnn)