摘要:智能生活垃圾检测与分类系统用于日常生活垃圾的智能监测与分类,通过图片、视频和摄像头识别生活垃圾,对常见的可降解、纸板、玻璃、金属、纸质和塑料等类别垃圾进行检测和计数,以协助垃圾环保分类处理。本文详细介绍基于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
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。