版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章
机器怎么学习——01看图识数字1场景导入2知识小百科3AI实验室4分享评价1场景导入回想小时候,在我们上幼儿园的时候,老师和家长会教我们认识从1到10的数字,学习“人、大、天……”这样的汉字,我们是如何学会的呢?每个人写出来的字体都不完全一样,而我们会从看到的这些画面里面去找一些共同之处,比如“1”,是从上到下的一竖,我们看老师写过几次之后,就算字体有些偏斜、粗细不均匀,我们也能把这个字符和“1”这个概念关联起来,这个过程就是“学习”,如右图所示为不同字体的“1”。1场景导入各种数字12知识小百科活动目标:学习神经网络概念学习字符识别的原理学习神经网络建立和训练过程实现手写字符识别机器学习最基本的做法,是使用算法来解析数据,不断学习,然后对世界中发生的事做出判断和预测。此时,研究人员不会亲手编写软件、确定特殊指令集、然后让程序完成特殊任务,相反,研究人员会用大量数据和算法“训练”机器,让机器学会如何执行任务。正如人工智能先驱ArthurSamuel在1959年的定义:“机器学习是需要研究的领域,它给计算机学习的能力而不是明确地编程能力”。根据学习模式,机器学习分为监督学习、无监督学习,细分的话还有半监督学习和强化学习等。(一)机器学习1、监督学习监督学习,也称为监督训练或有教师学习。通过已有的训练样本(即已知数据以及其对应的输出)去训练得到一个最优模型(这个模型属于某个函数的集合,最优则表示在某个评价准则下是最佳的)。再利用这个模型将所有的输入映射为相应的输出,对输出进行简单的判断从而实现分类或预测的目的。如输入了一个人的信息,他是有性别属性的。当输入模型后,就可以明确的知道了输出的结果,也可以验证型的对错。(一)机器学习在监督式学习下,输入数据被称为“训练数据”,每组训练数据有一个明确的标识或结果,如对防垃圾邮件系统中“垃圾邮件”“非垃圾邮件”,对手写数字识别中的“1、2、3、4”等。在建立预测模型的时候,监督式学习建立一个学习过程,将预测结果与“训练数据”的实际结果进行比较,不断的调整预测模型,直到模型的预测结果达到一个预期的准确率。监督式学习的常见应用场景如分类问题和回归问题。(一)机器学习2、无监督学习无监督学习与监督学习的不同之处在于事先没有任何训练样本,而需要直接对数据进行建模。是否有监督,就看输入数据是否有标签。输入数据有标签(即数据有标识分类),则为有监督学习,没标签则为无监督学习(非监督学习)。在很多实际应用中,并没有大量的标识数据进行使用,并且标识数据需要大量的人工工作量,非常困难。这就需要非监督学习根据数据的相似度,特征及相关联系进行模糊判断分类。主要用于经济预测、异常检测、数据挖掘、图像处理、模式识别等领域。(一)机器学习人工神经网络(ArtificialNeuralNetworks,ANN)是早期机器学习中的一个重要的算法,历经数十年风风雨雨。神经网络的原理是受我们大脑的生理结构——互相交叉相连的神经元启发。1、生物神经网络回顾生物课上学到的知识,人类学习是靠大脑神经元的连接。人类的大脑是由大约100亿~1000亿个生物神经元构成的,如图所示。每一个神经元都和几千个其他神经元相连,神经元能根据环境变化做出反应,再将信息给其他的神经元。(二)神经网络(二)神经网络生物神经元的构成一个典型的生物神经元由四个部分组成:(1)树突:一个神经元有若干个树突,它们能接收来自其他神经元的信号,并将信号传递给细胞体。(2)细胞体:细胞体是神经元的核心,它把各个树突传递过来的信号加总起来,得到一个总的刺激信号。(3)轴突:当细胞体内的刺激信号超过一定阈值之后,神经元的轴突会对外发送信号。(4)突触:该神经元发送的信号(若有)将由突触向其他神经元或人体内的其他组织(对神经信号做出反应的组织)传递。(二)神经网络需要说明的是,由于神经元结构的可塑性,突触的传递作用可增强或减弱,因此神经元具有学习与遗忘的功能。人类大脑中的神经元相互联结构成了极其复杂的生物神经网络系统,如图所示。(二)神经网络生物神经网络系统2.人工神经网络按照生物神经元的结构和工作原理构造出来的一个抽象和简化了的模型,也就诞生了所谓的“模拟大脑”。该神经元模型包含输入、输出与计算功能。输入可以类比为生物神经元的树突,而输出可以类比为生物神经元的轴突,计算则可以类比为细胞核。如右图是一个典型的神经元模型:包含有3个输入,1个输出,以及2个计算功能。注意中间的箭头线。这些线称为“连接”,每个上有一个“权值”。(二)神经网络(二)神经网络典型的神经元模型每一个神经元都为它的输入分配权重,这个权重的正确与否与其执行的任务直接相关,最终的输出由这些权重加总来决定。权重扮演了生物神经元中突触的角色。调整权重,可以让它做你想做的事情。和生物神经网络类似,多个神经元模型按照一定的规则连接就形成了人工神经网络ANN。但与大脑中一个神经元可以连接一定距离内的任意神经元不同,人工神经网络具有离散的层、连接和数据传播的方向。如下图所示为神经网络ANN基本结构,由输入层、隐含层和输出层组成,图中的圆点为神经元。(二)神经网络(二)神经网络神经网络ANN基本结构相比于生物神经网络纷繁复杂,最初科学家只做出了单层的神经网络,后来做出了双层。而多层神经网络的突破发生在2012年,多伦多大学的GeoffreyHinton教授使用5层神经网络的机器学习,令图像识别的准确率大幅突破了原先人们认为的极限,而三年后微软研究院的Resnet神经网络到了152层。层数越多学习的深度就越深,也就越能认复杂的图形。(二)神经网络以学习认识数字为例子,我们来体验一下神经网络学习和工作的过程。数字识别隶属于字符识别,也叫光学字符识别(OCR,OpticalCharacterRecognition),是指将字符图像,翻译成计算机字符编码的过程。ORC技术目前主要应用在证件识别、银行卡识别、车牌识别、名片识别、票据识别等等,改变了人们对着图片往电脑里敲字符的历史。(三)字符识别OCR(三)字符识别OCR数字识别流程图回想下我们学习认识数字“1”的过程:(1)首先我们要明白老师写在黑板上的是什么,那白色的竖线是我们需要接收的信息。这就是图像处理里的二值化。这个白色多重,才是老师写上去的呢?这就是判断的灰度阈值。通过二值化可以让我们更清晰的得到关注的信息,如下图所示。(三)字符识别OCR(三)字符识别OCR不同阈值下的图像二值化效果(2)图像降噪滤波。黑板上如果有没擦干净的地方,或者粉笔写的不清晰的地方,那也是我们不关心的,需要滤除掉,这就是降噪和滤波。(三)字符识别OCR图像降噪滤波的效果(3)图像校正。一般情况下,我们看到的字符不会是横平竖直的,但是却不影响我们去认识,我们的大脑会自动的对字体进行校正,同样在字符图像处理的过程中,我们也需要进行倾斜校正,如图所示。(三)字符识别OCR图像降噪滤波的效果(4)字符分割。我们从小学习汉字的时候,都是要写在田字格里面,这样我们可以清楚的知道哪些笔画组成了一个完整的字。同样的道理,如果想要人工智能识别出文字,首先要知道哪些像素组成了文字,这就是字符分割。下图所显示的分割结果和我们使用的田字格是不是很像?(三)字符识别OCR(三)字符识别OCR字符分割(5)经过前面的处理,我们已经得到了一个一个独立的文字,这个时候就要在我们的脑海中去寻找这是什么字了。我们学过“一”字的特征是一条横线,“田”字的特征是在方框中有一个十字,这些我们脑海中的特征,在计算机里就是“特征向量”,这是一组数字组合。通过对比这些特征,计算机可以将这些字符的图片和字符所对应的概念对应起来,如图所示。(三)字符识别OCR(三)字符识别OCR字符识别的结果可视化是数据科学中很重要的一个步骤,能够为过程和结果提供一个非常好的展示效果,增加可信度。在Python中,matolotlib是一个非常强大的图形库。在线安装:(四)Matplotlib库pipinstallmatplotlib本地安装:pipinstallmatplotlib-3.1.2-cp37-cp37m-win_amd64.whl实例:使用Matplotlib库可视化图像(四)Matplotlib库#加载Matplotlib、OpenCV库importmatplotlib.pyplotaspltimportcv2#读取图像(默认以BGR通道读取图像)img=cv2.imread('./Lena.png')#BGR通道转RGB通道b,g,r=cv2.split(img)dst=cv2.merge([r,g,b])#可视化显示图像plt.imshow(dst)plt.show()实例Matplotlib绘图示例运行结果:(四)Matplotlib库图片绘制结果我们学习知识的过程,往往需要做大量的练习题,对于神经网络的学习过程,也同样如此。给计算机用来学习的这些“习题”,我们称之为数据集(DataSet),又称为资料集、数据集合或资料集合,是一种由数据所组成的集合。就像我们学习时使用的习题集会有数学、语文等不同的科目,数据集也有数值、图片、语音、文本等等各种各样的类型。对于训练不同的神经网络,需要用到不同类型的数据,这就需要用不同的数据集,比如手写字符数据集、汽车图片数据集等。(五)数据集(五)数据集手写字符数据集汽车图片数据集数据集一般是由数据和编号组成,在使用的过程中,会被划分成“训练集”和“测试集”,这就类似我们的练习题和考试题。神经网络建立好之后,通过大量的训练数据,让神经网络进行学习;神经网络训练完成之后,就可以使用测试数据或者实际应用场景中采集到的数据来让神经网络进行判断。一般情况下,训练数据量越大,神经网络判断的结果就会越准确,就像学习知识更多的学生一般会获得更好的成绩。(五)数据集3AI实验室(一)任务发布目标实现一个数字识别的程序要求(1)通过大量手写体数字,训练一个神经网络模型,可以识别字符的图像。(2)使用字符的图像,验证识别效果。配置好python3.x语言环境;VScode集成开发环境(Windowsx64UserInstaller版本);第三方Python库有:OpenCV库、Numpy库、PyTorch库、Torchvision库和Matplotlib库。本任务还需准备MNIST数据集。MNIST是机器学习领域中经典的手写图片数据集,这些图片采集不同人手写的从0到9的数字,由6万张训练图片和1万张测试图片构成,每张图片都是28*28像素大小(单通道),如图所示:(二)任务环境(二)任务环境数字示例图片MNIST数据集由以下四个部分组成:训练图片:train-images-idx3-ubyte.gz训练图片标签:train-labels-idx1-ubyte.gz测试图片:t10k-images-idx3-ubyte.gz测试图片标签:t10k-labels-idx1-ubyte.gzMNIST数据集采用ubyte格式存储,便于压缩和节省空间功能实现分为两个部分,神经网络模型的训练和用模型来识别字符图片。(三)任务实施任务流程图1、训练数字识别模型1)通过代码实现MNIST数据集的下载。2)代码分析(三)任务实施#加载PyTorch库importtorchimporttorch.nnasnnimporttorch.nn.functionalasFimporttorch.optimasoptim#加载Torchvision库importtorchvisionfromtorchvisionimportdatasets,transforms(三)任务实施#加载Matplotlib库importmatplotlib.pyplotasplt#默认显示512张图片BATCH_SIZE=512#默认训练批次20次EPOCHS=20#默认使用cpu加速DEVICE=torch.device("cuda"iftorch.cuda.is_available()else"cpu")(三)任务实施#构建数据转换列表tsfrm=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1037,),(0.3081,))])#下载MNIST数据集train_loader=torch.utils.data.DataLoader(datasets.MNIST(root='data',train=True,download=False,transform=tsfrm),batch_size=BATCH_SIZE,shuffle=True)(三)任务实施#测试集test_loader=torch.utils.data.DataLoader(datasets.MNIST(root='data',train=False,download=False,transform=tsfrm),batch_size=BATCH_SIZE,shuffle=True)特别说明:由于官方已经实现dataset,用户可以直接使用DataLoader来获取数据集。设置download=True,即可实现数据集在线下载;设置shuffle=True表示每次epoch都重新打乱训练样本。MNIST数据集包含6万张训练样本,1万张测试样本,像素大小均为28*28。(三)任务实施#定义展示训练样本图片函数defimshow(images):img=torchvision.utils.make_grid(images)npimg=img.numpy()plt.imshow(np.transpose(npimg,(1,2,0)))plt.show()说明:使用torchvision.utils中的make_grid类方法将一个批次的图片构造成网格模式。(三)任务实施#从训练集中拿出一批图像images,labels=next(iter(train_loader))imshow(images)print(labels)说明:用iter和next函数来获取取一个批次的图片数据和其对应的图片标签。构建CNN神经网络模型(函数定义一个LeNet-5网络,包含两个卷积层conv1和conv2,两个线性层作为输出,最后输出10个维度作为0-9的标识来确定识别出的是哪个数字。)(三)任务实施classConvNet(nn.Module):def__init__(self):super().__init__()#1*1*28*28#1个输入图片通道,10个输出通道,5x5卷积核self.conv1=nn.Conv2d(1,10,5)self.conv2=nn.Conv2d(10,20,3)(三)任务实施#全连接层、输出层softmax,10个维度self.fc1=nn.Linear(20*10*10,500)self.fc2=nn.Linear(500,10)#正向传播defforward(self,x):in_size=x.size(0)out=self.conv1(x)#1*10*24*24out=F.relu(out)
#1*10*12*12out=F.max_pool2d(out,2,2)(三)任务实施
#1*20*10*10out=self.conv2(out)out=F.relu(out)
#1*2000out=out.view(in_size,-1)#1*500
out=self.fc1(out)out=F.relu(out)out=self.fc2(out)#1*10out=F.log_softmax(out,dim=1)returnout(三)任务实施#生成模型model=ConvNet().to(DEVICE)print(model)运行结果:ConvNet((conv1):Conv2d(1,10,kernel_size=(5,5),stride=(1,1))(conv2):Conv2d(10,20,kernel_size=(3,3),stride=(1,1))(fc1):Linear(in_features=2000,out_features=500,bias=True)(fc2):Linear(in_features=500,out_features=10,bias=True))(三)任务实施#构建优化器optimizer=optim.Adam(model.parameters(),lr=0.0001)#定义训练函数deftrain(model,device,train_loader,optimizer,epoch):model.train()forbatch_idx,(data,target)inenumerate(train_loader):data,target=data.to(device),target.to(device)#输入样本和标签optimizer.zero_grad()#每次训练梯度清零output=model(data)#正向传播、反向传播和优化过程loss=F.nll_loss(output,target)(三)任务实施loss.backward()optimizer.step()#定义验证函数deftest(model,device,test_loader):model.eval()test_loss=0correct=0withtorch.no_grad():fordata,targetintest_loader:#输入样本和标签
(三)任务实施data,target=data.to(device),target.to(device)output=model(data)#将一批的损失相加test_loss+=F.nll_loss(output,target,reduction='sum’)#找到概率最大的下标pred=output.max(1,keepdim=True)[1]correct+=pred.eq(target.view_as(pred)).sum().item()test_loss/=len(test_loader.dataset)(三)任务实施#开始训练模型forepochinrange(1,EPOCHS+1):train(model,DEVICE,train_loader,optimizer,epoch)test(model,DEVICE,test_loader)说明:训练的过程是循环遍历数据迭代器,放入网络的输入层并优化。每次迭代训练时都先把所有梯度清零,否则会使梯度累加而导致训练错误和失效。(三)任务实施#保存模型torch.save(model.state_dict(),"./MNISTModel.pkl")运行结果:Testset:Averageloss:0.0393,Accuracy:9871/10000(99%)TrainEpoch:20[14848/60000(25%)]Loss:0.022141TrainEpoch:20[30208/60000(50%)]Loss:0.020308TrainEpoch:20[45568/60000(75%)]Loss:0.039529Testset:Averageloss:0.0392,Accuracy:9869/10000(99%)验证结果显示,模型在测试集上的准确率达到了99%,说明我们训练的卷积神经网络性能还是不错的。2、实现字符识别1)编写代码,从测试集里面抽取4张图片进行模型预测,实现字符识别。2)代码分析(三)任务实施model_eval=ConvNet()model_eval.load_state_dict(torch.load('./MNISTModel.pkl',map_location=DEVICE))model_eval.eval()#从测试集里面拿出几张图片进行模型预测images,labels=next(iter(test_loader))(三)任务实施测试样例(三)任务实施#定义图片可视化函数defimshow(images):img=torchvision.utils.make_grid(images)img=img.numpy().transpose(1,2,0)std=[0.5,0.5,0.5]mean=[0.5,0.5,0.5]img=img*std+mean#将图片高和宽分别赋值给x1,y1x1,y1=img.shape[0:2]#图片放大到原来的五倍,输出尺寸格式为(宽,高)enlarge_img=cv2.resize(img,(int(y1*5),int(x1*5)))(三)任务实施cv2.imshow('image',enlarge_img)cv2.waitKey(0)#显示图片imshow(images)#输入inputs=images.to(DEVICE)#输出
outputs=model_eval(inputs)#找到概率最大的下标_,preds=torch.max(outputs,1)(三)任务实施#打印预测结果numlist=[]foriinrange(len(preds)):label=preds.numpy()[i]numlist.append(label)List=''.join(repr(s)forsinnumlist)print('当前预测的数字为:',List)运行结果如下:当前预测的数字为:53384分享评价(一)分享时刻1.列举3个日常生活中可以用计算机识别字符的场景。2.分享你对机器学习概念的理解以及在实现过程中遇到的最大难点。(二)评价环节评价方式评价环节评价内容评价结果自我评价与相互评价场景导入看图识字☆☆☆☆☆知识小百科什么是神经元☆☆☆☆☆神经网络的概念☆☆☆☆☆字符识别OCR☆☆☆☆☆数据集的概念☆☆☆☆☆AI实验室建立字符识别模型并训练☆☆☆☆☆加载模型,识别手写字符☆☆☆☆☆计算机识别字符的场景☆☆☆☆☆分享评价机器学习概念的理解☆☆☆☆☆看图识字☆☆☆☆☆什么是神经元☆☆☆☆☆致
谢第4章
机器怎么学习——02垃圾分类1场景导入2知识小百科3AI实验室4分享评价1场景导入中国每年使用塑料快餐盒达40亿个,方便面碗5~7亿个,一次性筷子数十亿双,这些占生活垃圾的8~15%。1吨废塑料可回炼600公斤的柴油。回收1500吨废纸,可免于砍伐用于生产1200吨纸的林木。一吨易拉罐熔化后能结成一吨很好的铝块,可少采20吨铝矿。生活垃圾中有30%~40%可以回收利用,应珍惜这个小本大利的资源。不同种类的垃圾,都有不同的处理方法,让我们实现一种垃圾分类系统。1场景导入上海市生活垃圾分类标识2知识小百科活动目标:学习深度学习的概念了解卷积神经网络的概念掌握预训练模型的使用方法搭建智能垃圾分类系统深度学习(DeepLearning)是机器学习领域中一个新兴的研究方向。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。深度学习实际上指的的深度神经网络学习,它能够捕捉到数据中的深层联系,从而能够得到更精准的模型。例如“猫”,我们并不告诉计算机猫有圆脑袋、尖耳朵、大眼睛、长胡须,而是给神经网络很多很多猫的图片,并告诉它这些都是猫,让计算机自己寻找特征。这就类似我们上学的时候,有些学生不喜欢听讲,而是自己搞“题海战术”,根据答案是否正确来判断自己的思路是否正确。(一)深度学习(一)深度学习猫图像数据集1981年,DavidHubel和TorstenWiesel获得了诺贝尔医学奖,他们的贡献是发现了人脑视觉机理:视觉系统的信息处理在可视皮层是分级的,大脑的工作过程是一个不断迭代、不断抽象的过程。他们发现位于后脑皮层的不同视觉神经元,与瞳孔所受刺激之间,存在某种对应关系,这是一种被称为“方向选择性细胞(OrientationSelectiveCell)”的神经元。(一)深度学习当瞳孔发现了眼前的物体的边缘,而且这个边缘指向某个方向时,这种神经元就会活跃。这个发现激发了人们对于神经系统的进一步思考,感受神经到中枢神经,再到大脑的工作过程,或许是不断抽象和不断迭代的过程。从原始信号开始,经过低级抽象,逐渐向高级抽象迭代,人类的逻辑思维,使用的就是高度抽象的概念。这也给计算机神经网络提供了一个新的思路:抽象和迭代。(一)深度学习(一)深度学习人类视觉系统边缘特征和人脸部分特征若把人脑的这种分析方式比喻成图像处理,如图所示:第一层为像素级别,通过摄入瞳孔中形成像素;第二层级为某些细胞发现边缘和方向;第三层级为判定形状,动物还是汽车;第四层级进一步抽象,判断这是一辆轿车。(一)深度学习轿车图片的抽象特征对象的抽象特征是如何在计算机里实现的呢?这就要用到“卷积”这个计算方法,卷积是由过滤器(卷积核,ConvolvedKernel)对图像进行过滤。当一个深度神经网络的主体部分是由卷积层构成时,我们称之为卷积神经网络(ConvolutionalNeuralNetworks,CNN)。同机器学习方法一样,深度机器学习方法也有监督学习与无监督学习之分,卷积神经网络就是一种深度的监督学习下的机器学习模型。(二)卷积神经网络(二)卷积神经网络卷积神经网络示意图卷积层是深度神经网络在处理图像时十分常用的一种层。输入图片数据后,进入卷积层。卷积层的作用是抽象图片的特征。卷积层是由若干个过滤器组成的。每个过滤器就是一个小矩阵。使用的时候,在原始矩阵上,移动这个小矩阵,将小矩阵与矩阵重叠的位置上的数字做乘法后加在一起。这样原先的一个矩阵,就变成了“卷积”之后的一个数字,过程如图所示。通过设计不同的过滤器,我们可以找到图像的不同特征。如果图像中有和我们设计的过滤器一样的特征,那卷积结果就会很大,反之,卷积的结果就很小或者为0。(二)卷积神经网络(二)卷积神经网络图像卷积计算过程再下一层,是池化层,池化可以理解成采样。采样的目的是,将特征的位置从具体的某个点,拓展成某个区域。下图最大池化层使用的是“最大值采样”。以原先的2×2范围作为一个分块,从中找到最大值,记录在新的结果矩阵里。(二)卷积神经网络最大池化层示意图随着层数不断向右推进,一般特征矩阵会变得越来越小,但是层数会变得越来越多。只有这样,我们才能把图片中的规律信息抽取出来,并且尽量掌握足够多的模式。下一层叫做全连接层,它其实就是把上一层输出的若干个矩阵全部压缩到一维,变成一个长长的输出结果。最后是输出层,对应的结果就是我们需要让计算机掌握的分类。(二)卷积神经网络经过多年的发展,深度学习理论中除了我们讲的卷积神经网络,还包含了许多不同的深度网络模型,例如经典的深层神经网络(DeepNeuralNetwork,DNN),深层置信网络(DeepBeliefNetworks,DBN),深层玻尔兹曼机(DeepBoltzmannMachines,DBM),循环神经网络(RecurrentNeuralNetwork)等,它们都属于人工神经网络。不同结构的网络适用于处理不同的数据类型,例如卷积神经网络适用于图像处理,循环神经网络适用于语音识别等。(二)卷积神经网络3AI实验室(一)任务发布目标设计智能垃圾分类系统要求(1)Python语言编写程序实现四种垃圾(可回收垃圾、干垃圾、有害垃圾、湿垃圾)的分类。(2)建立卷积神经网络,训练垃圾分类模型。配置好python3.x语言环境;VScode集成开发环境(Windowsx64UserInstaller版本);第三方Python库有:OpenCV库、Numpy库、PyTorch库、Torchvision库和Matplotlib库。(二)任务环境智能垃圾分类系统(1)准备垃圾图片数据集新建一个名称为data文件夹,再新建一个名称为train子文件夹作为训练集,里面包含四种垃圾分类的数据集,分别为0.RecyclableWaste、1.ResidualWaste、2.HazardousWaste、3.HouseholdFoodWaste。测试集不需要用户创建,在运行训练脚本过程中自动从训练集抽取20%图片作为测试集。另外,为了能获得更好的训练模型,每种垃圾图片数据至少要包含100张。(二)任务环境硬件环境如下表所示:(二)任务环境硬件图示名称数量机械臂1台USB串口通信线1条电源适配器1套摄像头套件1套垃圾桶4个垃圾卡片若干1.绘制程序流程图根据任务要求绘制智能垃圾分类系统程序流程图,如下图所示。(三)任务实施(三)任务实施参考流程图2.实现智能垃圾分类系统程序(1)训练模型YOLOv5物体检测模型训练是基于深度学习的端到端过程,旨在高效识别图像中的多种物体。通过执行命令,用户能定制化训练流程:选用mineral.yaml定义的数据集专注生活垃圾识别,配置轻量级的YOLOv5s模型以平衡速度与精度,进行200轮迭代学习,以及设置小批量尺寸适应低内存需求。(三)任务实施通过执行命令,用户能定制化训练流程:选用mineral.yaml定义的数据集专注生活垃圾识别,配置轻量级的yolov5s模型以平衡速度与精度,进行200轮迭代学习,以及设置小批量尺寸适应低内存需求。(三)任务实施pythontrain.py--datamineral.yaml--epochs10--cfgyolov5s.yaml--batch-size1●
打标签将dataset文件夹下的images文件夹作为训练集,在images文件夹下存储4种垃圾图片后开始打标签。打开AnacondaPrompt,输人命令:(三)任务实施condaactivateyolov5#进入yolov5-master所在目录,输入文件地址进入文件,再输入:labelimg(三)任务实施打开标签软件打开软件后,首先点击左边的OPENDIR选择需要打标签的图像数据集位置,对应的地址,image夹下;注意:需要打标签的图像越多精度越准;(三)任务实施然后再设置标签的保存路径:点击左上角File->ChangeSaveDir,选择到你之前创建的
labels
子文件夹在左边CreateRectBox这一栏的上方,将其切换为YOLO;同时将左上角的View-AutoSaveMode选项勾选,如下图所示;(三)任务实施选择YOLO执行完以上过程后,就可以开始打标签了;按住W键就可以框选物体区域,输入标签名,这样就完成了一张图像的打标签过程,按D键可以切换到下一张,给所有文件打完标签后就可以关闭软件了;第一种样品标签名称为1.ResidualWaste,第二种样品标签名称为0.RecyclableWaste,第三种样品标签名称为3.HouseholdFoodWaste,第四种样品标签名称为2.HazardousWaste,如下图所示(三)任务实施(三)任务实施数据集名称完成后关闭打标签软件,点击Yes进行保存;注意:不要关闭AnacondaPrompt打完标签后,就可以看到labels文件夹内有了生成的对应图像的.txt文本数据,这样就完成了数据集的制作。(三)任务实施完成数据集制作,在VScode中打开yolov5-master文件,在yolov5-master文件中找到mineral.yaml格式的文件,如下图所示,将数据集地址进行修改,数据集的名称,数据集的种类进行修改,如下图所示:(三)任务实施mineral.yaml文件修改完成,返回AnacondaPrompt,在AnacondaPrompt输入:(三)任务实施pythontrain.py--datamineral.yaml--epochs10--cfgyolov5s.yaml--batch-size1其中:--datamineral.yaml:存放训练模型训练集验证集测试集等的相关数据;--epochs10:表示训练伦次为10,可以进行修改多次;--cfgyolov5s.yaml:声明预训练模型(三)任务实施数据集生成名称--batch-size1:训练过程中每一次处理的图像个数。这里设为1,设置越高对电脑性能要求越大;(2)预测模型通过训练得到模型文件mineral.yaml,接下来进行模型的预测。在预测之前,先通过相机或摄像头捕获一张图片,然后对这张图片进行预处理(包括图像灰度化、图像滤波去噪声、图像腐蚀、轮廓提取等操作),最终进行图片分割并输出识别结果。将数据集路径放置在yolov5-master-detect.py代码中,同时将需要识别的图像路径进行修改,如下图所示:(三)任务实施(三)任务实施(三)任务实施修改代码中的相关路径2)代码分析(三)任务实施#开启摄像头,0:笔记本摄像头,1:USB摄像头defcamera():cap=cv2.VideoCapture(1)#捕获图像,read()函数返回两个值:布尔值和视频帧ret,img=cap.read()#保存图像cv2.imwrite("D:/111/image.jpg",img)#通过cv2读取图像image_source=cv2.imread(''D:/111/image.jpg'')图像捕获结果如图所示:(三)任务实施图像捕获图像灰度化结果如图所示:(三)任务实施图像灰度化#图像灰度化gray=cv2.cvtColor(image_source,cv2.COLOR_BGR2GRAY)(三)任务实施#图像滤波去噪声#shape返回的是图像的高,宽,色彩通道数h_s,w_s,_=img.shapeblured=cv2.blur(img,(3,3))mask=np.zeros((h_s+2,w_s+2),np.uint8)cv2.floodFill(blured,mask,(w_s-1,h_s-1),(255,255,255),(1,1,1),(5,5,5),8)#图像腐蚀ret,binary=cv2.threshold(closed,160,255,cv2.THRESH_BINARY)erode=cv2.erode(binary,kernel)图像腐蚀,结果如图所示:(三)任务实施图像腐蚀处理图像轮廓提取,结果如图所示:(三)任务实施图像轮廓提取结果#轮廓提取contours,hierarchy=cv2.findContours(erode,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)运行detect.py程序(三)任务实施if__name__=="__main__":
camera()
subprocess.run(["python","./detect.py"])运行结果如下图所示,在runs/exp/labels中查看(三)任务实施识别结果(3)标定转换1)标定转换前的准备一台机械臂和一个含支架的摄像头并固定好,保证机械臂与摄像头之间的相对位置保持不变。打印一张标定纸,把标定纸放到摄像头视野范围内,捕获图像并保存,命名为coordinate.png,然后寻找标定纸图像上的三点坐标以及实际对应的机械臂三点坐标。(三)任务实施(三)任务实施标定纸图像点位机械臂实际点位说明:标定纸图像上的三个点可以通过打开Windows上自带的画图工具来寻找A、B、C的点位;也可以通过运行编写Python代码来寻找点位。而机械臂实际对应的三点坐标可以通过机械臂上位机来获取。(三)任务实施2)代码分析(三)任务实施#开启摄像头,0:笔记本摄像头,1:USB摄像头cap=cv2.VideoCapture(1)#捕获图像,read()函数返回两个值:布尔值和视频帧ret,img=cap.read()#保存图像img=cv2.imread('./coordinate.png')(三)任务实施#通过鼠标事件获取图像三点坐标A、B、Cdefon_EVENT_LBUTTONDOWN(event,x,y,flags,param):ifevent==cv2.EVENT_LBUTTONDOWN:xy="%d,%d"%(x,y)a.append(x)b.append(y)cv2.circle(img,(x,y),1,(255,0,0),thickness=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 南通市城市建设档案馆招聘政府购买服务岗位人员1人笔试备考试题及答案解析
- 成都市郫都区绵实外国语学校招聘笔试模拟试题及答案解析
- 2026年10月宝应县卫生健康系统事业单位公开招聘备案制专业技术人员24人笔试参考题库及答案解析
- 2026会昌县公开选调乡镇敬老院院长、会计10人考试备考试题及答案解析
- 北京地铁专职内训师招聘6人考试备考题库及答案解析
- 2026河南周口市太康县城镇公益性岗位招聘80人考试备考题库及答案解析
- 客户高端饭局营销方案(3篇)
- 南江路段施工方案公示(3篇)
- 三八彩头店营销方案(3篇)
- 学生文物模仿活动方案策划(3篇)
- 医院纪委培训课件
- DB31/T 1128-2019再生骨料混凝土技术要求
- 患者用药指导全国知识技能竞赛考试题库(带答案)
- 公司租赁个人车辆协议书范本
- DB11-T 1628-2019 钢管混凝土顶升法施工技术规程
- 2025年中煤电力有限公司招聘笔试参考题库含答案解析
- 中等职业学校英语教学大纲附件五:词汇表
- 【苏泊尔电器营运资金管理问题及完善分析13000字 (论文)】
- 2022年浙江省宁波市慈溪实验中学高一数学文联考试卷含解析
- 天耀中华合唱简谱大剧院版
- 病理学课件:肿瘤-实验课
评论
0/150
提交评论