智能生活垃圾检测与分类系统(UI界面+YOLOv5+训练数据集)

在这里插入图片描述

摘要:智能生活垃圾检测与分类系统用于日常生活垃圾的智能监测与分类,通过图片、视频和摄像头识别生活垃圾,对常见的可降解、纸板、玻璃、金属、纸质和塑料等类别垃圾进行检测和计数,以协助垃圾环保分类处理。本文详细介绍基于YOLOv5算法的智能生活垃圾检测与分类系统,在介绍算法原理的同时,给出Python的实现代码、PyQt的UI界面以及训练数据集。在界面中可以选择各种图片、视频进行检测识别,可对图像中存在的多个目标进行识别分类,检测速度快、识别精度高。博文提供了完整的Python代码和使用教程,适合新入门的朋友参考,完整代码资源文件请转至文末的下载链接。本博文目录如下:

文章目录

  • 前言
  • 1. 效果演示
  • 2. 智能生活垃圾检测与分类
  • 3. 智能生活垃圾检测
  • 下载链接
  • 结束语

➷点击跳转至文末所有涉及的完整代码文件下载页☇

智能生活垃圾检测与分类系统演示与介绍(UI界面+YOLOv5+训练数据集)


前言

        智能垃圾分类处理系统是依托物联网、GPS、云计算、大数据等信息技术,结合各种智能化设备(智能垃圾分类箱、积分兑现、车载一体机等),采用分布式微服务架构搭建而成,对垃圾分类全过程中所涉及到的人、车、物、事进行全过程实时监管,实现垃圾投放、收集、运输、处理各环节的有源可溯。

        传统的人工垃圾分拣技术存在着效率低、耗时长、需要大量人力、分挑环境差等问题,如何有效地智能化地进行垃圾分类以及成为亟待解决的问题。如今的深度学习技术快速发展,在深层特征提取、表征,目标检测上都取得了很大进展,利用相关技术解决垃圾分类问题,无疑可以减少人力资源的消耗,有效提高垃圾分类效率,促进生态文明建设发展。

        智能生活垃圾检测分类是近年来计算机视觉领域的一个应用,同时也是目标检测领域中的难点。其目的是识别和定位图像中存在的垃圾类型,在许多领域中都有广泛的应用。本系统基于YOLOv5算法进行垃圾检测分类,对于图片、视频和摄像头捕获的实时画面,系统可检测画面中的垃圾类型和位置,支持结果记录、展示和保存,每次检测的结果记录在表格中。以下给出博主设计的界面,功能也可以满足图片、视频和摄像头的识别检测,初始界面如下图(比前面的界面稍有升级,增加了柱状图统计数目,哈哈)。

在这里插入图片描述

        检测类别时的界面截图(点击图片可放大)如下图,可识别画面中存在的多个类别,也可开启摄像头或视频检测:

在这里插入图片描述

         详细的功能演示效果参见博主的B站视频或下一节的动图演示,觉得不错的朋友敬请点赞、关注加收藏!系统UI界面的设计工作量较大,界面美化更需仔细雕琢,大家有任何建议或意见和可在下方评论交流。


1. 效果演示

        软件需要颜值与功能并存,我们还是通过动图看一下识别的效果,系统主要实现的功能是对图片、视频和摄像头画面中的垃圾识别,识别结果可视化显示在界面和图像中,另外提供多个目标的显示选择功能,演示效果如下。

(一)系统介绍

        智能生活垃圾检测与分类系统主要用于日常生活垃圾检测和智能分类,对常见的可降解、纸板、玻璃、金属、纸质和塑料等类别垃圾进行检测和计数,以方便对垃圾进行分类处理;系统提供登录注册功能,可进行用户管理;能够有效识别图片、视频等文件形式,检测目标位置、类别并统计各类别计数结果;可开启摄像头实时检测和统计画面中的垃圾类型和数目,支持结果记录、展示和保存。

(二)技术特点

         (1)YoloV5算法实现,模型一键切换更新;
         (2)检测图片、视频等图像中的各目标数目并可视化;
         (3)摄像头监控实时检测,便携展示、记录和保存;
         (4)支持用户登录、注册,检测结果可视化功能;
         (5)提供完整训练数据集,可重新训练模型;

(三)用户注册登录界面

        这里设计了一个登录界面,可以注册账号和密码,然后进行登录。界面还是参考了当前流行的UI设计,上面贴图和系统名,下面可输入账号、密码。

在这里插入图片描述

(四)选择图片识别

        系统可选择图片文件进行识别,点击图片选择按钮图标选择图片后,显示所有识别的结果,可通过下拉选框查看单个结果,以便具体判断某一特定目标。本功能的界面展示如下图所示:

在这里插入图片描述

(五)视频识别效果展示

        点击视频按钮可选择待检测的视频,系统会自动解析视频逐帧识别多个垃圾类型,并将垃圾分类结果记录在右下角表格中,效果如下图所示:

在这里插入图片描述

(六)摄像头检测效果展示

        在真实场景中,我们往往利用道路的摄像头获取实时画面,同时需要对垃圾进行识别,因此本文考虑到此项功能。如下图所示,点击摄像头按钮后系统进入准备状态,系统显示实时画面并开始检测画面中的垃圾,识别结果展示如下图:

在这里插入图片描述


2. 智能生活垃圾检测与分类

(一)YOLOv5项目进行生活垃圾检测

         YOLOv5的代码是开源的,因此我们可以从github上克隆其源码。在不断更新和完善中,YOLOv5就已经有了多个分支,几经更新成为一项比较成熟的深度学习技术了,在发布这个智能垃圾检测系统的时候,YOLOv6-v8的代码版本也有了,不过看起来还有改进和更新的空间,因此这里先使用YOLOv5进行开发了,后续也会升级本系统的算法。

         生活垃圾检测分类的数据集已经整理和添加进项目中,项目的目录如下图所示。其中train.py是训练程序,在配置好Python环境和依赖库的基础上,可以点击运行重新进行训练。

在这里插入图片描述

         一般为了缩短网络的训练时间,并达到更好的精度,我们一般加载预训练权重进行网络的训练。而yolov5给我们提供了几个预训练权重,我们可以对应我们不同的需求选择不同的版本的预训练权重。通过如下的图可以获得权重的名字和大小信息,可以预料的到,预训练权重越大,训练出来的精度就会相对来说越高,但是其检测的速度就会越慢。预训练权重可以通过这个网址进行下载,本次训练自己的数据集用的预训练权重为yolov5s.pt。

在这里插入图片描述

(二)数据集及训练

        这里我们使用的生活垃圾数据集,包含可降解、纸板、玻璃、金属、纸质、塑料等垃圾类型,每张图片除包括类别标签外,还有一个标注的物体边框(Bounding Box),其类别标注如下图所示。

Chinese_name = {'BIODEGRADABLE': "可降解", "CARDBOARD": '纸板', 'GLASS': "玻璃", 'METAL': "金属", 'PAPER': "纸质", 'PLASTIC': "塑料"}

在这里插入图片描述
        每张图像均提供了图像类标记信息,训练数据集具有7324张图片,验证集2098张,测试集1042张,共计10000余张图像,部分图片的截图如下图所示。

在这里插入图片描述
        安装好Yolov5的依赖库,配置一个Python3.8然后按照requirements.txt里面的依赖装环境就可以运行了,训练的具体参数需要具体配置,配置数据集的训练集路径、验证集路径、测试集路径,类别nc设置为6,包括’BIODEGRADABLE’, ‘CARDBOARD’, ‘GLASS’, ‘METAL’, ‘PAPER’, 'PLASTIC’这6类,配置好这些就可运行train.py训练了。

train: ./Garbage/images/train
val: ./Garbage/images/val
test: ./Garbage/images/test
nc: 6
names: ['BIODEGRADABLE', 'CARDBOARD', 'GLASS', 'METAL', 'PAPER', 'PLASTIC']

        在深度学习中,我们通常通过损失函数下降的曲线来观察模型训练的情况。而YOLOv5训练时主要包含三个方面的损失:矩形框损失(box_loss)、置信度损失(obj_loss)和分类损失(cls_loss),在训练结束后,我们也可以在logs目录下找到生成对若干训练过程统计图。下图为博主训练生活垃圾类识别的模型训练曲线图。
在这里插入图片描述
        一般我们会接触到两个指标,分别是召回率recall和精度precision,两个指标p和r都是简单地从一个角度来判断模型的好坏,均是介于0到1之间的数值,其中接近于1表示模型的性能越好,接近于0表示模型的性能越差,为了综合评价目标检测的性能,一般采用均值平均密度map来进一步评估模型的好坏。我们通过设定不同的置信度的阈值,可以得到在模型在不同的阈值下所计算出的p值和r值,一般情况下,p值和r值是负相关的,绘制出来可以得到如下图所示的曲线,其中曲线的面积我们称AP,目标检测模型中每种目标可计算出一个AP值,对所有的AP值求平均则可以得到模型的mAP值。
在这里插入图片描述
        以PR-curve为例,可以看到我们的模型在验证集上的均值平均准确率为0.546。从训练结果和数据集进行分析,存在一定干扰样本,部分数据集图像中的垃圾相互遮盖,垃圾存在的环境复杂多变,很容易造成模型误检。

3. 智能生活垃圾检测

        在训练完成后得到最佳模型,接下来我们将帧图像输入到这个网络进行预测,从而得到预测结果,预测方法(predict.py)部分的代码如下所示:

parser = argparse.ArgumentParser()
parser.add_argument('--weights', nargs='+', type=str, default='./weights/garbage-best.pt',
                    help='model.pt path(s)')  # 模型路径仅支持.pt文件
parser.add_argument('--img-size', type=int, default=480, help='inference size (pixels)')  # 检测图像大小,仅支持480
parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')  # 置信度阈值
parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')  # NMS阈值
# 选中运行机器的GPU或者cpu,有GPU则GPU,没有则cpu,若想仅使用cpu,可以填cpu即可
parser.add_argument('--device', default='',
                    help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--save-dir', type=str, default='inference', help='directory to save results')  # 文件保存路径
parser.add_argument('--classes', nargs='+', type=int,
                    help='filter by class: --class 0, or --class 0 2 3')  # 分开类别
parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')  # 使用NMS
opt = parser.parse_args()  # opt局部变量,重要
out, weight, imgsz = opt.save_dir, opt.weights, opt.img_size  # 得到文件保存路径,文件权重路径,图像尺寸
device = select_device(opt.device)  # 检验计算单元,gpu还是cpu
half = device.type != 'cpu'  # 如果使用gpu则进行半精度推理

        应用训练得到的模型,可以运行testPicture.py代码,我们只需更改图片路径,该脚本调用已训练好的模型进行预测并通过OpenCV绘制标记框,运行效果如下图所示。

在这里插入图片描述

        博主对整个系统进行了详细测试,最终开发出一版流畅得到清新界面,就是博文演示部分的展示,完整的UI界面、测试图片视频、代码文件,以及Python离线依赖包(方便安装运行,也可自行配置环境),均已打包上传,感兴趣的朋友可以通过下载链接获取。

在这里插入图片描述


下载链接

    若您想获得博文中涉及的实现完整全部程序文件(包括测试图片、视频,py, UI文件等,如下图),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:

在这里插入图片描述

    在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,离线依赖的使用详细演示也可见本人B站视频:win11从头安装软件和配置环境运行深度学习项目、Win10中使用pycharm和anaconda进行python环境配置教程。

在这里插入图片描述

注意:该代码采用Pycharm+Python3.8开发,经过测试能成功运行,运行界面的主程序为runMain.py和LoginUI.py,测试图片脚本可运行testPicture.py,测试视频脚本可运行testVideo.py。为确保程序顺利运行,请按照requirements.txt配置Python依赖包的版本。Python版本:3.8,请勿使用其他版本,详见requirements.txt文件;

完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见参考博客文章里面,或参考视频的简介处给出:➷➷➷

参考博客文章:https://zhuanlan.zhihu.com/p/614853467

参考视频演示:https://www.bilibili.com/video/BV1Xx4y1N7YM/

离线依赖库下载链接:https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n (提取码:oy4n )


界面中文字、图标和背景图修改方法:
        在Qt Designer中可以彻底修改界面的各个控件及设置,然后将ui文件转换为py文件即可调用和显示界面。如果只需要修改界面中的文字、图标和背景图的,可以直接在ConfigUI.config文件中修改,步骤如下:
        (1)打开UI_rec/tools/ConfigUI.config文件,若乱码请选择GBK编码打开。
        (2)如需修改界面文字,只要选中要改的字符替换成自己的就好。
        (3)如需修改背景、图标等,只需修改图片的路径。例如,原文件中的背景图设置如下:

mainWindow = :/images/icons/back-image.png

        可修改为自己的名为background2.png图片(位置在UI_rec/icons/文件夹中),可将该项设置如下即可修改背景图:

mainWindow = ./icons/background2.png

结束语

        由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/1476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

找一找马里奥-第14届蓝桥杯STEMA测评Scratch真题精选

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第110讲。 蓝桥杯选拔赛现已更名为STEMA,即STEM 能力测试,是蓝桥杯大赛组委会与美国普林斯顿多…

《Linux的权限》

本文主要对linux的一些基本权限进行讲解 文章目录前言Linux权限(1)权限的概念(2)linux下用户分类(root,普通)(3)linux的文件属性文件属性的分类文件权限修改文件权限1、chmod2、chown和chgrp3、fiile权限的三个重要的问题第一个问…

Java面向对象:接口的学习

本文介绍了Java中接口的基本语法, 什么是接口, java中的接口 语法规则, 接口的使用,接口的特性,如何实现多个接口,接口间的继承,以及抽象类和接口的区别 Java接口的学习一.接口的概念二.Java中的接口1.接口语法规则2.接口的使用3.接口的特性4.实现多个接口5.接口间的继承三.抽象…

C++线程池理解

线程池基本信息 线程池是一种结合池化思想衍生出来的一种线程管理及使用的方案 其主要针对服务器端多线程场景下,服务器频繁接收请求,每个请求都分配一个单独的线程去处理。 使用线程的开销: 创建和销毁线程调度线程 线程池主要解决的核…

你是真的“C”——结构体中鲜有人知的“秘密”

你是真的“C”——结构体中的精髓剖析【内存对齐】 【位段】 😎前言🙌结构体内存对齐:😊结构体内存对齐存在的意思是什么?😘内存对齐例子详细剖析:😘结构体中的位段:&…

基于Vue+Vue-cli+webpack搭建渐进式高可维护性前端实战项目

本文是专栏《Vue SpringBoot前后端分离项目实战》的实战第一篇,将从Vue脚手架安装开始,逐步带你搭建起一套管理系统所需的架构。当然,在默认安装完成之后,会对文件目录进行初步的细化拆分,以便后续功能迭代和维护所用…

ChatGPT没有API?OpenAI官方API带你起飞

目录ChatGPT没有API?OpenAI官方API带你起飞安装 OpenAI 的 API 库包装个函数包装个UIAPI 调不通怎么办?ChatGPT没有API?OpenAI官方API带你起飞 前段时间ChatGPT爆火,OpenAI 的 GPT API也被大家疯狂调用, 但其实这个AP…

超详细的堆排序,进来看看吧。

1.堆的基本概念1.1什么是堆堆是一种叫做完全二叉树的数据结构,1.2大堆和小堆大堆:每个节点的值都大于或者等于他的左右孩子节点的值小根堆:每个结点的值都小于或等于其左孩子和右孩子结点的值1.3完全二叉树节点之间的关系leftchild parent*2 1rightchild parent*…

string类(上)

string类(上)1.标准库中的string类2.string类对象的常见构造①string()②string(const char* s)③string(size_t n,char c)④string(const string&s)⑤string(const string& str,size_t pos,size_t lennpos)⑥string(const char* s,s…

【基于协同过滤算法的推荐系统项目实战-2】了解协同过滤推荐系统

本文目录1、推荐系统的关键元素1.1 数据1.2 算法1.3 业务领域1.4 展示信息2、推荐算法的主要分类2.1 基于关联规则的推荐算法基于Apriori的算法基于FP-Growth的算法2.2 基于内容的推荐算法2.3 基于协同过滤的推荐算法3、推荐系统常见的问题1、冷启动2、数据稀疏3、不断变化的用…

java 每日一练 (9)

文章目录1. 单选2. 编程1. 单选 1. 下面程序的输出是:() A : FmNwxy B :fmnwxy C :wxyfmn D : Fmnwxy 答案 : D , 这里主要考察 toUpperCase 和 replace 方法 , 注意点 : toUpperCas…

动态规划-基础(斐波那契数、爬楼梯、使用最小花费爬楼梯、不同路径、不同路径II、整数拆分、不同的二叉搜索树)

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的。动态规划问题,五步走:状态定义&am…

【数据结构】双向链表

🚀write in front🚀 📜所属专栏: 初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是…

海思SD3403/SS928V100开发(7)mcp2515-SPI转CAN驱动开发

1. 前言 需求: 需要一路can进行收发 分析: 根据目前使用较多的方案是使用主控端SPI接口 接入MCP2515芯片进行CAN协议转换 硬件: MCP2515->SPI2->SS928 2. Uboot开发 2.1 pinmux复用配置 2.1.1 修改uboot参数表 路径: osdrv/tools/pc/uboot_tools/ SS928V100…

Android 进程间通信机制(三) 系统进程与应用进程通信

一. 概述 Android中有一个重要的系统进程(system_server),运行着系统中非常重要服务(AMS, PMS, WMS等), 针对Activity而言,系统进程需要不断地调度Activity执行,管理Activity的状态; 每一个APK都需要运行在一个应用进程中&#xf…

【动态规划】最长上升子序列(单调队列、贪心优化)

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…

jvm-题库

1、JVM内存模型 JVM内存区域总共分为两种类型 线程私有区域:程序计数器、本地方法栈和虚拟机栈 线程共享区域:堆(heap)和方法区 特征 线程私有区域:依赖用户的线程创建而创建、销毁而销毁,因用户每次访问都…

带头双向循环链表

在前面我们学习了单链表,发现单链表还是有一些不够方便,比如我们要尾插,需要遍历一遍然后找到它的尾,这样时间复炸度就为O(N),现在我们引入双向带头链表就很方便了,我们先看看它的结构。通过观察,我们发现一…

Vue全新一代状态管理库 Pinia【一篇通】

文章目录前言1. Pinia 是什么?1.1 为什么取名叫 Pinia?1.2. 为什么要使用 Pinia ?2. 安装 Pinia2.1.创建 Store2.1.1. Option 类型 Store2.1.2 Setup 函数类型 Store2.1.3 模板中使用3. State 的使用事项(Option Store )3.1 读取 State3.2 …

EEPROM芯片(24c02)使用详解(I2C通信时序分析、操作源码分析、原理图分析)

1、前言 (1)本文主要是通过24c02芯片来讲解I2C接口的EEPROM操作方法,包含底层时序和读写的代码; (2)大部分代码是EEPROM芯片通用的,但是其中关于某些时间的要求,是和具体芯片相关的,和主控芯片和外设芯片都有关系&…