【《基于CNN的垃圾分类系统设计》8300字】_第1页
【《基于CNN的垃圾分类系统设计》8300字】_第2页
【《基于CNN的垃圾分类系统设计》8300字】_第3页
【《基于CNN的垃圾分类系统设计》8300字】_第4页
【《基于CNN的垃圾分类系统设计》8300字】_第5页
已阅读5页,还剩21页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

绪论1.1研究的背景和意义在字典里,垃圾被定义成无用的东西,但在实际生活中,大部分垃圾还是可以被回收利用的。随着科技的进步,人们开始学会利用垃圾,把被丢弃的垃圾变成可以使用的资源。现如今大部分垃圾已经可以回收再利用。古时候,人们习惯于填埋和焚烧垃圾。但那时因为人口特别少,科技十分落后,没什么垃圾产出,所以生态保护的较好,没什么污染。随着世界科技迅速的发展,人类产出的垃圾量飞速上涨,错误的垃圾处理方式使生态环境收到严重的破坏,也使人们逐渐意识到垃圾分类的重要性。垃圾如何正确处理成为了人们关注的问题,各国对垃圾分类的要求也渐渐严格起来。很多人不知道的是,垃圾也是可以再回收来重新利用的,但是把垃圾杂乱的放置在一起不仅不可以利用,还会污染环境,只有把垃圾正确的分类,才能被充分的回收利用。中国在垃圾处理这方面在世界上一直处于落后地位,做的没有很多发达国家好。在发达国家中,人们对垃圾处置方法的第一选择就是回收利用,而不是堆放压缩掩埋。现如今各国都在大力推广垃圾分类,其中德国遥遥领先于其他国家,远超韩国、美国等国家,韩国和美国的垃圾利用率分别为25%与32%。[1]很多国家在孩子小的时候就会普及垃圾分类的好处,普及率远超一些不重视的国家,让国民从小就对垃圾分类有根深蒂固的意识,甚至一些国家通过立法来约束公民执行。我国民众大多缺乏垃圾分类意识,垃圾大都是杂乱堆放在一起。在调查中发现,我国每年产生的垃圾数量高于处理量,也就是说每年都有一定数量的垃圾没有被及时回收清理,导致这一现象的主要原因是人们排放垃圾时乱丢乱放,没有进行垃圾分类,大大加深了垃圾处理的难度。可以看出,合理地分类垃圾在回收垃圾中非常的重要,特别是提高大家的垃圾分类主观意识,但目前我国大部分公民对垃圾分类的意识还是很模糊,往往不知道如何分类,哪种垃圾属于哪一类,在处理识别垃圾过程中,计算机视觉技术可以发挥重要的作用。为了帮助人们更准确便捷的进行垃圾分类,可以用深度学习处理图像识别分类的方法来进行垃圾分类,使人们更准确便捷的进行垃圾分类,缓解我国垃圾处理的压力。1.2研究现状在深度学习得到发展之前,人们通常用机器学习方法来进行图像识别,人们必须靠着图像识别的经验来手动的提取图片特征值,然后再将特征值输入进待执行的算法,最后得出结果。这一方法存在明显的缺点,就是需要人为的经验来操作,人的出错在所难免,如果提取特征不是最合适的,那么最后得出的分类结果就会不理想。深度学习的发展解决了这一问题,只需要将图像直接输入神经网络,训练网络中的权值以及偏置即可。美国一知名大学教授和其团队构建了垃圾分类数据集TrashNetDataset[2],总共2527张图片,包含硬纸板、玻璃、金属、纸张、废弃材料和塑料六个类别。该团队用SVM的方法在此数据集上取得了62%的准确率。之后也有很多专家在此数据集上继续做着实验,正确率也在逐渐增加。StephennL.Rabano等人将轻量级神经网络MobileNet[3]用到这一数据集上,取得了更高的准确率,还开发了一个垃圾分类的手机端软件;RahmiArdaAral等人使用DenseNet121[4]和DenseNet169网络,将准确率提升至95%的平均准确率;之后,UmutOzkaya等对比了多种分类提取特征的网络与分类器的搭配,发现GoogleNet[5]搭配SVM分类器是效果最好的,准确率达到了97.86%,截至目前所有在TrashNetDataset数据集上的研究中,这是准确率最高的一次实验。现有的研究存在着很多问题,比如数据集太少,类别和图片都不够,类比和中国垃圾分类区别很大,图片背景不够复杂化,难以应对现实中复杂的环境,正确率低下。而华为公司在2019年9月举办的垃圾分类大赛公开的数据集总数达到了14683张,包含4个大类40小类,符合中国的垃圾分类标准。有一队伍以ResNet101[6]作为预训练模型做迁移训练以及很多方法最后取得冠军,正确率达到了96.96%。1.3本文章节安排本设计的课题为基于卷积神经网络的垃圾分类设计与实现,目标是开发出一个单独的垃圾图像识别系统。经过几个模型的对比,本文最终采用ResNet50作为与训练模型进行迁移学习,本文的主要结构如下:第一章叙述了本设计的研究背景和意义,垃圾分类领域的研究现状,以及一些目前存在的为解决问题,还有本设计的章节安排。第二章叙述了一些关于深度学习的基础理论知识,包括图像分类中的VGG,ResNet网络。第三章对系统的实现进行了分析,首先描述了数据集来源以及种类和数量,然后描述了系统的整个实现流程,详细的说明了数据如何处理和模型的选择。第四章介绍了系统的实现所需要的重要部分的代码,呈现了系统的图形用户界面,描述了使用方法。2深度学习相关理论2.1卷积神经网络(CNN)在卷积神经网络发现前,多层神经网络只有输入层、隐含层和输出层。[7]隐藏层的数量取决于需要,并没有明确的理论推导来解释多少层是合适的。卷积神经网络CNN比普通的深度学习多了特征学习。具体操作是在原全连接层的基础上增加卷积层和池化层。卷积神经网络的出现加深了神经网络的层次。典型的CNN结构如图2-1所示。图2-1CNN结构示意图2.1.1卷积层卷积层通过平移图像来提取特征。卷积层的一个重要因素是滤波器[7]大小。如果输入值是[32*32*3],每个过滤器的大小为5x5,那么CNN层中的每个过滤器都会对输入量中的[5*5*3]区域有一个权重,总共553=75个权重。输入图像的三个深度分别用滤波器的三个深度计算。需要注意的是,沿深度轴[8]的连接度必须为3,因为这是输入值的深度,请记住这只是一个过滤器。如果设置输入容量为[16*16*20]。然后,使用3X3的样本接收场[9]大小,CNN中的每个神经元现在总共有3320=180个连接到输入层。卷积操作示意图如2-2所示。图2-2卷积操作示意图2.1.1池化层

池化层(pooling)主要的作用是下采样[10],具体的步骤是减少参数数量来预防过拟合,而为了减少参数数量,一般会去掉一些相对来说不重要的样本,因为原始数据量不变,参数减少,池化就可以达到预防过拟合的目的。池化操作示意图如图2-3所示。图2-3池化操作示意图2.1.3激活函数激活函数[11]在人工神经网络模型中非常复杂、非线性的函数学习和理解中起着重要的作用。他们给我们的网络引入了非线性。激活函数运行在人工神经网络的神经元上,将神经元的输入映射到输出。激活的作用是将权重结果转化为分类结果。2.1.4全连接全连接层一般在卷积层池化层之后,位于卷积神经网络的最后,当卷积层池化层将图片的特征提取处理后,将数据平摊成一段向量,在全连接层进行分类。全连接层采用特征空间到样本标签空间映射[12]的方法。2.2图像分类模型2.2.1VGGNet模型VGGNet是由牛津大学和谷歌的研究人员开发出的一种新的卷积神经网络,第一次亮相就在ILSVRC2014[13]类别中获得了第二名的好成绩。该模型发现了卷积神经网络的深度与性能之间存在的关系,模型最高达到了19层。VGGNet证明了增加网络深度会影响到网络的性能,可以发现的是,VGGNet网络性能良好,相对于其他网络正确率明显提高,同时易改动层数,另外用来做迁移学习效果也非常的好。2.2.2ResNet模型伴随着神经网络的发展,深度学习通过降级训练集的精度来处理梯度的消失,后来原微软研究院4名中国籍研究院提出了Resnet深度残差网络[14],Resnet模型高达152层之多,并在2015年的ILSVRC比赛中取得了冠军。其性能等各个方面均优于传统的神经网络。Resnet优化了特征集的提取,可以有效的加快模型训练的速度。基于ResNet优秀的性能,本设计选择ResNet作为图像识别的特征提取网络。残差模块示意图如图2-4所示。图2-4残差模块2.4本章小结本章叙述了卷积神经网络的一些基础知识,以及图像分类模型概况,为后面实现垃圾分类模型准备了理论基础。3系统分析3.1数据来源本设计通过调研发现,目前网上暂时还有权威的公开垃圾数据集可以直接使用,找到的TrashNetDataset垃圾数据集,因为数据集过少,模型训练量不够,类别又和我国垃圾分类标准不同,故放弃使用。国内的华为垃圾分类大赛公开数据集共14683张图片,分为4个大类40个小类,符合我国垃圾分类标准,数据集也足够庞大,最终决定用此数据集作为本设计的数据来源3.1.1华为垃圾分类数据集介绍2019年华为举办了垃圾分类大赛并公开了垃圾数据集。[7]该数据集采用了深圳市发布的垃圾分类标准,共分为4个大类,40个小类,共有14802张图片。其中其他垃圾包括类别0(一次性快餐盒)242张、类别1(污损塑料)370张、类别2(烟蒂)279张、类别3(牙签)85张、类别4(破碎花盆及碟碗)387张、类别5(竹筷)289张;厨余垃圾包括类别6(剩饭剩菜)395张、类别7(大骨头)362张、类别8(水果果皮)380张、类别9(水果果肉)389张、类别10(茶叶渣)387张、类别11(菜叶菜根)736张、类别12(蛋壳)331张、类别13(鱼骨)409张;可回收物包括类别14(充电宝)357张、类别15(包)419张、类别16(化妆品瓶)352张、类别17(塑料玩具)308张、类别18(塑料碗盆)363张、类别19(塑料衣架)312张、类别20(快递纸袋)226张、类别21(插头电线)657张、类别22(旧衣服)375张、类别23(易拉罐)309张、类别24(枕头)318张、类别25(毛绒玩具)550张、类别26(洗发水瓶)351张、类别27(玻璃杯)536张、类别28(皮鞋)382张、类别29(砧板)416张、类别30(纸板箱)321张、类别31(调料瓶)446张、类别32(酒瓶)280张、类别33(金属食品罐)322张、类别34(锅)395张、类别35(食用油桶)351张、类别36(饮料瓶)271张;有害垃圾包括类别37(干电池)316张、类别38(软膏)391张、类别39(过期药物)437张。图3-1不同类别数据分布本设计将数据集按照不同类别进行分组,保存在相应的文件夹当中,每个文件夹下包含图片和对应的txt文档标签,如图3-2所示。图3-2文件夹分类显示3.1.2数据扩充为了防止出现过拟合现象,需要对数据集进行增强,以此来提高模型的泛化能力,实现更准确的识别功能。本设计主要通过对数据集的内部增强[15]来提高模型的泛化能力,如翻转、缩放、随机覆盖等,生成新的特征,以此来得到扩充数据的效果。3.2算法来源3.2.1数据处理本设计主要使用tensflow和Keras框架来实现,使用Keras进行数据预处理,Keras_preprocessing预处理提供了一个ImageDataGenerator[16]类,通过这个类来实现图像处理。图像生成模块,为每个模型提供一个批量大小的样本数据,同时还可以在每个批量中增强批量大小的样本数据。如随机缩放、旋转、翻转等。3.2.2模型选择采用迁移学习的方式导入预训练模型,冻结特征提取层,进行微调训练,选取了Inceptionv3、ResNet50、ResNet101、VGG16四种模型进行对比实验,选取结果较好的模型进行调优。在训练中对四个模型都运行了12个epoch,识别结果如表3-1所示。表3-1各模型训练结果模型迭代周期准确率(%)ResNet101Inceptionv3VGG16ResNet501212121288.6884.1584.3692.23由上表可以看出,ResNet50准确率明显高于其他三个模型。可以看出残差网络的性能更好。因此,本设计选取ResNet50作为预训练模型进行迁移学习,冻结特征提取层,进行微调训练。训练12个epoch的准确率如图3-3所示。图3-3模型准确率3.3本章小结第三章对系统的实现进行了分析,首先描述了数据集来源以及种类和数量,然后描述了系统的整个实现流程,详细的说明了数据如何处理和模型的选择。为后面具体实现系统确定了框架。4系统设计与实现4.1数据预处理4.1.1设置数据类别本设计采用的数据集共设40个类别。"0":"其他垃圾/一次性快餐盒","1":"其他垃圾/污损塑料","2":"其他垃圾/烟蒂","3":"其他垃圾/牙签","4":"其他垃圾/破碎花盆及碟碗","5":"其他垃圾/竹筷","6":"厨余垃圾/剩饭剩菜","7":"厨余垃圾/大骨头","8":"厨余垃圾/水果果皮","9":"厨余垃圾/水果果肉","10":"厨余垃圾/茶叶渣","11":"厨余垃圾/菜叶菜根","12":"厨余垃圾/蛋壳","13":"厨余垃圾/鱼骨","14":"可回收物/充电宝","15":"可回收物/包","16":"可回收物/化妆品瓶","17":"可回收物/塑料玩具","18":"可回收物/塑料碗盆","19":"可回收物/塑料衣架","20":"可回收物/快递纸袋","21":"可回收物/插头电线","22":"可回收物/旧衣服","23":"可回收物/易拉罐","24":"可回收物/枕头","25":"可回收物/毛绒玩具","26":"可回收物/洗发水瓶","27":"可回收物/玻璃杯","28":"可回收物/皮鞋","29":"可回收物/砧板","30":"可回收物/纸板箱","31":"可回收物/调料瓶","32":"可回收物/酒瓶","33":"可回收物/金属食品罐","34":"可回收物/锅","35":"可回收物/食用油桶","36":"可回收物/饮料瓶","37":"有害垃圾/干电池","38":"有害垃圾/软膏","39":"有害垃圾/过期药物"4.1.2划分训练集和测试集加载训练文件到模型标签,数据集共14802张图片,按训练集和测试集20:3的比例划分,即分别为12871张图片和1931张图片。随机抽取图片概率为0。主要代码如下:defdata_flow(train_data_dir,batch_size,num_classes,input_size):label_files=glob(os.path.join(train_data_dir,'*.txt'))random.shuffle(label_files)label=int(line_split[1])img_paths.append(os.path.join(train_data_dir,img_name))labels.append(label)labels=np_utils.to_categorical(labels,num_classes)train_X,validation_X,train_Y,validation_Y=\train_test_split(img_paths,labels,stratify=labels,test_size=0.15,random_state=0)print('totalsamples:%d,trainingsamples:%d,validationsamples:%d'%(len(img_paths),len(train_img_paths),len(validation_img_paths)))4.1.3获取图片信息调整图片到256*256大小,减少运算量,转换图片为RGB格式,创建一个12行每行2列的随机数二维列表,随机数的范围为0到32的整数。defpreprocess_img(img_path,img_size):try:img=Image.open(img_path)img=img.resize((256,256))img=img.convert('RGB')img=np.array(img)imgs=[]for_inrange(10):i=random.randint(0,32)j=random.randint(0,32)imgg=img[i:i+224,j:j+224]imgg=preprocess_input(imgg)imgs.append(imgg)returnimgsexceptExceptionase:print('发生了异常data_process:',e)return04.2加载数据4.2.1增强数据为了提高模型的准确率,选择增强数据集,每个类别扩充一倍。设置图片随机转动,图片宽度和高度随数据提升时图片偏移幅度,逆时针方向的剪切变换角度,随机缩放幅度为,随机水平翻转,随机竖直翻转;截取函数,遮挡部分不能超过图片的一半。defincrease_img(img_path,class_num,save_path,amplify_ratio=1):train_datagen=ImageDataGenerator(Loop=30,W=0.2,H=0.2,SH=0.2,ZM=0.2,HZ=True,VT=True,FI='nearest')def__init__(self,n_holes,length):self.n_holes=n_holesself.length=lengthdef__call__(self,img):h=img.shape[0]w=img.shape[1]c=img.shape[2]mask=np.ones((h,w,c),np.float32)forninrange(self.n_holes):y=np.random.randint(h)x=np.random.randint(w)y1=np.clip(y-self.length//2,0,h)y2=np.clip(y+self.length//2,0,h)x1=np.clip(x-self.length//2,0,w)x2=np.clip(x+self.length//2,0,w)mask[y1:y2,x1:x2,:]=加载并预处理数据定义基本数据流生成器,调用先前定义的处理数据库包,并在每次迭代中返回一个批,BaseSequence可以直接用于fit_generator的generator参数,fit_generator将BaseSequence重新封装为一个多进程数据流生成器[17],保证同一样本在多进程下的一个历元中不会被重复调用。classBaseSequence(Sequence):def__init__(self,img_paths,labels,batch_size,img_size,is_train):self.is_train=is_trainifself.is_train:train_datagen=ImageDataGenerator()self.train_datagen=train_datagendef__len__(self):h,wid=pic.shape[:2]cx=(size-wid)//2cy=(size-h)//2background[cy:cy+h,cx:cx+wid]=picreturnbackgrounddefpre(self,pic):img=Image.open(img_path)img=img.resize((256,256))img=img.convert('RGB')img=np.array(img)img=img[16:16+224,16:16+224]returnimgdefcutout_img(self,img):cut_out=Cutout(n_holes=1,length=40)img=cut_out(img)returnimg4.3构造模型4.3.1定制网络本设计是基于ResNet50的迁移学习,在实际模型中,只是用了ResNet50的5个stage,最后添加的全连接层需要自己制作。网络的结构图如图4-1所示。图4-1模型示意图用keras框架定制ResNet后面的全连接层,先引入初始化ResNet50模型,由于有预权重,前部分冻结,后面进行迁移学习。然后添加平均池化层[18]。添加Dropout层防止过拟合,提升模型的泛化能力。Regularizers正则化层[19],正则化器允许在优化过程中对层的参数或层的激活情况进行惩罚对损失函数进行最小化的同时,也需要让对参数正则化惩罚项,使用l2范数。插入BatchNormalization,即批量标准化,使得模型正则化,进而使得模型在训练期间更加地稳定。还可以使模型在训练期间能够抵抗梯度消失现象,可以减少训练时间并能够获得更好的性能defoutput(model,count):last=model.outputlast=GlobalAveragePooling2D()(last)last=Dropout(0.2)(last)last=Dense(256,activation='relu')(last)last=Dropout(0.5)(last)last=Dense(count,activation='softmax')(last)model=Model(inputs=input,outputs=last)returnmodeldefmodel_fn(FLAGS):#K.set_learning_phase(0)base_model=ResNet50(weights="imagenet",include_top=False,pooling=None,input_shape=(FLAGS.input_size,FLAGS.input_size,3),classes=FLAGS.num_classes)forlayerinbase_model.layers:layer.trainable=Falsemodel=add_new_last_layer(base_model,FLAGS.num_classes)pile(optimizer="adam",loss='categorical_crossentropy',metrics=['accuracy'])returnmodel4.3.2迁移学习本设计的训练是迁移学习的过程,使用已有的ResNet50权重,因为5个stage已经训练好,卷积层已经能够提取特征值,我们只需要训练后面的全连接层,4个epoch后再对比后面的层进行训练微调,获得更高的准确率,由于训练时间过长,所以只设置两次迭代,每次迭代是初始值的2倍即8个epoch。deftrain_model(mark):X_train,X_val=data(mark.data,mark.batch_size,mark.count,mark.input_countmodel=model(mark)pre=model.fit_generator(X_train,epochs=mark.count*2,verbose=1,data_val=X_val,shuffle=True)defsetup_to_finetune(FLAGS,model,layer_number=149):#K.set_learning_phase(0)#K.set_learning_phase(1)#Adam=adam(lr=FLAGS.learning_rate,clipnorm=0.001)Adam=adam(lr=FLAGS.learning_rate,decay=0.0005)pile(optimizer=Adam,loss='categorical_crossentropy',metrics=['accuracy'])4.4模型训练用tensflow框架[20]设置全局配置文件,定义了数据集路径,设垃圾分类数目为40类,模型输入图片大小为224,图片批处理大小为16,学习率为0.0001,步长epoch为4,共两次迭代,第二次迭代epoch为8。数据集共14802张图片,训练集12871张图片,测试集1931张图片,模型共运行25个小时,两次迭代分别是4个epoch和8个epoch,最后得出模型在测试集上损失率为0.6576,准确率为0.9623。在验证集上损失率为0.7721,正确率为0.9264。pre=model.fit_generator(X_train,epochs=mark.count*2,verbose=1,data_val=X_val,shuffle=True)4.5模型预测把训练好的模型best.h5放到指定的文件夹下用于预测图片,判断图片来源是网络图片还是本地图片,对图片进行识别,同时增加了代码的健壮性,补充异常报告。defpre(model,img):model.load('model.h5')pred=[]foriinrange(num):pred=model.predict(test_x)pred_y=np.argmax(pred,axis=0)returnload_dict[str(pred_label)]4.6Gui界面图形使用界面使用PyQt5制作。具体代码如下。classMyMainWindow(QMainWindow,Ui_MainWindow):def__init__(self,parent=None):super(MyMainWindow,self).__init__(parent)self.setupUi(self)self.label.setScaledContents(True)self.pushButton_2.clicked.connect(self.predict_image)self.pushButton.clicked.connect(self.button_open_img_click)self.pushButton_3.clicked.connect(self.close)defpredict_image(self):res=prediction_result_from_img(model,self.pic_path)self.lineEdit.setText(res)defbutton_open_img_click(self):self.pic_path,_=QFileDialog.getOpenFileName(self,'选择图片',r'C','Imagefiles(*.jpg*.gif*.png)')ifself.pic_path:self.label.setPixmap(QtGui.QPixmap(self.pic_path))else:QMessageBox.warning(self,'提示','没有选中任何东西!',QMessageBox.Ok)4.6.1系统界面本系统共分为本地图片、打开摄像头、摄像头拍照、分类四个模块。图形用户界面如图4-2所示。图4-2图形用户界面4.6.2系统功能用户可选择打开本地图片,在本地文件夹中选取待识别图片上传,再点击分类按钮开始识别。操作示意图如图4-3、图4-4所示。图4-3选择本地图片图4-4垃圾识别界面如果没有选中图片,系统会弹出提示窗口,如图4-5所示。图4-5系统提示窗口用户也可点击摄像头拍照按钮,直接拍照识别。如图4-6所示4-6拍照识别4.7本章小结第四章介绍了系统的实现所需要的重要部分的代码,呈现了系统的图形用户界面,描述了使用方法。5总结随着垃圾分类问题逐渐成为国际社会关注的问题,深度学习的不断发展和完善,本设计提出了基于卷积神

温馨提示

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

评论

0/150

提交评论