为期一周结合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. 输出类型SPER能自动删除公司间STO里的内向交货单?
  2. Analog使用中的一些技巧和总结
  3. 【DIY】不到20元,升级热水器加装远程wifi控制功能,esp8266远程红外控制热水器启动...
  4. nginx / 安装、部署和启动
  5. GIS中最短路径的实现
  6. web项目出现的异常
  7. 22.c语言各种输入输出与错误处理
  8. 【软件使用技巧】一(截图)
  9. java_web基本概念
  10. 数学女孩儿中的数列问题
  11. html5ie11缩放,IE 11 页面缩放后再次打开不能保存之前的缩放比例
  12. C语言打印日历总结报告,C语言打印日历
  13. ROS1云课→18一键配置
  14. 关于华为OD机考的澄清 + 说明
  15. 新知实验室 TRTC实时音视频
  16. 无线测温产品在山西煤矸石制砖余热发电项目中的应用
  17. linux lcm 接口,lcm接口ubuntu16.04系统qt编程详细步骤
  18. 微软亚洲研究院的软件工程课程
  19. 复制后的图形将文字覆盖上了【已解决】
  20. 广电收视率项目之项目需求分析

热门文章

  1. c++RPG游戏《末日风暴》1.0.8
  2. 是对马的鬼魂日本RPG
  3. 取消confirm和自动确认
  4. Pytorch 、torchvision、Tensorflow安装
  5. 测控技术与仪器应该学计算机哪些,测控技术与仪器专业到底学到了什么?
  6. Covid-19 肺部 X 射线分类和 CT 检测演示
  7. STM32传感器外设集--语音模块(SYN6288)
  8. 极客日报:三星嘲讽iPhone13:120Hz高刷我们早用上了;华为撤回对OPPO欧洲专利的异议;淘宝搜索崩了登上热搜
  9. 消除冗长Java代码的工具——Lombok详解
  10. 什么因素引起了肾结石呢?