目标检测系列(3)—又一个 one stage 的目标检测模型—SSD(下)

前言

在深度学习学习过程,学习理论和读懂源码都是同等重要的,之前看了许多 paper,也积累了许多理论知识,不过当真的要落实到代码上,还是无从下手,还是停留在用的层面上。最近自由时间比较多,所以也想静下心来,通过实现一些经典框架来培养自己将 paper 转为 code 的能力。

位置损失函数

这部分内容是之前上一篇文章关于位置损失的补充

这里采用了 L 1 s m o o t h L_1^{smooth} 损失函数

t x j = ( g x j p x i ) / p w i t y j = ( g y j p y i ) / p h i t w j = log ( g w j / p w i ) t h j = log ( g h j / p h i ) t_x^j = (g_x^j - p_x^i)/p_w^i\\ t_y^j = (g_y^j - p_y^i)/p_h^i\\ t_w^j = \log(g_w^j/p_w^i)\\ t_h^j = \log(g_h^j/p_h^i)

回归参数 t x j t_{x^j} 表示第 j j 个 GT 框中心点 x 偏移量 GT g x j g_x^j 减去第 i i 个默认框 p x i p_{x^i} 的差除以第 i i 默认框的宽度,那么 t w j t_{w^j}

默认框(Default box)的缩放尺度和宽高比

在 SSD 提供不同大小特征图,这样设计是为了能够检测出不同大小的目标。在不同尺度的特征图下,如何定义默认框(default box)的尺度和宽高比呢? 这是这部分内容要回答的问题,在 SSD 中,是有

屏幕快照 2022-07-24 下午2.04.29.png

值得注意在 SSD 这里每一个网格会给出一些默认框(Default box),这里名字和锚框区分一下

在靠前(左侧)的特征图,也就是分辨率比较高的特征图主要用来检测比较小的目标,而靠后(右侧)特征图主要用来检测比较大的目标。

这里提供一个计算公式

( w k a , h k a ) = ( s k a r , s k / a r ) (w_k^a,h_k^a) = (s_k\sqrt{a_r},s_k/\sqrt{a_r})

屏幕快照 2022-07-24 下午2.12.47.png

计算 S k S_k 的公式
S k = S m i n + S m a x S m i n m 1 ( k 1 ) S_k = S_{min} + \frac{S_{max} - S_{min}}{m - 1}(k-1)

这里 S m i n S_{min} S m a x S_{max} 分别的缩放比例分别是 0.2 和 0.95 ,

  • k k 表示第 k 特征层,那么 k 取值范围也就是 1 到 m,当 k 取 1 时, S k S_k = S m i n S_{min} ,当 k k 取 m 时候 S k S_k 就等于 S m a x S_{max} 这一点不难看出
  • 假设 S m i n = 0.2 S_{min} = 0.2 , S m a x = 0.95 S_{max} = 0.95 m = 6 m=6 条件下,那么公式就等于
S k = 0.2 + 0.95 0.2 6 1 ( k 1 ) = 0.2 + 0.15 ( 1 k ) S_k = 0.2 + \frac{0.95 - 0.2}{6-1}(k-1) = 0.2 + 0.15(1-k)
a r a_r

关于 a r a_r 的取值如下

a r { 1 , 2 , 3 , 1 2 , 1 3 } a_r \in \{1,2,3,\frac{1}{2},\frac{1}{3}\}
举一个例子

还是以上面 S m i n = 0.2 S_{min} = 0.2 S m a x = 0.95 S_{max} = 0.95 m = 6 m=6 a r a_r 取值作为已知条件来计算当 k = 1 , a r = 1 2 k=1, a_r = \frac{1}{2} 时候比例。

S 4 = 0.2 + 0.15 ( 4 1 ) = 0.65 w 4 a = 0.65 1 / 2 = 0.46 h 4 a = 0.65 / 1 / 2 = 0.92 S_4 = 0.2 + 0.15(4-1) = 0.65\\ w_4^a = 0.65 \sqrt{1/2} = 0.46\\ h_4^a = 0.65 / \sqrt{1/2} = 0.92

这里还得特殊说明一下,在当 a r = 1 a_r = 1 时候,还会额外添加一个默认的默认框(default box),这个锚框计算比例用 S k S^{\prime}_k 来表示,和 S k S_k 计算的公式约有不同

S k = S k S k + 1 S_k^{\prime} = \sqrt{S_kS_{k+1}}
S 5 = 0.2 + 0.15 ( 1 5 ) = 0.8 S 4 = S 4 S 5 = 0.65 × 0.8 = 0.72 S_{5} = 0.2 + 0.15(1-5) = 0.8 \\ S_4 = \sqrt{S_4S_5} = \sqrt{0.65\times 0.8} =0.72

那么也就是说每一个锚点都提供 5 + 1 也就是 6 默认的默认框。其实代码实现与 paper 上关于尺度和宽高比略有不同。

屏幕快照 2022-07-24 下午3.38.29.png

这里还要说明一下,在图上橘黄色表示输出特征层上,仅有 4 个 default box 分别是 ( 1 , 2 , 1 2 ) (1,2,\frac{1}{2}) 而其他位置输出特征层上 default box 为 6 个 1 , 2 , 1 2 , 3 1 3 1, 2, \frac{1}{2}, 3 \frac{1}{3}

对于默认框中心点的取值

那么对于中心点又该如何取值呢? 我们知道不同特征图大小不同, f k f_k 这里下标表示第 k 层输出特征图, i , j [ 0 , f k ] i,j \in [0,|f_k|] ,那么默认框(Default box)默认中心点坐标 c x , c y c_x,c_y 就可以用下面公式来计算

( c x , c y ) = ( i + 0.5 f k , j + 0.5 f k ) (c_x,c_y) = \left( \frac{i+0.5}{|f_k|},\frac{j+0.5}{|f_k|} \right)

下面通过一张表来展示特征图中默认框

特征层 特征层的大小 默认框尺寸 默认框宽高比 默认框数量
1 38 × 38 38 \times 38 21 1,2,1/2 38 × 38 × 4 38 \times 38 \times 4
2 19 × 19 19 \times 19 45 1,2,3,1/2,1/3 19 × 19 × 6 19 \times 19 \times 6
3 10 × 10 10 \times 10 99 1,2,3,1/2,1/3 10 × 10 × 6 10 \times 10 \times 6
4 5 × 5 5 \times 5 153 1,2,3,1/2,1/3 5 × 5 × 6 5 \times 5 \times 6
5 3 × 3 3 \times 3 207 1,2,1/2 3 × 3 × 4 3 \times 3 \times 4
6 1 × 1 1 \times 1 261 1,2,1/2 1 × 1 × 4 1 \times 1 \times 4

屏幕快照 2022-07-24 下午4.05.27.png

我们可以结合上面这张图来解释

  • 较远处目标,有 1 个特征图负责预测,也就是会给出 4 个默认框(default boxes)分别是 1,2,1/2 还有在不比例下计算的比例为 1 的边界框
  • 较近处的目标,可能由 4 特征图负责预测,那么就是给出 6 默认框

推理

我们知道在 SSD 一共有 6 输出特征层,那么如何在在 6 个输出特征层上进行预测呢?其实使用一个 3 × 3 3 \times 3 的卷积进行预测每一个位置的输出。

在推理过程中,例如对于 m × n × p m\times n\times p 这里 m 和 n 是特征层的大小,而 p 为通道数,在预测过程中,会用 3 × 3 × p 3 \times 3 \times p 卷积核来预测分类和边界框相对于默认框的偏移量。使用这样卷积核数量是根据预测输出数据结构所确定的,每一个位置会为 k 个默认框每一个默认框输出一个类别概率分布和 一个中心点和宽高偏移量的值。那么也就是 k ( c + 4 ) k(c + 4)

注意这里 c 是包括背景,例如对于 pascal VOC 20 个类别来说,C 就应该是 20 + 1 = 21,对于每一个默认框只有 4 的位置回归,这个与类别无关

正负样本不均衡

现在来看一看在 SSD 中,是如何解决正负样本不均衡的问题,那么在 SSD 关于正负样本定义又是如何定义的呢?

  • 正样本: 对于正样本选择,只要满足以下两个条件之一即可,默认框(default box)与真实框(ground truth)的 IoU 最大的默认框,还有就是对于默认框只要满足与任意真实框的 IoU 大于 0.5
  • 负样本: 其实不满足正样本的默认框都应该计算为负样本,之前我们已经计算过了一共生成了 8700 多个默认框,所以还需要在这么多负样本中筛选,通过 high confidence loss 进行排序,这里 confidence loss 越大也就是网络越容易将其预测为正样本的概率越大(也就是默认框在背景处却给出很高存在目标的分数),然后按照排序从负样本中选取数量,选取的负样本数量和正样本数量保持 3:1 的比例。

这里负样本通常是 IoU 小于 0.3 的默认框会记做负样本。

Atrous/Dilated Convolution

膨胀卷积也称空洞卷积,关于这可能以后会用一次分享来解释,这里现在只是清楚用来进行上采样,这里采用膨胀卷积主要加快速度,并且增加了视野域,这里关于膨胀卷积不做为重点,如果想了更多关于膨胀卷积(Dilated Convolution)的信息可以去看 SAPP 这篇论文。

参考文献

  • SSD: Single Shot MultiBox Detector

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿

猜你喜欢

转载自juejin.im/post/7123877277170925599