精华内容
下载资源
问答
  • SSD论文翻译

    2018-08-17 20:53:12
    此压缩包包含SSD英文论文原版和中文版翻译(已校正),可以作为论文学习的资料!!
  • SSD论文官方PDF版本

    2018-03-22 14:53:05
    SSD的官方文档SSD论文官方PDF版本SSD的官方文档SSD论文官方PDF版本
  • SSD论文总结

    千次阅读 2018-04-22 23:46:02
    SSD论文总结 目录 SSD论文总结 目录 一、one-stage 检测器和two-stage检测器 1) ont-stage 检测器 2) two-stage 检测器 二、SSD与YOLOv1 三、网络结构中的一些tricks 1)SSD的结构示意图 2) L2Norm的...

    SSD论文总结

    目录

    一、one-stage 检测器和two-stage检测器

    SSD属于one-stage的物体检测器

    1) ont-stage 检测器

    • 主要以YOLO和SSD为代表,这种one-stage的检测主要是对图片不同位置进行采样预测,利用卷积层输出的相对于原图相对位置的特征,直接预测对象类别和对象位置信息。
    • 如YOLO,最后输出相对于原图的7x7的网格,也就是对图中的49个位置进行均匀采样预测,如使用anchor技术,对同一位置进行不同长宽比例的预测。而SSD则对多个分辨率的fmaps进行密集的均匀采样预测。
    • 我们可以发现,这种均匀采样存在一定缺陷:导致正负例的比例不均衡,均匀采样中大部分对应着背景图。这会导致模型精度不高。论文Focal Loss就是一种从损失方面针对这种问题进行优化的方法。而OHEM技术也对这种正负不均衡问题的一种优化技术。

    2) two-stage 检测器

    主要以R-CNN系列算法,主要是通过启发式方法Selective search或者RPN产生较为准确的候选框,然后再对这些候选框进行分类与回归。有利用多级方式,则预测精度更加准确。因而RefineDet 论文就是利用两个SSD级联,一个相当于RPN对anchor修正,第二个SSD对第一个的修正anchor后的输出进行预测,取得更好的结果。

    二、SSD与YOLOv1

    • SSD用CNN来直接进行检测,而YOLOv1使用全连接进行检测;
    • SSD将背景background当做一个类别来预测(对于20类的VOC,则实际预测21类),而YOLO只对对象类别进行预测(实际预测为20类)
    • SSD利用了多层不同分辨率的特征图进行预测输出,而且对大尺度的图进行小物体检测,小尺度的图进行大物体检测;从而更有利于多scale的物体的检测
    • SSD采用了Faster rcnn中的anchor技术,利用不同长宽比先验框进行对象检测;而YOLOv1没有用anchors技术。
    • SSD的这几个改进,一定程度上克服了YOLOv1**难以检测小目标定位不准**等不足。

    三、网络结构中的一些tricks

    1)SSD的结构示意图

    SSD示意图
    可以看出,后面几层用于对象预测(类别和位置的预测)

    2) L2Norm的使用

    该技术来自于ParseNet,conv4_3作为第一个输出预测的特征图,其大小为38x38,该层比较靠前,norm较大,因而使用L2Norm对特征图进行归一化,保证其与后面高语义层的差异不是很大。
    - 注意L2Norm与BatchNorm(BN)的区别,BN是在batch_size,width,height三个维度上进行归一化,;而L2Norm仅仅在channel每个像素的维度上进行归一化,归一化后一般设置一个可训练的放缩变量gamma。

    pytorch代码
    class L2Norm2d(nn.Module):
        '''L2Norm layer across all channels'''
        def __init__(self,scale):  # scale是参数初始化的值,代码中设置为20
            super(L2Norm2d, self).__init__()
            self.scale = Parameter(torch.Tensor([scale]))  # self.scale是可学习的
        '''
        因为conv4_3层比较靠前,而且norm较大所以加一个L2Norm使其与后面层差别不大
        不同于BN,这是在通道维度上进行Norm (spatial normalization)
        '''
        def forward(self,x,dim=1):
            '''out = scale * x / sqrt(\sum x_i^2)'''
            return self.scale[0] * x * x.pow(2).sum(dim).unsqueeze(1).clamp(min=1e-12).rsqrt().expand_as(x)

    3) dilation的使用

    这个技术来自于DeepLab-LargeFOV,这个下采样操作是代替原来网络的pool5层,这样能速度会慢与使用这种操作的20%。
    下图为不同dilation rate的设置
    (a)是普通的 3\times3 卷积,其视野就是 3×3 ,(b)是扩张率为1,此时视野变成 7×7 ,(c)扩张率为3时,视野扩大为 15×15 ,但是视野的特征更稀疏了。Conv6采用 3×3 大小但dilation rate=6的扩展卷积。
    ditaltion conv
    该图片来自于https://www.zhihu.com/people/xiaohuzc/posts?page=1 博文

    4) 不同大小的fmaps对应的anchor_sizes设计

    SSD中conv4_3, Conv7,Conv8_2,Conv9_2,Conv10_2,Conv11_2共6个卷积层用作预测输出,它们的大小分别是38,19,19,5,3,1。针对不同大小的fmaps,使用不同数目的先验框以及不同大小比例的先验框;除去conv4_3, 其他5层的anchor_size的计算公式如下:
    sk=smin+smaxsminm1(k1),k[1,m]

    • 其中 m=5, smin=2,smax=0.9, 然后每层的anchor_size乘以对应层的锚长宽比anchor_ratio,即可得到每层的anchor数目。anchor_ratio = {1,2,3,1/2,1/3};
    • 注意一些细节,每层anchor的计算并不统一;其中ratio的数目设置为[4,6,6,6,4,4],4表示只有两种比例,而6表示使用所有的长宽比;也就是只对Conv7,Conv8_2,Conv9_2使用所有的长宽比,其他的层只使用两个比例。最终所有层的anchor_sizes={30,60,111,162,213,264,315}, 对于conv4_3, sk=smin/2,由于计算ratio=1时,需要k+1的sk,所以conv11_2的后一个sk=300×105/100=315
    • 另外,对于ratio=1的情况,对应两种anchor, {sk,sk}和{sksk+1,sksk+1}。
    • 所以SSD300一共预测
      38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732

    四、训练过程中一些tricks

    1) hard example mining

    由于SSD均匀采样,所以产生的正负例极其不平衡;此外,每个groundtruth至少与一个先验框anchor匹配,注意一个GT可以与多个先验框匹配,且匹配为正例的阈值为iou=0.5。但是这样正例相对于负例可能还是很少,所以为了尽量平衡,则采用OHEM技术,对负样本抽样时,按照预测出类别的执行度误差,从大到小排列,取误差大的topN个负样本作为负例。保证正负样本比例为1:3。具体代码如下

        def hard_negative_mining(self, cls_loss, pos):
            '''
            :param cls_loss: (N*num_anc,) 经过cross_entropy_loss计算损失
            :param pos: (N,num_anc,) 只有0,1值,
            :return: neg indices, (N,num_anc)
            '''
            N,num_anc = pos.size()
    
            cls_loss[pos.view(-1)] = 0  # set pos = 0将正例损失赋为0,不考虑正例
            cls_loss = cls_loss.view(N,-1) # (N,num_anc)
    
            # 注意这个地方有个编程技巧,能用索引的方式,求出topN的位置
            # 先逆序,然后在对索引值进行正序,得到的二级索引值在小于N的位置就是topN
            _, idx = cls_loss.sort(1,descending=True)  # sort by neg
            _, rank = idx.sort(1)  # (N,num_anc)
    
            num_pos = pos.long().sum(1)  # (N,1)
            num_neg = torch.clamp(3*num_pos,max=num_anc-1)  #(N,1) 正例样本的3倍不得超过总anc数
    
            # print('neg size:',num_neg.size(),rank.size())
            neg = rank < num_neg.unsqueeze(1).expand_as(rank) # (N,num_anc_8732)
    
            return neg # 只有0,1值

    2) 数据增强

    论文中的实验表明,数据增强对预测精度有很大的提升
    主要采用水平旋转操作,随机采集块区域(获取小目标训练样本),还有随机裁剪加颜色扭曲(代码中未实现)。

    3)损失计算

    L(x,c,l,g)=1N(Lconf(x,c)+αLloc(x,l,g)
    其中N为正样本个数

    • 位置损失计算:Lloc(x,l,g)=iPosNmcx,cy,w,hxijksmoothL1(limgjm) 这是采用Fast RCNN的位置计算方法;此处的trick有,训练时对cx,cy,w,h进行缩放,添加一个scales因子,加速训练。
    • 类别损失计算:
      Lconf(x,c)=iPosNxijplog(Cip)iNeglog(Cio)whereCip=exp(cip)pexp(cip)
    • 权重系数 α 通过交叉验证设置为1.

    五、总结

    1)有些收获

    • 在进行框预测时,要将box的值映射到(0,1)之间,这样在对不同的fmaps,进行逆转时,比较方便。
    • 多尺度特征图,或者特征融合方式,更有利于识别出大小不一的物体
    • 先验框的设置有利于物体检测,可以探究一下为什么,关于四个位置信息的计算方式(Fast RCNN方式)能否有更好的通用的方式。

    2) 思想启发

    • 根据SSD中的思想,能否根据物体大小(划分为一定梯度),然后不同大小物体选取的fmaps来源不同。

    六 待补充

    1)SSD 512的设计细节
    2)SSD的一系列变形网络设计

    参考文献

    1.知乎博客: https://www.zhihu.com/people/xiaohuzc/posts?page=1
    2. github SSD源码: https://github.com/kuangliu/pytorch-ssd
    3. Wei Liu, et al. “SSD: Single Shot MultiBox Detector.” ECCV2016.


    展开全文
  • SSD论文解读.md

    2020-02-19 12:06:25
    本文从相关知识、主要贡献、SSD模型结构以及实验设计四个方面解读了SSD论文,并对其中的相关概念进行了分析。
  • SSD论文解读

    千次阅读 2019-01-04 09:59:36
    1 论文简述 题目 《SSD: Single Shot MultiBox Detector》 作者 Wei Liu, Dragomir Anguelov, Dumitru Erhan , Christian Szegedy,Scott Reed , Cheng-Yang Fu , ...

    1 论文简述

    题目

    SSD: Single Shot MultiBox Detector

    作者

    Wei Liu, Dragomir Anguelov, Dumitru Erhan ,

    Christian Szegedy,Scott Reed , Cheng-Yang Fu ,

    Alexander C. Berg

    联系邮箱

    wliu@cs.unc.edu drago@zoox.com

    fdumitru,szegedyg@google.com

    reedscot@umich.edu

    fcyfu,abergg@cs.unc.edu

    出处

    European Conference on Computer Vision (ECCV), 2016 (In press)

    发表时间

    April 2016

    被引量

    18

    代码链接

    https://github.com/weiliu89/caffe/tree/ssd

     

    2 摘要

    Wei Liu等人提出了一种使用单个深层神经网络检测图像中目标的方法,名为SSD,将边界框的输出空间离散化为一组默认框,该默认框在每个特征图位置有不同的宽高比和尺寸。在预测期间,网络针对每个默认框中的每个存在目标类别生成分数,并且对默认框进行一些调整以更好地匹配对象形状。另外,网络组合了来自不同分辨率的多个特征图的预测,以适应处理各种尺寸的对象。Wei Liu等人的SSD模型相对于需要region proposal的方法是简单的,因为它完全消除了proposal生成和后续的像素或特征重采样阶段,并将所有计算封装在一个网络之中。这使得SSD容易训练和直接集成到需要检测组件的系统。在PASCAL VOC,MS COCO和ILSVRC数据集的实验结果证实,SSD与使用另外的region proposal的方法具有相当的准确性,并且速度更快,同时为训练和参考提供统一的框架。与其他单级方法相比,即使输入图像尺寸更小,SSD仍然具有更好的精度。对VOC2007,在300×300输入,SSD在Nvidia Titan X上58FPS时达到72.1%的mAP,500×500输入SSD达到75.1%的mAP,优于类似的现有技术Faster R-CNN模型。

    关键词:实时目标检测 ;卷积神经网络

    3 引言

    现有目标检测系统都是基于以下方法:假设边界框,对每个框重新取样像素或特征,再应用高质量的分类器进行分类。选择性搜索方法之后,Faster R-CNN在PASCAL VOC,MS COCO和ILSVRC检测取得领先结果,它的流程成为了检测领域的一个里程碑,它能提取更深的特征。尽管它准确度高,但这些方法对于嵌入式系统来说计算量过大,即使对于高端硬件,对于实时或接近实时的应用来说也太慢。这些方法的检测速度通常以每秒帧数为单位进行测量,高精度检测器(基于Faster R-CNN)最快仅以每秒7帧(FPS)运行。目前,已有很多的尝试:如通过研究检测流程的每个阶段来建立更快的检测器,但是迄今为止,显著增加的速度仅仅是靠大幅度降低检测精度为代价。

    Wei Liu等人提出了第一个基于深层网络的目标检测器,它不会对边界框假设的像素或特征进行重新取样,但可以和这种做法一样准确识别目标。这使高精度检测速度有显著提高(在VOC2007测试中, 58 FPS下 72.1% mAP,对Faster R-CNN 7 FPS 下mAP 73.2%,YOLO 45 FPS 下mAP 63.4%)。用消除边界框proposal和随后的像素或特征重采样阶段来提高速度。通过增加一系列改进提高了它的准确性。Wei Liu等人的改进包括使用不同宽高比检测的单独的预测器(滤波器),预测边界框中的对象类别和偏移,并且将这些滤波器应用于网络后期的多个特征图,以便进行多尺度检测。通过这些修改,Wei Liu等人可以使用相对低分辨率的输入实现高精度检测,进一步提高处理速度,所得系统提高了PASCAL VOC的高速检测的准确性,从YOLO的63.4%mAP提高到72.1%mAP。相比近期工作,这是在检测精度上和残差网络上的较大提高。此外,有效提高高质量检测的速度可以拓宽计算机视觉的应用范围。

    4 贡献点

    1. Wei Liu等人介绍了SSD,一个单次检测器——可用于多个类别检测,比先前技术的单次检测器(YOLO)速度更快,并且准确度更高。实际上它和使用region proposal、pooling的更慢技术一样准确(包括Faster RCNN)。
    2. SSD方法的核心是使用小卷积滤波器来预测特征图上固定的一组默认边界框的类别分数和位置偏移。
    3. 为了实现高检测精度,从不同尺度的特征图进行不同尺度的预测,并且通过宽高比来明确地分离预测。
    4. 这些设计特性得到了简单的“端到端”训练和高精度,进一步提高速度和精度的权衡,即使输入的是低分辨率图像也是如此。
    5. 实验包括在PASCAL VOC,MS COCO和ILSVRC上评估不同输入图像大小下模型耗时和精度分析,并与一系列最新的先进方法进行比较。

    5 模型及方法

    SSD检测的框架如图1所示,如图1(a),SSD在训练期间仅需要每个对象的输入图像和真实标签框。卷积处理时,在具有不同尺度(例如图1(b)和图1(c)中的8×8和4×4)的若干特征图中的每个位置处评估不同宽高比的小集合默认框。对于每个默认框,预测对所有对象类别((c1,c2,...,cp))的形状偏移和置信度。在训练时,首先对这些默认框匹配得到标签框。例如,两个默认框匹配到猫和狗,这些框为正,其余视为负。模型损失是位置损失)和置信损失之间的加权和。

    (a)带标签图像

    (b)4×4特征图

    (c)8×8特征图

                                                                          图1     SSD架构图

    5.1 方法概述

    SSD方法基于前馈卷积网络,其产生固定大小的边界框集合和框中目标类别的对应分数,接着按照非最大化抑制步骤产生最终的检测结果。早期网络都是基于高质量的图像分类的标准架构,Wei Liu等人使用了VGG-16网络作为基础,然后向网络添加辅助结构,产生了具有以下主要特征的检测:

    多尺度特征图检测:卷积特征层尺寸逐渐减小,得到多个尺度检测的预测值,并添加到截断的基础网络末尾。

    检测的卷积预测器:如图2所示,每个添加的特征层可以使用一组卷积滤波器产生固定的预测集。对于具有p个通道的大小为m×n的特征层,使用3×3×p卷积核卷积操作,产生类别的分数或相对于默认框的坐标偏移。在每个应用卷积核运算的m×n大小位置处,产生一个输出值。边界框偏移输出值是相对于默认框测量,默认框位置则相对于特征图。

    默认框与宽高比:将一组默认边界框与顶层网络每个特征图单元关联。具体来说,对于在给定位置的k个框中每个框计算c类分数和相对于原始默认框的4个偏移量,这使得在特征图中的每个位置需要总共(c+4)k个滤波器,对于m×n特征图产生(c+4)kmn个输出。Wei Liu等人的方法在多个特征图中使用不同的默认框形状,可以有效地离散可能的输出框形状空间。

                                                           图2   两个单次检测模型之间的比较

    5.2 训练方法

           SSD的真实标签信息需要被指定到固定的检测器输出集合中的某一特定输出,一旦确定了该指定,则端对端地应用损失函数和反向传播。训练还涉及选择用于检测的默认框和尺度集合,以及hard negative mining和数据增广策略。

           匹配策略从默认框中选择真实标签框,这些默认框随位置、纵横比和比例而变化。启始时,匹配每个真实标签框与默认框最好重叠,以确保每个真实标签框有一个匹配的默认框。添加这些匹配使得有多个重叠默认框时网络预测获得高置信度。

           训练xijp=1 表示第i个默认框与类别p的第j个真实标签框相匹配,相反的xijp=0 。由∑ixijp ≥ 1,意味着可以有多于一个与第j个真实标签框相匹配的默认框。总体目标损失函数是位置损失(loc)和置信损失(conf)的加权和:

     

     

    (1)

    其中N是匹配的默认框的数量,位置损失是预测框和真实标签值框参数之间的平滑L1损失。

           选择默认框的比例和纵横比Wei Liu等人使用低层和高层的特征图进行检测预测。图1示出了在框架中使用的两个示例特征图(8×8和4×4)。

           在SSD框架内,默认框不需要对应于每层的实际receptive field sizes。假设使用m个特征图做预测,每个特征图的默认框的比例计算如下:

     

     

    (2)

    其中smin是0.2,smax是0.95,意味着最低层具有0.2的刻度,最高层具有0.95的刻度,并且其间的所有层是规则间隔的。对默认框施以不同的宽高比,表示为ar∈{1,2,3,1/2,1/3},因此可以计算每个默认框的宽度和高度。对于宽高比为1,添加一个缩放为的默认框。设定每个默认框中心为,其中|fk| 是第k个正方形特征图的大小,

    Hard negative mining:在匹配之后,使用每个默认框的最高置信度对它们进行排序,使得正负样本之间的比率最多为3:1,以代替使用所有的负样本。

    数据增广:为了使模型对于各种输入对象具有更好的鲁棒性,每个训练图像通过以下三种方法之一随机采样:1)使用整个原始输入图像;2)采样一个片段,使对象最小的jaccard重叠为0.1,0.3,0.5,0.7或0.9;3)随机采样一个片段。

    每个采样片段的大小为原始图像大小的[0.1,1],横宽比在1/2和2之间。如果真实标签框中心在采样片段内,则保留重叠部分。在上述采样步骤之后,将每个采样片大小调整为固定大小,并以0.5的概率水平翻转。

    5.3原文实验结果

    Wei Liu等人的实验基于VGG16网络,在ILSVRC CLS-LOC数据集预训练。Wei Liu等人将fc6和fc7转换为卷积层,从fc6和fc7两层采样得到参数,将pool5从2×2-s2更改为3×3-s1,并使用atrous算法填“洞”。并删除了所有的dropout层和fc8层,使用SGD对这个模型进行fine-tune,初始学习率10-3 ,0.9 momentum, 0.0005 weight decay, batch大小32。

    5.3.1 PASCAL VOC2007

           在这个数据集上,Wei Liu等人比较了Fast R-CNN和Faster R-CNN。在VOC2007train val和VOC2012train val(16551images)上训练,在VOC2007(4952图像)测试。

           Wei Liu等人使用conv4_3,conv7(fc7),conv8_2,conv9_2,conv10_2和pool11来预测位置和置信度(对SSD500模型,额外增加了conv11_2用于预测),用“xavier”方法初始化所有新添加的卷积层的参数。由于conv4_3的大小较大(38×38),因此只在其上放置3个默认框 :一个0.1比例的框和另外纵横比为1/2和2的框。对于所有其他层,我们设置6个默认框。由于conv4_3与其他层相比具有不同的特征尺度,因此引入L2正则化技术,将特征图中每个位置处的特征范数缩放为20,并在反向传播期间学习比例。使用10-3 学习速率进行SSD300模型已经比Fast R-CNN更准确。当以更大的500×500输入图像训练SSD,结果更准确,甚至惊人的超过了Faster R-CNN 1.9% mAP。

    表1  PASCAL VOC2007测试集检测结果

    Fast和Faster R-CNN输入图像最小尺寸为600,两个SSD模型除了输入图像尺寸(300*300和500*500),其他设置与其相同。很明显,较大的输入尺寸得到更好的结果。

           图4显示SSD对边界框尺寸非常敏感,它对较小的对象比较大的对象具有更差的性能,在大对象上表现很好。因为对每个特征图位置使用各种长宽比的默认框,因此对于不同的对象宽高比鲁棒性较好。

    5.3.2 模型分析

    为了更好地理解SSD,Wei Liu等人进行了人为控制的实验,以检查每个组件如何影响最终性能。

    表2 不同选择和组件对SSD表现的影响

    关键的数据增广Fast和Faster R-CNN使用原始图像和水平翻转(0.5概率)图像训练。Wei Liu等人使用更广泛的采样策略,类似于YOLO,但它使用了光度失真。表2显示,用这个抽样策略提高6.7%的mAP。

    图3 VOC2007测试集上SSD 500对动物、车辆和家具性能的可视化

    第一行显示由于定位不良(Loc),与类似类别(Sim)、其他类别(Oth)或背景(BG)混淆的正确检测(Cor)、假阳性检测的累积分数。红色实线反映了随着检测次数的增加,“强”标准(0.5jaccard重叠)的召回率变化。红色虚线使用“弱”标准(0.1 jaccard重叠)底行显示排名靠前的假阳性类型的分布。

    图4  灵敏度和不同物体特性对VOC2007测试集的影响

    更多特征图的提升 :受许多语义分割工作启发,Wei Liu等人也使用底层特征图来预测边界框输出,比较使用conv4_3预测的模型和没有它的模型。从表2,可以看出,通过添加conv4_3进行预测,它有明显更好的结果(72.1% vs 68.1%),conv4_3可以捕获对象更好的细粒度,特别是细小的细节。

    更多的默认框形状效果更好:默认情况下,每个位置使用6个默认框。如果删除具有1/3和3宽高比的框,性能下降0.9%。通过进一步移除1/2和2纵横比的框,性能再下降2%。使用多种默认框形状似乎使网络预测任务更容易。

    Atrous算法更好更快 :使用VGG16的atrous版本遵循DeepLabLargeFOV。如果使用完整的VGG16,保持pool5与2×2-s2,并且不从fc6和fc7的采集参数,添加conv5_3,结果稍差(0.7%),而速度减慢大约50%。

    5.3.3 PASCAL VOC2012

           采用和VOC2007上一样的设置,这次,用VOC2012的训练验证集和VOC2007的训练验证集、测试集(21503张图像)训练,在VOC2012测试集(10991张图像)测试。由于有了更多的训练数据,模型训练时以10-3 学习率进行60K次迭代,再减小到10-4 继续迭代20K次。

    表 3  PASCAL VOC2012测试检测结果

    表3显示了SSD300和SSD500模型的结果。可以看到与VOC2007测试中观察到的相同的性能趋势。SSD300已经优于Fast R-CNN,并且非常接近Faster R-CNN(只有0.1%的差异)。可能是由于使用来自多个特征图的卷积默认框和训练期间的匹配策略,与YOLO相比,SSD显著更好。

    5.3.4  MS COCO

    为了进一步验证SSD架构,Wei Liu等人MS COCO数据集上训练了SSD300和SSD500模型。由于COCO中的对象往往较小,因此对所有图层使用较小的默认框,最小的默认框具有0.1缩放比例,并且conv4_3上默认框的缩放比例是0.07(例如,对应于300×300图像的21个像素)。

    表4  COCO test-dev2015检测结果

    Wei Liu等人使用trainval35k来训练模型。首先用8×10-4 的学习率迭代4K次训练模型,接着以10-3 学习率进行140K次迭代,再以10-5 学习率迭代60K次,10-5 学习率迭代40K次。表4显示了test-dev2015上的结果。SSD300在mAP@0.5和mAP@[0.5:0.95]中优于Fast R-CNN,在mAP @ [0.5:0.95]与Faster R-CNN接近。通过将图像大小增加到500×500, SSD500在两个标准中都优于Faster R-CNN。此外, SSD500模型也比ION更好,它是一个多尺寸版本的Fast R-CNN,使用循环网络显式模拟上下文。在图5中展示了使用SSD500模型在MS COCO test-dev的一些检测示例。

    5.3.5 ILSVRC初步结果

    在ILSVRC DET数据集使用与MS COCO相同的网络架构,并使用ILSVRC2014 DET train和val1来训练SSD300模型。Wei Liu等人首先以8×10-4 的学习率迭代4K次训练模型,再用10-3 学习率进行320k次迭代训练该模型,然后用10-4 进行100k次迭代和10-5 继续训练60k次迭代,可以在val2集上实现41.1mAP。

    图5  采用SSD512型号的COCO test-dev的检测实例

    6 相关工作

    目前有两种已建立的用于图像中对象检测的方法,一种基于滑动窗口,另一种基于region proposal分类。在卷积神经网络出现之前,用于检测的两种方法Deformable Part Model(DPM)和选择性搜索性能接近。然而,在R-CNN带来的显着改进之后,其结合了选择性搜索region proposal和基于卷积网络的后分类,region proposal对象检测方法变得普遍。

    原始的R-CNN方法已经以各种方式进行了改进。第一组方法提高了后分类的质量和速度,因为它需要对成千上万的图像作物进行分类,这是昂贵和耗时的。SPPnet对原始的R-CNN方法大大提速。它引入了空间金字塔池化层,其对区域大小和尺度更加鲁棒,并且允许分类层重用在若干图像分辨率生成的特征图特征。Fast R-CNN扩展了SPPnet,使得它可以通过最小化置信度和边界框回归的损失来对所有层进行端对端微调,这在MultiBox中首次引入用于学习对象。

    第二组方法使用深层神经网络提高proposal生成的质量。在最近的工作中,例如MultiBox,基于低层图像特征的选择性搜索region proposal被直接从单独的深层神经网络生成的proposal所替代。这进一步提高了检测精度,但导致了一些复杂的设置,需要训练两个神经网络及其之间的依赖。Faster R-CNN通过从region proposal网络(RPN)中学习的方案替换了选择性搜索proposal,并且引入了通过微调共享卷积层和两个网络的预测层之间交替来集成RPN与Fast R-CNN的方法。用这种方式region proposal池化中层特征图,最终分类步骤更快速。我们的SSD与Faster R-CNN中的region proposal网络(RPN)非常相似,因为我们还使用固定的(默认)框来进行预测,类似于RPN中的achor框。但是,不是使用这些来池化特征和评估另一个分类器,我们同时在每个框中为每个对象类别产生一个分数。因此,我们的方法避免了将RPN与Fast R-CNN合并的复杂性,并且更容易训练,更易于集成到其他任务中。

    另一组方法与我们的方法直接相关,完全跳过proposal步骤,直接预测多个类别的边界框和置信度。 OverFeat是滑动窗口方法的深度版本,在知道基础对象类别的置信度之后直接从最顶层特征图的每个位置预测边界框。YOLO 使用整个最高层特征图来预测多个类别和边界框(这些类别共享)的置信度。我们的SSD方法属于此类别,因为我们没有提案步骤,但使用默认框。然而,我们的方法比现有方法更灵活,因为我们可以在不同尺度的多个特征图中的每个特征位置上使用不同宽高比的默认框。如果顶层特征图的每个位置只使用一个默认框,我们的SSD将具有与OverFeat类似的架构;如果我们使用整个顶层特征图并且添加一个全连接层用于预测而不是我们的卷积预测器,并且没有明确考虑多个宽高比,我们可以近似地再现YOLO。

    7 结果重现

    首先在作者给的三个模型文件中,我们运行得到三个精度依次提高的结果(SSDSSD代码和模型常在更新,如果有同学遇到“shape mismatch”这种错误,从 github下载最新的模型即可)。由于工作环境搭建在笔记本电脑上,并没有明显感觉出速度的差别,不过均能在1-2s得到单张图片结果,效果还是比较可观的,相比于fast-CNN的几十秒一张性能要好。

     

    (a)多目标检测结果1

     

    (b)多目标检测结果2

     

    (c)多目标检测结果3

    第一个结果基本上框出了所有显著性目标,但是在人那边重现了重叠。第二个结果对于目标解决了重复检测的问题,但是对于小物体的检测还不是很好。第三个结果则可以兼顾小目标和显著性目标,准确率较高。由于作者的原图已经标注过,我们对现有图像进行检测与识别,得到结果如下图所示。均取得较好的结果。

    我们设想能识别人脸,在知道人脸身份的时候输出身份,在不知道人脸身份的时候输出性别和年龄,为此我们也在做了一些努力,利用《Age and Gender Classification using Convolutional Neural Networks》的模型文件得到下面的结果,效果还是比较令人满意的。

    (a)原始图像

     

    (b)卷积层可视化

     

    (c)隐藏层可视化

    最后输出结果:Female  Age:[0,2]

    (a)原始图像

     

    (b)卷积层可视化

     

    (c)隐藏层可视化

    最后输出结果:Male  Age:[25,32]

    8 个人总结

    SSD在多尺度下面计算特征,然后评估在该尺度下的区域存在的概率以及相关偏置,是一种遍历所有区域的方式。SSD获得的是图像中的矩形区域以及该区域所对应的类型以及类型得分。

    训练整体流程:

    Step1:图像经过卷积网络,得到图像的base特征A

    Step2:在对这个特征进行多层级的提取feature map B

    Step3:在每个feature map中各个位置location,每个location对应多个default box

    Step4:计算每个default box的loc offset 以及 class score

    Step5: 根据default box以及loc offset 计算区域位置P,再根据class score,计算每个default box的损失函数,累加得到最终的损失函数。

    论文中指出由于negative 的矩形区域明显多于positive的矩形区域,所以根据计算的confidence 排序获得前N个矩形区域求损失函数,negative 与positive的比例大致是3:1。论文的优势使用图像在各个scale下各个位置的特征进行回归,既保证了速度,也保证了准确度。可能可以进一步提高的方面:其在各个位置中用到的特征仅仅只是该尺度下的特征,没有结合上层或者下层特征。

    Wei Liu等人提出的SSD用于多个类别的快速单次对象检测器。该模型的一个关键特点是使用多尺度卷积边界框输出附加到网络顶部的多个特征图。这种表示能够有效地模拟可能的框形状空间。经过实验验证,给定适当的训练策略,更大量的仔细选择的默认边界框得到了性能的提高。给定相同的VGG-16基础架构,SSD在精度和速度方面胜过最先进的对象检测器。该模型的SSD500型号在PASCAL VOC和MS COCO的精度方面明显优于最先进的Faster R-CNN,速度快了3倍。且实时SSD300模型运行在58 FPS,这比当前的实时YOLO更快,同时有显著高质量的检测。

     

    展开全文
  • ssd论文详解

    2018-11-22 21:19:53
    转载于: ... 这篇博客主要介绍SSD算法,该算法是最近一年比较优秀的object detection算法,主要特点在于采用了特征融合。 论文SSD singl...
    转载于: https://blog.csdn.net/u014380165/article/details/72824889

    这篇博客主要介绍SSD算法,该算法是最近一年比较优秀的object detection算法,主要特点在于采用了特征融合。

    论文:SSD single shot multibox detector
    论文链接:https://arxiv.org/abs/1512.02325

    算法概述:

    本文提出的SSD算法是一种直接预测bounding box的坐标和类别的object detection算法,没有生成proposal的过程。针对不同大小的物体检测,传统的做法是将图像转换成不同的大小,然后分别处理,最后将结果综合起来,而本文的ssd利用不同卷积层的feature map进行综合也能达到同样的效果。算法的主网络结构是VGG16,将两个全连接层改成卷积层再增加4个卷积层构造网络结构。对其中5个不同的卷积层的输出分别用两个3*3的卷积核进行卷积,一个输出分类用的confidence,每个default box生成21个confidence(这是针对VOC数据集包含20个object类别而言的);一个输出回归用的localization,每个default box生成4个坐标值(x,y,w,h)。另外这5个卷积层还经过priorBox层生成default box(生成的是坐标)。上面所述的5个卷积层中每一层的default box的数量是给定的。最后将前面三个计算结果分别合并然后传递给loss层。
    算法的结果:对于300*300的输入,SSD可以在VOC2007 test上有74.3%的mAP,速度是59 FPS(Nvidia Titan X),对于512*512的输入, SSD可以有76.9%的mAP。相比之下Faster RCNN是73.2%的mAP和7FPS,YOLO是63.4%的mAP和45FPS。即便对于分辨率较低的输入也能取得较高的准确率。可见作者并非像传统的做法一样以牺牲准确率的方式来提高检测速度。作者认为自己的算法之所以在速度上有明显的提升,得益于去掉了bounding box proposal以及后续的pixel或feature的resampling步骤。

    code地址:https://github.com/weiliu89/caffe/tree/ssd

    算法详解:

    SSD算法在训练的时候只需要一张输入图像及其每个object的ground truth boxes。
    基本的网络结构是基于VGG16,在ImageNet数据集上预训练完以后用两个新的卷积层代替fc6和fc7,另外对pool5也做了一点小改动,还增加了4个卷积层构成本文的网络。VGG的结构如下图所示:

    这里写图片描述

    文章的一个核心是作者同时采用lower和upper的feature maps做检测。如下图Fig1,有8*8和4*4两种大小的feature maps,而feature map 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就一共有k*m*n个default box,每个default box需要预测4个坐标相关的值和c+1个类别概率(实际code是分别用不同数量的3*3卷积核对该层feature map进行卷积,比如卷积核数量为(c+1)*k对应confidence输出,表示每个default box的confidence,就是类别;卷积核数量为4*k对应localization输出,表示每个default box的坐标)。作者的实验也表明default box的shape数量越多,效果越好。
    所以这里用到的default box和Faster RCNN中的anchor很像,在Faster RCNN中anchor只用在最后一个卷积层,但是在本文中,default box是应用在多个不同层的feature map上。

    下图还有一个重要的信息是:在训练阶段,算法在一开始会先将这些default box和ground truth box进行匹配,比如蓝色的两个虚线框和猫的ground truth box匹配上了,一个红色的虚线框和狗的ground truth box匹配上了。所以一个ground truth可能对应多个default box。在预测阶段,直接预测每个default box的偏移以及对每个类别相应的得分,最后通过NMS得到最终的结果。
    Fig1(c)说明对于每个default box,同时预测它的坐标offset和所有类的confidence。

    这里写图片描述

    关于ground truth和default box的匹配细则可以参考下图:

    这里写图片描述

    那么default box的scale(大小)和aspect ratio(横纵比)要怎么定呢?假设我们用m个feature maps做预测,那么对于每个featuer map而言其default box的scale是按以下公式计算的:
    这里写图片描述
    这里smin是0.2,表示最底层的scale是0.2,;smax是0.9,表示最高层的scale是0.9。
    至于aspect ratio,用ar表示为下式:注意这里一共有5种aspect ratio
    这里写图片描述
    因此每个default box的宽的计算公式为:
    这里写图片描述
    高的计算公式为:(很容易理解宽和高的乘积是scale的平方)
    这里写图片描述
    另外当aspect ratio为1时,作者还增加一种scale的default box:
    这里写图片描述

    因此,对于每个feature map cell而言,一共有6种default box。
    可以看出这种default box在不同的feature层有不同的scale,在同一个feature层又有不同的aspect ratio,因此基本上可以覆盖输入图像中的各种形状和大小的object!

    显然,当default box和grount truth匹配上了,那么这个default box就是positive example(正样本),如果匹配不上,就是negative example(负样本),显然这样产生的负样本的数量要远远多于正样本。于是作者将负样本按照confidence loss进行排序,然后选择排名靠前的一些负样本作为训练,使得最后负样本和正样本的比例在3:1左右。

    下图是SSD算法和YOLO算法的结构图对比。YOLO算法的输入是448*448*3,输出是7*7*30,这7*7个grid cell一共预测98个bounding box。SSD算法是在原来VGG16的后面添加了几个卷积层来预测offset和confidence(相比之下YOLO算法是采用全连接层),算法的输入是300*300*3,采用conv4_3,conv7,conv8_2,conv9_2,conv10_2和conv11_2的输出来预测location和confidence。

    这里写图片描述

    详细讲一下SSD的结构,可以参看Caffe代码。SSD的结构为conv1_1,conv1_2,conv2_1,conv2_2,conv3_1,conv3_2,conv3_3,conv4_1,conv4_2,conv4_3,conv5_1,conv5_2,conv5_3(512),fc6:3*3*1024的卷积(原来VGG16中的fc6是全连接层,这里变成卷积层,下面的fc7层同理),fc7:1*1*1024的卷积,conv6_1,conv6_2(对应上图的conv8_2),……,conv9_1,conv9_2,loss。然后针对conv4_3(4),fc7(6),conv6_2(6),conv7_2(6),conv8_2(4),conv9_2(4)的每一个再分别采用两个3*3大小的卷积核进行卷积,这两个卷积核是并列的(括号里的数字代表default box的数量,可以参考Caffe代码,所以上图中SSD结构的倒数第二列的数字8732表示的是所有default box的数量,是这么来的38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4=8732),这两个3*3的卷积核一个是用来做localization的(回归用,如果default box是6个,那么就有6*4=24个这样的卷积核,卷积后map的大小和卷积前一样,因为pad=1,下同),另一个是用来做confidence的(分类用,如果default box是6个,VOC的object类别有20个,那么就有6*(20+1)=126个这样的卷积核)。如下图是conv6_2的localizaiton的3*3卷积核操作,卷积核个数是24(6*4=24,由于pad=1,所以卷积结果的map大小不变,下同):这里的permute层就是交换的作用,比如你卷积后的维度是32*24*19*19,那么经过交换层后就变成32*19*19*24,顺序变了而已。而flatten层的作用就是将32*19*19*24变成32*8664,32是batchsize的大小。

    这里写图片描述

    confidence的3*3卷积核操作如下,注意卷积核个数是126(6*21=126):

    这里写图片描述

    然后是一个生成default box的操作,根据最小尺寸,最大尺寸以及横纵比来生成,step表示该层的一个像素点相当于最开始输入图像的1/32,简单讲就是感受野,源码里面是通过将原始的input image的大小除以该层feature map的大小来得到的。variance目测是一个尺度变换,本文的四个坐标采用的是中心坐标加上长宽,计算loss的时候可能需要对中心坐标的loss和长宽的loss做一个权衡,所以有了这个variance。如果采用的是box的四大顶点坐标这种方式,默认variance都是0.1,即相互之间没有权重差异。经过上述3个操作后,对这一层feature的处理就结束了。

    稍微看下几个层的输出维度,注意看priorbox的维度,以conv8_2_mbox_priorbox为例,是(1,2,144),这个144表示生成的default box的所有坐标,所以和前面回归的坐标个数是一样的:3*3*4*4。2是和variance相关的。

    这里写图片描述

    对前面所列的5个卷积层输出都执行上述的操作后,就将得到的结果合并:采用Concat,类似googleNet的Inception操作,是通道合并而不是数值相加。

    这里写图片描述

    这是几个通道合并后的维度:

    这里写图片描述

    最后就是作者自定义的损失函数层,这里的overlap_threshold表示default box和ground truth的重合度超过这个阈值则为正样本:

    这里写图片描述

    损失函数方面:和Faster RCNN的基本一样,由分类和回归两部分组成,可以参考Faster RCNN,这里不细讲。总之,回归部分的loss是希望预测的box和default box的差距尽可能跟ground truth和default box的差距接近,这样预测的box就能尽量和ground truth一样。

    这里写图片描述

    这里稍微列了下几种object detection算法的default boxes数量以及为什么要有这么多的box:

    这里写图片描述

    实验结果:

    数据集增加对于mAP的提升确实相当明显!

    这里写图片描述

    通过对比各种设计方法说明增加数据集对mAP的增加是最明显的。

    这里写图片描述

    在Fast RCNN和Faster RCNN中,数据集增加的办法主要是采用原有的数据及其水平翻转的结果作为训练集。

    这个图说明使用多层特征的有效性。融合不同层的特征是一种重要的方法,在这里主要解决了大小不同的object的检测问题。

    这里写图片描述

    通过实验对比YOLO和Faster RCNN,说明SSD速度快且准确率更高。

    这里写图片描述

    总结:

    这种算法对于不同横纵比的object的检测都有效,这是因为算法对于每个feature map cell都使用多种横纵比的default boxes,这也是本文算法的核心。另外本文的default box做法是很类似Faster RCNN中的anchor的做法的。最后本文也强调了增加数据集的作用,包括随机裁剪,旋转,对比度调整等等。
    文中作者提到该算法对于小的object的detection比大的object要差。作者认为原因在于这些小的object在网络的顶层所占的信息量太少,所以增加输入图像的尺寸对于小的object的检测有帮助。另外增加数据集对于小的object的检测也有帮助,原因在于随机裁剪后的图像相当于“放大”原图像,所以这样的裁剪操作不仅增加了图像数量,也放大了图像。

    参考资料:
    1、https://docs.google.com/presentation/d/1rtfeV_VmdGdZD5ObVVpPDPIODSDxKnFSU0bsN_rgZXc/pub?start=false&loop=false&delayms=3000&slide=id.g179f601b72_0_51
    2、http://www.cs.unc.edu/~wliu/papers/ssd_eccv2016_slide.pdf

    展开全文
  • SSD 论文详解

    千次阅读 多人点赞 2020-03-12 21:52:37
    SSD: Single Shot MultiBox Detector (ECCV 2016) 声明:笔者翻译论文仅为学习研究,如有侵权请...源论文代码:https://github.com/weiliu89/caffe/tree/ssd 笔者践行代码:【tensorflow版本正在整理中~】 注:文...

    SSD: Single Shot MultiBox Detector (ECCV 2016)

    声明:笔者翻译论文仅为学习研究,如有侵权请联系作者删除博文,谢谢

    源论文地址:https://arxiv.org/abs/1512.02325
    源论文代码:https://github.com/weiliu89/caffe/tree/ssd

    **笔者践行代码:https://github.com/dexterod/mask_SSD-Inceptionv2

    :文字中标粗和亮色的部分为笔者认为有创新改进余地和需要注意的地方,灰色背景部分为笔者的一些想法。因水平所限,部分笔触可能有不实和错误之处,敬请广大读者批评指正,让我们一起进步~

    -----------------------------------------------------------------------------------------------------------------------------------------

    摘要

           我们提出了一种使用单个深度神经网络来检测图像中的目标的方法。我们的方法命名为SSD,将边界框的输出空间离散化,为不同长宽比的一组默认框和并缩放每个 feature map 的位置在预测时,网络会在每个默认框中为每个目标类别生成分数,并对框进行调整以更好地匹配目标形状。此外,网络还结合了不同分辨率的多个特征映射的预测,自然地处理各种尺寸的目标。相对于需要 region proposal 的方法,SSD 非常简单,因为它完全消除了 proposal generation 和随后的像素重采样或特征重采样阶段,并将所有计算封装到单个网络中。这使得SSD易于训练和直接集成到需要检测组件的系统中。PASCAL VOC,COCO和ILSVRC数据集上的实验结果证实,SSD比利用额外的object proposal step的方法具有一定水准的准确性,并且速度更快,同时为训练和推断提供了统一的框架。对于300×300的输入,SSD在VOC2007测试中以59FPS的速度在Nvidia Titan X上达到74.3%的mAP,对于512×512的输入,SSD达到了76.9%的mAP,优于参照的最先进的Faster R-CNN模型。与其他单阶段方法相比,即使输入图像尺寸较小,SSD也具有更高的精度。代码获取:https://github.com/weiliu89/caffe/tree/ssd

    SSD 将输出一系列 离散化(discretization) 的 bounding boxes,这些 bounding boxes 是在不同层次(layers)上的 feature maps 上生成的,并且有着不同的 aspect ratio。

    在 prediction 阶段:要计算出每一个 default box 中的物体其属于每个类别的可能性,即 score。如对于PASCAL VOC 数据集,总共有 20 类,那么得出每一个 bounding box 中物体属于这 20 个类别的每一种的可能性得分。同时,要对这些 bounding boxes的 shape 进行微调,以使得其匹配目标物体的形状。还有就是,为了处理相同物体的不同尺寸的情况,SSD 结合了不同分辨率的 feature maps 的 predictions。

    SSD 的简单是相对于 Faster R-CNN 来说的,前者生成默认框(也就是锚点框)后微调位置并直接具体分类,而后者在生成锚点并初次分类和回归位置后,得到 proposal 层,再进行 ROI Pooling。特征重采样成 7×7 像素,进行二次分类回归

    1. 引言

           目前最先进的目标检测系统是以下方法的变种:假设边界框,每个框重采样像素或提取特征,并应用一个高质量的分类器。自从选择性搜索[1]通过在PASCAL VOC,COCO和ILSVRC上所有基于Faster R-CNN[2]的检测都取得了当前领先的结果(尽管具有更深的特征如[3]),这种流程在检测基准数据上流行开来。尽管这些方法准确,但对于嵌入式系统而言,这些方法的计算量过大,即使是高端硬件,对于实时应用而言也太慢。通常,这些方法的检测速度是以每帧秒(SPF)度量,甚至最快的高精度检测器,Faster R-CNN,仅以每秒7帧(FPS)的速度运行。已经有很多尝试通过处理检测流程中的每个阶段来构建更快的检测器(参见第4节中的相关工作),但是到目前为止,显著提高的速度会以显著降低的检测精度为代价。

    现在的目标检测网络大多依然是:先生成一些假设的 bounding boxes(可以理解为锚点框),然后在这些 bounding boxes 中提取特征(或者先提取特征以后,再在特征图中假设 bboxes),之后再经过一个分类器,来判断里面是不是物体,是什么物体。

           本文提出了第一个基于深度网络的目标检测器,它不对假设边界框的像素或特征进行重采样,并且与其它方法有一样精确度。这对高精度检测在速度上有显著提高(在VOC2007测试中,59FPS和74.3%的mAP,与Faster R-CNN 7FPS和73.2%的mAP或者YOLO 45 FPS和63.4%的mAP相比)。速度的根本改进来自消除了proposal generation and subsequent pixel or feature resampling stages。我们并不是第一个这样做的人(查阅[4,5]),但是通过增加一系列改进,我们设法比以前的尝试显著提高了准确性。我们的改进包括使用小型卷积滤波器来预测边界框位置中的目标类别和偏移量,使用不同长宽比检测的单独预测器(滤波器),并将这些滤波器应用于网络后期的多个特征映射中,以执行多尺度检测。通过这些修改——特别是使用多层进行不同尺度的预测——我们可以使用相对较低的分辨率输入实现高精度,进一步提高检测速度。虽然这些贡献可能单独看起来很小,但是我们注意到由此产生的系统将PASCAL VOC实时检测的准确度从YOLO的63.4%的mAP提高到我们的SSD的74.3%的mAP。相比于最近备受瞩目的残差网络方面的工作[3],在检测精度上这是相对更大的提高。而且,显著提高的高质量检测速度可以扩大计算机视觉使用的设置范围。

    我们总结我们的贡献如下:

    • 我们引入了 SSD,这是一种针对多个类别的单次检测器,比先前的先进的单次检测器(YOLO)更快,并且准确得多,事实上,与执行region proposal和ROI pooling的更慢的技术具有相同的精度(包括 Faster R-CNN )。
    • SSD 的核心是预测固定的一系列默认边界框的类别分数和边界框偏移,使用更小的卷积滤波器应用到 feature map 上
    • 为了实现高检测精度,我们根据不同尺度的 feature map 生成不同尺度的预测,并通过长宽比(aspect ratio)明确分别预测。
    • 这些设计功能使得即使在低分辨率输入图像上也能实现简单的端到端训练和高精度,从而进一步提高速度与精度之间的权衡。
    • 实验包括在 PASCAL VOC,COCO 和 ILSVRC 上评估具有不同输入大小的模型的时间和精度分析,并与最近的一系列最新方法进行比较。

    SSD 核心思想:Our improvements include using a small convolutional filter to predict object categories and offsets in bounding box locations, using separate predictors (filters) for different aspect ratio detections, and applying these filters to multiple feature maps from the later stages of a network in order to perform detection at multiple scales.

    2. 单次检测器(SSD)

           本节描述我们提出的SSD检测框架(2.1节)和相关的训练方法(2.2节)。之后,2.3节介绍了数据集特有的模型细节和实验结果。

    2.1 模型

           SSD方法基于前馈卷积网络,该网络产生固定大小的边界框集合,并对这些边界框中存在的目标类别实例进行评分,然后进行非极大值抑制来产生最终的检测结果早期的网络层基于用于高质量图像分类的标准架构(在任何分类层之前被截断),我们将其称为基础网络。然后,我们将辅助结构添加到网络中以产生具有以下关键特征的检测:

    这里与跟 YOLO / Faster R-CNN 一样,都是先用基础网络提取特征,然后添加些辅助结构进行关键特征的检测

           用于检测的多尺度特征映射。我们将卷积特征层添加到截取的基础网络的末端(VGG的conv4_3)。这些层在尺寸上逐渐减小,并允许在多个尺度上对检测结果进行预测。用于预测检测的卷积模型对于每个特征层都是不同的(查阅 Overfeat[4] 和 YOLO[5] 在单尺度特征映射上的操作)。

    在这里插入图片描述
    图2:两个单次检测模型的比较:SSD和YOLO[5]。我们的SSD模型在基础网络的末端添加了几个特征层,它预测了不同尺度和长宽比的默认边界框的偏移量及相关的置信度。300×300输入尺寸的SSD在VOC2007 test上的准确度上明显优于448×448的YOLO的准确度,同时也提高了速度。

    FPN 论文中原话:SSD 方法在借鉴利用 featurized image pyramid上很是值得说,为了避免利用太低层的特征,SSD从偏后的 conv4_3 开始,又往后加了几层,分别抽取每层特征,进行综合利用。但是SSD对于高分辨率的底层特征没有再利用,而这些层对于检测小目标很重要。
    在这里插入图片描述

           用于检测的卷积预测器每个添加的特征层(或者任选的来自基础网络的现有特征层)可以使用一组卷积滤波器产生固定的预测集合。这些在图2上部中的 SSD 网络架构指出。对于具有 p 通道的大小为 m×n 的特征层,使用的卷积滤波器是 3×3×p 的卷积核,可以得到归属类别的分数,或者相对于默认框坐标的shape偏移。在每一个 m×n 的 feature map 位置上,使用上面的 3×3 的卷积核,它会产生一个输出值。边界框偏移输出值是相对每个 feature map 位置的相对默认框位置来度量的(查阅 YOLO[5] 的架构,该步骤使用中间全连接层而不是卷积滤波器)。
           默认边界框和长宽比对于网络顶部的多个 feature map cells,我们将一组默认边界框与每个 feature map cell 相关联。默认边界框以卷积的方式平铺 feature map,以便每个边界框相对于其对应 cell 的位置是固定的。在每个 feature map cell 中,我们预测 cell 中相对于默认边界框形状的偏移量,以及指出每个边界框中存在的每个类别实例的类别分数。具体而言,对于给定位置处的 k 个边界框中的每一个,我们计算 c 个类别分数和相对于原始默认边界框形状的 4 个偏移量。这导致在 feature map 中的每个 cell 使用总共 (c+4)×k 个滤波器,对于 m×n 的 feature map 取得 (c+4)×k×m×n 个输出。有关默认边界框的说明,请参见图1。我们的默认边界框与 Faster R-CNN[2] 中使用的锚点框相似,但是我们将它们应用到不同分辨率的几个 feature map 上。在几个 feature map 中允许不同的默认边界框形状让我们有效地离散可能的输出框形状的空间。
    在这里插入图片描述
    图1:SSD框架。(a)在训练期间,SSD仅需要每个目标的输入图像和真实边界框。我们用卷积的方式评估具有不同尺度(例如(b)和(c)中的 8×8 和 4×4)的几个 feature maps 中每个位置处不同长宽比的默认框的小集合(例如4个)。对于每个默认边界框,我们预测所有目标类别((c1,c2,…,cp))的形状偏移量和置信度。在训练时,我们首先将这些默认边界框与实际的边界框进行匹配。例如,我们已经给猫匹配了两个默认边界框,与狗匹配了一个,这被视为积极的,其余的是消极的。模型损失是定位损失(例如,Smooth L1[6])和置信度损失(例如 Softmax)之间的加权和

    feature map cell 就是将 feature map 切分成 8×8 或者 4×4之后的一个个格子;
    default box 就是每一个格子上,一系列固定大小的 box,即图中虚线所形成的一系列 boxes。

    SSD总结起来:就是先用基础网络提取特征,然后将多个尺度的特征图进行网格划分,每个特征图的网格里划分出x个默认框(锚点框),并对默认框预测目标类别和置信度以及与实际边界框进行偏移量匹配,再经过NMS后得到预测框

    这就是Faster r-cnn和yolo v1的结合。 前者的锚点框机制 + 前者的实际框偏移计算 + 后者的网格化预测5个点(即直接分类回归,检测问题转化为回归问题。)然后 ssd 用的多尺度输出,被 FPN 升级后,又在 yolo v3 中被改进使用

    2.2 训练

           训练SSD和训练使用 region proposal + pooling 的典型检测器之间的关键区别在于,SSD 训练图像中的 ground truth 需要赋予到那些固定输出的 boxes 上。在YOLO[5]的训练中、Faster R-CNN[2]和MultiBox[7]的region proposal阶段,一些版本也需要这样的操作。当这种将训练图像中的 groundtruth 与固定输出的 boxes 对应之后,就可以 end-to-end 的进行 loss function 的计算以及 back-propagation 的计算更新了。训练也涉及选择默认边界框集合和缩放检测,以及难例挖掘和数据增强策略。
           下面谈本文解决这些问题的方式,分为下面的几个部分。

    在前面也已经提到了,SSD 输出的是事先定义好的,一系列固定大小的 bounding boxes。如图1中,狗狗的 ground truth 是红色的 bounding boxes,但进行 label 标注的时候,要将红色的 groundtruth box 赋予 图(c)中一系列固定输出的 boxes 中的一个,即 图(c)中的红色虚线框。

    匹配策略

           在训练过程中,我们需要确定哪些默认边界框对应 ground truth 的检测,并相应地训练网络。对于每个 ground truth,我们从默认边界框中选择,这些框会在位置,长宽比和尺度上变化。我们首先将每个 ground truth 与具有最好的 Jaccard 重叠(如MultiBox[7])的边界框相匹配。与 MultiBox 不同的是,我们将默认边界框匹配到 Jaccard 重叠高于阈值(0.5)的任何实际边界框。这简化了学习问题,允许网络为多个重叠的默认边界框预测高分,而不是要求它只挑选具有最大重叠的一个边界框。

    注:Jaccard重叠即IoU。

    训练目标函数

           SSD 训练目标函数来自于 MultiBox 目标[7,8],但扩展到处理多个目标类别。xpij=1 表示 第 i 个 default box 与 类别 p 的 第 j 个 ground truth box 相匹配,否则若不匹配的话,则 xpij=0。根据上面的匹配策略,一定有 ∑ixpij≥1,意味着对于 第 j 个 ground truth box,有可能有多个 default box 与其相匹配。
           总体目标损失函数是定位损失(loc)和置信度损失(conf)的加权和
    在这里插入图片描述
           其中N是匹配的默认边界框的数量。如果N=0,则将损失设为0。定位损失是预测框(l)与真实框(g)参数之间的Smooth L1损失[6]。类似于Faster R-CNN[2],我们回归默认边界框(d)的中心偏移量(cx,cy)和其宽度(w)、高度(h)的偏移量
    在这里插入图片描述
           置信度损失conf是在多类别置信度©上的softmax损失。

    在这里插入图片描述
           通过交叉验证权重项α设为1。

    定位损失 loc 像 Faster R-CNN 中的一样,也是三个框,默认框d(锚点框)、预测框l 和真实框g。其中 g 与 d 相关联,首先用 g 和 d 的关系算出偏移量 g~ ,然后将 g~ 代入,构成 l 与 g~ 的Smooth L1损失。(具体见 Faster R-CNN 相关部分)
    在这里插入图片描述

    为默认边界框选择尺度和长宽比

           为了处理不同的目标尺度,一些方法[4,9]建议处理不同尺寸的图像,然后将结果合并。然而,通过利用单个网络中几个不同层的feature map进行预测,我们可以模拟相同的效果,同时还可以跨所有目标尺度共享参数。以前的工作[10,11]已经表明,使用低层的特征映射可以提高语义分割的质量,因为低层会捕获输入目标的更多细节。同样,[12]表明,从feature map上添加全局上下文池化可以有助于平滑分割结果。受这些方法的启发,我们使用较低和较高的feature map进行检测。图1显示了框架中使用的两个示例性feature map(8×8和4×4)。在实践中,我们可以使用更多的具有很少计算开支的feature map。
           已知网络中不同层的feature map具有不同的(经验的)感受野大小[13]。幸运的是,在SSD框架内,默认边界框不需要对应于每层的实际感受野。我们设计平铺默认边界框,以便特定的feature map学习相应目标的特定尺度。假设我们要使用 m 个 feature map 进行预测。每个 feature map 默认边界框的尺度计算如下:

    在这里插入图片描述

    在这里插入图片描述

    哈哈哈哈,原谅我偷个小懒,这些公式打上去有点麻烦 ~ 。~

           通过将所有默认边界框的预测与许多 feature map 所有位置的不同尺度和长宽比相结合,我们有不同的预测集合,涵盖各种输入目标大小和形状。例如,在图1中,狗被匹配到 4×4 feature map 中的默认边界框,而不是 8×8 feature map 中的任何默认框。这是因为那些边界框有不同的尺度,不匹配狗的边界框,因此在训练期间被认为是负例

    一般来说,一个 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/

    难例挖掘

           在匹配步骤之后,大多数默认边界框为负例,尤其是当可能的默认边界框数量较多时。这在正的训练实例和负的训练实例之间引入了显著的不平衡,训练时难以收敛。我们不使用所有负例,而是使用每个默认边界框的最高置信度损失的前几个负例来排序它们,以便负例和正例之间的比例至多为3:1。我们发现这会导致更快的优化和更稳定的训练。

    数据增强

           为了使模型对各种输入目标大小和形状更鲁棒,每张训练图像都是通过以下选项之一进行随机采样的:

    • 使用整个原始输入图像。
    • 采样一个图像块,使得与目标之间的最小Jaccard重叠为0.1,0.3,0.5,0.7或0.9。
    • 随机采样一个图像块。每个采样图像块的大小是原始图像大小的 [0.1,1],长宽比在12和2之间。如果实际边界框的中心在采用的图像块中,我们保留实际边界框与采样图像块的重叠部分。在上述采样步骤之后,除了应用类似于文献[14]中描述的一些光度变形之外,将每个采样图像块调整到固定尺寸并以0.5的概率进行水平翻转。

    关于数据增广,推荐一篇文章:Must Know Tips/Tricks in Deep Neural Networks,其中的 section 1 就讲了 data augmentation 技术。

    3. 实验结果

           基础网络。我们的实验全部基于VGG16[15],它是在ILSVRC CLS-LOC数据集[16]上预先训练的。类似于DeepLab-LargeFOV[17],我们将fc6和fc7转换为卷积层,从fc6和fc7中重采样参数,将pool5从2×2−s2更改为3×3−s1,并使用空洞算法[18]来填补这个“小洞”。我们删除所有的丢弃层和fc8层。我们使用SGD对得到的模型进行微调,初始学习率为10^3,动量为0.9,权重衰减为0.0005,批数据大小为32。每个数据集的学习速率衰减策略略有不同,我们将在后面详细描述。完整的训练和测试代码建立在Caffe[19]上并开源:https://github.com/weiliu89/caffe/tree/ssd。

    3.1 PASCAL VOC2007

           在这个数据集上,我们在VOC2007 test(4952张图像)上比较了Fast R-CNN[6]和Faster R-CNN[2]。所有的方法都在相同的预训练好的VGG16网络上进行微调。
    在这里插入图片描述表1:PASCAL VOC2007 test检测结果。Fast和Faster R-CNN都使用最小维度为600的输入图像。两个SSD模型除了输入大小不同(300×300和512×512),其余使用完全相同的设置。很明显更大的输入尺寸会导致更好的结果,并且更大的数据同样有帮助。数据:“07”:VOC2007 trainval,“07+12”:VOC2007和VOC2012 trainval的联合。“07+12+COCO”:首先在COCO trainval35k上训练然后在07+12上微调。

    在这里插入图片描述
    图2显示了SSD300模型的架构细节。我们使用conv4_3,conv7(fc7),conv8_2,conv9_2,conv10_2和conv11_2来预测位置和置信度我们在conv4_3上设置了尺度为0.1的默认边界框。我们使用“xavier”方法[20]初始化所有新添加的卷积层的参数。对于conv4_3,conv10_2和conv11_2,我们只在每个feature map位置上关联了4个默认边界框——忽略1/3和3的长宽比。对于所有其它层,我们像2.2节描述的那样放置了6个默认边界框。如[12]所指出的,与其它层相比,由于conv4_3具有不同的特征尺度,所以我们使用[12]中引入的L2正则化技术将feature map中每个位置的特征标准缩放到20,在反向传播过程中学习尺度。对于40k次迭代,我们使用103的学习率,然后继续用104和105的学习率训练10k迭代。当对VOC2007 trainval进行训练时,表1显示了我们的低分辨率SSD300模型已经比Fast R-CNN更准确。当我们用更大的512×512输入图像上训练SSD时,它更加准确,超过了Faster R-CNN 1.7%的mAP。如果我们用更多的(即07+12)数据来训练SSD,我们看到SSD300已经比Faster R-CNN好1.1%,SSD512比Faster R-CNN好3.6%。如果我们将SSD512用3.4节描述的COCO trainval35k来训练模型并在07+12数据集上进行微调,我们获得了最好的结果:81.6%的mAP。

    在这里插入图片描述图3:SSD512在VOC2007 test中的动物,车辆和家具上的性能可视化。第一行显示由于定位不佳(Loc),与相似类别(Sim)混淆,与其它(Oth)或背景(BG)相关的正确检测(Cor)或假阳性的累积分数。红色的实线表示随着检测次数的增加,强标准(0.5 Jaccard重叠)下的召回变化。红色虚线是使用弱标准(0.1 Jaccard重叠)。最下面一行显示了排名靠前的假阳性类型的分布。

    在这里插入图片描述
    图4:使用[21]在VOC2007 test设置上不同目标特性的灵敏度和影响。左边的图显示了bbox面积对每个类别的影响,右边的图显示了长宽比的影响。关键:bbox区域:XS=超小;S=小;M=中等;L=大;XL=超大。长宽比:XT=超高/窄;T=高;M=中等;W=宽;XW =超宽。

           为了更详细地了解我们两个SSD模型的性能,我们使用了[21]中的检测分析工具。图3显示了SSD可以检测到高质量(大白色区域)的各种目标类别。它大部分的确信检测是正确的。召回约为85−90%,而“弱”(0.1 Jaccard重叠)标准则要高得多。与R-CNN[22]相比,SSD具有更小的定位误差,表明SSD可以更好地定位目标,因为它直接学习回归目标形状和分类目标类别,而不是使用两个解耦步骤。然而,SSD对类似的目标类别(特别是对于动物)有更多的混淆,部分原因是我们共享多个类别的位置。图4显示SSD对边界框大小非常敏感。换句话说,它在较小目标上比在较大目标上的性能要差得多。这并不奇怪,因为这些小目标甚至可能在顶层没有任何信息。增加输入尺寸(例如从300×300到512×512)可以帮助改进检测小目标,但仍然有很大的改进空间。积极的一面,我们可以清楚地看到SSD在大型目标上的表现非常好。而且对于不同长宽比的目标,它是非常鲁棒的,因为我们使用每个feature map位置的各种长宽比的默认框。

    3.2 模型分析

           为了更好地了解SSD,我们进行了控制实验,以检查每个组件如何影响性能。对于所有的实验,我们使用相同的设置和输入大小(300×300),除了指定的设置或组件的更改。

    在这里插入图片描述

    数据增强至关重要

           Fast 和 Faster R-CNN 使用原始图像和水平翻转来训练。我们使用更广泛的抽样策略,类似于YOLO[5]。从表2可以看出,采样策略可以提高8.8%的mAP。我们不知道我们的采样策略将会使Fast和Faster R-CNN受益多少,但是他们可能从中受益较少,因为他们在分类过程中使用了一个特征池化步骤,这对通过设计的目标变换来说相对鲁棒。

    更多的默认边界框形状会更好

           如2.2节所述,默认情况下,我们每个位置使用6个默认边界框。如果我们删除长宽比为1/3和3的边界框,性能下降了0.6%。通过进一步去除1/2和2长宽比的盒子,性能再下降2.1%。使用各种默认边界框形状似乎使网络预测边界框的任务更容易。

    Atrous更快

           如第3节所述,我们根据DeepLab-LargeFOV[17]使用子采样的VGG16的空洞版本。如果我们使用完整的VGG16,保持pool5为2×2-s2,并且不从fc6和fc7中子采样参数,并添加conv5_3进行预测,结果大致相同,而速度慢了大约20%。

    多个不同分辨率的输出层更好

    在这里插入图片描述
           SSD的主要贡献是在不同的输出层上使用不同尺度的默认边界框。为了衡量所获得的优势,我们逐步删除层并比较结果。为了公平比较,每次我们删除一层,我们调整默认边界框平铺,以保持类似于最初的边界框的总数(8732)。这是通过在剩余层上堆叠更多尺度的边界框并根据需要调整边界框的尺度来完成的。我们没有详尽地优化每个设置的平铺。表3显示层数较少,精度降低,从74.3单调递减至62.4。当我们在一层上堆叠多尺度的边界框时,很多边界框在图像边界上需要小心处理。我们尝试了在Faster R-CNN[2]中使用这个策略,忽略在边界上的边界框。我们观察到了一些有趣的趋势。例如,如果我们使用非常粗糙的feature map(例如conv11_2(1×1)或conv10_2(3×3)),它会大大伤害性能。原因可能是修剪后我们没有足够大的边界框来覆盖大的目标。当我们主要使用更高分辨率的feature map时,性能开始再次上升,因为即使在修剪之后仍然有足够数量的大边界框。如果我们只使用conv7进行预测,那么性能是最糟糕的,这就强化了在不同层上扩展不同尺度的边界框是非常关键的信息。此外,由于我们的预测不像[6]那样依赖于ROI pooling,所以我们在低分辨率feature map中没有折叠组块的问题[23]。SSD架构将来自各种分辨率的feature map的预测结合起来,以达到与Faster R-CNN相当的精确度,同时使用较低分辨率的输入图像。

    3.3 PASCAL VOC2012

    在这里插入图片描述表4: PASCAL VOC2012 test上的检测结果. Fast和Faster R-CNN使用最小维度为600的图像,而YOLO的图像大小为448× 48。数据:“07++12”:VOC2007 trainval,test和VOC2012 trainval。“07++12+COCO”:先在COCO trainval135k上训练然后在07++12上微调。

           除了我们使用VOC2012 trainval和VOC2007 trainval,test(21503张图像)进行训练,以及在VOC2012 test(10991张图像)上进行测试之外,我们使用与上述基本的VOC2007实验相同的设置。我们用103的学习率对模型进行60k次的迭代训练,然后使用104的学习率进行20k次迭代训练。表4显示了我们的SSD300和SSD512模型的结果。我们看到了与我们在VOC2007 test中观察到的相同的性能趋势。我们的SSD300比Fast/Faster R-CNN提高了准确性。通过将训练和测试图像大小增加到512×512,我们比Faster R-CNN的准确率提高了4.5%。与YOLO相比,SSD更精确,可能是由于使用了来自多个特征映射的卷积默认边界框和我们在训练期间的匹配策略。当对从COCO上训练的模型进行微调后,我们的SSD512达到了80.0%的mAP,比Faster R-CNN高了4.1%。

    3.4 COCO

    在这里插入图片描述
           为了进一步验证SSD框架,我们在COCO数据集上对SSD300和SSD512架构进行了训练。由于COCO中的目标往往比PASCAL VOC中的更小,因此我们对所有层使用较小的默认边界框。我们遵循2.2节中提到的策略,但是现在我们最小的默认边界框尺度是0.15而不是0.2,并且conv4_3上的默认边界框尺度是0.07(例如,300×300图像中的21个像素)。
           我们使用trainval35k[24]进行训练。我们首先用103的学习率对模型进行训练,进行160k次迭代,然后继续以104和105的学习率各进行40k次迭代。表5显示了test-dev2015的结果。与我们在PASCAL VOC数据集中观察到的结果类似,SSD300在mAP@0.5和mAP@[0.5:0.95]中都优于Fast R-CNN。SSD300与ION 24]和Faster R-CNN[25]具有相似的mAP@0.75,但是mAP@0.5更差。通过将图像尺寸增加到512×512,我们的SSD512在这两个标准中都优于Faster R-CNN[25]。有趣的是,我们观察到SSD512在mAP@0.75中要好5.3%,但是在mAP@0.5中只好1.2%。我们也观察到,对于大型目标,AP(4.8%)和AR(4.6%)的效果要好得多,但对于小目标,AP(1.3%)和AR(2.0%)有相对更少的改进。与ION相比,大型和小型目标的AR改进更为相似(5.4%和3.9%)。我们推测Faster R-CNN在较小的目标上比SSD更具竞争力,因为它在RPN部分和Fast R-CNN部分都执行了两个边界框细化步骤。在图5(展示图片,未放)中,我们展示了SSD512模型在COCO test-dev上的一些检测实例。

    3.5 初步的ILSVRC结果

           我们将在COCO上应用的相同网络架构应用于ILSVRC DET数据集[16]。我们使用[22]中使用的ILSVRC2014 DETtrain和val1来训练SSD300模型。我们首先用103的学习率对模型进行训练,进行了320k次的迭代,然后以104继续迭代80k次,以105迭代40k次。我们可以在val2数据集上[22]实现43.4 mAP。再一次证明了SSD是用于高质量实时检测的通用框架。

    3.6 为小目标准确率进行数据增强

    在这里插入图片描述表6:我们使用图像扩展数据增强技巧在多个数据集上的结果。SSD300∗和SSD512∗是用新的数据增强训练的模型。
    在这里插入图片描述图6:具有新的数据增强的目标尺寸在[21]中使用的VOC2007test数据集上灵敏度及影响。最上一行显示了原始SSD300和SSD512模型上每个类别的BBox面积的影响,最下面一行对应使用新的数据增强训练技巧的SSD300∗和SSD512∗模型。新的数据增强技巧显然有助于显著检测小目标。

           SSD没有如Faster R-CNN中后续的特征重采样步骤,小目标的分类任务对SSD来说相对困难,正如我们的分析(见图4)所示。2.2描述的数据增强有助于显著提高性能,特别是在PASCAL VOC等小数据集上。策略产生的随机裁剪可以被认为是“放大”操作,并且可以产生许多更大的训练样本。为了实现创建更多小型训练样本的“缩小”操作,我们首先将图像随机放置在填充了平均值的原始图像大小为16x的画布上,然后再进行任意的随机裁剪操作。因为通过引入这个新的“扩展”数据增强技巧,我们有更多的训练图像,所以我们必须将训练迭代次数加倍。我们已经在多个数据集上看到了一致的2%−3%的mAP增长,如表6所示。具体来说,图6显示新的增强技巧显著提高了模型在小目标上的性能。这个结果强调了数据增强策略对最终模型精度的重要性。
           改进SSD的另一种方法是**设计一个更好的默认边界框平铺,使其位置和尺度与feature map上每个位置的感受野更好地对齐。**我们将这个留给未来工作。

    3.7 推断时间

           考虑到我们的方法产生大量边界框,在推断期间执行非最大值抑制(NMS)是必要的。通过使用0.01的置信度阈值,我们可以过滤大部分边界框。然后,我们应用NMS,每个类别0.45的Jaccard重叠,并保留每张图像的前200个检测。对于SSD300和20个VOC类别,这个步骤每张图像花费大约1.7毫秒,接近在所有新增层上花费的总时间(2.4毫秒)。我们使用Titan X、cuDNN v4、Intel Xeon E5-2667v3@3.20GHz以及批大小为8来测量速度。

    在这里插入图片描述
           表7显示了SSD,Faster R-CNN[2]和YOLO[5]之间的比较。我们的SSD300和SSD512的速度和精度均优于Faster R-CNN。虽然Fast YOLO[5]可以以155FPS的速度运行,但其准确性却降低了近22%的mAP。就我们所知,SSD300是第一个实现70%以上mAP的实时方法。请注意,大约80%前馈时间花费在基础网络上(本例中为VGG16)。因此,使用更快的基础网络可以进一步提高速度,这也可能使SSD512模型达到实时。

    4. 相关工作

           在图像中有两种建立的用于目标检测的方法,一种基于滑动窗口,另一种基于区域提出分类。在卷积神经网络出现之前,这两种方法的最新技术——可变形部件模型(DPM)[26]和选择性搜索[1]——具有相当的性能。然而,在R-CNN[22]结合选择性搜索区域提出和基于后分类的卷积网络带来的显著改进后,区域提出目标检测方法变得流行。
           最初的R-CNN方法已经以各种方式进行了改进。第一套方法提高了后分类的质量和速度,因为它需要对成千上万的裁剪图像进行分类,这是昂贵和耗时的。SPPnet[9]显著加快了原有的R-CNN方法。它引入了一个空间金字塔池化层,该层对区域大小和尺度更鲁棒,并允许分类层重用多个图像分辨率下生成的特征映射上计算的特征。Fast R-CNN[6]扩展了SPPnet,使得它可以通过最小化置信度和边界框回归的损失来对所有层进行端到端的微调,最初在MultiBox[7]中引入用于学习目标。
           第二套方法使用深度神经网络提高了提出生成的质量。在最近的工作MultiBox[7,8]中,基于低级图像特征的选择性搜索区域提出直接被单独的深度神经网络生成的提出所取代。这进一步提高了检测精度,但是导致了一些复杂的设置,需要训练两个具有依赖关系的神经网络。Faster R-CNN[2]将选择性搜索提出替换为区域建议网络(RPN)学习到的区域建议,并引入了一种方法,通过交替两个网络之间的微调共享卷积层和预测层将RPN和Fast R-CNN结合在一起。通过这种方式,使用区域建议池化中级特征,并且最后的分类步骤比较简单。我们的SSD与Faster R-CNN中的区域建议网络(RPN)非常相似,因为我们也使用一组固定的(默认)边界框进行预测,类似于RPN中的锚边界框。但是,我们不是使用这些来池化特征并评估另一个分类器,而是为每个目标类别在每个边界框中同时生成一个分数。因此,我们的方法避免了将RPN与Fast R-CNN合并的复杂性,并且更容易训练,更快且更直接地集成到其它任务中。
           与我们的方法直接相关的另一组方法,完全跳过region proposal步骤,直接预测多个类别的边界框和置信度。OverFeat[4]是滑动窗口方法的深度版本,在知道了底层目标类别的置信度之后,直接从最顶层的feature map的每个位置预测边界框。YOLO[5]使用整个最顶层的feature map来预测多个类别和边界框(这些类别共享)的置信度。我们的SSD方法属于这一类,因为我们没有region proposal,但使用默认边界框。然而,我们的方法比现有方法更灵活,因为我们可以在不同尺度的多个特征映射的每个特征位置上使用不同长宽比的默认边界框。如果我们只从最顶层的feature map的每个位置使用一个默认框,我们的SSD将具有与OverFeat[4]相似的架构;如果我们使用整个最顶层的特征映射,并添加一个全连接层进行预测来代替我们的卷积预测器,并且没有明确地考虑多个长宽比,我们可以近似地再现YOLO[5]。

    5. 结论

           本文介绍了SSD,一种快速的单次多类别目标检测器。我们模型的一个关键特性是使用网络顶部多个feature map的多尺度卷积边界框输出。这种表示使我们能够高效地建模可能的边界框形状空间。我们通过实验验证,在给定合适训练策略的情况下,大量仔细选择的默认边界框会提高性能。我们构建的SSD模型比现有的方法至少要多一个数量级的边界框预测采样位置,尺度和长宽比[5,7]。我们证明了给定相同的VGG-16基础架构,SSD在准确性和速度方面与其对应的最先进的目标检测器相比毫不逊色。在PASCAL VOC和COCO上,我们的SSD512模型的性能明显优于最先进的Faster R-CNN[2],而速度提高了3倍。我们的实时SSD300模型运行速度为59FPS,比目前的实时YOLO[5]更快,同时显著提高了检测精度。

    -----------------------------------------------------------------------------------------------------------------------------------------

    PS:

    SSD值得学习的地方

    SSD的主要贡献是在不同的输出层上使用不同尺度的默认边界框进行类别分数预测和边界框偏移定位

    • 吸纳了yolo和faster rcnn的优势(锚点和分块直接检测)
    • 数据增强用了抽样策略。(需要实验+别的方法可以用)

    可能会更好的地方:

    • ssd增加更多的默认边界框形状会更好。(需要实验,根据检测物调整)
    • ssd增加更多的不同分辨率输出层会更好。(需要实验+与FPN结合)
    • 改变基础网络VGG16
    • 可以更好地定位目标,但对于类似的目标类别(特别是对于动物)有更多的混淆,部分原因是我们共享多个类别的位置
    • 在小目标的检测上差很多
    • 改进SSD的另一种方法是设计一个更好的默认边界框平铺,使其位置和尺度与feature map上每个位置的感受野更好地对齐。

    借鉴资料:
    https://blog.csdn.net/u010167269/article/details/52563573
    Must Know Tips/Tricks in Deep Neural Networks

    展开全文
  • 深度解析SSD论文

    千次阅读 2019-04-18 18:21:17
    前言:以前对SSD算法只有一个比较粗浅的理解,这周为了在组会上讲清楚SSD算法,自己又仔细看了好几遍论文,算是抠得比较细的一篇论文了,总结如下。 一、背景 当前基于深度学习的通用目标检测框架主要分为两大类...
  • SSD论文笔记

    千次阅读 2019-01-03 12:00:19
    论文地址:https://arxiv.org/pdf/1611.10012.pdf code地址:https://github.com/weiliu89/caffe/tree/ssd 文章的主要贡献: We summarize our contributions as follows:  – We introduce SSD, a single-shot...
  • SSD 论文理解

    千次阅读 2018-12-17 13:07:21
    paper:: SSD Single Shot MultiBox Detector(单摄多框检测器) link:SSD paper code:https://github.com/weiliu89/caffe/tree/ssd 摘要 提出目标检测方法SSD: one-stage的检测方法,不需要额外的proposal生成...
  • SSD论文策略理解

    千次阅读 2017-10-04 19:07:57
    SSD论文策略理解
  • SSD论文阅读

    千次阅读 2017-05-14 20:52:38
    SSD论文阅读(Wei Liu——【ECCV2016】SSD Single Shot MultiBox Detector)   目录 作者及相关链接文章的选择原因方法概括方法细节相关背景补充实验结果与相关文章的对比总结
  • SSD论文学习

    千次阅读 2018-11-20 14:17:48
    SSD: Single Shot MultiBox DetectorAbstract1. Introduction2. The Single Shot Detector...论文地址:https://arxiv.org/abs/1512.02325 Abstract 作者呈现了一种仅需要单个深度神经网络的目标检测方法 — SSD。SS...
  • SSD论文中文版

    2018-08-20 17:24:48
    一种使用单个深层神经网络检测图像中对象的方法被称为SSD,这篇文档是由爱好者帮忙翻译而成的中文版论文,可以深入了解SSD。更多参考资料可点击:https://club.leiphone.com/page/resources
  • 大神刘伟发表的ssd论文,包括引文版和翻译的中文版,适合入门学习ssd的同学阅读学习。
  • 详细描述了SSD的相关概念以及CF实现 SSD究竟学到了什么 SSD详细叙述
  • SSD论文浅析

    千次阅读 2018-06-27 15:16:02
    Single Shot MultiBox Detectordeepsystems背景 因为YOLO V1带来的快速的检测速度,而准确率却远不如faster-rcnn,而且前面博文所说,YOLO V1只在一个grid cell中预测一种... 本文中提出的SSD,很重要的一点就是将...
  • SSD论文理解

    2017-09-20 21:25:01
    论文翻译:http://blog.csdn.net/Ai_Smith/article/details/52997456?locationNum=2&amp;fps=1论文理解:https://zhuanlan.zhihu.com/p/24954433?refer=xiaoleimlnote代码理解:cafe版本:...
  • 目标检测 SSD论文理解

    千次阅读 2018-10-18 20:44:17
    此文章只是自己看论文和...1.论文SSD-tensorflow代码 论文地址:https://arxiv.org/abs/1512.02325 代码链接:https://github.com/balancap/SSD-Tensorflow 2.yolo算法与SSD算法区别 two-stage方法:主要用到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,422
精华内容 4,568
关键字:

ssd论文下载