本博客记录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。
代码如下:
# 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()
结果:
代码地址:https://github.com/penbury/code_for_blogs/tree/master/anchor_gen