【《SSD目标检测算法研究案例》5800字】_第1页
【《SSD目标检测算法研究案例》5800字】_第2页
【《SSD目标检测算法研究案例》5800字】_第3页
【《SSD目标检测算法研究案例》5800字】_第4页
【《SSD目标检测算法研究案例》5800字】_第5页
已阅读5页,还剩7页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SSD目标检测算法研究案例目录TOC\o"1-3"\h\u12603SSD目标检测算法研究案例 1142401.1SSD网络模型 152841.2实验平台 1239221.3Pytorch搭建SSD目标检测平台 146441.3.1SSD整体结构介绍 1314031.3.2主干特征提取网络 3208521.3.3分类预测和回归预测 5285261.3.4先验框概念及可视化 7297441.3.5获得预测框 8145401.3.6训练部分 9259831.3.7计算loss 9SSD网络模型SSD的英文全名是SingleShotMultiBoxDetector,代表它是一种one—stage算法,它的功能十分优秀。one—stage算法主要是利用CNN提取特征,然后在图片的不同位置均匀密集地采样,取样时可以使用不同的比例尺和长宽比,这样使得回归预测和分类预测同时进行,加速目标检测效率,所以优点使检测速度快。而由于正负背景的十分不平衡,导致它在训练过程过在均匀密集采集目标上有一定困难,导致模型的精度并不是最理想化,这也是它检测速度快而导致的一个缺点。实验平台本次课题选用的实验平台是Pytoch。PyTorch是一个开源的Python机器学习库,是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络、入门简单、它是相当简介且高效快速的框架。因此我选用Pytorch来搭建自己的SSD目标检测平台。Pytorch搭建SSD目标检测平台SSD整体结构介绍如下所示就是SSD主干网络结构,深度卷积神经网络可以进行特征提取,而SSD采用就是这样一种优秀的深度卷积网络,也就是VGG网络。SSD在VGG的基础上进行了一定的改变,增加了Conv6,Conv7,Conv8,Conv9这四个卷积层,普通的VGG只包含前两个部分,而这样的作用就是能对图片进行不断的特征提取,这就是SSD特征提取网络的部分,利用这样的特征层就能进行下一步——获取框的位置。图3.1SSD主干网络介绍那这些特征层具有什么样的特点,就先要看它们的shape,主要来看它们的高和宽,第一个特征层是38x38,第二个特征层是19x19,第三个特征层是10x10,第四个特征层是5x5,第五个特征层是3x3,第六个特征层是1x1,这些特征层的高和宽的作用是在于把输入的图像分为多少的个网格,比如对于第一个特征层38x38x512来说就相当于是吧图像分成38x38的网格,利用这些网格,网络会对这些网格进行目标检测获取我们需要的目标,所有的特征层都是同理的,就是把输入进来的图像分割成与它对应的高和宽的网格里面。那把图像分割成这样的网格是怎么样的操作,以及把图像分割成网格和我们去目标检测又有什么样的联系就要先了解先验框这个概念。我们可以看到下图这个8x8的网格,虽然上述特征层没有8x8这样的网格,就以8x8这个网格作为一个例子,每个网格它都存在类似下图带颜色的先验框,3.2(b)中先验框以网格的中心为中心,存在好几个先验框,这个先验框都是之前先标好的,之后的预测结果就会对这些先验框进行调整,把它调整到3.2(a)中的框的大小,获得最终的预测结果,也就是说我们获得这些网格的目的就是为了获得这些先验框,之后利用这些网格里的先验框进行调整,然后再获得我们目标检测的结果,这就是把输入进来的图片分割成这么多网络的原因和目的。图3.2先验框分割成这么多网格就会对应这么多的先验框,每一个网格里都会对应比较多的先验框。从图3.1可以看到它对应的情况:对于38x38x512来讲它每一个网格对应了四个先验框,对于19x19x1024的特征层它每一个网格对应了6个先验框,所以对于38x38x512的特征层来说,它里面一共有38x38的网格,每个网格又有四个先验框,因此它具有38x38x4=5776个先验框,然后预测结果会对这5776个先验框先后进行调整,判断这5776个先验框调整后是否含有我们需要检测的物体,后面每个特征层都同理,所以第二个特征层对应了2166个先验框,第三个对应了600个先验框,第四个对应了150个先验框,第五个对应了36个先验框,第六个对应了4个先验框,全部特征层的先验框总数为8732,因此对于SSD目标检测来说就是先后调整了8732个先验框,并判断检验这些先验框里有没有需要检测物体,如果有就标出来,但是结果也会如图3.1中有多个重合的框,那么就需要对它们的得分和主格情况进行判断,利用非极大抑制的方法找到最终需要的框并对它们标注种类。这就是SSD目标检测的整体过程。主干特征提取网络如图3.1所示,SSD主干特征提取网络前面这一部分就是经典的VGG。VGG结构的创建只要通过:defvgg(i);即可调用VGG网络结构,i代表图片输入的通道数一般来说都是3通道,然后就会进入下面这样的循环:forvinbase:ifv=='M':layers+=[nn.MaxPool2d(kernel_size=2,stride=2)]elifv=='C':layers+=[nn.MaxPool2d(kernel_size=2,stride=2,ceil_mode=True)]else:conv2d=nn.Conv2d(in_channels,v,kernel_size=3,padding=1)layers+=[conv2d,nn.ReLU(inplace=True)]in_channels=v这个循环会对列表进行循环,这个v会取数字或者M或者C,M和C就代表了最大池化,数字代表卷积通道数的多少,结合列表和循环可以知道当有一张300x300的图片输入到VGG的时候首先会进行两次64通道的卷积,然后再进行一次最大池化,图片的shape就会从300300x3变成150x150x64,这就是VGG当中Conv1当中的内容,而Conv2会进行两次128通道的卷积和一次最大池化把图片的shape变为75x75x128。Conv2结束之后的Conv3会进行三次256通道的卷积和一次最大池化,此时的Ceil_mode=True,最大池化保留特征层的单数边部分,因此Conv3结束之后获得的特征层是38x38x256,然后再进行Conv4,三次512通道的卷积,此时的Conv4会作为SSD中的有效特征层,获得网络的预测结果,再进行一次最大池化以及Conv5,三次512通道的卷积,之后进行一次的最大池化的stride为1,因此shape不会发生变化,然后会进行一次具有膨化率的1024通道的卷积,用来模拟全连接层,经过这次Conv6之后shape变成19x19x1024,之后进行一次激活函数和下一次的卷积Conv7,shape不发生改变,并且这次的Conv7会作为SSD主干特征提取网络的一个有效特征层,来进行回归预测和分类预测来提取网络预测结果。下图就是VGG网络结构:图3.3VGG网络结构之后的SSD主干特征提取网络的部分通过如下代码实现:layers+=[nn.Conv2d(in_channels,256,kernel_size=1,stride=1)]layers+=[nn.Conv2d(256,512,kernel_size=3,stride=2,padding=1)]layers+=[nn.Conv2d(512,128,kernel_size=1,stride=1)]layers+=[nn.Conv2d(128,256,kernel_size=3,stride=2,padding=1)]layers+=[nn.Conv2d(256,128,kernel_size=1,stride=1)]layers+=[nn.Conv2d(128,256,kernel_size=3,stride=1)]layers+=[nn.Conv2d(256,128,kernel_size=1,stride=1)]layers+=[nn.Conv2d(128,256,kernel_size=3,stride=1)]returnlayers进行如上通道数的压缩和扩大以及多次卷积,获得最终的1x1x256通道的有效特征层,利用这些有效特征层进行回归预测和分类预测获得预测结果。所以说SSD就是改进的VGG网络,整个特征提取层的结构如下所示:图3.4改进的VGG网络分类预测和回归预测图3.5有效特征层由上图我们可以知道,有效特征层都是由长宽高组成的,高是通道数,而长和宽就是把输入进来的图片分割成多少个网格,以及网格存在着多个先验框,所以再有效特征层之后如果要对先验框进行分类预测和回归预测就要再进行两次卷积,而它的通道数有一定的限制,所有的特征层对应的预测结果的shape如下:图3.4预测结果的Shape其中,num_priors就是每一个网格点上先验框的数量,而num_priorsx4就是每个网格点上先验框的调整参数:如果要对框进行调整的话首先要对框的中心进行调整,调整的时候需要两个参数,我们需要对框的宽和高进行调整,调整又需要两个参数,因此如果要对先验框进行调整的话,就需要4个参数,特征层的每个特征点上要包含这个网格点上每个先验框的预测结果,因此这个地方回归预测的卷积的通道数就是num_priorsx4,也就代表着每个先验框的调整参数。而分类预测的结果卷积通道数就是num_priorsxnum_classes:num_classes就是SSD目标检测网络分的类,它是包括背景的,因此num_priorsxnum_classes代表了每个先验框所属的种类,它可能属于背景也可能属于某一个物体,如果num_priorsxnum_classes卷积的某一个先验框某一个类的概率非常高的话就代表着这个先验框很可能包含物体,这就是分类预测卷积的作用。实现分类预测和回归预测的过程如下:defget_ssd(phase,num_classes):vgg,extra_layers=add_vgg(3),add_extras(1024)loc_layers=[]conf_layers=[]vgg_source=[21,-2]fork,vinenumerate(vgg_source):loc_layers+=[nn.Conv2d(vgg[v].out_channels,mbox[k]*4,kernel_size=3,padding=1)]conf_layers+=[nn.Conv2d(vgg[v].out_channels,mbox[k]*num_classes,kernel_size=3,padding=1)]fork,vinenumerate(extra_layers[1::2],2):loc_layers+=[nn.Conv2d(v.out_channels,mbox[k]*4,kernel_size=3,padding=1)]conf_layers+=[nn.Conv2d(v.out_channels,mbox[k]*num_classes,kernel_size=3,padding=1)]SSD_MODEL=SSD(phase,vgg,extra_layers,(loc_layers,conf_layers),num_classes)returnSSD_MODEL在获取好之前的VGG和额外的特征层之后,先用到Conv4-3,对它进行一次回归预测和分类预测,可以看到回归预测的通道数就变成了4x4,分类预测的通道就变成4xnum_classes,也就是每个先验框的种类,再对Conv7进行回归和分类预测,结果取出来之后通道数就变成了6x4和6xnum_classes,之后还需要到extra_layers取后面的特征层,分别进行回归预测和分类预测,通过上述get_ssd代码就获得了回归预测和分类预测的层,把之前的有效特征层和刚刚获得的预测的层进行连接:forkinrange(23):x=self.vgg[k](x)在这一步会不断的进行卷积,进行到Conv4-3的时候停止并进行L2标准化,进行L2标准化的原因是由于之前的卷积程度不够深,进行标准化可以得到更好的结果。把标准化后的特征层添加到sources中,之后会对sources中的数据进行回归预测和分类预测的连接。之后继续把VGG的内容往下传递到Conv7:forkinrange(23,len(self.vgg)):x=self.vgg[k](x)sources.append(x)把结果再添加到sources中,事实上sources就是之后用来回归预测和分类预测的数组。之后再添加额外特征层的内容,可以发现卷积之后会进行激活函数:fork,vinenumerate(self.extras):x=F.relu(v(x),inplace=True)ifk%2==1:sources.append(x)对激活函数进行导入,两次把特征层传入sources里面。通过前面这些代码就获得了所有的有效特征层,并需要开始对sources开始循环了,利用之前获得的回归预测和分类预测的层来处理传入进来的sources,就可以对之前所以的特征层进行回归处理和特征处理了,结果保存再loc.和conf.里面,利用torch.cat函数把前面的结果堆叠到一起。通过上述所有操作就获得了两个内容:每一张图片里面每一个先验框的调整参数以及每个先验框的种类。到这里SSD网络结构的部分就构建好了。先验框概念及可视化首先对feature_maps进行一个循环,feature_maps就是ssd当中有效特征层的长和宽的大小,’feature_maps’:[38,19,10,5,3,1],它相当于一个列表存放着有效特征层的长宽大小,之后通过numpy.meshgrid函数来进行对网格的生成,对获得的网格进行循环:获得的网格相当于是图像划分后的网格中心,对这个网格中心进行循环,首先对原始图片300x300除上步长,让图像划分成平均大小的区域,利用图像划分就可以把网格中心转化成小数的形式。之后就要求先验框的边长,先获得一个对于某个特征层比较小的正方形和一个比较大的正方形,以及两个长方形,即是这个有效特征层的先验框。下图就是先验框可视化的效果:图3.5先验框可视化获得预测框通过上述的步骤获得了SSD目标检测网络的回归预测结果、分类预测结果以及先验框,现在就要利用这些结果来获得预测框。用self.detect函数让它指向自己定义的detect层,这个层主要有三个输入:回归预测结果、分类预测结果和先验框,通过num=loc_data.size(0)获得图片的数量,再用num_priors=prior_data.size(0)获得先验框的数量,对SSD网络说,先验框数量是8732,之后创建一个output的空的数列用来存放输出。把传入进的分类预测结果进行shape的转变,如下开始对每张图片进行解码处理,首先是计算先验框调整后中心的位置,可以看到取回归预测前两位的内容乘上标准化再乘上先验框的长和宽就得到了先验框调整后中心的位置,再计算出先验框调整后的长和宽,即可得到调整后先验框的具体位置。之后再计算先验框的左上角和右下角,就完成了对先验框的解码。defdecode(loc,priors,variances):boxes=torch.cat((priors[:,:2]+loc[:,:2]*variances[0]*priors[:,2:],priors[:,2:]*torch.exp(loc[:,2:]*variances[1])),1)boxes[:,:2]-=boxes[:,2:]/2boxes[:,2:]+=boxes[:,:2]returnboxes之后需要去除某张图片所有先验框的种类,对所有种类进行循环,对每一类进行非极大抑制的操作:由于一张图片里如果包含物体的话,那么这个物体上会存在非常多的先验框,这些框都会指向这个物体,但结果只需要一个最精确的框即可,因此需要非极大抑制在同一区域里判断先验框的重合程度,然后取出得分最高的那个先验框,那么得分最高的框就可能是最精确的框,就可以比较好的代表某个区域内这个物体的种类和先验框的位置,这就是非极大抑制的功能。我们需要对每一个类都进行非极大抑制,找出得分最高最精确的框。通过非极大抑制之后就能获得经过筛选后的预测结果,之后对这些结果进行排序,取出top_k这个框返回到output。训练部分先初始化参数决定每次训练放入多少个样本、学习率多少、训练多少个世代以及是伐使用CUDA等。接着利用迁移学习的思想载入我们预训练好的权重,可以加速我们模型的训练。设置好CUDA的参数打开train.txt文件,train.txt文件存放了图片的信息和图片里存在的目标,打开以后进行顺序的打乱,用Generator生成我们需要使用到的图片和标签,以用来对每一行信息进行读取和预处理。Generator会在每个世代都进行打乱,由于所得到的行是一个列表形式,所有把它传入到self.get_random_data文件里,这个函数的功能是完成实时的的数据增强,对图片进行扭曲、亮度的调整和色域的调整等等,使得原始图片发生变化,达到图片数据增加的效果,使图片丰富多彩,增加模型的鲁棒性。数据增强完之后需要把box也就是目标所在图片上的位置转化成小数的形式,同时要防止box的数值超出0-1,过滤错误数据,再放入numpy中完成数据集的生成。Optimizer=optim.Adam(net.parameters(),Ir=Ir)Criterion=MultiBoxLoss(Config[‘num_classes’],0.5,True,0,True,3,0.5False,Cuda)这里用到了Adam优化器,MultiBoxLoss是目标检测算法使用的Loss函数,之后下面就开训练了。首先取出下一个Batch训练所用的图片还有对应的标签,把它变成变量的形式传入网络当中,然后进行梯度清零,反向传播等等,把训练的过程打印出来,每过一个世代进行一个权重的保存,就是整个训练的过程。计算lossLoss的计算用到是MultiBoxLoss里面的内容。首先取出了预测信息,预测信息包括了回归信息、分类信息和先验框,然后计算出取出传入进来了多少张图片,取出所有先验框然后计算先验框的数量,并对每一种图片进行循环,这个循环的功能使讲我们的真实框和先验框进行一个对比,传入真实框以及它的标签,把它跟先验框传入match函数里来进行对比:match首先计算了所有先验框和真实框的重合程度,这样的计算结果是通过计算IOU的过程,计算结果的每一行都代表了真实框,每一列就代表了先验框,它的输出是[truth_box,num_prior]。之后计算所有真实框重合最好的先验框用overlap.max的方法计算出来,结果获得[truth_box,1]这样的内容,再计算所有先验框重合最好的真实框,得到[1,prior],利用下面几行代码保证每一个真实框都能找到重合程度最好的先验框,matches=truths[best_truyh_idx]conf=labels[best_truth_idx]+1cof[best_truth_overlap<threshold]=0loc=encode(matches,priors,var

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论