建设网站学什么,wordpress网站在哪,公司做网站 需要准备什么,杭州建设网杨赟文章目录1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估6 识别效果1 前言
#x1f525;这两年开始毕业设计和毕业答辩的要求和难度不断提升#xff0c;传统的毕设题目缺少创新和亮点#xff0c;往往达不到毕业答辩的要求…文章目录1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估6 识别效果1 前言这两年开始毕业设计和毕业答辩的要求和难度不断提升传统的毕设题目缺少创新和亮点往往达不到毕业答辩的要求这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。并且很难找到完整的毕设参考学习资料。为了大家能够顺利以及最少的精力通过毕设学长分享优质毕业设计项目提供大家参考学习今天要分享的是基于深度学习的手势识别实现选题指导, 项目分享见文末2 项目背景手势识别在深度学习项目是算是比较简单的。这里为了给大家会更好的训练。其中的数据集如下3 任务描述图像分类是根据图像的语义信息将不同类别图像区分开来是计算机视觉中重要的基本问题。手势识别属于图像分类中的一个细分类问题。虽然与NLP的内容其实没有多大的关系但是作为深度学习DNN是一个最为简单的深度学习的算法它是学习后序CNN、RNN、Lstm以及其他算法深度学习算法的基础。实践环境Python3.7PaddlePaddle1.7.0。用的仍然是前面多次提到的jupyter notebook当然我们也可以用本地的pycharm。不过这里需要提醒大家如果用的是jupyter notebook作为试验训练在实验中会占用很大的内存jupyter notebook默认路径在c盘时间久了我们的c盘会内存爆满希望我们将其默认路径修改为其他的路径网上有很多的修改方式这里限于篇幅就不做说明了。这里需要给大家简要说明paddlepaddle是百度 AI Studio的一个开源框架类似于我们以前接触到的tensorflow、keras、caffe、pytorch等深度学习的框架。4 环境搭配首先在百度搜索paddle选择你对应的系统(Windows、macOs、Ubuntu、Centos)然后选择你的安装方式(pip、conda、docker、源码编译)最后选择python的版本(Python2、python3)但是一般选择python3。左后先则版本(GPU、CPU)但是后期我们用到大量的数据集因此我们需要下载GPU版本。然后将该命令复制到cmd终端点击安装这里用到了百度的镜像可以加快下载安装的速度。python-m pip install paddlepaddle-gpu1.8.3.post107-i https://mirror.baidu.com/pypi/simple学长电脑是window10系统用的是pip安装方式安装的版本是python3本人的CUDA版本是CUDA10因此选择的示意图以及安装命令如图所示。这里前提是我们把GPU安装需要的环境配好网上有很多相关的文章这里篇幅有限就不进行展开叙述了。环境配好了接下来就该项目实现。5 项目实现5.1 准备数据首先我们导入必要的第三方库。importosimporttimeimportrandomimportnumpyasnpfromPILimportImageimportmatplotlib.pyplotaspltimportpaddleimportpaddle.fluidasfluidimportpaddle.fluid.layersaslayersfrommultiprocessingimportcpu_countfrompaddle.fluid.dygraphimportPool2D,Conv2Dfrompaddle.fluid.dygraphimportLinear该数据集是学长自己收集标注的数据集(目前较小)包含0-9共就种数字手势共2073张手势图片。图片一共有3100100张格式均为RGB格式文件。在本次实验中我们选择其中的10%作为测试集90%作为训练集。通过遍历图片根据文件夹名称生成label。我按照1:9比例划分测试集和训练集生成train_list 和 test_list具体实现如下data_path/home/aistudio/data/data23668/Dataset# 这里填写自己的数据集的路径windows的默认路径是\要将其路径改为/。character_foldersos.listdir(data_path)print(character_folders)if(os.path.exists(./train_data.list)):os.remove(./train_data.list)if(os.path.exists(./test_data.list)):os.remove(./test_data.list)forcharacter_folderincharacter_folders:withopen(./train_data.list,a)asf_train:withopen(./test_data.list,a)asf_test:ifcharacter_folder.DS_Store:continuecharacter_imgsos.listdir(os.path.join(data_path,character_folder))count0forimgincharacter_imgs:ifimg.DS_Store:continueifcount%100:f_test.write(os.path.join(data_path,character_folder,img)\tcharacter_folder\n)else:f_train.write(os.path.join(data_path,character_folder,img)\tcharacter_folder\n)count1print(列表已生成)其效果图如图所示这里需要简单的处理图片。需要说明一些函数data_mapper(): 读取图片对图片进行归一化处理返回图片和 标签。data_reader(): 按照train_list和test_list批量化读取图片。train_reader(): 用于训练的数据提供器乱序、按批次提供数据test_reader():用于测试的数据提供器具体的实现如下defdata_mapper(sample):img,labelsample imgImage.open(img)imgimg.resize((32,32),Image.ANTIALIAS)imgnp.array(img).astype(float32)imgimg.transpose((2,0,1))imgimg/255.0returnimg,labeldefdata_reader(data_list_path):defreader():withopen(data_list_path,r)asf:linesf.readlines()forlineinlines:img,labelline.split(\t)yieldimg,int(label)returnpaddle.reader.xmap_readers(data_mapper,reader,cpu_count(),512)5.2 构建网络在深度学习中有一个关键的环节就是参数的配置这些参数设置的恰当程度直接影响这我们的模型训练的效果。因此也有特别的一个岗位就叫调参岗专门用来调参的这里是通过自己积累的经验来调参数没有一定的理论支撑因此这一块是最耗时间的当然也是深度学习的瓶颈。接下来进行参数的设置。train_parameters{epoch:1,#训练轮数batch_size:16,#批次大小lr:0.002,#学习率skip_steps:10,#每10个批次输出一次结果save_steps:30,#每10个批次保存一次结果checkpoints:data/}train_readerpaddle.batch(readerpaddle.reader.shuffle(readerdata_reader(./train_data.list),buf_size256),batch_size32)test_readerpaddle.batch(readerdata_reader(./test_data.list),batch_size32)前面也提到深度神经网络Deep Neural Networks 简称DNN是深度学习的基础。DNN网络图如图所示首先定义一个神经网络具体如下classMyLeNet(fluid.dygraph.Layer):def__init__(self):super(MyLeNet,self).__init__()self.c1Conv2D(3,6,5,1)self.s2Pool2D(pool_size2,pool_typemax,pool_stride2)self.c3Conv2D(6,16,5,1)self.s4Pool2D(pool_size2,pool_typemax,pool_stride2)self.c5Conv2D(16,120,5,1)self.f6Linear(120,84,actrelu)self.f7Linear(84,10,actsoftmax)defforward(self,input):# print(input.shape)xself.c1(input)# print(x.shape)xself.s2(x)# print(x.shape)xself.c3(x)# print(x.shape)xself.s4(x)# print(x.shape)xself.c5(x)# print(x.shape)xfluid.layers.reshape(x,shape[-1,120])# print(x.shape)xself.f6(x)yself.f7(x)returny这里需要说明的是在forward方法中我们在每一步都给出了打印的print()函数就是为了方便大家如果不理解其中的步骤可以在实验中进行打印通过结果来帮助我们进一步理解DNN的每一步网络构成。5.3 开始训练接下来就是训练网络。为了方便我观察实验中训练的结果学长引入了matplotlib第三方库直观的通过图来观察我们的训练结果具体训练网络代码实现如下importmatplotlib.pyplotasplt Iter0Iters[]all_train_loss[]all_train_accs[]defdraw_train_process(iters,train_loss,train_accs):titletraining loss/training accsplt.title(title,fontsize24)plt.xlabel(iter,fontsize14)plt.ylabel(loss/acc,fontsize14)plt.plot(iters,train_loss,colorred,labeltraining loss)plt.plot(iters,train_accs,colorgreen,labeltraining accs)plt.legend()plt.grid()plt.show()withfluid.dygraph.guard():modelMyLeNet()# 模型实例化model.train()# 训练模式optfluid.optimizer.SGDOptimizer(learning_rate0.01,parameter_listmodel.parameters())# 优化器选用SGD随机梯度下降学习率为0.001.epochs_num250# 迭代次数forpass_numinrange(epochs_num):forbatch_id,datainenumerate(train_reader()):imagesnp.array([x[0].reshape(3,32,32)forxindata],np.float32)labelsnp.array([x[1]forxindata]).astype(int64)labelslabels[:,np.newaxis]# print(images.shape)imagefluid.dygraph.to_variable(images)labelfluid.dygraph.to_variable(labels)predictmodel(image)# 预测# print(predict)lossfluid.layers.cross_entropy(predict,label)avg_lossfluid.layers.mean(loss)# 获取loss值accfluid.layers.accuracy(predict,label)# 计算精度Iter32Iters.append(Iter)all_train_loss.append(loss.numpy()[0])all_train_accs.append(acc.numpy()[0])ifbatch_id!0andbatch_id%500:print(train_pass:{},batch_id:{},train_loss:{},train_acc:{}.format(pass_num,batch_id,avg_loss.numpy(),acc.numpy()))avg_loss.backward()opt.minimize(avg_loss)model.clear_gradients()fluid.save_dygraph(model.state_dict(),MyLeNet)# 保存模型draw_train_process(Iters,all_train_loss,all_train_accs)训练过程以及结果如下前面提到强烈建议大家安装gpu版的paddle框架因为就是在训练过程中paddle框架会利用英伟达的GP加速训练的速度会很快的而CPU则特别的慢。因此CPU的paddle框架只是在学习的时候还可以一旦进行训练根本不行。可能GPU需要几秒的训练在CPU可能需要十几分钟甚至高达半个小时。其实不只是paddlepaddle框架建议大家安装GPU版本其他的类似tensorflow、keras、caffe等框架也是建议大家按安装GPU版本。不过安装起来比较麻烦还需要大家认真安装。withfluid.dygraph.guard():accs[]model_dict,_fluid.load_dygraph(MyLeNet)modelMyLeNet()model.load_dict(model_dict)# 加载模型参数model.eval()# 训练模式forbatch_id,datainenumerate(test_reader()):# 测试集imagesnp.array([x[0].reshape(3,32,32)forxindata],np.float32)labelsnp.array([x[1]forxindata]).astype(int64)labelslabels[:,np.newaxis]imagefluid.dygraph.to_variable(images)labelfluid.dygraph.to_variable(labels)predictmodel(image)accfluid.layers.accuracy(predict,label)accs.append(acc.numpy()[0])avg_accnp.mean(accs)print(avg_acc)5.4 模型评估配置好了网络并且进行了一定的训练接下来就是对我们训练的模型进行评估具体实现如下结果还可以这里说明的是刚开始我们的模型训练评估不可能这么好可能存在过拟合或者欠拟合的问题不过更常见的是过拟合这就需要我们调整我们的epoch、batchsize、激活函数的选择以及优化器、学习率等各种参数通过不断的调试、训练最好可以得到不错的结果但是如果还要更好的模型效果其实可以将DNN换为更为合适的CNN神经网络模型效果就会好很多关于CNN的相关知识以及实验我们下篇文章在为大家介绍。最后就是我们的模型的预测。6 识别效果 项目分享:大家可自取用于参考学习获取方式见文末!