SSD目标检测算法——通俗易懂解析
前面几篇文章我们讲解了YOLO系类的论文,今天抽空写下SSD算法。对YOLO有兴趣的小伙伴们可以一步到我前面的几篇博文:
- YOLOv1目标检测算法——通俗易懂的解析
- YOLOv2目标检测算法——通俗易懂的解析
- YOLOv3目标检测算法——通俗易懂的解析
- YOLOv4目标检测算法——通俗易懂的解析
- YOLOv5目标检测算法——通俗易懂的解析
SSD论文地址:https://arxiv.org/abs/1512.02325v5
SSD
网络是在2016年ECCV上发表的论文,超越了当时地表最强的目标检测算法Faster RCNN
性能,现在看来时间有点久远了,但是SSD
还是很经典的算法,SSD
是一个单阶段的目标检测算法,里面的有些思路还是值得我们学习的,很多公司在面试的时候也会问到SSD
算法,所以还是有必要的学习一下的。
当时流行的Faster RCNN
是一个双阶段的目标检测网络,存在着不少问题:
- 小目标检测效果很差(因为
Faster RCNN
只在一个特征层上进行检测,不适合检测小目标。所以能不能直接在低层次特征上进行预测?看SSD) - 模型很大,检测速度慢(主要是因为分两步走)
先来看下SSD
的整体框图,输入图像必须是300×300300\times300300×300,然后输入到VGG16
网络(后半部分网络重新设计了)through
表示贯穿到VGG16
的Conv5_3
,前半部分网络只用到了Con5_3_layer
,什么意思呢,我们看下面的VGG
网络,就是对应到第五层网络的第三个卷积层 ,Conv4_3
是SSD
输出的第一个卷积层,论文中还将Maxpooling5
(Conv5_3
后面的池化核)的池化核大小从原本的2×22\times22×2,步距为2调整为3×33\times33×3大小,步距为1,所以经过此操作之后,Conv5_3
的输出特征层的大小时不会发生变化的。在此之后会添加其他的卷积层,得到其他的预测特征层,图中的FC6
就是对应VGG16
中的第一个全连接,FC7
对应VGG16
中的第二个全连接层,接下来通过一些列的卷积层得到输出特征3,4,5,6,总共有6层特征输出,前面的低层特征输出用于检测尺寸比较小的目标,后面的高层输出特征负责检测尺寸较大的目标。在前面讲YOLOv3
的时候我们对此已经解释过了,思想都是一样的。
注意:图中总共有6个输出特征层(Extra Feature Layers
)
SSD
中使用default box
来匹配目标。那么什么是default box
呢,实际上就是anchor box
,原理一样,这里的default box
将他们放在不同的特征层上面。default box
的比例和尺度怎么设定呢?以下是原论文给的公式:
很多大神实现的SSD算法用的公式并不是上面的公式,简单了解下即可。我们直接给出每个scale
所对应的aspect
的比例。
scale=[(21,45),(45,99),(99,153),(153,207),(207,261),(261,315)]aspect=[(1,2,0.5),(1,2,0.5,3,1./3),(1,2,0.5,3,1./3),(1,2,0.5,3,1./3),(1,2,0.5),(1,2,0.5)]scale=[(21,45),(45,99),(99,153),(153,207),(207,261),(261,315)]\\ aspect=[(1,2,0.5),(1,2,0.5,3,1./3),(1,2,0.5,3,1./3),(1,2,0.5,3,1./3),(1,2,0.5),(1,2,0.5)] scale=[(21,45),(45,99),(99,153),(153,207),(207,261),(261,315)]aspect=[(1,2,0.5),(1,2,0.5,3,1./3),(1,2,0.5,3,1./3),(1,2,0.5,3,1./3),(1,2,0.5),(1,2,0.5)]
scale
表示目标尺度,aspect
表示每个尺度所对应的一系列比例,初看这些参数可能一脸懵逼,为什么每个scale
会有两个值?我们先来看下原文怎么解释的:对于比例为1的情况,在每个特征层上会额外的添加一个default box
,default box
的scale
是(sksk+1)\sqrt(s_{k}s_{k+1})(sksk+1),其中,sks_{k}sk对应的就是scale
中的第一个元素,sk+1s_{k+1}sk+1就是scale
中的第二个元素,也是下一个预测特征层的sks_{k}sk。
关于比例信息,我们看下面的一段文字,对于conv4_3
,conv10_2
,conv11_2
我们都会使用四个default box
,对于其他的预测特征层会使用六个default box
。观察上面的网络模型图,可以发现,也就是第一个,和倒数第一个,倒数第二个预测特征层是使用4个default box
,其他的都是6个。
根据刚才对原文的解释,我们来看下这几组数据到底怎么看。先来看下第一个预测特征层scale=(21,45)
的情况,scale
为21的时候,会有aspect=(1:1,2:1,1:2)
三个比例,对于(21×45)\sqrt(21\times45)(21×45)的scale
只有一个aspect=(1:1)
的比例,其他的以此类推。根据上面的default
的生成方式我们可以计算总共有default box
的数量:
38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=873238\times38\times4 +19\times19\times6 +10\times10\times6 +5\times5\times6 +3\times3\times4 +1\times1\times4=8732 38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732
看了上面的default box
的设计,是不是感觉跟anchor
的设计有异曲同工之处,其实他俩就是一个东西,只不过SSD
的尺寸大小是人为设计的,而YOLO
的anchor
是聚类学习得到的。接下来我们再来看下预测器的设计与实现,怎么在6个输出特征层上进行预测?依旧先看下原文的解释:
对于m×n×pm\times n\times pm×n×p的预测特征层,直接使用卷积核大小为3×3×p3\times3\times p3×3×p,channel
为p的卷积核实现,通过这个卷积层来生成概率分数和相对default box
的坐标偏移量,即边界框回归参数。
我们刚才讲在每个特征层上使用3×33\times33×3的卷积核进行预测,那么我们到底需要使用多少个卷积核呢?看下面论文中的解释,我们知道在每个预测特层上的每个位置会有k
个default box
,对每个default box
会计算c
个类别分数和4个坐标偏移量,那么我们就需要(c+4)×k(c+4)\times k(c+4)×k个卷积核进行处理,所以对于一个m×nm\times nm×n的输出特征层而言,总共有(c+4)×k×m×n(c+4)\times k \times m \times n(c+4)×k×m×n个输出值。注意这个地方区分下跟Faster RCNN
的区别,在Faster RCNN
生成边界框回归参数的时候,对于每个anchor
会生成4×c4\times c4×c个边界框回归参数,即对每个anchor
分别去生成针对每个目标类别的边界框回归参数,在Faster RCNN
中,这里是4×c4\times c4×c,在SSD
中,针对每个default box
只生成4个边界框回归参数,不关注每个default
是归于哪个类别。
下面我们再来介绍下训练阶段正负样本的选取,看到这个是不是发现SSD
算法和YOLO
系列的有点相似。我么依旧先看下原论文怎么解释的,论文中给了两个匹配准则:
- 对于每个
ground truth
去匹配跟他IoUIoUIoU最大的的default box
。 - 对于任意一个
default box
,它只要与任意一个ground truth
的IoUIoUIoU的大于0.5,也认为他是正样本。
匹配准则都大同小异,跟YOLO
和Faster RCNN
都很类似,理解一个,其他的基本上都能理解。
下面我们再来看下负样本的选取,正样本选取完之后,剩下的样本都可以归为负样本,但是剩下的负样本并不是都用来计算,上面我们计算过总共生成了8732个default box
,但是训练的时候default box
匹配到的ground truth
有很少,即正样本很少,导致正负样本极不平衡。对于负样本的选取SSD是这样做的,首先对于刚刚计算剩下的所有的负样本计算他的最大confidence loss
,confidence loss
越大表示网络将负样本预测为目标的概率越大,所以就根据计算的confidence loss来选取排在前面的负样本,根据正样本的个数选取正负样本的比例为1:3。
上面讲了正负样本的计算,下面我们来看下怎么计算模型的损失,先来看下损失函数:
L(x,c,l,g)=1N(Lconf(x,c)+αLloc(c,l,g))L(x,c,l,g)=\frac{1}{N}(L_{conf}(x,c)+\alpha L_{loc}(c,l,g)) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(c,l,g))
上式右边的的第一项表示类别损失,第二项表示定位损失,N表示正样本的个数,α\alphaα是平衡系数,直接取1即可。类别损失有分为两部分:
Lconf (x,c)=−∑i∈PosNxijplog(c^ip)−∑i∈Neglog(c^i0)where c^ip=exp(cip)∑pexp(cip)L_{\text {conf }}(x, c)=-\sum_{i \in P o s}^N x_{i j}^p \log \left(\hat{c}_i^p\right)-\sum_{i \in N e g} \log \left(\hat{c}_i^0\right) \quad \text { where } \quad \hat{c}_i^p=\frac{\exp \left(c_i^p\right)}{\sum_p \exp \left(c_i^p\right)} Lconf (x,c)=−i∈Pos∑Nxijplog(c^ip)−i∈Neg∑log(c^i0) where c^ip=∑pexp(cip)exp(cip)
上式右边第一项表示正样本损失,第二项表示负样本损失。这个损失函数就是一个softmax loss。下面解释下公式中的符号含义:
- c^ip\hat{c}_i^pc^ip表示预测的第iii个default box(类别是P)对应的GT box的类别概率
- xijp=0,1x_{i j}^p={0,1}xijp=0,1为第iii个default box匹配到的第jjj个GT box(类别是P),可以直接看成1即可。
接下来我们再来看下定位损失怎么计算(跟Faster RCNN的计算方式基本一模一样),先看公式,第二项为定位损失,我们重写一下:
L(x,c,l,g)=1N(Lconf(x,c)+αLloc(x,l,g))L(x, c, l, g)=\frac{1}{N}\left(L_{\operatorname{conf}}(x, c)+\alpha L_{l o c}(x, l, g)\right) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))
Lloc(x,l,g)=∑i∈PosN∑m∈{cx,cy,w,h}xijksmoothL1(lim−g^jm)g^jcx=(gjcx−dicx)/diwg^jcy=(gjcy−dicy)/dihg^jw=log(gjwdiw)g^jh=log(gjhdih)\begin{gathered} L_{l o c}(x, l, g)=\sum_{i \in P o s}^N \sum_{m \in\{c x, c y, w, h\}} x_{i j}^k \operatorname{smooth}_{\mathrm{L} 1}\left(l_i^m-\hat{g}_j^m\right) \\ \hat{g}_j^{c x}=\left(g_j^{c x}-d_i^{c x}\right) / d_i^w \quad \hat{g}_j^{c y}=\left(g_j^{c y}-d_i^{c y}\right) / d_i^h \\ \hat{g}_j^w=\log \left(\frac{g_j^w}{d_i^w}\right) \quad \hat{g}_j^h=\log \left(\frac{g_j^h}{d_i^h}\right) \end{gathered} Lloc(x,l,g)=i∈Pos∑Nm∈{cx,cy,w,h}∑xijksmoothL1(lim−g^jm)g^jcx=(gjcx−dicx)/diwg^jcy=(gjcy−dicy)/dihg^jw=log(diwgjw)g^jh=log(dihgjh)
smoothL1(x)={0.5x2if ∣x∣<1∣x∣−0.5otherwise \operatorname{smooth}_{L_1}(x)= \begin{cases}0.5 x^2 & \text { if }|x|<1 \\ |x|-0.5 & \text { otherwise }\end{cases} smoothL1(x)={0.5x2∣x∣−0.5 if ∣x∣<1 otherwise - liml_{i}^{m}lim为预测对应第iii个正样本的回归参数
- g^jm\hat{g}_j^mg^jm为正样本iii匹配的第jjj个GT box的回归参数
至此,SSD算法的理论部分基本上已经介绍完了,欢迎各位大佬批评指正。
SSD目标检测算法——通俗易懂解析相关推荐
- YOLOv3目标检测算法——通俗易懂的解析
目录 YOLOv3目标检测算法 前沿 一.YOLOv3 二.损失函数 YOLOv3目标检测算法 前沿 前两篇文章我们讲了下关于YOLOv1和YOLOv2的原理,有不懂的小伙伴可以回到前面再看看: YO ...
- 基于Grad-CAM与KL损失的SSD目标检测算法
基于Grad-CAM与KL损失的SSD目标检测算法 人工智能技术与咨询 来源:<电子学报>,作者侯庆山等 摘 要: 鉴于Single Shot Multibox Detector (SSD ...
- 基于神经网络的目标检测论文之目标检测方法:改进的SSD目标检测算法
4.2 改进的SSD 上一章我们了解到,物体识别检测算法是在传统CNN算法基础上加上目标区域建议策略和边框回归算法得到的.前辈们的工作主要体现在目标区域建议的改进策略上,从最开始的穷举建议框,到划分图 ...
- 层与特征融合_【计算机系统应用】(第122期)感受野特征增强的 SSD 目标检测算法...
点击上方"蓝字",关注我们吧! 目标检测是计算机视觉领域的一项重要任务, 是 生活中如实例分割[1] , 面部分析[2] , 汽车自动驾驶[3].视 频分析[4] 等各种视觉应用的 ...
- [RCNN]-[YOLO]-[SSD]目标检测算法
原文链接:http ://chuansong.me/n/353443351445 转载自深度学习大讲堂公众号 开始本文内容之前,我们先来看一下上边左侧的这张图,从图中你看到了什么物体?他们在什么 ...
- SSD目标检测算法原理(上)
目录 一.目标检测概述 1.1 项目演示介绍 1.2 图片识别背景 1.3 目标检测定义 二.目标检测算法原理 2.1 任务描述 2.2 目标检测算法必备基础 2.3目标检测算法模型输出 目标检测 - ...
- 一文弄懂SSD目标检测算法
SSD是YOLO之后又一个引人注目的目标检测结构,它沿用了YOLO中直接回归 bbox和分类概率的方法,同时又参考了Faster R-CNN,大量使用anchor来提升识别准确度.通过把这两种结构相结 ...
- Pytorch搭建SSD目标检测平台
学习前言 什么是SSD目标检测算法 源码下载 SSD实现思路 一.预测部分 1.主干网络介绍 2.从特征获取预测结果 3.预测结果的解码 4.在原图上进行绘制 二.训练部分 1.真实框的处理 2.利用 ...
- 目标检测算法YOLO-V1算法详解
❝ 前面我们一起学了SSD算法的相关知识,如下: SSD目标检测算法必须知道的几个关键点 目标检测算法SSD结构详解 ❞ 今天我们学习另一系列目标检测算法YOLO(You Only Look Once ...
- 【快速入门】YOLOv5目标检测算法
文章目录 一.YOLOv5简介 二.网络结构 1.Input 2.Backbone 3.Neck 4.Head 三.改进方法 1.自适应锚框计算 2.自适应灰度填充 四.性能表现 五.YOLOv5入门 ...
最新文章
- Python中的赋值、引用和深浅拷贝
- Json.Net系列教程 3.Json.Net序列化和反序列化设置
- 【渝粤教育】国家开放大学2018年秋季 1126t社会医学 参考试题
- flash 异常修复:QQ 的 flash 图标显示异常?QQ 秀、表情加载异常?一招解决
- 今天,公司架构师跟我分享多年的私货 | 进阶之路必读书籍(附下载链接)
- Simulink步长
- 如何用python处理图片_推荐:10个Python图像处理工具
- redis中multi和pipeline区别以及效率(推荐使用pipeline)
- 《树莓派实战秘籍》——1.20 技巧20使用Swap添加额外的内存
- 美国河流出现神奇冰盘 顺着水流不断旋转
- 【单片机/嵌入式】最完整学习路线
- Excel常用技巧1
- C++ 通讯录管理系统
- 物联卡Iccid号码编码规则
- 最美不过少年时,红尘走马,步步相随
- STM32从固件库到HAL库
- 自学Java语言网络编程局域网内与电脑无线传输视频,图片文件,调用系统媒体播放视频图片文件
- 上市公司融资需要哪些条件
- 从JavaScript到TypeScript,Pt。 IIB:使用类,接口和混合器进行设计
- 论文浏览(27) Long-Term Feature Banks for Detailed Video Understanding