为期一周结合ssd源码对ssd的细节进行梳理,其实有些地方仍然不是很明白,但是还是要对自己一周的工作进行总结。

ssd算法,其英文全名是Single Shot MultiBox Detector,属于one-stage方法,MultiBox指明了ssd算法是多框预测,是相对于RCNN系列目标检测算法,yolo系列目标检测算法的改进算法,ssd算法在准确度和速度上都比yolo要好很多,对于Faster R-CNN,首先通过CNN得到候选框,然后再进行分类与回归,而yolo与ssd可以一步到位完成检测。相比yolo,ssd采用CNN来直接进行检测,而不是像yolo那样在全连接层之后做检测。其实采用卷积直接做检测只是SSD相比Yolo的其中一个不同点,另外还有两个重要的改变,一是SSD提取了不同尺度的特征图来做检测,大尺度特征图(较靠前的特征图)可以用来检测小物体,而小尺度特征图(较靠后的特征图)用来检测大物体;二是SSD采用了不同尺度和长宽比的先验框(Prior boxes, Default boxes,在Faster R-CNN中叫做锚,Anchors)。Yolo算法缺点是难以检测小目标,而且定位不准,但是这几点重要改进使得SSD在一定程度上克服这些缺点。下面我们详细讲解SDD算法的原理。

SSD网络结构

ssd是采用VGG16作为基础网络的,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。SSD的网络结构如图所示。在论文中将ssd和yolo的网络结构进行对比,可以明显看到ssd利用了多尺度的特征图做检测,模型的输入图片大小是300×300。

采用VGG16做基础模型,首先VGG16是在ILSVRC CLS-LOC数据集预训练。然后借鉴了DeepLab-LargeFOV,分别将VGG16的全连接层fc6和fc7转换成 3×3 卷积层 conv6和 1×1卷积层conv7,同时将池化层pool5由原来的stride=2的 2×2 变成stride=1的 3×3 (猜想是不想reduce特征图大小),为了配合这种变化,采用了一种Atrous Algorithm,其实就是conv6采用扩展卷积或带孔卷积(Dilation Conv),其在不增加参数与模型复杂度的条件下指数级扩大卷积的视野,其使用扩张率(dilation rate)参数,来表示扩张的大小,如下图6所示,(a)是普通的 3×3 卷积,其视野就是 3×3,(b)是扩张率为1,此时视野变成 7×7 , (c) 扩张率为3时,视野扩大为 15×15,但是视野的特征更稀疏了。Conv6采用 3×33×3 大小但dilation rate=6的扩展卷积。

SSD的与众不同

1采用多尺度特征图用于检测

多尺度指的是采用不同大小的特征图,结合ssd的网络结构和上图可以看出,ssd采用了特征金字塔结构进行检测,即检测时用到了conv4-3,conv7,conv6-2,comv7-2,conv8_2,conv9_2这些大小不同的faeture maps,在多个feature maps上同时进行softmax分类和位置的回归。SSD使用6个不同特征图检测不同尺度的目标。低层预测小目标,高层预测大目标。

2prior box

在SSD中引入了Prior Box,实际上与anchor非常类似,就是一些目标的预选框,后续通过softmax分类+bounding box regression获得真实目标的位置。SSD按照如下规则生成prior box:

以feature map上每个点的中点为中心(offset=0.5),生成一系列同心的prior box(然后中心点的坐标会乘以step,相当于从feature map位置映射回原图位置)

prior box的长宽以及个数的计算主要根据以下原则,结合网络结构来说明:

  • 先以min_size确定宽高生成一个框
  • 若存在max_size,则用sqrt(min_size*max_size)确定宽高生成一个框
  • 若存在aspect_ratio,则再去确定宽高生成宽,举例说明,如上图的网络结构中,aspect_ratio为2,3,则就会自动添加aspect_ratio=1/2、1/3,然后根据如下方法进行计算:

box_width = min_size*sqrt(ar)

box_height =min_size/sqrt(ar)

其中ar = aspect_ratio=2、3、1/2、1/3

所以中心点所能产生的prior_box的数量为cout(min_size)*1+cout(max_size)*1+cout(aspect_ratio)*n,n为aspect_ratio的个数。

3数据增强

ssd在训练阶段进行了数据预处理,对数据进行了裁剪,放大,缩小,旋转等操作。

SSD中使用了两种数据增强的方式:
放大操作: 随机crop,patch与任意一个目标的IOU为0.1,0.3,0.5,0.7,0.9,每个patch的大小为原图大小的[0.1,1],宽高比在1/2到2之间。能够生成更多的尺度较大的目标。
缩小操作: 首先创建16倍原图大小的画布,然后将原图放置其中,然后随机crop,能够生成更多尺度较小的目标。

当 groundtruth box 的 中心(center)在采样的 patch 中且在采样的 patch中 groundtruth box面积大于0时,我们保留CropImage。

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

这样一个样本被诸多batch_sampler采样器采样后会生成多个候选样本,然后从中随机选一个样本送入网络训练。

SSD损失函数

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

上面得到的8732个目标框经过Jaccard Overlap筛选剩下几个了;其中不满足的框标记为负数,其余留下的标为正数框。紧随其后:

SSD训练过程

训练过程中的 prior boxes 和 ground truth boxes 的匹配,基本思路是:让每一个 prior box 回归并且到 ground truth box,这个过程的调控我们需要损失层的帮助,他会计算真实值和预测值之间的误差,从而指导学习的走向。

SSD 训练的目标函数(training objective)源自于 MultiBox 的目标函数,但是在论文中将其拓展,使其可以处理多个目标类别。具体过程是我们会让每一个 prior box 经过Jaccard系数计算和真实框的相似度,阈值只有大于 0.5的才可以列为候选名单;假设选择出来的是N个匹配度高于百分之五十的框吧,我们令 i 表示第 i个默认框,j表示第 j个真实框,p表示第p个类。那么x_{ij}^p表示 第 i 个 prior box 与 类别 p 的 第 j 个 ground truth box 相匹配的Jaccard系数,若不匹配的话,则x_{ij}^p=0。总的目标损失函数(objective loss function)就由 localization loss(loc) 与 confidence loss(conf) 的加权求和:

  • N 是与 ground truth box 相匹配的 prior boxes 个数

  • localization loss(loc) 是 Fast R-CNN 中 Smooth L1 Loss,用在 predict box(l) 与 ground truth box(g) 参数(即中心坐标位置,width、height)中,回归 bounding boxes 的中心位置,以及 width、height

  • confidence loss(conf) 是 Softmax Loss,输入为每一类的置信度 c

  • 权重项 α,可在protxt中设置 loc_weight,默认设置为 1

caffe-ssd细节梳理相关推荐

  1. Caffe SSD Ubuntu16 04 训练自己的数据集

    总的来说,Caffe 是一个比较难上手的框架.这次尝试训练 Caffe 框架下 SSD 模型的训练是我第一次使用 Caffe 框架.下面就说一说我踩过的几个坑,希望能够帮助到大家. 1 编译 Caff ...

  2. ubuntu16.04 + caffe + SSD 硬件配置

    搞了几个月,终于把SSD试通了,不是科班出身的就是弯路多啊.几个月才跑通了caffe + ssd,痛苦至极,好在柳暗花明.好了,废话不多说,入正题. SSD作为object detection的论文, ...

  3. caffe SSD 代码编译运行流程及问题解决

    caffe SSD 代码编译运行流程及问题解决 该文基于以下代码: https://github.com/weiliu89/caffe/tree/ssd down下来后,进入目录 -rw-rw-r-- ...

  4. caffe ssd中输入图片大小对于内存使用和运行时间的影响

    caffe ssd中输入图片大小对于内存使用和运行时间的影响 一.内存使用 环境为caffe下以imagenet为样本集训练resnset网络.       在初始化生成lmdb的create_ima ...

  5. 笔记:caffe ssd gpu训练自己的数据集

    caffe ssd GPU训练自己的数据集 一.caffe环境搭建 二.数据集 三.训练和测试 一.caffe环境搭建 环境搭建过程网上有很多教程,可能要踩些坑吧,正常,这里不多赘述,主要是我当时也没 ...

  6. caffe ssd 优化

    一.数据预处理加速(提升 4~6 倍) 优化原因: 原版 caffe ssd 数据预处理速度很慢(尤其是遇到 depthwise conv 的时候) 数据预处理的速度远远跟不上前向和反向计算的速度,导 ...

  7. 17 CSR/SSR双模式渲染支持以及其他细节梳理

    导读 本节标题:CSR/SSR双模式渲染支持以及其他细节梳理 本节主旨:前面没有关注小细节,这里合并起来统一说明,如双模式渲染.跨平台处理.前端模块 hack.跨端访问等 正文 本节主要是补充一下以前 ...

  8. caffe ssd 测试demo,检测单张图片

    原 SSD: Single Shot MultiBox Detector 检测单张图片 2016年10月29日 16:39:05 阅读数:19930 标签: python ssd ssd-detect ...

  9. Caffe SSD编译、训练及测试

    SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征以用于检测.SSD的网络结构如上图所示(上面是SSD模型,下面是Yolo模型),可以明显看到SSD利用了多尺度的特 ...

最新文章

  1. 摩托罗拉指控苹果iPhone 4S和iCloud侵犯6项专利
  2. 【BZOJ4004】装备购买(线性基)
  3. 野指针和悬空指针的形成原因和如何避免!
  4. CSS基础笔记(w3school)
  5. 获取python工程下面的所需的所有开源依赖包
  6. oracle 打开 ctl,Oracle 19c 随系统systemctl启动数据库
  7. Python+Selenium基础篇之2-打开和关闭火狐浏览器
  8. 外媒报道电子垃圾被运入中国
  9. 设计模式之六 --- 抽象工厂模式(Abstract Factory)
  10. 基于jQuery8款超赞的评分插件
  11. 前端开发必备之MDN文档
  12. 自响应式企业网站源码MVC源码
  13. 使用RNN预测各个国家的人均GDP
  14. 简单介绍一下HBase、Cassandra、Voldemort、Redis、VoltDB、MySQL(转)
  15. 【Vue基础七】--- 组件和模块概念
  16. 弘辽科技:如何书写淘宝直通车创意标题才能带来更多的流量?
  17. 【软件之道】Word模板的制作及使用
  18. @Transactional 使用说明
  19. 基于stm32的物联网、智能家居控制系统
  20. 【BZOJ 2330】 [SCOI2011]糖果【差分约束】

热门文章

  1. Windows下Java下载与安装,Java第一个程序
  2. 【network】How do I verify the speed of my NIC?
  3. 使用CSS3动画做出光芒万丈的效果
  4. Pulmonary--Detection7
  5. 长江大学c语言程序设计答案,C语言程序设计卷及答案.doc
  6. php手机建站,zzzphp免费开源建站系统含手机站
  7. CentOS7.9安装nexus-3.20.1-01-unix.tar.gz
  8. java double类型判空,简单封装JAVA空判断
  9. 英语----我们快乐生活的一部分
  10. Shell Programming