SSD目标检测之默认框的生成(Python)

SSD物体检测论文:arXiv1512.02325

SSD作为较新出现的物体检测算法,拥有网络搭建简单、无需细节调参的优秀特点。其不仅用于物体检测,还可应用于文字检测任务。近期实现的TextBox(arXiv1611.06779)文字检测借鉴了SSD的default boxes。虽然算法不难理解,但是实现过程中遇到了不少问题。通过学习借鉴他人代码以及自己总结,特在此记录生成默认框部分的方法与思路。

任务描述:

给定原图宽高像素和特征图宽高,以及一系列默认框宽高比,生成对应的默认框列表

如特征图为4x4大小,图片大致应划成4x4的网格形状,对于每一个网格中心都有一组不同宽高比的矩形框。

运行效果:

SSD目标检测之默认框的生成(Python)           SSD目标检测之默认框的生成(Python)

       左图为生成的4x4网格           右图为一个网格应具备的不同比例的默认框

(方便起见默认框宽高较小,实际算法默认框大小比上图大一倍左右)

实现思路:

1. 数据的表示:之前我很少事先考虑数据在算法中如何表示。对于默认框问题,最先在脑海中浮现的可能是使用原图的尺寸进行计算。事实上,若将原图映射在0到1的范围内,数据的表示会更加清晰。尤其是当图像经过了一定程度的缩放之后。如果实在需要尺寸信息,直接在结果上乘以原图大小即可。

   上图中即是原图尺寸映射在0到1范围内的结果。

 

2.一维信息生成二维信息:我们现在掌握特征图长是4,宽是4的一维信息。若要生成上图的网格,除了使用16次append列表操作,不妨使用x, y = numpy.meshgrid([0,1,2,3], [0,1,2,3])或mgrid[[0,1,2,3], [0,1,2,3]](注意mgrid接收列表)获取网格坐标

   运行它获得的结果可能会使人摸不着头脑,但是当我们输出x[0][1], y[0][1]得到的结果就是(0,1),x[i][j], y[i][j]就是(i,j)!

   x,y数组加0.5后除以特征图对应的宽高,得到了[0.125, 0.375, 0.625, 0.875]这样均匀分割原图的坐标值

 

3.根据不同宽高比生成不同宽高,此处宽度与高度的预设值需要除以原图的长宽以映射到0,1之间。

 

4.numpy数组操作:

x = np.expand_dims(x, axis=-1)
y = np.expand_dims(y, axis=-1)

在最后一维扩张维度,此步骤为了

xmin = x_out - w / 2
ymin = y_out - h / 2
xmax = x_out + w / 2
ymax = y_out + h / 2

使得numpy数组自行匹配最后一个维度的宽度,具体原因还需继续深入研究numpy原理

 

5.(关键)保证输出合法:输出在0到1之间

xmin = xmin.clip(0, 1)
xmax = xmax.clip(0, 1)
ymin = ymin.clip(0, 1)
ymax = ymax.clip(0, 1)

此时输出的列表经过画图验证,可以表明满足SSD算法中的要求。