先验框

SSD算法定义了多尺度、多长宽比的先验框(Prior Boxes,也称为默认框,Default Boxes),代替了目标预提取步骤,能够加速检测过程

尺度设置

先验框的尺度计算如下:

s_{k} = s_{min} + \frac {s_{max} - s_{min}}{m-1}(k-1), k\in [1, m]

其中,

  • m表示不同分辨率的特征图的个数
  • S_{min}=0.2, S_{max}=0.9

长宽比设置

特征图的每个cell中使用了多个先验框,其不同先验框的长宽比计算如下:

a_{r}\in \{1, 2, 3, \frac {1}{2}, \frac {1}{3}\}\\ w_{k}^{a} = s_{k}\sqrt {a_{r}} \\ h_{k}^{a} = s_{k} / \sqrt {a_{r}}

对于长宽比为1的先验框,使用两种尺度

scale_{1} = s_{k} \ \ \ \ scale_{2} = \sqrt {s_{k} s_{k+1}}

中心坐标计算

每个先验框的中心坐标计算如下:

(center_{x}, center_{y}) = (\frac {i+0.5}{\left | f_{k} \right |})

其中f_{k}表示第k个特征图的尺度,i, j\in [0, \left | f_{k} \right |)

先验框个数

当前提取了6个网络层作为特征图

  • Conv4_338\times 38\times 512
  • Conv719\times 19\times 1024
  • Conv8_210\times 10\times 512
  • Conv9_25\times 5\times 256
  • Conv10_23\times 3\times 256
  • Conv11_21\times 1\times 256

Conv4_3/Conv10_2/Conv11_2中,每个cell使用了3种长宽比设置 - (1, 2, \frac {1}{2}),所以在这些特征图中每个cell包含了4个先验框(因为长宽比为1的先验框有2种尺度

Conv7/Conv8_2/Conv9_2中,每个cell使用了5种长宽比设置 - (1, 2, 3, \frac{1}{2}, \frac{1}{3}),所以在这些特征图中每个cell包含了6个先验框

完整的先验框个数计算如下:

(38\times 38 + 3\times 3+ 1\times 1)\times 4 + (19\times 19+ 10\times 10+ 5\times 5)\times 6=5816 + 2916 = 8732

先验框作用

参考:目标检测|SSD原理与实现

  • 对分辨率较高的特征图使用小尺度的先验框
  • 对分辨率较低的特征图使用大尺度的先验框

这样能够充分覆盖不同尺度的检测目标,使得

  • 比较大的特征图能够用来检测相对较小的目标
  • 比较小的特征图能够用来检测相对较大的目标

从而提高检测精度

具体实现

  • py/ssd/models/achors/prior_box.py

在具体实现过程中,对于先验框的尺度计算进行了相应的调整

参考:

SSD先验框详解

关于SSD默认框产生的详细解读

指定了第一个特征图使用的尺寸s_{1}=0.1,然后从第二个特征图开始按公式计算。所以s_{2}=0.2, s_{6}=0.9,完整的尺度列表为

{0.1, 0.2, 0.375, 0.55, 0.735, 0.9}

从第二个特征层开始增量为0.175

在上述计算后进一步对尺度进行了100倍的放大(防止具体计算时尺度不为整数),计算公式为

S_{k} = \left \lfloor S_{min} * 100 \right \rfloor + \left \lfloor \frac {\left \lfloor S_{max}*100 \right \rfloor - \left \lfloor S_{min}*100 \right \rfloor}{m-1} \right \rfloor (k-1)

从第二个特征层开始,之后特征层的增量为17

所以放大后的尺度列表为

{10, 20, 37, 54, 71, 88}

再进行100倍的缩小,得到尺度列表为

{0.1, 0.2, 0.37, 0.54, 0.71, 0.88}

输入图像大小为300\times 300,所以各层先验框的实际大小为

{30, 60, 111, 162, 213, 264}

每层的增量为0.17*300=51

对于第6个特征层,还需要额外计算s_{k+1}=264+51=315