SSD、DSSD算法详解
SSD(Single Shot MultiBox Detector)
特点:多尺度特征图用于检测;采用了先验框,,SDD backbone采用VGG-16
SSD和YOLO一样都是采用一个CNN网络进行检测,但是采用了多尺度的特征图,如下图所示:
采用多尺度特征图用于检测
采用步长stride=2的卷积或者pool来降低特征图的大小,比较大的特征图用来检测小目标,比较小的特征图用来检测大目标
采用卷积进行检测
YOLO最后采用全连接,而SSD直接采用卷积对不同的特征图进行提取特征。对于形状为m×n×p特征图,只需要采用3×3×p这样比较小的卷积核得到检测值。
设置先验框
YOLO中每个单元预测多个边界框,但是都是相对于这个单元本身的,YOLO需要在训练过程中自适应目标的形状。SSD借鉴了Faster-RCNN的anchor理念,每个单元设置尺度或者长宽比不同的先验框,文中每个单元设置了4个先验框
SSD的检测值与YOLO也不一样
对每一个单元,SSD都输出一套独立的检测值,对应一个边界框。检测值主要分为两部分:
- 第一部分是各个类别的置信度或者评分(注意:SSD将背景也当做一个特殊的类别,所有检测类别是C+1,第一个类别是是否有背景,这个置信度最高时就表示不含有目标)
- 第二部分是边界框的location,包含(cx,cy,w,h),真实预测值只是边界框相对于先验框的转换值。先验框位置用d=(dcx,dcy,dw,dh)表示,对应的边界框用b=(bcx,bcy,bw,bh)表示,那么边界框的预测值L其实是b相对于d的转换值:(边界框的编码过程)
预测时框的反向这个过程,就是进行边界解码
所以对于一个m*n大小的特征图,每个单元设置K个先验框,每个单元就需要(C+4)*k个预测值,一共需要(c+4)*k*m*n个预测值,所以就需要(k+4)*k个卷积核完成这个特征图的检测过程
网络结构
图片来源:https://blog.csdn.net/xiaohu2022
1.模型的输入是300*300,SDD backbone采用VGG-16,在其基础上增加新的卷积层获得更多的特征图用于检测
- 将VGG16的全连接层fc6和fc7转换成3*3的卷积层conv6和1*1卷积层conv7
- 将池化层pool5由原来的2*2-s2变成3*3-s1
- Conv6采用扩展卷积或带孔卷积(dilation conv), 卷积核大小是3*3,dilation rate=6
- 移除dropout和fc8
带孔卷积如下图所示:a是普通的3*3卷积,b是扩展率为2的卷积,感受野变成了7*7,c是扩展率为4的卷积,感受野变成了15*15
2.VGG16的conv4_3层作为用于检测的第一个特征图,conv4_3层特征图的大小是38*38,由于其norm(指标,参数)比较大,在其后面增加了一个L2 normalization层
3.从后面新增的卷积层中提取conv7, conv8_2, conv9_2, conv10_2,conv11_2作为检测用的特征图,加上conv4_3层,共提取 了6个特征图,其大小分别是(38,38),(19,19),(10,10),(5,5),(3,3),(1,1)但是不同特征图上设置的先验框是不同的(同一个特征图上每个单元格设置的先验框是相同的)
如何设置先验框
先验框的设置包括尺度和长宽比两个方面,对于先验框的尺度,遵守一个线性递增规则:随着特征图大小的降低(可以检测更大的目标),先验框尺度线性增加
- 先验框尺度:
m指特征图的个数,sk表示先验框相比与图片大小的比例,smin和smax分别表示比例最大和最小值,paper里取得是0.2和0.9。对于第一个特征图,其先验框的尺度比例一般设置为smin/2=0.1,那么尺度为300*0.1=30,对于后面的特征图,先验框的尺度按照上面的公式线性增加,但是先将尺度比例先扩大100倍,此时增长步长为(smax-smin)*100/4=17,这样各个特征图的20,37,54,71,88,将这些比例除以100,再乘以图片大小,得到各个特征图的尺寸为60,111,162,213,264,所以各个特征图的尺寸为30,60,111,162,213,264
- 长宽比
一般选取ar={1,2, 3, 1/2, 1/3 },对于特定长宽比,按如下公式计算先验框的宽度和高度(这个sk指的是先验框的实际尺寸,而不是尺寸比例)
默认情况下每个特征图会有一个ar=1的尺度为sk的先验框,除此之外,还会设置一个尺度为且=1的先验框,这样每个特征图都设置了两个长宽比为1但是大小不同的正方形先验框,(注意,最后一个特征图需要参考一个虚拟=300*105/100=315来计算)因此每一个特征图有6个先验框,但是在现实中,conv4_3,conv10_2和conv11_2层仅使用4个先验框,不使用3,1/3的先验框。每个先验框的中心点分布在各个单元的中心是特征图的大小。
4.得到特征图后,对特征图做卷积得到检测结果,下图给出了5*5大小的特征图的检测过程,priorbox得到的是先验框。检测值包括两个部分:类别置信度和边界框位置,各采用一次卷积来完成。
设先验框数目为nk,那么类别置信度需要的卷积核数量为nk*C,而边界框位置需要的卷积核数目为nk*4,由于每个先验框都会预测一下,所以SSD300一共预测38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4=8732个边界框,所以说SSD是密集采样
训练过程
1.先验框匹配:确定训练图片中ground truth与哪个先验框进行匹配,匹配的先验框所对应的边界框将负责预测它。在YOLO中, ground truth的中心落在哪个单元格,该单元格与其IOU最大的边界框负责预测它,SSD中先验框与ground truth的匹配原则主要有两点:
- 原则一:对于图片中中每个ground truth,找到与其IOU最大的先验框,并匹配。这样保证每个ground truth一定与某个先验框匹配。称与ground truth匹配的先验框为正样本,不匹配的称为负样本。背景多,目标少,造成正负样本不匹配的问题,所以引入:
- 原则二:对于剩余未匹配的先验框,若某个ground truth的IOU大于某个阈值(一般设置0.5),那么该先验框与这个ground truth进行匹配。这意味着某个ground truth可能与多个先验框匹配,但是一个先验框只能匹配一个ground truth
注意:尽管一个ground truth可以和多个先验框匹配,但是ground truth相对于先验框还是太少了。为了保证正负样本尽量平衡,SSD采用了hard negative mining:就是对负样本抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差较大的top-k作为训练的负样本,保证正负样本比例接近1:3.
2.损失函数:位置误差和置信度误差的加权和
N是先验框的正样本数量,C为类别置信度,L为先验框所对应边界框的位置预测值,而g是ground truth的位置参数,对于位置误差采用Smooth L1 loss
位置误差
图片来源:https://blog.csdn.net/xiaohu2022
等于1表示第i个先验框与第j个ground truth匹配,并且ground truth的类别为p,
由于的存在,所以位置误差近针对正样本进行计算,表示预测框的中心位置
置信度误差:采用softmox loss
3.数据扩增
采用数据扩增可以提升SSD的性能,主要使用了水平翻转(horizontal flip),随机裁剪加颜色扭曲(random crop&color distortion),随机采集块域(random sample a patch)(为了获取小目标训练样本),如下图所示:
预测过程
- 对每一个预测框,根据类别置信度确定其类别(类别置信度最大的)和置信度值,并滤掉属于背景的预测框
- 根据置信度阈值过滤掉阈值较低的预测框
- 对留下的预测框进行解码,根据先验框得到的真实位置参数(解码后一般还需要做clip,防止预测框超出图片)
- 根据置信度进行降序排列,仅保留top-k(如400)个预测框
- 最后进行NMS
性能评估
加*表示使用了image expansion data augmentation
不同trick对SSD的影响
数据曾广比较重要
SSD优缺点:
- SSD优势是速度比较快,整个过程只需要一步,首先在图片不同位置按照不同尺度和宽高比进行密集抽样,然后利用CNN提取特征后直接进行分类与回归,所以速度比较快,
- 但均匀密集采样会造成正负样本不均衡的情况使得训练比较困难,导致模型准确度有所降低。
- SSD对小目标的检测没有大目标好,因为随着网络的加深,在高层特征图中小目标的信息丢失掉了,适当增大输入图片的尺寸可以提升小目标的检测效果
DSSD(Deconvolution Single Shot MultiBox Detector)
特点:使用ResNet替换SSD中的VGG;使用Deconvolution层
SSD中在更浅的一些层上来匹配小目标,就是把图片分成更小的格子,在这些格子中使用anchor这样漏检概率就会大大减少,但是问题是在浅层提取的feature map的表征能力不够强,每个格子可以判断这个格子中包含的是哪一个类,但是不那么确定。
DSSD的网络结构
方法就是把红色层做反卷积操作,使其和上一级蓝色层尺度相同,再把二者融合在一起,得到的新的红色层用来做预测。如此反复,仍然形成多尺度检测框架。在图中越往后的红色层分辨率越高,而且包含的上下文信息越丰富,综合在一起,使得检测精度得以提升。
上图结构中采用了跳步连接(skip connection).按理说模型在编码和解码过程中应该包含对称的层,但是由于两个原因作者使解码的层比较浅:
- 做成对称的速度比较慢
- 目前并没有现成的包含解码的训练模型,以为模型必须从零开始学习这一部分,对称形式的计算成本太高了
SSD对小目标不够鲁棒性的最主要的原因是浅层feature map的表征能力不够强,因此DSSD作出了如下改进:(DSSD的核心思想:提高浅层的表征能力)
1.ResNet
上图是说明那些层作为最后的预测feature layer,其结果对比图如下所示:
2..修改了预测模块(prediction module)
设置不同的预测模块进行预测并对比,结果如下
3.Deconvolution module
- 在每个卷积层之后添加batch normalization
- 采用基于学习的反卷积层而不是简单的双线性上采样
- 红色框是不同的计算方式:Eltw Product其实就是矩阵的点积,sum是求和
4.改进box比例
使用聚类分析采用了1, 1.6, 2, 3的长宽比
网络训练
先预训练一个SSD模型,使用训练好的SSD模型初始化DSSD模型,具体分为两个步骤:
- 先冻结DSSD网络中SSD网络层的参数,只用预训练好的SSD模型去微调DSSD层的权重(DSSD层的权重初始化方式为Xavier)
- 解冻第一阶段的所有层参数,放开了微调
SSD、DSSD算法详解相关推荐
- Scale-Transferrable Object Detection算法详解(基于多尺寸目标检测)
Scale-Transferrable Object Detection算法详解 论文背景 算法背景 算法简介 算法对比 算法详解 网络结构 DenseNet STM Object Localizat ...
- DES(Detection with Enriched Semantics)算法详解
DES算法详解 论文背景 实验结果 算法简介 算法结构 语义信息增强过程 与之前算法的区别 算法细节 Semantic enrichment at low level layer Semantic e ...
- Deformable ConvNet算法详解(对象尺寸/形状变换)
Deformable ConvNet算法详解(DCN) 算法背景 算法细节 Deformable convolution Deformable RoI pooling Deformable ConvN ...
- Matlab人脸检测算法详解
这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...
- 图论-最短路Dijkstra算法详解超详 有图解
整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...
- C++中的STL算法详解
1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...
- 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码
粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...
- 基础排序算法详解与优化
文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...
- 目标检测 RCNN算法详解
原文:http://blog.csdn.net/shenxiaolu1984/article/details/51066975 [目标检测]RCNN算法详解 Girshick, Ross, et al ...
最新文章
- flask小项目打开教学
- 可以在xml中靠增加属性来实现分组
- CVPR2021 最具创造力的那些工作成果!
- CLR via C# 中关于装箱拆箱的摘录
- python调整照片
- 带你过一遍:廖雪峰大神Git教程(建议收藏)
- C语言超时错误,C语言题目运行得到超时错误
- C# 后端代码中使用事务
- 纯css实现icon的网站,代码可复制
- 小白入门之HTML--第五章 块状元素,行内元素,盒子模型
- php文件转换为mp4,PHP转换视频为MP4并获取预览图的实例分享
- 优化机场值机体验之护照阅读器
- qs计算机圣安排名,2020年QS世界大学排名圣安德鲁斯大学排名第100
- 8421码转16进制的c语言,16进制数转换成8421BCD编码函数
- 用JAVA写一个俄罗斯方块游戏tetrisGame
- Microsoft 365 E5 开发者扩容到5T
- Java中 支持多继承吗?
- 博士研究生入学第一年就完成了毕业所需的发表论文要求是怎样的体验?
- 浅浅讲解下Linux内存管理之CMA
- 三个变量存在一个协整方程_计量经济学最基本的31个问题