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

    2019-10-12 15:50:47
    SSD 相比较于其他单结构模型(YOLO),SSD 取得更高的精度,即是是在输入图像较小的情况下。如输入 300 × 300 300×300 的 mAP。 如果输入的图像是 500 × 500 500×500 的 mAP,比目前最 state-of-art 的 ...

    Preface

    这是今年 ECCV 2016 的一篇文章,是 UNC Chapel Hill(北卡罗来纳大学教堂山分校)Wei Liu 大神的新作,论文代码:https://github.com/weiliu89/caffe/tree/ssd

    这里写图片描述

    有几点更新:
    1. 看到一篇 blog 对检测做了一个总结、收集,强烈推荐: Object Detection
    2. 还有,今天在微博上看到 VOC2012 的榜单又被刷新了,微博原地址为:这里,如下图:

    这里写图片描述

    3. 目前 voc 2012 的榜单 如下:
    这里写图片描述

    做目标检测这块的多关注哦~


    Abstract

    这篇文章在既保证速度,又要保证精度的情况下,提出了 SSD 物体检测模型,与现在流行的检测模型一样,将检测过程整个成一个 single deep neural network。便于训练与优化,同时提高检测速度。

    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。

    相对于那些需要 object proposals 的检测模型,本文的 SSD 方法完全取消了 proposals generation、pixel resampling 或者 feature resampling 这些阶段。这样使得 SSD 更容易去优化训练,也更容易地将检测模型融合进系统之中。

    PASCAL VOCMS COCOILSVRC 数据集上的实验显示,SSD 在保证精度的同时,其速度要比用 region proposals 的方法要快很多。

    SSD 相比较于其他单结构模型(YOLO),SSD 取得更高的精度,即是是在输入图像较小的情况下。如输入 300×300300×300 的 mAP。

    如果输入的图像是 500×500500×500 的 mAP,比目前最 state-of-art 的 Faster R-CNN 要好很多。


    Introduction

    现金流行的 state-of-art 的检测系统大致都是如下步骤,先生成一些假设的 bounding boxes,然后在这些 bounding boxes 中提取特征,之后再经过一个分类器,来判断里面是不是物体,是什么物体。

    这类 pipeline 自从 IJCV 2013, Selective Search for Object Recognition 开始,到如今在 PASCAL VOCMS COCOILSVRC 数据集上取得领先的基于 Faster R-CNN 的 ResNet 。但这类方法对于嵌入式系统,所需要的计算时间太久了,不足以实时的进行检测。当然也有很多工作是朝着实时检测迈进,但目前为止,都是牺牲检测精度来换取时间。

    本文提出的实时检测方法,消除了中间的 bounding boxes、pixel or feature resampling 的过程。虽然本文不是第一篇这样做的文章(YOLO),但是本文做了一些提升性的工作,既保证了速度,也保证了检测精度。

    这里面有一句非常关键的话,基本概括了本文的核心思想:

    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.

    本文的主要贡献总结如下:

    • 提出了新的物体检测方法:SSD,比原先最快的 YOLO: You Only Look Once 方法,还要快,还要精确。保证速度的同时,其结果的 mAP 可与使用 region proposals 技术的方法(如 Faster R-CNN)相媲美。

    • SSD 方法的核心就是 predict object(物体),以及其 归属类别的 score(得分);同时,在 feature map 上使用小的卷积核,去 predict 一系列 bounding boxes 的 box offsets

    • 本文中为了得到高精度的检测结果,在不同层次的 feature maps 上去 predict objectbox offsets,同时,还得到不同 aspect ratio 的 predictions。

    • 本文的这些改进设计,能够在当输入分辨率较低的图像时,保证检测的精度。同时,这个整体 end-to-end 的设计,训练也变得简单。在检测速度、检测精度之间取得较好的 trade-off

    • 本文提出的模型(model)在不同的数据集上,如 PASCAL VOCMS COCOILSVRC, 都进行了测试。在检测时间(timing)、检测精度(accuracy)上,均与目前物体检测领域 state-of-art 的检测方法进行了比较。


    The Single Shot Detector(SSD)

    这部分详细讲解了 SSD 物体检测框架,以及 SSD 的训练方法。

    这里,先弄清楚下文所说的 default box 以及 feature map cell 是什么。看下图:

    • feature map cell 就是将 feature map 切分成 8×88×8 之后的一个个 格子

    • 而 default box 就是每一个格子上,一系列固定大小的 box,即图中虚线所形成的一系列 boxes。

    这里写图片描述


    Model

    SSD 是基于一个前向传播 CNN 网络,产生一系列 固定大小(fixed-size) 的 bounding boxes,以及每一个 box 中包含物体实例的可能性,即 score。之后,进行一个 非极大值抑制(Non-maximum suppression) 得到最终的 predictions。

    SSD 模型的最开始部分,本文称作 base network,是用于图像分类的标准架构。在 base network 之后,本文添加了额外辅助的网络结构:

    • Multi-scale feature maps for detection
      在基础网络结构后,添加了额外的卷积层,这些卷积层的大小是逐层递减的,可以在多尺度下进行 predictions。

    • Convolutional predictors for detection
      每一个添加的特征层(或者在基础网络结构中的特征层),可以使用一系列 convolutional filters,去产生一系列固定大小的 predictions,具体见 Fig.2。对于一个大小为 m×nm×n 个输出结果。

    这里的 default box 很类似于 Faster R-CNN 中的 Anchor boxes,关于这里的 Anchor boxes,详细的参见原论文。但是又不同于 Faster R-CNN 中的,本文中的 Anchor boxes 用在了不同分辨率的 feature maps 上。

    这里写图片描述


    Training

    在训练时,本文的 SSD 与那些用 region proposals + pooling 方法的区别是,SSD 训练图像中的 groundtruth 需要赋予到那些固定输出的 boxes 上。在前面也已经提到了,SSD 输出的是事先定义好的,一系列固定大小的 bounding boxes。

    如下图中,狗狗的 groundtruth 是红色的 bounding boxes,但进行 label 标注的时候,要将红色的 groundtruth box 赋予 图(c)中一系列固定输出的 boxes 中的一个,即 图(c)中的红色虚线框。

    这里写图片描述

    事实上,文章中指出,像这样定义的 groundtruth boxes 不止在本文中用到。在 YOLO 中,在 Faster R-CNN 中的 region proposal 阶段,以及在 MultiBox 中,都用到了。

    当这种将训练图像中的 groundtruth 与固定输出的 boxes 对应之后,就可以 end-to-end 的进行 loss function 的计算以及 back-propagation 的计算更新了。

    训练中会遇到一些问题:

    • 选择一系列 default boxes

    • 选择上文中提到的 scales 的问题

    • hard negative mining

    • 数据增广的策略

    下面会谈本文的解决这些问题的方式,分为以下下面的几个部分。

    Matching strategy

    如何将 groundtruth boxes 与 default boxes 进行配对,以组成 label 呢?

    在开始的时候,用 MultiBox 中的 best jaccard overlap 来匹配每一个 ground truth box 与 default box,这样就能保证每一个 groundtruth box 与唯一的一个 default box 对应起来。

    但是又不同于 MultiBox ,本文之后又将 default box 与任何的 groundtruth box 配对,只要两者之间的 jaccard overlap 大于一个阈值,这里本文的阈值为 0.5。

    Training objective

    SSD 训练的目标函数(training objective)源自于 MultiBox 的目标函数,但是本文将其拓展,使其可以处理多个目标类别。用 xpij=1xijp=1

    根据上面的匹配策略,一定有 ixpij1∑ixijp≥1 个 ground truth box,有可能有多个 default box 与其相匹配。

    总的目标损失函数(objective loss function)就由 localization loss(loc)confidence loss(conf) 的加权求和:

    L(x,c,l,g)=1N(Lconf(x,c)+αLloc(x,l,g))L(x,c,l,g)=1N(Lconf(x,c)+αLloc(x,l,g))

    其中:

    • NN,设置为 1


    Choosing scales and aspect ratios for default boxes

    大部分 CNN 网络在越深的层,feature map 的尺寸(size)会越来越小。这样做不仅仅是为了减少计算与内存的需求,还有个好处就是,最后提取的 feature map 就会有某种程度上的平移与尺度不变性。

    同时为了处理不同尺度的物体,一些文章,如 ICLR 2014, Overfeat: Integrated recognition, localization and detection using convolutional networks,还有 ECCV 2014, Spatial pyramid pooling in deep convolutional networks for visual recognition,他们将图像转换成不同的尺度,将这些图像独立的通过 CNN 网络处理,再将这些不同尺度的图像结果进行综合。

    但是其实,如果使用同一个网络中的、不同层上的 feature maps,也可以达到相同的效果同时在所有物体尺度中共享参数

    之前的工作,如 CVPR 2015, Fully convolutional networks for semantic segmentation,还有 CVPR 2015, Hypercolumns for object segmentation and fine-grained localization 就用了 CNN 前面的 layers,来提高图像分割的效果,因为越底层的 layers,保留的图像细节越多。文章 ICLR 2016, ParseNet: Looking wider to see better 也证明了以上的想法是可行的。

    因此,本文同时使用 lower feature maps、upper feature maps 来 predict detections。下图展示了本文中使用的两种不同尺度的 feature map,8×88×8 的 feature map:

    这里写图片描述

    一般来说,一个 CNN 网络中不同的 layers 有着不同尺寸的 感受野(receptive fields)。这里的感受野,指的是输出的 feature map 上的一个节点,其对应输入图像上尺寸的大小。具体的感受野的计算,参见两篇 blog:

    所幸的是,SSD 结构中,default boxes 不必要与每一层 layer 的 receptive fields 对应。本文的设计中,feature map 中特定的位置,来负责图像中特定的区域,以及物体特定的尺寸。加入我们用 mm。所以最终,在每个 feature map location 上,有 6 个 default boxes。

    每一个 default box 的中心,设置为:(i+0.5|fk|,j+0.5|fk|)(i+0.5|fk|,j+0.5|fk|)

    在结合 feature maps 上,所有 不同尺度、不同 aspect ratios 的 default boxes,它们预测的 predictions 之后。可以想见,我们有许多个 predictions,包含了物体的不同尺寸、形状。如下图,狗狗的 ground truth box 与 4×44×4 feature map 中的红色 box 吻合,所以其余的 boxes 都看作负样本。

    这里写图片描述


    Hard negative mining

    在生成一系列的 predictions 之后,会产生很多个符合 ground truth box 的 predictions boxes,但同时,不符合 ground truth boxes 也很多,而且这个 negative boxes,远多于 positive boxes。这会造成 negative boxes、positive boxes 之间的不均衡。训练时难以收敛。

    因此,本文采取,先将每一个物体位置上对应 predictions(default boxes)是 negative 的 boxes 进行排序,按照 default boxes 的 confidence 的大小。 选择最高的几个,保证最后 negatives、positives 的比例在 3:13:1

    本文通过实验发现,这样的比例可以更快的优化,训练也更稳定。

    Data augmentation

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

    每一张训练图像,随机的进行如下几种选择:

    • 使用原始的图像
    • 采样一个 patch,与物体之间最小的 jaccard overlap 为:0.10.1
    • 随机的采样一个 patch

    采样的 patch 是原始图像大小比例是 [0.11][0.1,1] 之间。

    当 groundtruth box 的 中心(center)在采样的 patch 中时,我们保留重叠部分。

    在这些采样步骤之后,每一个采样的 patch 被 resize 到固定的大小,并且以 0.50.5 的概率随机的 水平翻转(horizontally flipped)


    Experimental Results

    Base network and hole filling algorithm

    本文的 Base network 是基于 ICLR 2015, VGG16 来做的,在 ILSVRC CLS-LOC 数据集上进行了预训练。

    ICLR 2015, DeepLab-LargeFOV 的工作类似,本文将 VGG 中的 FC6 layer、FC7 layer 转成为 卷积层,并从模型的 FC6、FC7 上的参数,进行采样得到这两个卷积层的 parameters。

    还将 Pool5 layer 的参数,从 2×2s22×2−s2,外加一个 pad(1),如下图:

    这里写图片描述

    但是这样变化后,会改变感受野(receptive field)的大小。因此,采用了 atrous algorithm 的技术,这里所谓的 atrous algorithm,我查阅了资料,就是 hole filling algorithm

    在 DeepLab 的主页上:http://liangchiehchen.com/projects/DeepLab.html,有一张如下的图:

    这里写图片描述

    博客 1:http://www.cnblogs.com/jianyingzhou/p/5386222.html

    最早用的就是 deeplab 的文章了,Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFS 这篇文章和 fcn 不同的是,在最后产生 score map 时,不是进行upsampling,而是采用了 hole algorithm,就是在 pool4 和 pool 5层,步长由 2 变成 1,必然输出的 score map 变大了,但是 receptive field 也变小了,为了不降低 receptive field,怎么做呢?利用 hole algorithm,将卷积 weights 膨胀扩大,即原来卷积核是 3x3,膨胀后,可能变成 7x7 了,这样 receptive field 变大了,而 score map 也很大,即输出变成 dense 的了。

    这么做的好处是,输出的 score map 变大了,即是 dense 的输出了,而且 receptive field 不会变小,而且可以变大。这对做分割、检测等工作非常重要。

    博客 2:http://blog.csdn.net/tangwei2014/article/details/50453334

    既想利用已经训练好的模型进行 fine-tuning,又想改变网络结构得到更加 dense 的 score map.

    这个解决办法就是采用 Hole 算法。如下图 (a) (b) 所示,在以往的卷积或者 pooling 中,一个 filter 中相邻的权重作用在 feature map 上的位置都是物理上连续的。如下图 (c) 所示,为了保证感受野不发生变化,某一层的 stride 由 2 变为 1 以后,后面的层需要采用 hole 算法,具体来讲就是将连续的连接关系是根据 hole size 大小变成 skip 连接的(图 (c) 为了显示方便直接画在本层上了)。不要被 (c) 中的 padding 为 2 吓着了,其实 2 个 padding 不会同时和一个 filter 相连。

    pool4 的 stride 由 2 变为 1,则紧接着的 conv5_1, conv5_2 和 conv5_3 中 hole size 为 2。接着 pool5 由 2 变为 1 , 则后面的 fc6 中 hole size 为 4。

    这里写图片描述

    本文还将 fully convolutional reduced (atrous) VGGNet 中的所有的 dropout layers、fc8 layer 移除掉了。

    本文在 fine-tuning 预训练的 VGG model 时,初始 learning rate 为 10310−3,learning rate decay 的策略随数据集的不同而变化。


    PASCAL VOC 2007

    在这个数据集中,与 Fast R-CNNFaster R-CNN 进行了比较,几种检测网络都用相同的训练数据集,以及预训练模型(VGG16)。

    本文训练图像是 VOC 2007 train + VOC 2007 validation + VOC 2012 train + VOC 2012 validation,共计 16551 张图像;

    测试集选取的是 VOC 2007 test,共计 4952 张图像。

    下图展示了 SSD300 model 的结构:

    这里写图片描述

    我们用 conv4_3conv7(原先的 FC7)conv8_2conv9_2conv10_2,以及 pool11,这些 layer 来 predict location、 confidence

    在 VGG16 上新加的 convolutional layers,其参数初始化都用 JMLR 2010, Understanding the difficulty of training deep feedforward neural networks 提出的 xavier 方法。

    因为 conv4_3 的尺寸比较大,size 为 38×3838×38 个 default boxes。

    文献 ICLR 2016, ParseNet: Looking wider to see better 指出,conv4_3 相比较于其他的 layers,有着不同的 feature scale,我们使用 ParseNet 中的 L2 normalization 技术将 conv4_3 feature map 中每一个位置的 feature norm scale 到 20,并且在 back-propagation 中学习这个 scale。

    在最开始的 40K 次迭代中,本文使用的 learning rate 是 10310−3,再接着迭代 20K 次。

    下面 Table 1 显示了,我们的 SSD300 model 的精度已经超过了 Fast R-CNN,当我们用 SSD 在更大的图像尺寸上,500×500500×500 的 mAP。

    这里写图片描述

    为了更细节的了解本文的两个 SSD model,我们使用了 ECCV 2012, Diagnosing error in object detectors 的检测分析工具。下图 Figure 3 显示了 SSD 可以高质量的检测不同种类的物体。

    这里写图片描述

    下图 Figure 4 展示了 SSD 模型对 bounding box 的 size 非常的敏感。也就是说,SSD 对小物体目标较为敏感,在检测小物体目标上表现较差。其实这也算情理之中,因为对于小目标而言,经过多层卷积之后,就没剩多少信息了。虽然提高输入图像的 size 可以提高对小目标的检测效果,但是对于小目标检测问题,还是有很多提升空间的。

    同时,积极的看,SSD 对大目标检测效果非常好。同时,因为本文使用了不同 aspect ratios 的 default boxes,SSD 对于不同 aspect ratios 的物体检测效果也很好。

    这里写图片描述


    Model analysis

    为了更好的理解 SSD,本文还使用控制变量法来验证 SSD 中的每一部分对最终结果性能的影响。测试如下表 Table 2 所示:

    这里写图片描述

    从上表可以看出一下几点:

    • 数据增广(Data augmentation)对于结果的提升非常明显
      Fast R-CNN 与 Faster R-CNN 使用原始图像,以及 0.5 的概率对原始图像进行水平翻转(horizontal flip),进行训练。如上面写的,本文还使用了额外的 sampling 策略,YOLO 中还使用了 亮度扭曲(photometric distortions),但是本文中没有使用。
      做了数据增广,将 mAP 从 65.4%65.4%


    PASCAL VOC 2012

    本文又在 VOC 2012 test 上进行的实验,比较结果如下:

    这里写图片描述


    MS COCO

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

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

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

    总的结果如下:

    这里写图片描述


    Inference time

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

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

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

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

    这里写图片描述


    这篇文章居然把相关工作总结放在最后面,我还是第一次见到。

    具体的看原文吧。

    最后放几张结果图:

    这里写图片描述

    这里写图片描述

    展开全文
  • SSD论文官方PDF版本

    2018-03-22 14:53:05
    SSD的官方文档SSD论文官方PDF版本SSD的官方文档SSD论文官方PDF版本
  • SSD论文解读.md

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

    千次阅读 2018-09-05 15:09:27
    SSD论文讲解,可参见博文:https://blog.csdn.net/u010167269/article/details/52563573 &amp;lt;/div&amp;gt; ...

    SSD论文讲解,可参见博文:https://blog.csdn.net/u010167269/article/details/52563573

                </div>
    
    展开全文
  • SSD论文理解

    2019-09-18 15:36:21
    SSD论文贡献: 1. 引入了一种单阶段的检测器,比以前的算法YOLO更准更快,并没有使用RPN和Pooling操作; 2. 使用一个小的卷积滤波器应用在不同的feature map层从而预测BB的类别的BB偏差; 3. 可以在更小的输入...

    SSD论文贡献:

    1. 引入了一种单阶段的检测器,比以前的算法YOLO更准更快,并没有使用RPN和Pooling操作;

    2. 使用一个小的卷积滤波器应用在不同的feature map层从而预测BB的类别的BB偏差;

    3. 可以在更小的输入图片中得到更好的检测效果(相比Faster-rcnn);

    4. 在多个数据集(PASCAL、VOC、COCO、ILSVRC)上面的测试结果表明,它可以获得更高的mAp值;

    This results in a significant improvement in speed for high-accuracy detection(59 FPS with mAP 74.3% on VOC2007 test, vs Faster-rcnn 7 FPS with mAP 73.2% or YOLO 45 FPS with mAP 63.4%)

     

    图1 SSD和其它算法的性能比较

     

    一、SSD网络总体架构

    1. 输入一幅图片(300x300),将其输入到预训练好的分类网络中来获得不同大小的特征映射,修改了传统的VGG16网络;

    • 将VGG16的FC6和FC7层转化为卷积层,如图1上的Conv6和Conv7;
    • 去掉所有的Dropout层和FC8层;
    • 添加了Atrous算法(hole算法);
    • 将Pool5从2x2-S2变换到3x3-S1;

    2. 抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2层的feature map,然后分别在这些feature map层上面的每一个点构造6个不同尺度大小的BB,然后分别进行检测和分类,生成多个BB,如图1下面的图所示;

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

     

    二、 SSD算法细节

    1. 多尺度特征映射

    A.传统算法与SSD算法的思路比较:

     

    如上图所示,我们可以看到左边的方法针对输入的图片获取不同尺度的特征映射,但是在预测阶段仅仅使用了最后一层的特征映射;而SSD不仅获得不同尺度的特征映射,同时在不同的特征映射上面进行预测,它在增加运算量的同时可能会提高检测的精度,因为它具有更多的可能性。

    B.Faster-rcnn与SSD比较:

     

    如图所示,对于BB的生成,Faster-rcnn和SSD有不同的策略,但是都是为了同一个目的,产生不同尺度,不同形状的BB,用来检测物体。对于Faster-rcnn而言,其在特定层的Feature map上面的每一点生成9个预定义好的BB,然后进行回归和分类操作进行初步检测,然后进行ROI Pooling和检测获得相应的BB;而SSD则在不同的特征层的feature map上的每个点同时获取6个不同的BB,然后将这些BB结合起来,最后经过NMS处理获得最后的BB。

    C.原因剖析:

    输入一幅汽车的图片,我们将其输入到一个卷积神经网络中,在这期间,经历了多个卷积层和池化层,我们可以看到在不同的卷积层会输出不同大小的feature map(这是由于pooling层的存在,它会将图片的尺寸变小),而且不同的feature map中含有不同的特征,而不同的特征可能对我们的检测有不同的作用。总的来说,浅层卷积层对边缘更加感兴趣,可以获得一些细节信息,而深层网络对由浅层特征构成的复杂特征更感兴趣,可以获得一些语义信息,对于检测任务而言,一幅图像中的目标有复杂的有简单的,对于简单的patch我们利用浅层网络的特征就可以将其检测出来,对于复杂的patch我们利用深层网络的特征就可以将其检测出来,因此,如果我们同时在不同的feature map上面进行目标检测,理论上面应该会获得更好的检测效果。

    D.SSD多尺度特征映射细节:

    SSD算法中使用到了conv4_3,conv_7,conv8_2,conv7_2,conv8_2,conv9_2,conv10_2,conv11_2这些大小不同的feature maps,其目的是为了能够准确的检测到不同尺度的物体,因为在低层的feature map,感受野比较小,高层的感受野比较大,在不同的feature map进行卷积,可以达到多尺度的目的。
     

    2. Defalut box

     

    如上图所示,在特征图的每个位置预测K个BB,对于每一个BB,预测C个类别得分,以及相对于Default box的4个偏移量值,这样总共需要(C+4)* K个预测器,则在m*n的特征图上面将会产生(C+4)* K * m * n个预测值。
    Defalut box分析:

    我们总共可以获得8732个box,然后我们将这些box送入NMS模块中,获得最终的检测结果。

     

     

    3. LOSS计算

    与常见的 Object Detection模型的目标函数相同,SSD算法的目标函数分为两部分:计算相应的default box与目标类别的confidence loss以及相应的位置回归。

     

    其中N是match到Ground Truth的default box数量;而alpha参数用于调整confidence loss和location loss之间的比例,默认alpha=1。

     

     

    三、SSD提高精度的方法

    1. 数据增强

    SSD训练过程中使用的数据增强对网络性能影响很大,大约有6.7%的mAP提升。

    (1) 随机剪裁:采样一个片段,使剪裁部分与目标重叠分别为0.1, 0.3, 0.5, 0.7, 0.9,剪裁完resize到固定尺寸。

    (2) 以0.5的概率随机水平翻转。

    2. Hard Negative Mining技术

    一般情况下negative default boxes数量是远大于positive default boxes数量,如果随机选取样本训练会导致网络过于重视负样本(因为抽取到负样本的概率值更大一些),这会使得loss不稳定。因此需要平衡正负样本的个数,我们常用的方法就是Hard Ngative Mining,即依据confidience score对default box进行排序,挑选其中confidience高的box进行训练,将正负样本的比例控制在positive:negative=1:3,这样会取得更好的效果。如果我们不加控制的话,很可能会出现Sample到的所有样本都是负样本(即让网络从这些负样本中找正确目标,这显然是不可以的),这样就会使得网络的性能变差。

    3. 匹配策略(即如何重多个default box中找到和ground truth最接近的box)

    • 首先,寻找与每一个ground truth有最大的IoU的default box,这样就能保证ground truth至少有default box匹配;
    • SSD之后又将剩余还没有配对的default box与任意一个ground truth尝试配对,只要两者之间的IoU大于阈值(SSD 300 阈值为0.5),就认为match;
    • 配对到ground truth的default box就是positive,没有配对的default box就是negative。

    总之,一个ground truth可能对应多个positive default box,而不再像MultiBox那样只取一个IoU最大的default box。其他的作为负样本(每个default box要么是正样本box要么是负样本box)。

    4. 是否在基础网络部分的conv4_3进行检测

    基础网络部分特征图分辨率高,原图中信息更完整,感受野较小,可以用来检测图像中的小目标,这也是SSD相对于YOLO检测小目标的优势所在。增加对基础网络conv4_3的特征图的检测可以使mAP提升4%。

    5. 使用瘦高与宽扁默认框

    数据集中目标的开关往往各式各样,因此挑选合适形状的默认框能够提高检测效果。作者实验得出使用瘦高与宽扁默认框相对于只使用正方形默认框有2.9%mAP提升。

    6. Atrous Algothrim(获得更加密集的得分映射)

    作用:既想利用已经训练好的模型进行fine-tuning,又想改变网络结构得到更加dense的score map。
    这个解决办法就是采用Hole算法。

    7. NMS(非极大值抑制)
    在SSD算法中,NMS至关重要,因为多个feature map 最后会产生大量的BB,然而在这些BB中存在着大量的错误的、重叠的、不准确的BB,这不仅造成了巨大的计算量,如果处理不好会影响算法的性能。仅仅依赖于IOU(即预测的BB和GT的BB之间的重合率)是不现实的,IOU值设置的太大,可能就会丢失一部分检测的目标,即会出现大量的漏检情况;IOU值设置的太小,则会出现大量的重叠检测,会大大影响检测器的性能,因此IOU的选取也是一个经验活,常用的是0.65,建议使用论文中作者使用的IOU值,因为这些值一般都是最优值。即在IOU处理掉大部分的BB之后,仍然会存在大量的错误的、重叠的、不准确的BB,这就需要NMS进行迭代优化。
     

    四、评价

    1. SSD加速的原因

     

    表2 SSD的BB个数

    如上图所示,当Faster-rcnn的输入分辨率为1000x600时,产生的BB是6000个;当SSD300的输入分辨率为300x300时,产生的BB是8372个;当SSD512的输入分辨率为512x512时,产生的BB是24564个,大家像一个情况,当SSD的分辨率也是1000x600时,会产生多少个BB呢?这个数字可能会很大!但是它却说自己比Faster-rcnn和YOLO等算法快很多,我们来分析分析原因。

    原因1:首先SSD是一个单阶段网络,只需要一个阶段就可以输出结果;而Faster-rcnn是一个双阶段网络,尽管Faster-rcnn的BB少很多,但是其需要大量的前向和反向推理(训练阶段),而且需要交替的训练两个网络;
    原因2:Faster-rcnn中不仅需要训练RPN,而且需要训练Fast-rcnn,而SSD其实相当于一个优化了的RPN网络,不需要进行后面的检测,仅仅前向推理就会花费很多时间;
    原因3:YOLO网络虽然比SSD网络看起来简单,但是YOLO网络中含有大量的全连接层,和FC层相比,CONV层具有更少的参数;同时YOLO获得候选BB的操作比较费时;
    原因4:SSD算法中,调整了VGG网络的架构,将其中的FC层替换为CONV层,这一点会大大的提升速度,因为VGG中的FC层都需要大量的运算,有大量的参数,需要进行前向推理;
    原因5:使用了atrous算法,具体的提速原理还不清楚,不过论文中明确提出该算法能够提速20%。
    原因6:SSD设置了输入图片的大小,它会将不同大小的图片裁剪为300x300,或者512x512,和Faster-rcnn相比,在输入上就会少很多的计算,不要说后面的啦,不快就怪啦!!!
     

    2. SSD算法的优缺点

    优点:运行速度超过YOLO,精度超过Faster-rcnn(一定条件下,对于稀疏场景的大目标而言)。

    缺点:

    需要人工设置prior box的min_size,max_size和aspect_ratio值。网络中default box的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层feature使用的default box大小和形状恰好都不一样,导致调试过程非常依赖经验。(相比之下,YOLO2使用聚类找出大部分的anchor box形状,这个思想能直接套在SSD上)
    虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,并没有达到碾压Faster RCNN的级别。可能是因为SSD使用conv4_3低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。
    个人观点:SSD到底好不好,需要根据你的应用和需求来讲,真正合适你的应用场景的检测算法需要你去做性能验证,比如你的场景是密集的包含多个小目标的,我很建议你用Faster-rcnn,针对特定的网络进行优化,也是可以加速的;如果你的应用对速度要求很苛刻,那么肯定首先考虑SSD,至于那些测试集上的评估结果,和真实的数据还是有很大的差距,算法的性能也需要进一步进行评估。

     

    参考:

    https://blog.csdn.net/WZZ18191171661/article/details/79444217

    https://www.cnblogs.com/fariver/p/7347197.html

    转载于:https://www.cnblogs.com/CJT-blog/p/10455362.html

    展开全文
  • 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论文解读

    2021-01-06 20:39:08
    SSD(SingleShotDetector)论文解读 一、相关背景 速率问题:在目标检测的速率上明显存在问题,此前最快的检测模型为Faster R-CNN(速率为每秒钟7帧) 二、主要贡献 提出了第一个基于目标检测的深度神经网络,不需要...
  • 大神刘伟发表的ssd论文,包括引文版和翻译的中文版,适合入门学习ssd的同学阅读学习。
  • 翻译SSD论文(Single Shot MultiBox Detector) ,转载仅作交流~
  • face paper:SSD论文详解

    2017-12-31 20:57:47
    face paper:SSD论文详解
  • SSD论文地址:https://arxiv.org/abs/1512.02325 SSD代码:https://github.com/weiliu89/caffe/tree/ssd SSD检测模型框架 模型 ssd属于前馈卷积神经网络,通过该网络能够产生一系列边界框以及置信分数,...
  • SSD 论文与项目总结

    2018-09-12 21:14:14
    一、SSD论文 总体描述 SSD全程为single-shot multibox detection,其中一个要点single shot的意思是将分类和回归的loss在同一个过程中计算;另一个要点multibox,即算法中预先设定好一些列不同scale、不同...
  • SSD 论文详解

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

    2018-08-20 17:24:48
    一种使用单个深层神经网络检测图像中对象的方法被称为SSD,这篇文档是由爱好者帮忙翻译而成的中文版论文,可以深入了解SSD。更多参考资料可点击:https://club.leiphone.com/page/resources
  • SSD论文重新看了一遍,这次比较多的东西能够理解了 虽然还是比较肤浅的级别 分析几个觉得比较有用的知识点 SSD在训练的时候采用了数据增强,将每张训练图片进行了缩放 Sample_Patch 可以将...
  • 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-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论文

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

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,215
精华内容 486
关键字:

ssd论文