zoukankan      html  css  js  c++  java
  • SSD总结

    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 imes n)的特征层,用(3 imes 3 imes p)的卷积核卷积,生成类别得分和坐标偏移。
    • 在给定位置的k个框,计算c类分数和4个偏移量。因此特征图中每个位置需要(c+4)k个卷积核,对于m*n特征图产生(c+4)kmn个输出。在多个特征图中使用不同形状的默认框,可有效的离散可能的输出框形状空间。

    2.2 Training

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

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

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

    LOSS计算公式:

    [L(x,c,l,g)=frac {1} {N}(L_{conf}(x,c))+αL_{loc}(x,l,g) ag{1} ]

    定位LOSS:

    [L_{loc}(x,l,g) = sum_{iin Pos}^{N}sum_{min{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 ag{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_{iin Pos}^N x_{ij}^p log(hat{c}_i^p) - sum_{iin Neg} log(hat{c}_i^0) quad where quadhat{c}_i^p = frac {exp(c_i^p)}{sum_p exp(c_i^p)} ag{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_rin {1,2,3,frac {1}{2},frac{1}{3}})
    宽:(w_k^a=s_ksqrt {a_r})
    高:(h_k^a=s_k/sqrt{a_r})
    宽高比为1时,额外加一个(s'_k=sqrt{s_ks_{k+1}})
    整理如下:

    [left{ egin{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. egin{array}{l} w_k^a=s_ksqrt {a_r} \ h_k^a=s_k/sqrt{a_r} \ end{array} ight} a_rin {1,2,3,frac {1}{2},frac{1}{3}} } end{array} ight.]

    e.g.

    [设m=6,s_{min}=0.2,s_{max}=0.9 ]

    [left{egin{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} ight.]

    [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{ egin{array}{l} left. egin{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} ight} {(w_1^a,h_1^a)={(0.2,0.2),(0.282,0.1418),(0.346,0.1156),\quadquadquadquadquad(0.142,0.2816),(0.116,0.3448),(0.2608,0.2608)}} \\ left. egin{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} ight} {(w_2^a,h_2^a)={(0.34,0.34),(0.4794,0.2411),(0.5882,0.1965),\quadquadquadquadquad(0.2414,0.4789),(0.1972,0.5862),(0.4040,0.4040)}} \\ left. egin{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} ight} {(w_3^a,h_3^a)={(0.48,0.48),(0.6768,0.3404),(0.8304,0.2775),\quadquadquadquadquad(0.3408,0.6760),(0.2784,0.8276),(0.5455,0.5455)}} \\ left. egin{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} ight} {(w_4^a,h_4^a)={(0.62,0.62),(0.8742,0.4397),(1.0726,0.3584),\quadquadquadquadquad(0.4402,0.8732),(0.3596,1.0690),(0.1632,0.1632)}} \\ left. egin{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} ight} {(w_5^a,h_5^a)={(0.76,0.76),(1.0716,0.5390),(1.3148,0.4393),\quadquadquadquadquad(0.5396,1.0704),(0.4408,1.3103),(0.827,0.827)}} \\ left. egin{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} ight} {(w_6^a,h_6^a)={(0.9,0.9),(1.269,0.6382),(1.557,0.5202),\quadquadquadquadquad(0.639,1.2676),(0.522,1.5517),(1.04,1.04)}} \ end{array} ight.]

    每一个 default box 的中心,设置为:((i+0.5*|fk|,j+0.5*|fk|),其中|f_k|表示第k个正方形特征图的大小,i,jin[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

    SSD总结-SSD_YOLO

    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 imes 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

    定量分析:
    SSD总结-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

    SSD总结-PASCALVOC2012

    MS COCO

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

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

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

    总的结果如下:
    SSD总结-MSCOCO

    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 上的速度统计:
    SSD总结-PASCALVOC2007


    1. SSD 里的 atrous. CSDN ↩︎

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

  • 相关阅读:
    如何在iTerm2中配置oh my zsh?
    sublime中格式化jsx文件
    ES6 new syntax of Literal
    ES6 new syntax of Rest and Spread Operators
    How to preview html file in our browser at sublime text?
    ES6 new syntax of Default Function Parameters
    ES6 new syntax of Arrow Function
    七牛云2018春招笔试题
    Spring-使用注解开发(十二)
    Spring-声明式事物(十一)
  • 原文地址:https://www.cnblogs.com/ocean1100/p/9552469.html
Copyright © 2011-2022 走看看