计算机毕设 opencv python 深度学习垃圾图像分类系统

2023-09-20 13:07:55


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 opencv python 深度学习垃圾分类系统

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

课题简介

如今,垃圾分类已成为社会热点话题。其实在2019年4月26日,我国住房和城乡建设部等部门就发布了《关于在全国地级及以上城市全面开展生活垃圾分类工作的通知》,决定自2019年起在全国地级及以上城市全面启动生活垃圾分类工作。到2020年底,46个重点城市基本建成生活垃圾分类处理系统。

人工垃圾分类投放是垃圾处理的第一环节,但能够处理海量垃圾的环节是垃圾处理厂。然而,目前国内的垃圾处理厂基本都是采用人工流水线分拣的方式进行垃圾分拣,存在工作环境恶劣、劳动强度大、分拣效率低等缺点。在海量垃圾面前,人工分拣只能分拣出极有限的一部分可回收垃圾和有害垃圾,绝大多数垃圾只能进行填埋,带来了极大的资源浪费和环境污染危险。

随着深度学习技术在视觉领域的应用和发展,让我们看到了利用AI来自动进行垃圾分类的可能,通过摄像头拍摄垃圾图片,检测图片中垃圾的类别,从而可以让机器自动进行垃圾分拣,极大地提高垃圾分拣效率。

基于深度学习的垃圾分类系统,是非常好的毕业设计课题


一、识别效果

老样子, 废话不多说,先展示图像垃圾分类的识别效果

训练模型精度:
在这里插入图片描述
可以看到,只迭代了10轮精度达到87.50%,而且没有出现过拟合现象

我最高训练达到96%,迭代200轮

识别结果:
在这里插入图片描述
实际验证正确率还是很高的。

二、实现

1.数据集

该数据集包含了 2507 个生活垃圾图片。数据集的创建者将垃圾分为了 6 个类别,分别是:
在这里插入图片描述
如下所示:

在这里插入图片描述
一共6类垃圾, 比如玻璃类的如下:

在这里插入图片描述
塑料类的如下:

在这里插入图片描述
其他的不列举了。

2.实现原理和方法

使用深度残差网络resnet50作为基石,在后续添加需要的层以适应不同的分类任务
模型的训练需要用生成器将数据集循环写入内存,同时图像增强以泛化模型
使用不包含网络输出部分的resnet50权重文件进行迁移学习,只训练我们在5个stage后增加的层

需要的第三方库主要有tensorflow1.x,keras,opencv,Pillow,scikit-learn,numpy
安装方式很简单,打开terminal,例如:pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
数据集与权重文件比较大,所以没有上传
如果环境配置方面有问题或者需要数据集与模型权重文件,可以在评论区说明您的问题,我将远程帮助您

3.网络结构

这里我只使用了resnet50的5个stage,后面的输出部分需要我们自己定制,网络的结构图如下:
在这里插入图片描述
stage5后我们的定制网络如下:

"""定制resnet后面的层"""
def custom(input_size,num_classes,pretrain):
    # 引入初始化resnet50模型
    base_model = ResNet50(weights=pretrain,
                          include_top=False,
                          pooling=None,
                          input_shape=(input_size,input_size, 3),
                          classes=num_classes)
    #由于有预权重,前部分冻结,后面进行迁移学习
    for layer in base_model.layers:
        layer.trainable = False
    #添加后面的层
    x = base_model.output
    x = layers.GlobalAveragePooling2D(name='avg_pool')(x)
    x = layers.Dropout(0.5,name='dropout1')(x)
    #regularizers正则化层,正则化器允许在优化过程中对层的参数或层的激活情况进行惩罚
    #对损失函数进行最小化的同时,也需要让对参数添加限制,这个限制也就是正则化惩罚项,使用l2范数
    x = layers.Dense(512,activation='relu',kernel_regularizer= regularizers.l2(0.0001),name='fc2')(x)
    x = layers.BatchNormalization(name='bn_fc_01')(x)
    x = layers.Dropout(0.5,name='dropout2')(x)
    #40个分类
    x = layers.Dense(num_classes,activation='softmax')(x)
    model = Model(inputs=base_model.input,outputs=x)
    #模型编译
    model.compile(optimizer="adam",loss = 'categorical_crossentropy',metrics=['accuracy'])
    return model

网络的训练是迁移学习过程,使用已有的初始resnet50权重(5个stage已经训练过,卷积层已经能够提取特征),我们只训练后面的全连接层部分,4个epoch后再对较后面的层进行训练微调一下,获得更高准确率,训练过程如下:

class Net():
    def __init__(self,img_size,gar_num,data_dir,batch_size,pretrain):
        self.img_size=img_size
        self.gar_num=gar_num
        self.data_dir=data_dir
        self.batch_size=batch_size
        self.pretrain=pretrain

    def build_train(self):
        """迁移学习"""
        model = resnet.custom(self.img_size, self.gar_num, self.pretrain)
        model.summary()

        train_sequence, validation_sequence = genit.gendata(self.data_dir, self.batch_size, self.gar_num, self.img_size)

        epochs=4
        model.fit_generator(train_sequence,steps_per_epoch=len(train_sequence),epochs=epochs,verbose=1,validation_data=validation_sequence,
                                     max_queue_size=10,shuffle=True)
        #微调,在实际工程中,激活函数也被算进层里,所以总共181层,微调是为了重新训练部分卷积层,同时训练最后的全连接层
        layers=149
        learning_rate=1e-4
        for layer in model.layers[:layers]:
            layer.trainable = False
        for layer in model.layers[layers:]:
            layer.trainable = True
        Adam =adam(lr=learning_rate, decay=0.0005)
        model.compile(optimizer=Adam, loss='categorical_crossentropy', metrics=['accuracy'])

        model.fit_generator(train_sequence,steps_per_epoch=len(train_sequence),epochs=epochs * 2,verbose=1,
            callbacks=[
                callbacks.ModelCheckpoint('./models/garclass.h5',monitor='val_loss', save_best_only=True, mode='min'),
                callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1,patience=10, mode='min'),
                callbacks.EarlyStopping(monitor='val_loss', patience=10),],
            validation_data=validation_sequence,max_queue_size=10,shuffle=True)

        print('finish train,look for garclass.h5')

最后

更多推荐

基于Uniapp+SpringBoot+Vue的电影交流平台小程序设计与实现(源码+lw+部署文档+讲解等)

前言💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗👇🏻精彩专栏推荐订阅👇🏻2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选

GaussDB数据库SQL系列-自定义函数

目录一、前言二、自定义函数(Function)概述三、使用场景四、优缺点1、数据库中Function的使用优点2、数据库中Function的使用缺点五、GaussDB中的Function示例与解析1、示例一:定义函数为SQL查询2、示例二:返回一个包含多个输出参数的记录3、示例三:返回RECORD类型结果集六、小结一、

【数据结构】平衡二叉搜索树(AVL树)——AVL树的概念和介绍、AVL树的简单实现、AVL树的增删查改

文章目录平衡二叉搜索树(AVL树)1.AVL树的概念和介绍2.AVL树的简单实现2.1AVL树的插入2.2AVL树的旋转2.2.1左旋2.2.2右旋2.2.3右左双旋2.2.4左右双旋全部源码平衡二叉搜索树(AVL树)为什么要引入平衡二叉搜索树?在之前我们学习了二叉搜索树,二叉搜索树的结构类似于一个倒置的树,而左子树的

GaussDB数据库SQL系列-子查询

目录一、前言二、GaussDBSQL子查询表达式1、EXISTS/NOTEXISTS2、IN/NOTIN3、ANY/SOME4、ALL三、GaussDBSQL子查询实验示例1、创建实验表2、EXISTS/NOTEXISTS示例3、IN/NOTIN示例4、ANY/SOME示例5、ALL示例四、注意事项及建议五、小结一、前

新装机电脑网速特别慢

老主机最近有些问题,我一直没能解决,也用了5年了,索性出给闲鱼二道贩子,又自己新配置了一台主机。具体表现为:主机插网线后,跟之前主机比,浏览网页或者下载资源速度特别慢,打开百度浏览器都要转上一会,不管下载什么资源,下载速度最快只有100-200kb,让我梦回05年,重新体验了一把当年的感觉,实在抓狂。主板带有WIFI功

3D WEB引擎HOOPS Commuicator助力Naval Architect Jumpstart快速启动船舶信息建模平台开发

行业:造船业挑战:新公司希望将创新的船舶信息建模产品推向市场-基于浏览器的产品需要支持高级可视化和强大的数据转换,以处理大型、复杂的造船项目-小型开发团队的任务是雄心勃勃的平台发布计划。解决方案:TechSoft3D提供领先的SDK,可加速强大的工程Web应用程序的开发。结果:利用第三方组件进行3DWeb轻量化、数据转

负载均衡中间件---Nginx

一.nginx的好处学习Nginx对于一个全栈开发者来说是非常有价值的,下面是一些学习Nginx的原因和好处:反向代理和负载均衡:Nginx是一个高性能的反向代理服务器,可以用于将客户端请求转发给多个后端服务器,实现负载均衡。学习Nginx可以让您了解如何配置和管理反向代理和负载均衡,以提高应用程序的性能和可靠性。静态

layui框架学习(45: 工具集模块)

layui的工具集模块util支持固定条、倒计时等组件,同时提供辅助函数处理时间数据、字符转义、批量事件处理等操作。util模块中的fixbar函数支持设置固定条(2.7版本的帮助文档中叫固定块),是指固定在页面一侧的工具条元素,不随页面滚动条滚动,默认在页面右下角位置。fixbar函数的原型为util.fixbar(

Docker vs. Podman: 选择容器技术的智慧之选

嗨,各位亲爱的程序员小伙伴们!当我们步入容器技术的世界,往往会在众多选择中迷茫。两个备受瞩目的容器工具,Docker和Podman,都在业界掀起了一股风潮。今天,我将带你深入探索,为什么在Docker和Podman之间做出选择,以及如何根据自身需求来做出明智的决策。就让我们一同踏上这个容器之旅吧!容器技术简介:为何容器

初识Docker

文章目录Docker安装Docker简介1.什么是虚拟化、容器化?2.为什么需要虚拟化、容器化?3.虚拟化的实现方式主机虚拟化的实现方式容器虚拟化实现4.虚拟机和Docker的区别Docker安装基于Centos7进行安装1.确认系统版本和CPU架构,Centos7的x86_64架构#cat/etc/*release*

大数据之Hive(三)

分区表概念和常用操作将一个大表的数据按照业务需要分散存储到多个目录,每个目录称为该表的一个分区。一般来说是按照日期来作为分区的标准。在查询时可以通过where子句来选择查询所需要的分区,这样查询效率会提高很多。①创建分区表hive(default)>createtabledept_partition(deptnoint

热文推荐