从头造一个SSD网络(1):理论篇

目录

前言

SSD的优势

SSD的检测流程

先验框的选择

训练时的匹配问题

正负样本问题

损失函数


前言

        上一篇我们讨论了R-CNN这种两阶段的目标检测器,通过我的描述,大家应该已经知道了,R-CNN整体是比较繁琐的,而且整体速度也不行。因此今天我们要来看一篇更优雅的论文:《SSD: Single Shot MultiBox Detector》,也就是传说中的SSD。

        和以前不一样的是,我将开一个特别的篇章,从了解理论开始,到一步步写出SSD的代码,再到训练一个SSD检测器,将整个过程展现给大家看

        而今天这篇,是我们“从头造一个SSD网络”系列文章的理论篇,也是第一篇。


SSD的优势

        上一篇我们介绍了R-CNN,它的流程是先用Selective Search算法,先选出2000个建议区域,然后对建议区域进行目标分类,最后进行检测框位置的调整。这几个过程是相对独立的,而SSD相对于这种方法是简单的,因为它完全消除了建议区域的生成和随后的像素或特征重采样阶段,并将所有计算封装在单个网络中,可以说是十分优雅。而且因为它是一体成型,所以训练起来特别方便。

        而且SSD相对于当时的Faster R-CNN(R-CNN的升级版本),速度更快,而且精度更高。要知道,当时的目标检测器要提升精度,都是靠削减检测速度得到的,当其他检测器都在做速度与精度的权衡时,SSD已经开始考虑两全其美的事情了。


SSD的检测流程

        首先我们要输入一张300*300的图像给SSD网络,然后SSD使用一个卷积神经网络(它用的是VGG16),从整个卷积过程中抽出六个地方的输出,每个输出都是一叠(多个通道)的特征图。如下图:

        我们要知道,通过卷积神经网络,得到的特征图的尺寸(高*宽)是越来越小的,得到的特征越来越抽象,对局部信息越来越不敏感。所以它从六个不同的地方抽出特征图,其实就是为了获得不同尺度上的信息。比如说,从前面抽出的特征图,主要是检测小目标,而从后面抽出的特征图,它主要是检测大目标

        我们用论文中的例子再详细说说。首先我们补充一些细节知识。众所周知,我们可以把特征图看作宽乘高个格子的组合,比如一个特征图的宽和高都是8,那么就相当于有8*8个格子组合而成。我们可以把每个格子看成原图的某一部分:比如下面这个图,中间图上绿色的区域就对应左边图绿色的地方,右边这个图上橙色的区域就对应左边图橙色的地方。

图片改自论文

        而这种格子,每个格子都掌握着若干个框框(有些掌握着4个,有些掌握着6个,这些框框都以格子的中点为中心)。我们称这些框框为先验框,至于先验框的尺寸,我们后面再详细说如何选取。

        然后我们再看这个图:

图片来自论文

        左边是原图,中间是8*8的特征图,它是从比较前面的网络的输出中提取出来的,我们可以看到它格子比较多比较小,每个格子对应原图的部分比较小,所以它的先验框也比较小,负责小物体的检测;而右边是4*4的特征图,它是从后面卷积层的输出中抽出来的,它的格子比较少,但格子比较大,而它的先验框比较大,负责大物体的检测。

        还记得我们上面说的吗?每个输出都是一叠(多个通道)的特征图,那么多通道有什么意义呢?我们之前讲多通道卷积时说过,每个通道可以记录不同的信息,比如彩色图有三个通道,分别记录红蓝绿三者的数值。而我们的输出总共有k*(c+4)个通道,分别记录k个先验框的框信息和类别分数。我们在R-CNN那篇文章里说过这么一个公式:

图片来自论文

        G是指我们标记的那个框,P是指先验框,而t则是这里我们k*(c+4)中的4。当我们预测时获得这四个值,就能利用我们知道的先验框的信息,调整先验框的位置和尺寸了。而c是指c-1个分类和1个背景判别,哪个分类数量最多就说明这个格子掌控的这个框里包含的是哪个类别的。

        总结一下,塞一张图片进去,经过一个网络,我们获得六个输出,通过解码(选取最高类别,调整先验框尺寸和位置),我们就能获得若干个目标框以及它的分类,随后我们使用NMS,将重合的几个框弄成一个,就完成了检测。


先验框的选择

        在这一段,我们将详细地说一下,如何选取这些先验框。论文里用三个值来描述先验框的尺寸,比例和宽高比和输入图片尺寸,我们用比例乘上输入图片的尺寸再乘上宽高比的根号,就能得到宽和高。先说比例,这个比例是根据这个公式决定的:

图片来自论文

        Sk就是我们要求的,Smin取0.2,Smax取0.9,m是输出的个数,而六个输出中第一个输出的Sk设定是0.1,所以m取5,从第二层开始用这个公式,然后算出来是[0.1,0.2,0.375,0.55,0.725,0.9],如果乘上输入图片尺寸,就变成了[30,60,112.5,165,217.5,270],居然出现了小数,我们在图上操作是不能出现小数的。那怎么办呢,我们留意到从第二层开始每层间隔0.175,因此我们向下取整为0.17,再算一遍就是[0.1,0.2,0.37,0.54,0.71,0.88],以及[30,60,111,162,213,264]

        然后我们说宽高比,宽高比有这么几个取值:

图片来自论文

        然后根据下面两个公式算出宽高,ar就是上面的五个取值:

图片来自论文

        当然还有几个特例。首先除了这五个之外,我们还要再算一个,宽高比为1,而Sk为S’k的框,S’k的公式如下,但是你会发现,最后一个哪里有Sk+1?那这里直接拿300*1.05代替Sk+1就可以了。

图片来自论文

        其次,我们六个输出的尺寸分别是[38*38,19*19,10*10,5*5,3*3,1*1],38*38、3*3、1*1的那几个输出是没有3和1/3的宽高比的,所以这三个输出上的每个框框都只掌控3+1=4个框框,而其他的输出是掌控5+1=6个框框

        可以说非常麻烦,后面讲到代码时我直接列个表,大家对着看就行了,其实这些框的宽高可以根据自己的任务进行设置,这里只是介绍论文中的普适打法。


训练时的匹配问题

        刚才说了这么久,其实都是在说使用时的问题,下面我们说说训练时,如果匹配预测值和label来计算损失。

        我们首先将每个label框匹配到具有最大IOU的先验框,保证每个label框起码有一个框对应。然后,我们将先验框与IOU高于阈值(0.5)的任何label框进行匹配。就是一个label框可以对应多个先验框,但是一个先验框只能对应一个label框,如果A先验框与第一个label框的IOU是0.6,跟第二个label框的IOU是0.7,那么这个A先验框就与第二个label框匹配。匹配到的先验框就作为正样本,而没有匹配的就作为负样本。


正负样本问题

        按照上面的匹配找正负例,会出现负样本很多,而正样本很少的问题,这个时候我们就从负样本中选出confidence loss(也就是类别损失,后面会说)小的,使正负样本比例为1:3。之所以要选择confidence loss少的,是因为首先这些负例的IOU不达标,肯定没框对,但他们的损失却小,说明检测器错分类这个地方的特征了,因此我们要抽出来告诉检测器。


损失函数

        首先,SSD的损失函数有两部分,分别为定位损失和分类损失,总损失以加权平均加在一起,如下:

图片来自论文

        α一般选取1

        关于定位误差,用下面的公式:

图片来自论文

        首先x的上标k代表label的分类是k,而下标ij说明第i个先验框与第j个label框匹配。整个x的意思是,当第i个先验框与第j个label框匹配且两者的分类都为k时,这个值取1,否则取0。就是两个匹配的框都是同类别时为1,换言之,只有当两个匹配的框的类别一致时,我们再去讨论位置有没有定位对才有意义。而后面的smooth_L1可以看这个博文,里面有介绍,https://www.jianshu.com/p/e978425f34f2,这个l就是刚才说的k*(c+4)里那个4。

        关于分类损失,采用的是softmax损失

图片来自论文

        这里我们在后面写代码时会再拿出来讨论一下。


作者:公|众|号【荣仙翁】

内容同步在其中,想看更多内容可以关注我哦。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值