深度学习基础与实践 教案10.4任务实施(操作参考)_第1页
深度学习基础与实践 教案10.4任务实施(操作参考)_第2页
深度学习基础与实践 教案10.4任务实施(操作参考)_第3页
深度学习基础与实践 教案10.4任务实施(操作参考)_第4页
深度学习基础与实践 教案10.4任务实施(操作参考)_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

10.4任务实施10.4.1任务书人的重新识别可以看作是一个图像检索问题。给定摄像头A中的一个查询图像,来找到其他摄像头中同一个人的图像。人的重新识别的关键是找到一个有区别的人的表示。利用ResNet进行行人重识别的要求如下:1)下载Market1501数据,该数据包含很多行人图片数据;2)处理数据集,做好标签化;3)搭建合适的神经网络;4)训练时能够使用GPU来训练;5)完成测试;6)输出demo样本案例。10.4.2任务分组表10-2学生任务分配表班级组号指导老师组长学号成员数量组长任务组员姓名学号任务分工10.4.3获取信息引导问题1:查询相关资料,了解ResNet相对于其它神经网络结构的主要特点是什么?ResNet的主要特点是在深度较深的网络中,通过特殊的残差块和跨层连接的方式,使得网络训练更加容易,使得网络深度可以进一步增加,从而获得更好的性能表现。引导问题2:查询相关资料,分析实验中需要用到哪些资料,描述使用ResNet网络完成行人重识别任务的实验操作顺序。准备资料:上网搜集Market-1501数据集的使用方法,如前往.au/Project/project_reid.html了解Market-1501、获取数据集资源,学习其使用方法。通过网络和本书知识准备章节学习ResNet的定义和使用方法。安装顺序:准备实验环境。下载数据集和模型。查找资料,编写获取数据、建立模型、训练和测试的相关代码。完成训练和测试,输出最终结果。10.4.4工作实施1. 实验前准备(1)新建项目。创建实验检测路径及文件:在实验环境的桌面右键点击【创建文件夹(F)...】,输入文件夹名称为【test12】,如图10-48所示。打开【test12】文件夹,会显示其路径为“/home/techuser/Desktop/test12”。图10-48创建“test12”文件夹引导问题3:查看相关资料,完成配置项目conda虚拟环境。请详述环境配置过程,并记录环境配置过程中出现的问题及解决的方法。安装过程(叙述方式描述如步骤1和2这样描述):步骤1:双击桌面中的【pycharm】图标,在弹出的界面中点击【close】按钮。步骤2:在建好的文件夹中新建一个工程,进行如下操作:左键单击左上角【file】按钮,然后点击【open】按钮。步骤3:选择"/home/techuser/Desktop/test12"路径,点击【ok】按钮,在弹出框中左键点击【ThisWindow】。步骤4:对本实验用到的conda虚拟环境进行配置。左键点击【file】,再左键点击【Settings】。步骤5:左键点击下图中的【Projcet:test12】按钮,再左键点击【ProjectInterpreter】按钮。步骤6:在右侧的红框处,选择到conda的虚拟环境【Course】路径下,左键点击【ok】按钮。在【pycharm】界面的右下角出现下图中红框中的内容即为conda环境配置正确。出现的问题及解决的方法:(2)新建本文所需的python文件。右键点击pychram中的【test12】按钮,左键单击【new】,再单击【PythonFile】按钮,如图10-49。在框中输入“prepare”,如图10-50,敲击回车,则会得到【prepare.py】文件,如图10-51。图10-49创建Python文件图10-50为新创建Python文件命名图10-51创建新Python文件“prepare.py”按照上面的步骤再建5个python文件。一共建6个py文件,6个py文件及其路径分别是:“/home/techuser/Desktop/test12/prepare.py”“/home/techuser/Desktop/test12/model.py”“/home/techuser/Desktop/test12/train.py”“/home/techuser/Desktop/test12/test.py”“/home/techuser/Desktop/test12/evaluate_gpu.py”“/home/techuser/Desktop/test12/demo.py”(3)下载数据集和模型引导问题4:上网分别搜索Market-1501数据集的下载地址,下载数据后将压缩文件解压到我们在第一步中在pycharm创建在桌面上的test12目录中。Market-1501数据集的下载地址:/file/2765/Market.zip/file/2765/model.zip数据准备在工程文件夹中创建并打开“prepare.py”文件。作为下载数据以及处理加载数据的代码文件,首先需要导入相应的包:importosfromshutilimportcopyfile#导入处理数据所需要的包os所使用的数据集为Market1501,在下载好数据集后,需要进一步对数据集作为处理,所以先声明好数据集所在的位置,并且创建处理数据之后存放的文件夹。#将数据所在路径更改为test12根目录下!download_path='./Market'ifnotos.path.isdir(download_path):print('pleasechangethedownload_path')save_path=download_path+'/pytorch'ifnotos.path.isdir(save_path):os.mkdir(save_path)接着需要对数据集中每一个文件夹里面的图片做数据处理,以query为例:#-----------------------------------------#query#query为Market数据库中的一个图片文件夹,此段代码目的将其标签化,集合到同一个文件夹pytorchquery_path=download_path+'/query'#指定路径为下载路径下的query文件夹query_save_path=download_path+'/pytorch/query'#处理数据后保存在下载路径下的pytorch文件夹中ifnotos.path.isdir(query_save_path):os.mkdir(query_save_path)#检测是否存在query文件夹forroot,dirs,filesinos.walk(query_path,topdown=True):#开始处理各个文件夹下面的图片数据fornameinfiles:ifnotname[-3:]=='jpg':continueID=name.split('_')src_path=query_path+'/'+namedst_path=query_save_path+'/'+ID[0]#根据图片ID分配文件夹ifnotos.path.isdir(dst_path):os.mkdir(dst_path)copyfile(src_path,dst_path+'/'+name)#完成对query文件夹的标签化引导问题5:其他文件夹也需进行如上操作。请完成对gt_bbox、bounding_box_test、bounding_box_train的操作代码,其中gt_bbox的处理结果保存在pytorch/multi-query/目录中,bounding_box_test的处理结果保存在pytorch/gallery目录中,bounding_box_train的处理结果同时保存在pytorch/train目录和pytorch/train_all目录中。处理gt_bbox数据的代码:query_path=download_path+'/gt_bbox'#fordukemtmc-reid,wedonotneedmulti-queryifos.path.isdir(query_path):query_save_path=download_path+'/pytorch/multi-query'ifnotos.path.isdir(query_save_path):os.mkdir(query_save_path)forroot,dirs,filesinos.walk(query_path,topdown=True):fornameinfiles:ifnotname[-3:]=='jpg':continueID=name.split('_')src_path=query_path+'/'+namedst_path=query_save_path+'/'+ID[0]ifnotos.path.isdir(dst_path):os.mkdir(dst_path)copyfile(src_path,dst_path+'/'+name)处理bounding_box_test数据的代码:gallery_path=download_path+'/bounding_box_test'gallery_save_path=download_path+'/pytorch/gallery'ifnotos.path.isdir(gallery_save_path):os.mkdir(gallery_save_path)forroot,dirs,filesinos.walk(gallery_path,topdown=True):fornameinfiles:ifnotname[-3:]=='jpg':continueID=name.split('_')src_path=gallery_path+'/'+namedst_path=gallery_save_path+'/'+ID[0]ifnotos.path.isdir(dst_path):os.mkdir(dst_path)copyfile(src_path,dst_path+'/'+name)处理bounding_box_train数据的代码:train_path=download_path+'/bounding_box_train'train_save_path=download_path+'/pytorch/train_all'ifnotos.path.isdir(train_save_path):os.mkdir(train_save_path)forroot,dirs,filesinos.walk(train_path,topdown=True):fornameinfiles:ifnotname[-3:]=='jpg':continueID=name.split('_')src_path=train_path+'/'+namedst_path=train_save_path+'/'+ID[0]ifnotos.path.isdir(dst_path):os.mkdir(dst_path)copyfile(src_path,dst_path+'/'+name)操作完毕后,打开文件在每个subdir(例如pytorch/train/0002)中,相同ID的图像都被安排在文件夹中。现在已经成功的准备好了数据,以便torchvision读取数据。prepare.py文件中的代码编写完成,需要将其运行。构建神经网络(model.py)引导问题6:导入相关依赖包,以便后续函数功能的使用。因为构建神经网络的方法是对nn.Module进行继承重写,所以首先需要导包。查阅资料,考虑实现一个ResNet网络类的定义需要用到哪些包。完善如下代码,导入必要的包:#创建神经网络的结构需要用到以下所有的包。importtorchimporttorchimporttorch.nnasnnfromtorch.nnimportinitfromtorchvisionimportmodelsfromtorch.autogradimportVariableimportpretrainedmodels对构建神经网络的一些参数进行默认赋值:#######################################################################此处代码来声明一个神经网络的一些默认值。defweights_init_kaiming(m):#该方法用于给classname命名classname=m.__class__.__name__#print(classname)ifclassname.find('Conv')!=-1:#如果寻找到Conv层做以下操作init.kaiming_normal_(m.weight.data,a=0,mode='fan_in')#Foroldpytorch,youmayusekaiming_normal.elifclassname.find('Linear')!=-1:#如果寻找到Linear层作以下操作init.kaiming_normal_(m.weight.data,a=0,mode='fan_out')init.constant_(m.bias.data,0.0)elifclassname.find('BatchNorm1d')!=-1:init.normal_(m.weight.data,1.0,0.02)init.constant_(m.bias.data,0.0)defweights_init_classifier(m):classname=m.__class__.__name__ifclassname.find('Linear')!=-1:init.normal_(m.weight.data,std=0.001)init.constant_(m.bias.data,0.0)引导问题7:因为使用Resnet网络,所以首先要构建基础块ClassBlock。请根据基础块的功能实现基础块ClassBlock类的定义。#构建Resnet网络所使用的基础块ClassBlockclassClassBlock(nn.Module):#对Module类进行重构来构建基础块神经网络def__init__(self,input_dim,class_num,droprate,relu=False,bnorm=True,num_bottleneck=512,linear=True,return_f=False):#构造方法,用于一些默认的参数的传输super(ClassBlock,self).__init__()self.return_f=return_fadd_block=[]#定义列表add_block用于储存模型的一些信息iflinear:add_block+=[nn.Linear(input_dim,num_bottleneck)]#保存Linear层中的一些信息else:num_bottleneck=input_dimifbnorm:add_block+=[nn.BatchNorm1d(num_bottleneck)]ifrelu:add_block+=[nn.LeakyReLU(0.1)]ifdroprate>0:add_block+=[nn.Dropout(p=droprate)]add_block=nn.Sequential(*add_block)add_block.apply(weights_init_kaiming)classifier=[]classifier+=[nn.Linear(num_bottleneck,class_num)]classifier=nn.Sequential(*classifier)classifier.apply(weights_init_classifier)self.add_block=add_blockself.classifier=classifierdefforward(self,x):#声明forward方法,forward方法用于返回一些值,这些值经过网络结构的处理x=self.add_block(x)ifself.return_f:f=xx=self.classifier(x)returnx,felse:x=self.classifier(x)returnx构建完善基础块,再修改一下Resnet网络。引导问题8:Market-1501中有751个类(不同的人),与ImageNet中的1,000个类有所不同。对所需要的不同层的神经网络进行修改。因此,更改模型以使用分类器。参考Pytorch实现的ResNet类的定义,对其进行修改,使得适应本实验的751个类的输出。classft_net(nn.Module):#对Module类进行重载来构造Resnet网络def__init__(self,class_num,droprate=0.5,stride=2):#构造方法,用于传递一些函数的默认参数super(ft_net,self).__init__()model_ft=models.resnet50(pretrained=True)#avgpoolingtoglobalpoolingifstride==1:model_ft.layer4[0].downsample[0].stride=(1,1)model_ft.layer4[0].conv2.stride=(1,1)model_ft.avgpool=nn.AdaptiveAvgPool2d((1,1))self.model=model_ftself.classifier=ClassBlock(2048,class_num,droprate)#利用之前构造的基础块来声明defforward(self,x):#准备进行构造Resnet50的各层网络结构x=self.model.conv1(x)x=self.model.bn1(x)x=self.model.relu(x)x=self.model.maxpool(x)x=self.model.layer1(x)#第一层layer层x=self.model.layer2(x)#第二层layer层x=self.model.layer3(x)#第三层layer层x=self.model.layer4(x)#第四层layer层x=self.model.avgpool(x)#构造五层Resnet网络x=x.view(x.size(0),x.size(1))x=self.classifier(x)returnx程序会下载resnet50网络的模型。对我们创建的网络进行测试输出:'''#debugmodelstructure构造完神经网络结构之后将构造的神经网络进行输出'''if__name__=='__main__':#这里显示一个直接的方法,在进行训练之前,来测试网络结构net=ft_net(751,stride=1)net.classifier=nn.Sequential()print(net)input=Variable(torch.FloatTensor(8,3,256,128))output=net(input)print('netoutputsize:')print(output.shape)引导问题9:执行该程序,会输出我们创建的网络模型,以及之前下载网络模型的界面。完成代码之后自行执行一遍,在下方摘录关键的输出信息。开始训练创建“train.py”文件来进行训练。引导问题10:现在准备了训练数据并定义了模型结构,可以开始训练,按照此模型来训练。pythontrain.py--gpu_ids0--nameft_ResNet50--train_all--batchsize32--data_diryour_data_path--gpu_ids要运行哪个GPU。--name模型的名称。--data_dir训练数据的路径。--train_all使用所有图像进行训练。--batchsize批量大小。按照上方命令行格式及参数完成train.py关键代码的编写。见配套代码资源。train.py文件编辑完成后将其运行,将会出现图10-52的结果。图10-52CPU训练输出结果假如使用GPU设备进行训练,训练结果将如图10-53和图10-54所示。图10-53GPU训练输出结果(1)图10-54GPU训练输出结果(2)开始测试创建test.py文件。在测试中,加载网络权重(刚刚训练过)以提取每个图像的视觉特征。此部分功能在test.py中实现。首先,导入所需要的包:#-*-coding:utf-8-*-from__future__importprint_function,divisionimportargparseimporttorchimporttorch.nnasnnimporttorch.optimasoptimfromtorch.optimimportlr_schedulerfromtorch.autogradimportVariableimporttorch.backends.cudnnascudnnimportnumpyasnpimporttorchvisionfromtorchvisionimportdatasets,models,transformsimporttimeimportosimportscipy.ioimportyamlimportmathfrommodelimportft_net,ft_net_dense,ft_net_NAS,PCB,PCB_testfromtqdmimporttqdm#fp16try:fromapex.fp16_utilsimport*exceptImportError:#willbe3.xseries引导问题11:理解train.py的工作,思考如何实现测试代码,完成test.py关键代码的编写。完成test.py关键代码的编写。见配套代码资源。(1)准备test.py生成的特征文件将桌面上的pytorch_result.mat文件复制到test12文件夹下。(2)准备权重文件将左面上的n

温馨提示

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

评论

0/150

提交评论