毕设 基于深度学习图像识别的垃圾分类系统

张开发
2026/5/4 6:14:59 15 分钟阅读

分享文章

毕设 基于深度学习图像识别的垃圾分类系统
文章目录前言一、识别效果二、实现1.数据集2.实现原理和方法3.网络结构前言如今垃圾分类已成为社会热点话题。其实在2019年4月26日我国住房和城乡建设部等部门就发布了《关于在全国地级及以上城市全面开展生活垃圾分类工作的通知》决定自2019年起在全国地级及以上城市全面启动生活垃圾分类工作。到2020年底46个重点城市基本建成生活垃圾分类处理系统。人工垃圾分类投放是垃圾处理的第一环节但能够处理海量垃圾的环节是垃圾处理厂。然而目前国内的垃圾处理厂基本都是采用人工流水线分拣的方式进行垃圾分拣存在工作环境恶劣、劳动强度大、分拣效率低等缺点。在海量垃圾面前人工分拣只能分拣出极有限的一部分可回收垃圾和有害垃圾绝大多数垃圾只能进行填埋带来了极大的资源浪费和环境污染危险。随着深度学习技术在视觉领域的应用和发展让我们看到了利用AI来自动进行垃圾分类的可能通过摄像头拍摄垃圾图片检测图片中垃圾的类别从而可以让机器自动进行垃圾分拣极大地提高垃圾分拣效率。基于深度学习的垃圾分类系统是非常好的毕业设计课题选题指导, 项目分享见文末一、识别效果老样子 废话不多说先展示图像垃圾分类的识别效果训练模型精度可以看到只迭代了10轮精度达到87.50%而且没有出现过拟合现象我最高训练达到96%迭代200轮识别结果实际验证正确率还是很高的。二、实现1.数据集该数据集包含了 2507 个生活垃圾图片。数据集的创建者将垃圾分为了 6 个类别分别是如下所示一共6类垃圾 比如玻璃类的如下塑料类的如下其他的不列举了。2.实现原理和方法使用深度残差网络resnet50作为基石在后续添加需要的层以适应不同的分类任务模型的训练需要用生成器将数据集循环写入内存同时图像增强以泛化模型使用不包含网络输出部分的resnet50权重文件进行迁移学习只训练我们在5个stage后增加的层需要的第三方库主要有tensorflow1.xkerasopencvPillowscikit-learnnumpy安装方式很简单打开terminal例如pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple数据集与权重文件比较大所以没有上传如果环境配置方面有问题或者需要数据集与模型权重文件可以在评论区说明您的问题我将远程帮助您3.网络结构这里我只使用了resnet50的5个stage后面的输出部分需要我们自己定制网络的结构图如下stage5后我们的定制网络如下定制resnet后面的层defcustom(input_size,num_classes,pretrain):# 引入初始化resnet50模型base_modelResNet50(weightspretrain,include_topFalse,poolingNone,input_shape(input_size,input_size,3),classesnum_classes)#由于有预权重前部分冻结后面进行迁移学习forlayerinbase_model.layers:layer.trainableFalse#添加后面的层xbase_model.output xlayers.GlobalAveragePooling2D(nameavg_pool)(x)xlayers.Dropout(0.5,namedropout1)(x)#regularizers正则化层正则化器允许在优化过程中对层的参数或层的激活情况进行惩罚#对损失函数进行最小化的同时也需要让对参数添加限制这个限制也就是正则化惩罚项使用l2范数xlayers.Dense(512,activationrelu,kernel_regularizerregularizers.l2(0.0001),namefc2)(x)xlayers.BatchNormalization(namebn_fc_01)(x)xlayers.Dropout(0.5,namedropout2)(x)#40个分类xlayers.Dense(num_classes,activationsoftmax)(x)modelModel(inputsbase_model.input,outputsx)#模型编译model.compile(optimizeradam,losscategorical_crossentropy,metrics[accuracy])returnmodel网络的训练是迁移学习过程使用已有的初始resnet50权重5个stage已经训练过卷积层已经能够提取特征我们只训练后面的全连接层部分4个epoch后再对较后面的层进行训练微调一下获得更高准确率训练过程如下classNet():def__init__(self,img_size,gar_num,data_dir,batch_size,pretrain):self.img_sizeimg_size self.gar_numgar_num self.data_dirdata_dir self.batch_sizebatch_size self.pretrainpretraindefbuild_train(self):迁移学习modelresnet.custom(self.img_size,self.gar_num,self.pretrain)model.summary()train_sequence,validation_sequencegenit.gendata(self.data_dir,self.batch_size,self.gar_num,self.img_size)epochs4model.fit_generator(train_sequence,steps_per_epochlen(train_sequence),epochsepochs,verbose1,validation_datavalidation_sequence,max_queue_size10,shuffleTrue)#微调,在实际工程中激活函数也被算进层里所以总共181层微调是为了重新训练部分卷积层同时训练最后的全连接层layers149learning_rate1e-4forlayerinmodel.layers[:layers]:layer.trainableFalseforlayerinmodel.layers[layers:]:layer.trainableTrueAdamadam(lrlearning_rate,decay0.0005)model.compile(optimizerAdam,losscategorical_crossentropy,metrics[accuracy])model.fit_generator(train_sequence,steps_per_epochlen(train_sequence),epochsepochs*2,verbose1,callbacks[callbacks.ModelCheckpoint(./models/garclass.h5,monitorval_loss,save_best_onlyTrue,modemin),callbacks.ReduceLROnPlateau(monitorval_loss,factor0.1,patience10,modemin),callbacks.EarlyStopping(monitorval_loss,patience10),],validation_datavalidation_sequence,max_queue_size10,shuffleTrue)print(finish train,look for garclass.h5) 项目分享:大家可自取用于参考学习获取方式见文末!

更多文章