SSD TF版学习记录(一)

阅读了SSD的原文已经一周的时间了 ,有必要做一些总结了。

先给出原文链接:https://arxiv.org/abs/1512.02325 (自行下载查看哦)

再给出曾看过的几篇博客:1、https://blog.csdn.net/tomxiaodai/article/details/81875810

                                           2、https://blog.csdn.net/c20081052/article/details/80391627

第一篇博客 打算先总结一下文章的内容(以防我忘记,我先再浏览一次文章)

虽然文章量不是很大,但是已经言简意赅的表明了基本做法和思想,其工作量却是相当庞大的。下面按照文中的介绍顺序介绍下自己的想法,如有不足,欢迎各位大大批评指正,相互交流(毕竟博主我是个渣渣)

Abstract: SSD是一种单一的深度神经网络,即对于每个特征图像的不同位置比例和不同宽高比,将边框的输出离散到系列默认框中。预测时,网络生成分数是对每个默认框的每个目标类别进行的,并且不断调整来更好的匹配目标形状。另外,由于网络结合了来自用不同解决方法的大量的特征图的预测,因此可以更自然地用各种大小处理目标对象。文章用此方法训练各个公用的数据集:PASCAL, VOC,COCO,ILSVRC并将所得比例与其他网络模型如:Faster-R-CNN,YOLO进行比较。

(由此可见,该文章提出的网络模型性能及识别率都更高,是近期提出的较好的网络模型。且该文章还是开源代码,利用caffe编写,源代码: https://github.com/weiliu89/caffe/tree/ssd .)

P1:Introduction

当前先进的目标检测系统都利用如下方法:假设边界框,对每个框重采样像素点或特征,应用高质量分类器。但是 这些方法有点low,因为要保证识别率跟识别速度双高 是很难的,尤其他们这些方法还不能实时监测。

速度改进原因:消除边界框提议以及随后的像素或特征重采样阶段;

扫描二维码关注公众号,回复: 6154415 查看本文章

改进之处:1)用小卷积滤波器来预测目标类别和边框位置偏移量;

                  2)对不同的宽高比检测使用不同的滤波器;

                  3)将上述滤波器应用到一个网络后段的多层特征图中,以便多尺度检测。

SSD核心之处:对一组固定的边框用小卷积滤波器来预测目标类别和边框偏移量,并将其应用到特征层。

P2:SSD Model

(目前就知道一件事,SSD大法各种好、各种妙,最根本的优点在于他去掉了原来复杂的重采样部分,然后改用小的卷积滤波器来预测目标类和偏移,使得识别更精准,识别效果更好。那么具体的模型是什么呢?又该如何训练呢?)

SSD基于前馈神经网络,该网络生成一个固定大小集合的边框以及对这些框中存在的目标类别的分数,之后经非极大值抑制产生最终检测结果。该网络所采用的基本网络为VGG-16。

VGG-16:参考博客:https://blog.csdn.net/v1_vivian/article/details/77898652

                                  https://blog.csdn.net/daydayup_668819/article/details/79651137

以上两篇博主已经解剖VGG-16非常透彻了,不再赘述详细过程。重点讲解附加网络结构:

1)Multi-scale feature maps for detection 多尺度特征映射

将VGG16截断,最后两层全连接改为卷积层,以此这些层的尺寸逐渐减小并允许多尺度检测的预测。 用于预测检测的卷积模型对于每个特征层是不同的。

2)Convolutional predictors for detection 卷积预测

对于具有p个通道的大小为m×n的特征层,基本的用于预测潜在检测参数的方法是一个3×3×p的小内核,可以生成类别的分数,或相对于默认框坐标的形状偏移。 在应用内核的每个m×n个位置处,它产生输出值。 边框偏移输出值是相对于一个默认框位置和每个特征映射位置测量的。

(以上得出,需要得到的数据是分数及边框偏移量,这俩要根据3X3XP的内核卷积得到,对应使用内核的位置就会产生输出值,而边界偏移量又是根据默认框位置跟特征图位置所得,所以必须先求得原始图像上默认框的位置跟特征图的位置。)

3)Default boxes and aspect ratios 默认框和宽高比

把一组默认边框同每个特征图单元联系起来,用于网络顶部的多特征映射。默认框以卷积方式平铺特征图,以便每个框相对于其对应单元的位置是固定的。对于每个特征映射的单元格,预测偏移量相对于单元格中的默认框形状,以及每类得分,该分数表明在每个这些框里存在的类实例。具体来说,对于给定位置的K中的每个框,我们计算C类分数和相对于原始默认框形状的4个偏移量。(至于为啥计算4个偏移量,我猜应该是 上下左右吧)这导致在特征图中的每个位置周围应用总共(c + 4)k个滤波器,产生m×n特征图的(c + 4)kmn输出。允许在多个要素图中使用不同的默认框形状,可以有效地离散可能的输出框形状的空间。

SSD的构架只需要一个输入图片和对每个目标的真实边框。估计默认框就是这个啦。以上大概是根据原文翻译所得,其实都是些概念,具体如何使用还是需要看下面的训练过程,原文是基于caffe的程序,博主无能,舍弃了caffe换成好理解的tensorflow,当然这个也需要一定的代码理解力,作为小白的我还是硬着头皮看完了一些博客。

附上tf版的代码:https://github.com/Hellcatzm/SSD_Tensorflow

对于代码的讲解,本人不才附上大神的博客:https://cloud.tencent.com/developer/article/1167615

小结:目前为止,我们知道了网络的结构,利用VGG16进行改进,将最后两层全连接改为卷积层,然后添加了4层卷积层,并对所有的卷积层进行特征提取,得到检测层,之后经过非极大值抑制之后得到输出结果。输出结果应该是对原图显示每个检测出来的目标框进行标记和分数,至于如何获取分数,具体应该如何检测,就是接下来的训练模块了。

P3:SSD Training

训练SSD的关键是实况信息需要分成具体的输出在固定一组检测器输出中。一旦确定了该分配,就会端到端地应用损失函数和反向传播。训练涉及到:默认框的选择,检测尺度,数据扩增策略,难划分的负样本(hard negative mining)。

Matching strategy:将默认框与原图像的实况匹配起来。

在训练期间,我们需要确定哪些默认框对应于地面实况检测并相应地训练网络。 对于每个地面实况框,我们从默认框中选择,这些框的位置,宽高比和规模。 我们首先将每个地面实况框与具有最佳jaccard重叠的默认框匹配(如MultiBox [7]中所述)。 与MultiBox不同,我们将默认框与jaccard重叠高于阈值(0.5)的任何基础事实匹配。 这简化了学习问题,允许网络预测多个重叠默认框的高分,而不是要求它仅选择具有最大重叠的框。

(也就是说拿我们的默认框跟原图的实框进行重叠比较,得到重叠比,jaccard 重叠率,该比率也就是分数,分数越高 说明重合越好,匹配度越高。作者将重合比率阈值设置为0.5,高于0.5则保留默认框,上不封顶)

Training objective:训练目标

用于将第i个默认框与类别p的第j个地面实况框匹配的指示符。因为刚才讲到阈值为0.5之上的都保留,所以对于第i个默认框的同一类别相对于原实框的累加和是大于1的,也就是:

因而整个损失函数就是:loc(localization loss)+conf( confidence loss) = loss

(也就是位置定位不准导致损失与置信度损失)

N:匹配默认框个数  N=0,loss=0(如果没有得到一个默认框与原图匹配,有可能训练的模型里没有该类别,因此Loss=0)

l:预测框,咱们即将生成的预测框哦

g:真实框,也就是原来的实框

c:是多类别置信度 

为了更好理解,抠个大神的图:

顺便给出这个大神的博客:https://www.cnblogs.com/xuanyuyt/p/7447111.html  (写的也是相当好)

我们回归到默认边界框(d)的中心(cx,cy)以及宽度(w)和高度(h)的偏移量:

置信度损失是多类置信度下的softmax损失(c)

通过交叉验证把 alpha=1

(以上给出了该论文所用的一些公式,公式的推导是属于纯数学的东西,所以不深究,我们会用即可。但是单看公式,我们可以看到,损失函数是必须求的东西,也就是 置信度损失和位置损失都要求。)

Choosing scales and aspect ratios for default boxes:选择默认框的大小和宽高比

结合之前的想法,综合利用较低层和较高层的特征映射来检测。在一个网络中,不同层接受字段的能力不同。但是,SSD框架中,默认框并不需要同每层的实际接受字段相一致。将默认框平铺,目的就是利于学习目标对象的特定大小。假设用m个特征映射来预测,那么每个特征映射的默认框大小如下:

Smin = 0.2,Smax = 0.9, 意味着最底层有0.2大小,最高层有0.9大小,所有层都在这范围之间有规则分布。

对于不同的默认框采用不同的宽高比,本文采用的宽高比是:

然后对每个默认框计算宽度和高度:

特别提出,对于宽高比 = 1的情况:也增加一个默认框,且大小为:

将每个默认框的中心设为:

在实践中,还可以设计默认框的分布以最佳地适合特定数据集。 如何设计最佳平铺也是一个悬而未决的问题。

通过结合来自许多特征图的所有位置的所有具有不同尺度和纵横比的默认框的预测,我们具有多种预测,涵盖各种输入对象尺寸和形状。

Hard negative mining:私以为是教我们如何搞难训练的负样本的

匹配那步完成之后,大部分的默认框都是负样本,特别是当默认框的数量大的时候。由此导致了正负样本之间的比例不均衡。

作者给出的解决方法:利用最高置信度损失将默认框分类,选择损失最高的一组使用。因此可得到负正样本的宽高比至少是:3:1

作者实验得出,只有该比例,才能达到一个稳定的训练。(当然可以尝试修改该比例)

Data augmentation:数据扩增

目的:让模型鲁棒性更好,适应不同目标大小和形状

方法:

1)运用整个原始输入图像

2)用相同批次,因此目标的最小jaccard overlap 是:0.1,0.3,0.5,0.7 或0.9

3)随机抽样一个补丁

每个抽样补丁在原始图像大小的[0.1 , 1 ]内,宽高比:0.5--2.

如果它的中心在采样补丁中,我们保留地面实况框的重叠部分。 在上述采样步骤之后,每个采样的贴片尺寸调整为固定尺寸,并且除了0.5之外,水平翻转的概率为0.5,应用一些类似于文献中描述的照片度量失真。

总结:以上讲解了原文的前两大块,后面的数据结果以及具体步骤先不做分析。

论文提出的新的网络模型,整体思路就是,求出默认框,并且根据置信度得分来取舍默认框,留下比例比较高的,然后与真实框进行计算重合率,重合率越高当然越好,在这训练过程中,数据也是越多越好,但是要根据自己的电脑配置适当增加数据,增加方法作者已经给出,最后,求得整体的损失函数。

有位大神用tensorboard画出了整个SSD流程图,地址刚才已经给出了。

作者后面大量篇幅讲的其实是如何得到相应的结果,以及在训练过程中的参数设置细节。

所以,SSD的学习 未完待续。。

猜你喜欢

转载自blog.csdn.net/weixin_41154129/article/details/85986295
ssd