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

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

前言

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

位置损失函数

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

这里采用了 L1smoothL_1^{smooth} 损失函数

txj=(gxjpxi)/pwityj=(gyjpyi)/phitwj=log(gwj/pwi)thj=log(ghj/phi)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)

回归参数 txjt_{x^j} 表示第 jj 个 GT 框中心点 x 偏移量 GT gxjg_x^j 减去第 ii 个默认框 pxip_{x^i} 的差除以第 ii 默认框的宽度,那么 twjt_{w^j}

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

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

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

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

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

这里提供一个计算公式

(wka,hka)=(skar,sk/ar)(w_k^a,h_k^a) = (s_k\sqrt{a_r},s_k/\sqrt{a_r})

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

计算 SkS_k 的公式
Sk=Smin+SmaxSminm1(k1)S_k = S_{min} + \frac{S_{max} - S_{min}}{m - 1}(k-1)

这里 SminS_{min}SmaxS_{max} 分别的缩放比例分别是 0.2 和 0.95 ,

  • kk 表示第 k 特征层,那么 k 取值范围也就是 1 到 m,当 k 取 1 时,SkS_k = SminS_{min},当 kk 取 m 时候 SkS_k 就等于 SmaxS_{max} 这一点不难看出
  • 假设 Smin=0.2S_{min} = 0.2,Smax=0.95S_{max} = 0.95m=6m=6 条件下,那么公式就等于
Sk=0.2+0.950.261(k1)=0.2+0.15(1k)S_k = 0.2 + \frac{0.95 - 0.2}{6-1}(k-1) = 0.2 + 0.15(1-k)
ara_r

关于 ara_r 的取值如下

ar{1,2,3,12,13}a_r \in \{1,2,3,\frac{1}{2},\frac{1}{3}\}
举一个例子

还是以上面 Smin=0.2S_{min} = 0.2Smax=0.95S_{max} = 0.95m=6m=6ara_r 取值作为已知条件来计算当 k=1,ar=12k=1, a_r = \frac{1}{2} 时候比例。

S4=0.2+0.15(41)=0.65w4a=0.651/2=0.46h4a=0.65/1/2=0.92S_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

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

Sk=SkSk+1S_k^{\prime} = \sqrt{S_kS_{k+1}}
S5=0.2+0.15(15)=0.8S4=S4S5=0.65×0.8=0.72S_{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,12)(1,2,\frac{1}{2}) 而其他位置输出特征层上 default box 为 6 个 1,2,12,3131, 2, \frac{1}{2}, 3 \frac{1}{3}

对于默认框中心点的取值

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

(cx,cy)=(i+0.5fk,j+0.5fk)(c_x,c_y) = \left( \frac{i+0.5}{|f_k|},\frac{j+0.5}{|f_k|} \right)

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

特征层特征层的大小默认框尺寸默认框宽高比默认框数量
138×3838 \times 38211,2,1/238×38×438 \times 38 \times 4
219×1919 \times 19451,2,3,1/2,1/319×19×619 \times 19 \times 6
310×1010 \times 10991,2,3,1/2,1/310×10×610 \times 10 \times 6
45×55 \times 51531,2,3,1/2,1/35×5×65 \times 5 \times 6
53×33 \times 32071,2,1/23×3×43 \times 3 \times 4
61×11 \times 12611,2,1/21×1×41 \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×33 \times 3 的卷积进行预测每一个位置的输出。

在推理过程中,例如对于m×n×pm\times n\times p 这里 m 和 n 是特征层的大小,而 p 为通道数,在预测过程中,会用 3×3×p3 \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

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

收藏成功!
已添加到「」, 点击更改