SSD: Single Shot MultiBox Detector

1. Introduction

改进点:

  • 以前的方法都是先搞bounding box,再对box里面做分类。特点:精度高,速度慢。
    SSD不需要在bounding box上采样,特点:精度高,速度快。
  • 小卷积核在bounding box上做类别和偏移预测,
  • 在不同尺度的特征图上做不同尺度的预测,通过宽高比来明确的分离预测。

2. The Single Shot Detector(SSD)

2.1 Model

基础网络,如VGG,截断到分类层之前,作为基础网络。后面接附属架构,附属架构有以下特点:

  • 基础网络后添加的卷积层大小逐层递减,使检测具有多尺度特征。
  • 在SSD的顶部,每个增加的特征层,使用一组卷积核生成固定大小的predictions。对\(p\)通道\(m\times n\)的特征层,用\(3\times 3\times p\)的卷积核卷积,生成类别得分和坐标偏移。
  • 在给定位置的k个框,计算c类分数和4个偏移量。因此特征图中每个位置需要(c+4)k个卷积核,对于m*n特征图产生(c+4)kmn个输出。在多个特征图中使用不同形状的默认框,可有效的离散可能的输出框形状空间。

2.2 Training

选择用于检测的default box和尺度集合、难样本挖掘、数据增广策略。

  • 匹配策略: 训练阶段建立真实标签和默认框对应关系,真实标签从默认框中选择。开始先匹配每个真实标签框与默认框最好的jaccard重叠,确保每个真实标签框有一个匹配的默认框,然后匹配默认框与真实标签框jaccard重叠高于阈值0.5的默认框。这样就允许网络对多个重叠的默认框预测获得高置信度,而不是只选择最大重叠的一个。
  • 训练:

\[\left\{\begin{align}
& g:ground\ truth\ box\\
& l:predicted\ box\\
& d:default\ bounding\ box\\
& w:width\\
& h:height
\end{align}\right.\]

LOSS计算公式:
\[L(x,c,l,g)=\frac {1} {N}(L_{conf}(x,c))+αL_{loc}(x,l,g)\tag{1}\]
定位LOSS:
\[L_{loc}(x,l,g) = \sum_{i\in Pos}^{N}\sum_{m\in\{cx,cy,w,h\}}x_{ij}^ksmooth_{L1}(l_i^m-\hat{g}_j^m)\]
\[\hat{g}_j^{cx}=(g_j^{cx}-d_i^{cx})/d_i^w \quad \tag{2} \hat{g}_j^{cy}=(g_j^{cy}-d_i^{cy})/d_i^h\]
\[\hat{g}_j^{w}=log(g_j^{w}/d_i^h) \quad \hat{g}_j^{h}=log(g_j^{h}/d_i^h)\]
置信度损失(confidence loss):
\[L_{conf}(x,c)=-\sum_{i\in Pos}^N x_{ij}^p log(\hat{c}_i^p) - \sum_{i\in Neg} log(\hat{c}_i^0) \quad where \quad\hat{c}_i^p = \frac {exp(c_i^p)}{\sum_p exp(c_i^p)}\tag{3}\]

  • 在默认框上选择尺度和宽高比:同时使用低层和高层特征图来检测。
    一般来说,一个 CNN 网络中不同的 layers 有着不同尺寸的 感受野(receptive fields)。这里的感受野,指的是输出的 feature map 上的一个节点,其对应输入图像上尺寸的大小。具体的感受野的计算,参见两篇 blog:
    http://blog.csdn.net/kuaitoukid/article/details/46829355
    http://blog.cvmarcher.com/posts/2015/05/17/cnn-trick/
    但是在SSD 结构中,default boxes 不必要与每一层 layer 的 receptive fields 对应。本文的设计中,feature map 中特定的位置负责图像中特定的区域,以及物体特定的尺寸。假如我们用 \(m\) 个 feature maps 来做 predictions,每一个 feature map 中 default box 的尺寸大小计算如下:

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

其中\(s_{min}=0.2,s_{max}=0.9\)
再对每个default box做不同宽高比,
令aspect ratio:\(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时,额外加一个\(s'_k=\sqrt{s_ks_{k+1}}\)。
整理如下:

\[\left\{
\begin{array}{l}
\ s_k = s_{min} + \frac{s_{max} - s_{min}}{m-1}(k-1), \ \ k \in [1, m] \\
\ s'_k=\sqrt{s_ks_{k+1}} \\
\hskip -1.3mm {
\left.
\begin{array}{l}
\ w_k^a=s_k\sqrt {a_r} \\
\ h_k^a=s_k/\sqrt{a_r} \\
\end{array}
\right\} a_r\in \{1,2,3,\frac {1}{2},\frac{1}{3}\}
}
\end{array}
\right.\]

e.g.
\[设m=6,s_{min}=0.2,s_{max}=0.9 \]

\[\left\{\begin{align}
& s_1=0.2+\frac {0.7}{5}(1-1)=0.2\ ,\\
& w_1^a=0.2*\sqrt{\{1,2,3,\frac{1}{2},\frac{1}{3}\}}=
0.2*\{1,1.41,1.73,0.71,0.58\} \ ,\\
& h_1^a=0.2/\sqrt{\{1,2,3,\frac{1}{2},\frac{1}{3}\}} \ ,\\
& s'_1=\sqrt{s_1s_2}\approx 0.2608
\end{align}\right.\]

\[s_2=0.2+\frac {0.7}{5}(2-1)=0.34 \\
s_3=0.2+\frac {0.7}{5}(3-1)=0.48 \\
s_4=0.2+\frac {0.7}{5}(4-1)=0.62 \\
s_5=0.2+\frac {0.7}{5}(5-1)=0.76 \\
s_6=0.2+\frac {0.7}{5}(6-1)=0.9\],

\[\left\{
\begin{array}{l}
\left.
\begin{array}{l}
s_1=0.2+\frac {0.9-0.2}{6-1}(1-1)=0.2 ,\\
w_1^a=0.2*\sqrt{\{1,2,3,\frac{1}{2},\frac{1}{3}\}},\\
h_1^a=0.2/\sqrt{\{1,2,3,\frac{1}{2},\frac{1}{3}\}},\\
s'_1=\sqrt{s_1s_2}\approx 0.2608\\
\end{array}
\right\} {(w_1^a,h_1^a)=\{(0.2,0.2),(0.282,0.1418),(0.346,0.1156),\\\quad\quad\quad\quad\quad(0.142,0.2816),(0.116,0.3448),(0.2608,0.2608)\}} \\\\
\left.
\begin{array}{l}
s_2=0.2+0.14*(2-1)=0.34 ,\\
w_2^a=0.34*\{1,1.41,1.73,0.71,0.58\},\\
h_2^a=0.34/\{1,1.41,1.73,0.71,0.58\},\\
s'_2=\sqrt{s_2s_3}\approx 0.4040\\
\end{array}
\right\} {(w_2^a,h_2^a)=\{(0.34,0.34),(0.4794,0.2411),(0.5882,0.1965),\\\quad\quad\quad\quad\quad(0.2414,0.4789),(0.1972,0.5862),(0.4040,0.4040)\}} \\\\
\left.
\begin{array}{l}
s_3=0.2+0.14*(3-1)=0.48 ,\\
w_3^a=0.62*\{1,1.41,1.73,0.71,0.58\},\\
h_3^a=0.62/\{1,1.41,1.73,0.71,0.58\},\\
s'_3=\sqrt{s_3s_4}\approx 0.5455\\
\end{array}
\right\} {(w_3^a,h_3^a)=\{(0.48,0.48),(0.6768,0.3404),(0.8304,0.2775),\\\quad\quad\quad\quad\quad(0.3408,0.6760),(0.2784,0.8276),(0.5455,0.5455)\}} \\\\
\left.
\begin{array}{l}
s_4=0.2+0.14*(4-1)=0.62 ,\\
w_4^a=0.62*\{1,1.41,1.73,0.71,0.58\},\\
h_4^a=0.62/\{1,1.41,1.73,0.71,0.58\},\\
s'_4=\sqrt{s_1s_2}\approx 0.1632\\
\end{array}
\right\} {(w_4^a,h_4^a)=\{(0.62,0.62),(0.8742,0.4397),(1.0726,0.3584),\\\quad\quad\quad\quad\quad(0.4402,0.8732),(0.3596,1.0690),(0.1632,0.1632)\}} \\\\
\left.
\begin{array}{l}
s_5=0.2+0.14*(5-1)=0.76 ,\\
w_5^a=0.9*\{1,1.41,1.73,0.71,0.58\},\\
h_5^a=0.9/\{1,1.41,1.73,0.71,0.58\},\\
s'_5=\sqrt{s_1s_2}\approx 0.8270\\
\end{array}
\right\} {(w_5^a,h_5^a)=\{(0.76,0.76),(1.0716,0.5390),(1.3148,0.4393),\\\quad\quad\quad\quad\quad(0.5396,1.0704),(0.4408,1.3103),(0.827,0.827)\}} \\\\
\left.
\begin{array}{l}
s_6=0.2+0.14*(6-1)=0.9 ,\\
w_6^a=0.9*\{1,1.41,1.73,0.71,0.58\},\\
h_6^a=0.9/\{1,1.41,1.73,0.71,0.58\},\\
s'_6=\sqrt{s_6s_7}\approx 1.04\\
\end{array}
\right\} {(w_6^a,h_6^a)=\{(0.9,0.9),(1.269,0.6382),(1.557,0.5202),\\\quad\quad\quad\quad\quad(0.639,1.2676),(0.522,1.5517),(1.04,1.04)\}} \\
\end{array}
\right.\]

每一个 default box 的中心,设置为:\((i+0.5*|fk|,j+0.5*|fk|),其中|f_k|表示第k个正方形特征图的大小,i,j\in[0,|f_k|)\)。

  • 难样本挖掘: 由于正负样本不均衡,因此对default boxes以confidence loss由高到低排序,取最高的一些值,把将正负样本控制在3:1的范围。

  • 数据扩容:
    • 使用原始图像
    • 采样一个patch,与目标间最小的jaccard overlap为:0.1,0.3,0.5,0.7,0.9.
    • 随机采样一个patch.
      每个采样的patch大小为原始图像的[0.1,1],aspect ratio在\(\frac {1}{2}和2\)之间.
      当ground truth box的中心在patch中时,保留重叠部分.
      每个采样的patch被resize到固定大小,并以0.5的概率随机水平翻转。

3 Experimental Results

Base network 实验基于VGG16,z ILSVRC CLS-LOC上做了预训练。把fc6和fc7改成了卷积层,并对fc6和fc7参数进行降采样。把pool5的2x2-s2改为3x3-s1,并使用atrous算法填充“空洞”1

这样做之后可以让pool5的feature maps 保持较大的尺寸,这篇ECCV16论文也采用了同样的策略使得feature maps 分辨率比传统的更高,有利于小物体的检测。
pool5这样改变这之后,后面层的感受野将改变,因此也不能用原来网络的参数进行finetune,为了解决这样的矛盾,atrous算法提出。

图(a)展示是传统的过程,经过3x3-s2的pooling后,接一个3x3的conv,那么卷积层的一个神经元感受野是7
图(b)是atrous过程,现在Pooling层是3x3-s1,后面的卷积层为了能够使用原来的参数初始化必须使用带孔的卷积,这里卷积层的一个神经元的感受野也是7。

3.1 PASCAL VOC2007

PASCAL VOC 2007

如图所示,
conv4_3,conv7(fc7),conv8_2,conv9_2,conv10_2,conv11_2这些层用来预测位置和置信度。

在conv4_3上设置default box尺度0.1。

新增的层都用Xavier初始化参数。

对于conv4_3,conv10_2,conv11_2,每个feature map的location上只关联4个default box,(因为conv4_3的尺寸比较大,size为\(38\times 38\),放6个default box的话计算量会过大),去掉了aspect ratio为\(\frac {1} {3}和3\)的那俩。其他层都设置了6个default box。

文献2中指出,conv4_3和其他层相比有着不同的feature scale

Figure 2: Features are in different scale. We show the features for a position from conv4 3, conv5 3, fc7 and pool6
when we concatenate them together.

我们使用ParseNet中的L2 Normalization将conv4_3 feature map中每个位置的feature归一化到scale为20的大小,并在BP中学习这个scale。

开始的40K次迭代,learning rate为\(10^{-3}\),之后减少到\(10^{-4}\),再迭代20K次。

3.2 Model analysis

定量分析:

  • Data augmentation提升明显
    Fast R-CNN 与 Faster R-CNN 使用原始图像,以及 0.5 的概率对原始图像进行水平翻转(horizontal flip),进行训练。如上面写的,本文还使用了额外的 sampling 策略,YOLO 中还使用了亮度扭曲(photometric distortions),但是本文中没有使用。
    做了数据增广,将 mAP 从 65.4% 提升到了 72.1%,提升了 6.7%。
    我们还不清楚,本文的 sampling 策略会对 Fast R-CNN、Faster R-CNN 有多少好处。但是估计不会很多,因为 Fast R-CNN、Faster R-CNN 使用了feature pooling,这比人为的对数据进行增广扩充,还要更 robust。
  • 使用更多的 feature maps 对结果提升更大
    类似于 FCN,使用含图像信息更多的低 layer 来提升图像分割效果。我们也使用了 lower layer feature maps 来进行 predict bounding boxes。
    我们比较了,当 SSD 不使用 conv4_3 来 predict boxes 的结果。当不使用 conv4_3,mAP 下降到了 68.1%。
    可以看见,低层的 feature map 蕴含更多的信息,对于图像分割、物体检测性能提升帮助很大的。
  • defualt boxes越多,结果越好
    如 Table 2 所示,SSD 中我们默认使用 6 个 default boxes(除了 conv4_3 因为大小问题使用了 3 个 default boxes)。如果将 aspect ratios 为 13、3 的 boxes 移除,performance 下降了 0.9%。如果再进一步的,将 12、2 的 default boxes 移除,那么 performance 下降了近 2%。
  • Atrous 使得SSD又好又快
    如前面所描述,我们根据 ICLR 2015, DeepLab-LargeFOV,使用结合 atrous algorithm 的 VGG16 版本。
    如果我们使用原始的 VGG16 版本,即保留 pool5 的参数为:2×2−s2,且不从 FC6,FC7 上采集 parameters,同时添加 conv5_3 来做 prediction,结果反而会下降 0.7%。同时最关键的,速度慢了 50%。

    PASCAL VOC 2012

    MS COCO

    为了进一步的验证本文的 SSD 模型,我们将 SSD300、SSD500 在 MS COCO 数据集上进行训练检测。

因为 COCO 数据集中的检测目标更小,我们在所有的 layers 上,使用更小的 default boxes。

这里,还跟 ION 检测方法 进行了比较。

总的结果如下:

Inference time

本文的方法一开始会生成大量的 bounding boxes,所以有必要用 Non-maximum suppression(NMS)来去除大量重复的 boxes。

通过设置 confidence 的阈值为 0.01,我们可以过滤掉大多数的 boxes。

之后,我们再用 Thrust CUDA library 进行排序,用 GPU 版本的实现来计算剩下的 boxes 两两之间的 overlap。然后,进行 NMS,每一张图像保留 top 200 detections。这一步 SSD300 在 VOC 20 类的每张图像上,需要耗时 2.2 msec。

下面是在 PASCAL VOC 2007 test 上的速度统计:


  1. SSD 里的 atrous. CSDN

  2. JMLR 2010, Understanding the difficulty of training deep feedforward neural networks.

SSD总结的更多相关文章

  1. SSD框架训练自己的数据集

    SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证.本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括: 1 数据集的标注2 数据集的转换3 使用SSD如 ...

  2. 光驱SSD安装Win7+ubuntu系统双系统

    准备条件: U盘,32GB,三星品牌 SSD,120GB,三星品牌 win7旗舰版,Ghost系统(安装简单嘛),Ylmf_Ghost_Win7_SP1_x64_2016_1011.iso ubunt ...

  3. 创建Azure DS 虚拟机并附加SSD硬盘

    $subscriptionName = "Windows Azure Enterprise Trial" #订阅名称 $location = "China East&qu ...

  4. 关闭电脑SSD的磁盘碎片整理

    小白往往会把机械硬盘时代的习惯带进固态硬盘时代,比如碎片整理.机械硬盘时代砖家最喜欢告诉小白:“系统慢了吧?赶紧碎片整理撒.”小白屁颠屁颠地整理去了.殊不知碎片整理对于SSD来说完全就是种折磨.这种“ ...

  5. SQL Server 2014新特性探秘(2)-SSD Buffer Pool Extension

    简介     SQL Server 2014中另一个非常好的功能是,可以将SSD虚拟成内存的一部分,来供SQL Server数据页缓冲区使用.通过使用SSD来扩展Buffer-Pool,可以使得大量随 ...

  6. Macbook SSD硬盘空间不够用了?来个Xcode大瘦身吧!

    原文转自:http://www.jianshu.com/p/03fed9a5fc63    日期:2016-04-22 最近突然发现我的128G SSD硬盘只剩下可怜的8G多,剩下这么少的一点空间连X ...

  7. 搭把手教美工妹妹如何通过升级SSD提升电脑性能

    -----by LinHan 不单单适用于妹子,我这名的意思的妹子也能看懂. 以下教程依据实践和部分互联网资料总结得出,向博客园, CSDN的前辈们致谢:同时,如有说的不正确或有不到位的地方,麻烦指出 ...

  8. [archlinux][hardware] ThankPad T450自带SSD做bcache之后的使用寿命分析

    这个分析的起因,是由于我之前干了这两个事: [troubleshoot][archlinux][bcache] 修改linux文件系统 / 分区方案 / 做混合硬盘 / 系统转生大!手!术!(调整底层 ...

  9. SSD Trim Support -- 保护 SSD

    今天同事告诉我,换了 ssd 之后需要做以下配置能使 ssd 寿命更长.原理是配置系统定期清理和回收 ssd 的资源. 最终效果: 步骤: 1.下载 trim enabler: https://gis ...

  10. 目标检测方法——SSD

    SSD论文阅读(Wei Liu--[ECCV2016]SSD Single Shot MultiBox Detector) 目录 作者及相关链接 文章的选择原因 方法概括 方法细节 相关背景补充 实验 ...

随机推荐

  1. cmd生成大文件

    用cmd生成一个大小一定的文件 输入fsutil file createnew  文件位置  文件大小(以字节为单位1024b=1kb) 列如:fsutil file createnew  d:\my ...

  2. split()函数实现

    #split函数实现: ss='** *axx* *bv** *ctt** **dff***' result=[] def split_1(ss,a,times=len(ss)): i=0 n=0 w ...

  3. flask参数传递

    一. 参数传递两种方式: 1.get请求 request.args.get("key") 获取get请求参数 2.post请求request.form.get("key& ...

  4. 解析.conf配置文件

    解析.conf配置文件 解析.conf配置文件 解析.conf配置文件

  5. 如何使用python异常---runtimeError方法

    RuntimeError def ilove(name): if name=='陈培昌': print('i love {0}'.format(name)) elif name == '程劲': pr ...

  6. 文件和I/O

    一.读写文本数据 (1)使用open()函数配合rt模式读取文本文件的内容:( t 为默认的文本模式) (2)执行写入操作,使用wt模式,如果待操作文件已存在,会清除并覆盖其原先的内容: (3)对已存 ...

  7. box-orient

    box-orient 语法: box-orient:horizontal | vertical | inline-axis | block-axis 默认值:horizontal 适用于:伸缩盒容器大 ...

  8. 【概率论】4-4:距(Moments)

    title: [概率论]4-4:距(Moments) categories: - Mathematic - Probability keywords: - Moments - Moments Gene ...

  9. vim 操作命令

    #显示行号,设定之后,会在每一行的前缀显示该行的行号:set nu #取消行号显示:set nonu #将编辑的数据写入硬盘档案中(常用):w #若文件属性为『只读』时,强制写入该档案.不过,到底能不 ...

  10. Spring Cloud Gateway(一):认识Spring Cloud Gateway

    1.Spring Cloud Gateway 简介 Spring Cloud Gateway 系列目录 Spring Cloud Gateway(一):认识Spring Cloud Gateway S ...