SSD

转自:https://zhuanlan.zhihu.com/p/24954433?refer=xiaoleimlnote

参考: SSD: Single Shot MultiBox Detectordeepsystems.io

背景介绍:

基于“Proposal + Classification” 的 Object Detection 的方法,R-CNN 系列(R-CNN、SPPnet、Fast R-CNN 以及 Faster R-CNN),取得了非常好的结果,但是在速度方面离实时效果还比较远在提高 mAP 的同时兼顾速度,逐渐成为 Object Detection 未来的趋势。 YOLO 虽然能够达到实时的效果,但是其 mAP 与刚面提到的 state of art 的结果有很大的差距。 YOLO 有一些缺陷:每个网格只预测一个物体,容易造成漏检;对于物体的尺度相对比较敏感,对于尺度变化较大的物体泛化能力较差。针对
YOLO 中的这些不足,该论文提出的方法 SSD 在这两方面都有所改进,同时兼顾了 mAP 和实时性的要求。在满足实时性的条件下,接近 state of art 的结果。对于输入图像大小为 300*300 在 VOC2007 test 上能够达到 58 帧每秒( Titan X 的 GPU ),72.1% 的 mAP。输入图像大小为 500 *500 , mAP 能够达到 75.1%。作者的思路就是Faster R-CNN+YOLO,利用YOLO的思路和Faster R-CNN的anchor box的思想。

关键点:

关键点1:网络结构

该论文采用 VGG16 的基础网络结构,使用前面的前 5 层,然后利用 astrous 算法将 fc6 和 fc7 层转化成两个卷积层。再格外增加了 3 个卷积层,和一个 average pool层。不同层次的 feature map 分别用于 default box 的偏移以及不同类别得分的预测(惯用思路:使用通用的结构(如前 5个conv 等)作为基础网络,然后在这个基础上增加其他的层),最后通过 nms得到最终的检测结果。

这些增加的卷积层的 feature map 的大小变化比较大,允许能够检测出不同尺度下的物体: 在低层的feature map,感受野比较小,高层的感受野比较大,在不同的feature map进行卷积,可以达到多尺度的目的。观察YOLO,后面存在两个全连接层,全连接层以后,每一个输出都会观察到整幅图像,并不是很合理。但是SSD去掉了全连接层,每一个输出只会感受到目标周围的信息,包括上下文。这样来做就增加了合理性。并且不同的feature
map,预测不同宽高比的图像,这样比YOLO增加了预测更多的比例的box。(下图横向的流程)

关键点2:多尺度feature map得到 default boxs及其 4个位置偏移和21个类别置信度

对于不同尺度feature map( 上图中 38x38x512,19x19x512, 10x10x512, 5x5x512, 3x3x512, 1x1x256) 的上的所有特征点: 以5x5x256为例 它的#defalut_boxes = 6

  • 1 按照不同的 scale 和 ratio 生成,k 个 default boxes,这种结构有点类似于 Faster R-CNN 中的 Anchor。(此处k=6所以:5*5*6 = 150 boxes)
  • 2 新增加的每个卷积层的 feature map 都会通过一些小的卷积核操作,得到每一个 default boxes 关于物体类别的21个置信度 ( 20个类别和1个背景)
    和4偏移 (shape offsets) 。

    • 假设feature map 通道数为 p 卷积核大小统一为 3*3*p (此处p=256)。个人猜想作者为了使得卷积后的feature map与输入尺度保持一致必然有 padding = 1, stride = 1 : 
    • 假如feature map 的size 为 m*n, 通道数为 p,使用的卷积核大小为 3*3*p。每个 feature map 上的每个特征点对应 k 个 default boxes,物体的类别数为 c,那么一个feature map就需要使用 k(c+4)个这样的卷积滤波器,最后有 (m*n) *k* (c+4)个输出。

训练策略

监督学习的训练关键是人工标注的label。对于包含default box(在Faster R-CNN中叫做anchor)的网络模型(如: YOLO,Faster R-CNN, MultiBox)关键点就是如何把 标注信息(ground true box,ground true category)映射到(default box上)

  • 正负样本: 给定输入图像以及每个物体的 ground truth,首先找到每个ground true box对应的default box中IOU最大的作为(与该ground true box相关的匹配)正样本。然后,在剩下的default box中找到那些与任意一个ground truth box 的 IOU 大于 0.5的default box作为(与该ground true box相关的匹配)正样本。 一个 ground truth 可能对应多个 正样本default box 而不再像MultiBox那样只取一个IOU最大的default
    box。其他的作为负样本(每个default box要么是正样本box要么是负样本box)。下图的例子是:给定输入图像及 ground truth,分别在两种不同尺度(feature map 的大小为 8*8,4*4)下的匹配情况。有两个 default box 与猫匹配(8*8),一个 default box 与狗匹配(4*4)。
  • 目标函数,和常见的 Object Detection 的方法目标函数相同,分为两部分:计算相应的 default box 与目标类别的 score(置信度)以及相应的回归结果(位置回归)。置信度是采用 Softmax Loss(Faster R-CNN是log loss),位置回归则是采用 Smooth L1 loss (与Faster R-CNN一样采用 offset_PTDF靠近 offset_GTDF的策略:jian'xia'tu)。  其中:N代表正样本的数目
  • 该论文是在 ImageNet 分类和定位问题上的已经训练好的 VGG16 模型中 fine-tuning 得到,使用 SGD,初始学习率为 ,
    冲量为 0.9,权重衰减为 0.0005,batchsize 为 32。不同数据集的学习率改变策略不同。新增加的卷积网络采用 xavier 的方式进行初始化

    • 在预测阶段,直接预测每个 default box 的偏移以及对于每个类别相应的得分。最后通过 nms 的方式得到最后检测结果。

    Default Box 的生成:

    该论文中利用不同层的 feature map 来模仿学习不同尺度下物体的检测。

    • scale: 假定使用 m 个不同层的feature map 来做预测,最底层的 feature map 的 scale 值为 ,最高层的为 ,其他层通过下面公式计算得到 
    • ratio: 使用不同的 ratio值 计算
      default box 的宽度和高度:。另外对于
      ratio = 1 的情况,额外再指定 scale 为 也就是总共有
      6 中不同的 default box。
    • default box中心:上每个 default box的中心位置设置成  ,其中  表示第k个特征图的大小  。

    Hard Negative Mining:

    用于预测的 feature map 上的每个点都对应有 6 个不同的 default box,绝大部分的 default box 都是负样本,导致了正负样本不平衡。在训练过程中,采用了 Hard Negative Mining 的策略(根据confidence loss对所有的box进行排序,使正负例的比例保持在1:3) 来平衡正负样本的比率。这样做能提高4%左右。

    Data augmentation

    为了模型更加鲁棒,需要使用不同尺寸的输入和形状,作者对数据进行了如下方式的随机采样:

    • 使用整张图片
    • 使用IOU和目标物体为0.1, 0.3,0.5, 0.7, 0.9的patch (这些 patch 在原图的大小的 [0.1,1] 之间, 相应的宽高比在[1/2,2]之间)
    • 随机采取一个patch

    当 ground truth box 的 中心(center)在采样的 patch 中时,我们保留重叠部分。在这些采样步骤之后,每一个采样的 patch 被 resize 到固定的大小,并且以 0.5 的概率随机的 水平翻转(horizontally flipped)。用数据增益通过实验证明,能够将数据mAP增加8.8%。

    参考:

  • 【神经网络与深度学习】【计算机视觉】SSD的更多相关文章

    1. [神经网络与深度学习][计算机视觉]SSD编译时遇到了json_parser_read.hpp:257:264: error: ‘type name’ declared as function ret

      运行make之后出现如下错误: /usr/include/boost/property_tree/detail/json_parser_read.hpp:257:264: error: 'type n ...

    2. (转)神经网络和深度学习简史(第一部分):从感知机到BP算法

      深度|神经网络和深度学习简史(第一部分):从感知机到BP算法 2016-01-23 机器之心 来自Andrey Kurenkov 作者:Andrey Kurenkov 机器之心编译出品 参与:chen ...

    3. [DeeplearningAI笔记]神经网络与深度学习人工智能行业大师访谈

      觉得有用的话,欢迎一起讨论相互学习~Follow Me 吴恩达采访Geoffrey Hinton NG:前几十年,你就已经发明了这么多神经网络和深度学习相关的概念,我其实很好奇,在这么多你发明的东西中 ...

    4. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验【中英】

      [中英][吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第二周测验 第2周测验 - 神经网络基础 神经元节点计算什么? [ ]神经元节点先计算激活函数,再计算线性函数(z = Wx + ...

    5. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第一周测验【中英】

      [吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第一周测验[中英] 第一周测验 - 深度学习简介 和“AI是新电力”相类似的说法是什么? [  ]AI为我们的家庭和办公室的个人设备供电 ...

    6. 对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF

      随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中 ...

    7. 如何理解归一化(Normalization)对于神经网络(深度学习)的帮助?

      如何理解归一化(Normalization)对于神经网络(深度学习)的帮助? 作者:知乎用户链接:https://www.zhihu.com/question/326034346/answer/730 ...

    8. 【神经网络与深度学习】卷积神经网络(CNN)

      [神经网络与深度学习]卷积神经网络(CNN) 标签:[神经网络与深度学习] 实际上前面已经发布过一次,但是这次重新复习了一下,决定再发博一次. 说明:以后的总结,还应该以我的认识进行总结,这样比较符合 ...

    9. 【神经网络与深度学习】【CUDA开发】caffe-windows win32下的编译尝试

      [神经网络与深度学习][CUDA开发]caffe-windows win32下的编译尝试 标签:[神经网络与深度学习] [CUDA开发] 主要是在开发Qt的应用程序时,需要的是有一个使用的库文件也只是 ...

    10. 【神经网络与深度学习】【Matlab开发】caffe-windows使能Matlab2015b接口

      [神经网络与深度学习][Matlab开发]caffe-windows使能Matlab2015b接口 标签:[神经网络与深度学习] [Matlab开发] 主要是想全部来一次,所以使能了Matlab的接口 ...

    随机推荐

    1. 基于Chrome内核(WebKit内核)定制开发DoNet浏览器

      1.    源起 a)     定制.Net浏览器 本人是一名C#开发者,而作为C#开发者,做客户端应用中最头痛的一件事就是没有一个好的UI解决方案, WinFrom嘛,效率虽然还不错,但是做一些特殊 ...

    2. 10、Python迭代器与生成器(iterator、for循环、generator、yield)

      一.迭代器(foreach) 1.可迭代的对象 内置有__iter__方法的都叫可迭代的对象. Python内置str.list.tuple.dict.set.file都是可迭代对象. x = 1._ ...

    3. 字符串翻转(C++)

      1.字符串原地翻转,"abc"->"cba": int str_reverse(string &str,int first,int last) { ...

    4. WebSocket 实现前后端通信的笔记

      之前在做站内信时,用到了 WebSocket ,整理了一些笔记分享如下.本文基于 SpringBoot 2.1.5,本文不涉及环境搭建. 引入依赖 在 Spring 中要使用 WebSocket 功能 ...

    5. css 网格布局

      一.概述 网格布局(Grid)是最强大的 CSS 布局方案. 它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局.以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了. 上 ...

    6. 【批处理】choice命令,call 命令,start 命令,rem

      [1]choice命令简介 使用此命令可以提示用户输入一个选择项,根据用户输入的选择项再决定执行具体的过程. 使用时应该加/c:参数,c: 后应写提示可输入的字符或数字,之间无空格.冒号是可选项. 使 ...

    7. Omnibus-ctl: What is it and what can it do for you?

      转自:https://blog.chef.io/2015/05/26/omnibus-ctl-what-is-it-and-what-can-it-do-for-you/ Are you buildi ...

    8. 洛谷 题解 P3984 【高兴的津津】

      潇洒の开始 大水题一枚/小声说话 先吐槽一下: 为什么津津经历了魔鬼训练就可以Au日常QWQ,人家也是早起晚睡的好吧 (谁说魔鬼训练就一定是早起晚睡的) 思路 津津的高兴是持续m天的,但是一旦在这m中 ...

    9. Web前端开发工具和环境清单

      初级 浏览器 Google Chrome 75.0.3770.100www.google.cn/intl/zh-CN/chrome初级 移动端模拟器 Genymotion 6.0.6www.genym ...

    10. (13)Go接口

      接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节. 接口 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类型. interfa ...