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. 数组方法push() pop() shift() unshift() splice() sort() reverse() contact()浅拷贝 slice()原数组拷贝

    push() pop() shift() unshift() splice() sort() reverse() 参考资料:https://wangdoc.com/javascript/stdlib/ ...

  2. asp.net mvc(模式)和三层架构(BLL、DAL、Model)的联系与区别 转载自:http://blog.csdn.net/luoyeyu1989/article/details/8275866

    首先,MVC和三层架构,是不一样的. 三层架构中,DAL(数据访问层).BLL(业务逻辑层).WEB层各司其职,意在职责分离. MVC是 Model-View-Controller,严格说这三个加起来 ...

  3. Windows10关闭自动更新总结

    试过好多关闭windows自动更新的方法,但是在每次重启后发现C盘又塞了一堆更新包,强迫症的我必须要彻底关闭它! 1. services关闭 运行 services.msc ,找到Windows Up ...

  4. Luogu P4082 [USACO17DEC]Push a Box 点双连通分量/圆方树

    (貌似有圆方树的做法,我写的是点双) 显然这道题就是直接搜索.定义状态为f[i][j][0~4]表示箱子在(i,j),人在某个方向推.然后问题就是怎么转向.我们发现如果要转向,必须是人走过一条不包括( ...

  5. python修改linux主机ip

    修改虚拟机的主机ip 和hostname import os, sys def conf_ip(ip): iplist = [] f = open("/etc/sysconfig/netwo ...

  6. Matlab step方法

    在Matlab中我们经常能看到Java的影子,即面向对象编程(Object Oriented Programming,OOP). 以Turbo编码为例: hTEnc = comm.TurboEncod ...

  7. struts1 action之间的跳转

    ActionForward actionForward = new ActionForward(); actionForward.setPath("xxxxxxxx");//跳转的 ...

  8. [Luogu] 广义斐波那契数列

    https://www.luogu.org/problemnew/show/P1349 题解:https://www.zybuluo.com/wsndy-xx/note/1152988

  9. Luogu [P3622] [APIO2007]动物园

    题目链接 比较费脑子的一道题 先说题目核心思想 : 状压dp 环的处理我们先不管. 我们设 dp[j][s] 表示 到达动物 j 且 [ j , j+5) 这五个动物状态为s时 最多能使多少小朋友开心 ...

  10. centos7下glances系统监控的安装

    yum install epel* -y yum install python-pip python-devel -y yum install glances -y 启动>>glances