SSD: Single Shot MultiBox Detector

SSD: Single Shot MultiBox Detector

SSD创新点

  1. 基于Faster R-CNN中的Anchor,提出了相似的先验框(Prior box)
  2. 从不同比例的特征图(多尺度特征)中产生不同比例的预测,并明确地按长宽比分离预测。

不同于前面的R-CNN系列,SSD属于one-stage方法。SSD使用 VGG16 网络作为特征提取器(和 Faster R-CNN 中使用的 CNN 一样),将后面的全连接层替换成卷积层,并在之后添加自定义卷积层,并在最后直接采用卷积进行检测。在多个特征图上设置不同缩放比例和不同宽高比的先验框以融合多尺度特征图进行检测,靠前的大尺度特征图可以捕捉到小物体的信息,而靠后的小尺度特征图能捕捉到大物体的信息,从而提高检测的准确性和定位的准确性。如下图是SSD的网络结构图。
在这里插入图片描述

SSD使用VGG-16-Atrous作为基础网络,其中黄色部分为在VGG-16基础网络上填加的特征提取层。SSD与yolo不同之处是除了在最终特征图上做目标检测之外,还在之前选取的5个特特征图上进行预测。
上图为SSD网络进行一次预测的示意图,可以看出,检测过程不仅在填加特征图(conv8_2, conv9_2, conv_10_2, pool_11)上进行,为了保证网络对小目标有很好检测效果,检测过程也在基础网络特征图(conv4_3, conv_7)上进行。

SSD算法步骤:

  1. 输入一幅图片(300x300),将其输入到预训练好的分类网络中来获得不同大小的特征映射,修改了传统的VGG16网络;
  • 将VGG16的FC6和FC7层转化为卷积层,如图的Conv6和Conv7;
  • 去掉所有的Dropout层和FC8层;
  • 添加了Atrous算法(hole算法)
  • 将Pool5从2x2-S2变换到3x3-S1;
  1. 抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2层的feature map,然后分别在这些feature map层上面的每一个点构造6个不同尺度大小的BB,然后分别进行检测和分类,生成多个BB,如下图所示;

  2. 将不同feature map获得的BB结合起来,经过NMS(非极大值抑制)方法来抑制掉一部分重叠或者不正确的BB,生成最终的BB集合(即检测结果);
    在这里插入图片描述

Default box

文章的核心之一是作者同时采用lower和upper的feature map做检测。
如图所示,这里假定有8×8和4×4两种不同的feature map。
在这里插入图片描述

第一个概念是feature map cell,feature map cell 是指feature map中每一个小格子,如图中分别有64和16个cell。
另外有一个概念:default box,是指在feature map的每个小格(cell)上都有一系列固定大小的box,如下图有4个(下图中的虚线框,仔细看格子的中间有比格子还小的一个box)。
假设每个feature map cell有k个default box,那么对于每个default box都需要预测c个类别score和4个offset,那么如果一个feature map的大小是m×n,也就是有m×n个feature map cell,那么这个feature map就一共有(c+4)× k×m×n 个输出。这些输出个数的含义是:采用3×3的卷积核对该层的feature map卷积时卷积核的个数,包含两部分(实际code是分别用不同数量的3×3卷积核对该层feature map进行卷积):数量c×k×m×n是confidence输出,表示每个default box的confidence,也就是类别的概率;数量4×k×m×n是localization输出,表示每个default box回归后的坐标)。
训练中还有一个东西:prior box,是指实际中选择的default box(每一个feature map cell 不是k个default box都取)。也就是说default box是一种概念,prior box则是实际的选取。训练中一张完整的图片送进网络获得各个feature map,对于正样本训练来说,需要先将prior box与ground truth box做匹配,匹配成功说明这个prior box所包含的是个目标,但离完整目标的ground truth box还有段距离,训练的目的是保证default box的类confidence的同时将prior box尽可能回归到ground truth box。
举个例子:假设一个训练样本中有2个ground truth box,所有的feature map中获取的default box一共有8732个。那个可能分别有10、20个prior box能分别与这2个ground truth box匹配上。训练的损失包含定位损失和回归损失两部分。
作者的实验表明default box的shape数量越多,效果越好。
这里用到的 default box和Faster RCNN中的 anchor很像,在Faster RCNN中 anchor 只用在最后一个卷积层,但是在本文中,default box 是应用在多个不同层的feature map上。
那么default box的scale(大小)和aspect ratio(横纵比)要怎么定呢?假设我们用m个feature maps做预测,那么对于每个featuer map而言其default box的scale是按以下公式计算的:
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 min ⁡ s_{\min } smin是0.2,表示最底层的scale是0.2; s max ⁡ s_{\max } smax是0.9,表示最高层的scale是0.9。
至于aspect ratio,用 a r a_{r} ar表示为下式:注意这里一共有5种aspect ratio
a r = { 1 , 2 , 3 , 1 / 2 , ∣ 1 / 3 } a_{r}=\{1,2,3,1 / 2, | 1 / 3\} ar={1,2,3,1/2,1/3}

因此每个default box的宽的计算公式为:
( w k a = s k a r ) \left(w_{k}^{a}=s_{k} \sqrt{a_{r}}\right) (wka=skar )
高的计算公式为:(很容易理解宽和高的乘积是scale的平方)
( h k a = s k / a r ) \left(h_{k}^{a}=s_{k} / \sqrt{a_{r}}\right) (hka=sk/ar )
另外当aspect ratio为1时,作者还增加一种scale的default box:
s k ′ = s k s k + 1 s_{k}^{\prime}=\sqrt{s_{k} s_{k+1}} sk=sksk+1
因此,对于每个feature map cell而言,一共有6种default box。
可以看出这种default box在不同的feature层有不同的scale,在同一个feature层又有不同的aspect ratio,因此基本上可以覆盖输入图像中的各种形状和大小的object!

(训练自己的样本的时候可以在FindMatch()之后检查是否能覆盖了所有的 ground truth box)

将prior box和 grount truth box 按照IOU(JaccardOverlap)进行匹配,匹配成功则这个prior box就是positive example(正样本),如果匹配不上,就是negative example(负样本),显然这样产生的负样本的数量要远远多于正样本。这里将前向loss进行排序,选择最高的num_sel个prior box序号集合 D。那么如果Match成功后的正样本序号集合P。那么最后正样本集为 P - Dcap{P},负样本集为 D - Dcap{P}。同时可以通过规范num_sel的数量(是正样本数量的三倍)来控制使得最后正、负样本的比例在 1:3 左右。

正负样本获得

  1. 正样本获得

已经确定 default box,结合 ground truth,下一步要将 default box 匹配到 ground truth 上,从 groudtruth box 出发给每个 groudtruth box 找到了最近(IOU最大)的 default box 放入 候选正样本集。然后再从 default box 出发为 default box 集中寻找与 groundtruth box 满足 IOU>0.5 的的default box放入候选正样本集。
2. 负样本获得(这是一个难例挖掘的过程)

在生成 prior boxes 之后,会产生很多个符合 ground truth box 的 positive boxes(候选正样本集),但同时,不符合 ground truth boxes 也很多,而且这个 negative boxes(候选负样本集),远多于 positive boxes。这会造成 negative boxes、positive boxes 之间的不均衡。训练时难以收敛。

将每一个GT上对应prior boxes的分类loss 进行排序。

对于候选正样本集:选择loss最高的m个 prior box 与候选正样本集匹配 (box 索引同时存在于这两个集合里则匹配成功),匹配不成功则删除这个正样本(因为这个正样本loss太低(因为符合标准所以损失小(y, y”)),易被识别,所以不在难例里,已经很接近 ground truth box 了,不需要再训练);

对于候选负样本集:选择损失最高的m个 prior box 与候选负样本集匹配,匹配成功的则留下来作为最后的负样本,不成功剔除出候选负样本,因为他们loss不够大,易被识别为背景,训练起来没难度没提升空间。

  1. 举例:假设在这 8732 个 default box 里,经过 FindMatches 后得到候选正样本 P 个,候选负样本那就有 8732−P个。将 prior box 的 prediction loss 按照从大到小顺序排列后选择最高的 M个 prior box。如果这 P 个候选正样本里有 a 个 box 不在这 M 个 prior box 里,将这 a个 box 从候选正样本集中踢出去。如果这 8732−P个候选负样本集中有 b个在这 M 个 prior box,则将这b个候选负样本作为正式负样本。即删除易识别的正样本,同时留下典型的负样本,组成1:3的prior boxes样本集合。SSD 算法中通过这种方式来保证 positives、negatives 的比例。

在这里插入图片描述

Hard example mining

example mining 是选择出特定样本来计算损失函数;从实际问题出发 hard example 应该就是指定位较困难或分类较困难或者两者都困难的候选框。
hard negative example 或 Hard positive example 的定义需要首先确定某个候选框是 negative example 还是 positive example。比如 SSD 中将与任意 gt_bbox 的 IOU 超过给定阈值 overlap_threshold(multibox_loss_param 中的一个字段,SSD 默认为 0.5)的当作正样本,即前景类别为正样本,背景类别为负样本。比如,极端的例子,当图像中没有 gt_bbox 时,那么所有的 default bboxes 都是 negative example。

SSD 中 negative mining 只计算分类损失而不计算定位损失,而 hard example mining 对分类损失和定位损失都进行计算。
SSD 的 negative mining 的过程为:

  1. 生成default bboxes,每个检测器对应特征图生成的default boxes数目为n×n×6或n×n×4;

  2. 匹配default boxes,将每个 default box 与 ground truth 匹配,保证每个ground truth 都能对应多个default boxes,避免漏检;

  3. 衡量default boxes,当第 i 个 default box 被匹配到第 j 个 gt_bbox,那么计算其属于背景类别的 softmax loss 或 cross entropy loss 值;
    S i = e V i ∑ i C e V i S_{i}=\frac{e^{V_{i}}}{\sum_{i}^{C} e^{V_{i}}} Si=iCeVieVi
    其中 V i V_i Vi是分类器前级输出单元的输出,i表示类别索引,总的类别个数是C, S i S_i Si表示当前元素的指数与所有元素指数之和的比值.然后Softmax将多分类的输出转化为相对概率。

  4. 筛选default boxes, 计算完所有default boxes 的分类 loss后,按照 loss 排序,选择 loss 较大且与任意 gt_bbox 之间的 iou 小于 阈值neg_overlap 的样本中的前 3*num_positive 个负样本(保证留下的负样本“够坏”,同时保证1:3的正负比例)。

最后,这正负比为1:3的部分default boxes就是筛选全体default box后剩下的prior boxes,用这些prior box作为参考,对所有预测框其进行分类和回归,进行反向传播更新网络参数,即训练。

损失函数

在这里插入图片描述

(1) 每一个 prior box 经过Jaccard系数计算和真实框的相似度。
(2) 阈值只有大于 0.5 的才可以列为候选名单;假设选择出来的是N个匹配度高于百分之五十的框。
(3) 我们令 i 表示第 i 个默认框,j 表示第 j 个真实框,p表示第p个类。那么xi,jp 表示 第 i 个 prior box 与 类别 p 的 第 j 个 ground truth box 相匹配的Jaccard系数,若不匹配的话,则xi,jp=0 。
(4)总的目标损失函数(objective loss function)为 localization loss(loc) 与 confidence loss(conf) 的加权求和。

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_{c o n f}(x, c)\right)+\alpha L_{l o c}(x, l, g) L(x,c,l,g)=N1(Lconf(x,c))+αLloc(x,l,g)

L l o c ( x , l , g ) = ∑ i ∈ Pos N ∑ m ∈ { c x , c y , w , h } x i j k s smooth ⁡ L 1 ( l i m − g ^ 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} s \operatorname{smooth}_{L 1}\left(l_{i}^{m}-\hat{g}_{j}^{m}\right) Lloc(x,l,g)=iPosNm{cx,cy,w,h}xijkssmoothL1(limg^jm)

g ^ j c x = ( g j c x − d i c x ) / d i w g ^ j c y = ( g j c y − d i c y ) / d i h \hat{g}_{j}^{c x}=\left(g_{j}^{c x}-d_{i}^{c x}\right) / d_{i}^{w} \quad \hat{g}_{j}^{c y}=\left(g_{j}^{c y}-d_{i}^{c y}\right) / d_{i}^{h} g^jcx=(gjcxdicx)/diwg^jcy=(gjcydicy)/dih

g ^ j w = log ⁡ ( g i w / d i h ) g ^ j h = log ⁡ ( g j h / d i h ) \hat{g}_{j}^{w}=\log \left(g_{i}^{w} / d_{i}^{h}\right) \quad \hat{g}_{j}^{h}=\log \left(g_{j}^{h} / d_{i}^{h}\right) g^jw=log(giw/dih)g^jh=log(gjh/dih)

L c o n f ( x , c ) = − ∑ i ∈ P o s N x i j p log ⁡ ( c ^ i p ) − ∑ i ∈ N e g log ⁡ ( c ^ i 0 )  where  c ^ i p = exp ⁡ ( c i p ) ∑ p exp ⁡ ( c i p ) L_{c o n f}(x, c)=-\sum_{i \in P o s}^{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)

训练trick

  1. 数据增强
    SSD训练过程中使用的数据增强对网络性能影响很大,大约有6.7%的mAP提升。
    (1) 随机剪裁:采样一个片段,使剪裁部分与目标重叠分别为0.1, 0.3, 0.5, 0.7, 0.9,剪裁完resize到固定尺寸。
    (2) 以0.5的概率随机水平翻转。
  2. 是否在基础网络部分的conv4_3进行检测
    基础网络部分特征图分辨率高,原图中信息更完整,感受野较小,可以用来检测图像中的小目标,这也是SSD相对于YOLO检测小目标的优势所在。增加对基础网络conv4_3的特征图的检测可以使mAP提升4%。
  3. 使用瘦高与宽扁默认框
    数据集中目标的开关往往各式各样,因此挑选合适形状的默认框能够提高检测效果。作者实验得出使用瘦高与宽扁默认框相对于只使用正方形默认框有2.9%mAP提升。
  4. 使用atrous卷积
    通常卷积过程中为了使特征图尺寸特征图尺寸保持不变,通过会在边缘打padding,但人为加入的padding值会引入噪声,因此,使用atrous卷积能够在保持感受野不变的条件下,减少padding噪声,关于atrous参考。本文SSD训练过程中并且没有使用atrous卷积,但预训练过程使用的模型为VGG-16-atrous,意味着作者给的预训练模型是使用atrous卷积训练出来的。使用atrous版本VGG-16作为预训模型比较普通VGG-16要提高0.7%mAP。

Atrous Convolution解释

在这里插入图片描述

上图(b)是带洞卷积,可以跳着选,隔一个加一个。
下图中第三个示例(c),就是带洞卷积。
在这里插入图片描述
卷积减少了核的大小,可以达到节省内存的作用。
而且带洞卷积的有效性基于一个假设:紧密相邻的像素几乎相同,全部纳入属于冗余,不如跳H(hole size)个取一个。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cpp编程小茶馆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值