【目标检测】SSD: Single Shot MultiBox Detector


论文

SSD

SSD是在YOLO之后出的一个single stage的检测模型,精度与Faster R-CNN相当,但速度可以达到59FPS。

SSD的模型架构

特征提取

采用VGG-16提取特征,将两个全连接层换成了两个卷积层,并在后面额外增加了4组共计8个卷积层(每一组都是1×1卷积接3×3卷积),这样得到了多个尺度不同的特征图。

anchors生成

anchor在原文中称为default box

特征图上每一个格子称为cell,在特征图每一个cell中设置大小形状不同的anchor。假设特征图大小是 m × n × c m×n×c m×n×c,每个cell中设置anchor的个数是k,那么这个特征图产生的anchor的总个数是 m n k m\cdot n \cdot k mnk

例如这个8×8的特征图,每个cell设置3个anchor,那么总的anchor个数是8×8×3=192

不同尺寸的特征图上anchor的感受野不一样,为了充分利用提取出来的特征,保证大物体和小物体都能得到好的检测效果,再不同的feature maps上生成anchor。

特征图大小 cell中anchor个数 anchor总个数
conv4_3 38*38 4 5776
conv7 19*19 6 2166
conv8_2 10*10 6 600
conv9_2 5*5 6 150
conv10_2 3*3 4 36
conv11_2 1*1 4 4

总计共生成8732个anchors。相比于YOLO 7×7×2=49,多出了很多,所以能解决YOLO召回率低的问题。

预测

对每一个anchor,要预测4个位置变换参数(anchor相对于gt box应该进行的变换参数)和C个类别概率。总共(C+4)个参数。二者都是通过一个 3 3 3*3 33的卷积来完成,如下图所示。

假设特征图大小5×5,anchor数为3。因此总共anchor数为75;在预测位置变换参数的分支上,每个cell需要预测4×3(3指anchor个数)个参数;在预测类别概率上,每个cell需要预测21×3的参数(21为类别,3为anchor数)

对类别参数取softmax函数,就能得到每个anchor哪个类别概率最大以及概率具体的值。

非极大值抑制

根据生成的预测结果,执行非极大值抑制算法,就能得到预测结果。

训练

匹配策略
训练的时候要为生成的anchor指定gt,由于生成的anchor很多,但真正和gt有大部分重叠的只是一小部分。对于和gt有较大重叠部分的,训练的时候更容易回归到gt的位置。在为anchor指定gt的时候,流程如下

  • 首先,对每一个gt,找到与之IoU最大的anchor,设定该anchor的gt;

由于生成的anchor很多,gt很少,这样正样本数目仍然很少,因此执行第二个原则。

  • 其次,对于剩下每一个anchor,找到与其IoU最大的gt,若IoU大于0.5,则将该anchor的目标定为该gt。注意!一个anchor只能对应一个gt,而一个gt可以对应多个anchor。标记该anchor为正样本
  • 最后,由于这样正样本的数目还是远少于负样本数目,因此在计算损失时要限制负样本的数目。选取背景置信度较小(置信度误差较大)的负样本,使得正负样本数目在1:3左右。

损失函数

损失函数包含置信度损失和位置损失:
L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + α L l o c ( x , l , g ) ) L(x, c, l, g)=\frac{1}{N}\left(L_{conf}(x, c)+\alpha L_{l o c}(x, l, g)\right) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))

  • c 置信度
  • l l l预测框体
  • g g g实际框体
  • N N N正样本数目

先看位置损失:
L l o c ( x , l , g ) = <munderover> i <mtext> Pos </mtext> N </munderover> <munder> m { c x , c y , w , h } </munder> x i j k smooth L 1 ( l i m <mover accent="true"> g ^ </mover> j m ) L_{l o c}(x, l, g)=\sum_{i \in \text {Pos} }^{N} \sum_{m \in\{c x, c y, w, h\}} x_{i j}^{k} \operatorname{smooth}_{L 1}\left(l_{i}^{m}-\hat{g}_{j}^{m}\right) Lloc(x,l,g)=iPosNm{cx,cy,w,h}xijksmoothL1(limg^jm)

计算所有正样本和它对应gt的损失,损失共有四项,框体的中心坐标(x,y)和宽高。这里并不是预测他们实际的值,而是预测相对于anchor的变换参数。变换方法如下:
<mover accent="true"> g ^ </mover> j c x = ( g j c x d i c x ) / d i w <mover accent="true"> g ^ </mover> j c y = ( g j c y d i c y ) / d i h <mover accent="true"> g ^ </mover> j w = log ( g j w d i w ) <mover accent="true"> g ^ </mover> j h = log ( g j h d i h ) \hat{g}_{j}^{c x}=\left(g_{j}^{c x}-d_{i}^{c x}\right) / d_{i}^{w} \\ \hat{g}_{j}^{c y}=\left(g_{j}^{c y}-d_{i}^{c y}\right) / d_{i}^{h} \\ \hat{g}_{j}^{w}=\log \left(\frac{g_{j}^{w}}{d_{i}^{w}}\right) \\ \hat{g}_{j}^{h}=\log \left(\frac{g_{j}^{h}}{d_{i}^{h}}\right) g^jcx=(gjcxdicx)/diwg^jcy=(gjcydicy)/dihg^jw=log(diwgjw)g^jh=log(dihgjh)

再看置信度损失:
L c o n f ( x , c ) = <munderover> i <mtext> Pos </mtext> N </munderover> x i j p log ( <mover accent="true"> c ^ </mover> i p ) <munder> i N e g </munder> log ( <mover accent="true"> c ^ </mover> i 0 ) <mtext>  where  </mtext> <mover accent="true"> c ^ </mover> i p = exp ( c i p ) <munder> p </munder> exp ( c i p ) L_{c o n f}(x, c)=-\sum_{i \in \text {Pos}}^{N} x_{i j}^{p} \log \left(\hat{c}_{i}^{p}\right)-\sum_{i \in N e g} \log \left(\hat{c}_{i}^{0}\right) \quad \text { where } \quad \hat{c}_{i}^{p}=\frac{\exp \left(c_{i}^{p}\right)}{\sum_{p} \exp \left(c_{i}^{p}\right)} Lconf(x,c)=iPosNxijplog(c^ip)iNeglog(c^i0) where c^ip=pexp(cip)exp(cip)
置信度损失正样本和负样本都要计算。式中的 p p p指正样本对应的类别,0指的是背景类。

anchor尺寸和形状的选取

先看大小:
在不同的features maps上设置的anchor大小不一样。越浅层的feature maps,anchor越小。设置方式如下:
s k = s min + s max s min m 1 ( k 1 ) , k [ 1 , m ] s_{k}=s_{\min }+\frac{s_{\max }-s_{\min }}{m-1}(k-1), \quad k \in[1, m] sk=smin+m1smaxsmin(k1),k[1,m]
s m i n = 0.2 , s m a x = 0.9 s_{min}=0.2, s_{max}=0.9 smin=0.2,smax=0.9。s指相对于feature maps的缩放系数。

再看形状:宽高的比例有5种: a r 1 , 2 , 3 , 1 2 , 1 3 a_r \in {1,2,3,\frac{1}{2}, \frac{1}{3}} ar1,2,3,21,31。因此就能计算出宽和高的值: w k a = s k a r , h k a = s k / a r w_k^a=s_k\sqrt{a_r}, h_k^a=s_k/\sqrt{a_r} wka=skar ,hka=sk/ar

最后计算anchor中心坐标 x = i + 0.5 f k , y = j + 0.5 f k x=\frac{i+0.5}{|f_k|}, y=\frac{j+0.5}{|f_k|} x=fki+0.5,y=fkj+0.5, 其中 f k f_k fk是特征图的大小, i , j i,j i,j是anchor所在cell对应在特征图上的位置, 0.5 0.5 0.5是为了将中心设置在cell中心。

数据增强的方法

  • 直接输入原图
  • 在原图上采样patch(与原图的比例为[0.1,0.9],aspect ratio为[0.5,2]),patch与目标的最小IoU为[0.1,0.3,0.5,0.7,0.9]。

实验结论

  • 数据增强很重要
  • anchor形状越多越好
  • 使用空洞卷积更快
  • 使用不同尺度的特征图,能提高精度
全部评论

相关推荐

11-20 17:33
已编辑
门头沟学院 嵌入式工程师
小米汽车 底软测开岗 n*15(15大概率拿不到) 双非硕
点赞 评论 收藏
分享
牛客963010790号:为什么还要收藏
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务