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

文章介绍了利用YOLOv5算法构建的智能生活垃圾检测与分类系统,该系统能识别和计数可降解、纸板等六类垃圾,适用于图片、视频和摄像头的实时检测。系统包括用户登录、图像和视频识别功能,提供训练数据集,并展示了训练过程和效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

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

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

智能生活垃圾检测与分类系统演示与介绍(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://www.cnblogs.com/sixuwuxian/p/17227722.html

参考视频演示: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

结束语

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

<think>好的,用户想用HC32F460JETA芯片通过PWM控制RGBW灯带。首先,我需要回忆一下这个芯片的PWM模块相关配置。根据提供的引用资料,特别是引用[1]和[2],知道TimerA可以用来生成PWM,并且可以调节占空比。用户可能需要配置多个通道来控制RGBW四个灯的不同颜色。 接下来,我需要确定如何初始化TimerA的PWM功能。根据引用[3],工程模板的建立需要包含common和MDK文件夹,这可能涉及到头文件和库的引用。配置TimerA的时钟和引脚复用是关键步骤。例如,LED引脚PA5、PA6、PA7、PA8在引用[2]中被提到,可能对应PWM的输出通道,但RGBW可能需要更多的引脚,用户需要确认具体连接。 然后,动态调整占空比的方法。引用[1]提到需要修改比较寄存器的值,比如TCDT寄存器,这可能需要使用到对应的库函数。同时,用户可能需要使用不同的定时器通道来分别控制R、G、B、W四个通道的PWM输出,每个通道对应一个颜色。 还要考虑PWM的频率设置,是否适合灯带的控制需求。例如,常见的PWM频率可能在几百Hz到几KHz之间,需要根据灯带的规格来调整预分频和周期值。 示例代码部分,需要展示初始化流程,包括GPIO配置、定时器模式设置、通道配置,以及如何更新占空比。需要确保代码结构清晰,注释明确,方便用户理解和修改。 另外,用户的问题可能涉及到DMA传输的问题,如引用[4]提到的DMA传输只一次的问题,但当前问题主要是PWM控制,可能不需要涉及DMA,但需要注意在PWM配置中是否会有类似的中断或传输问题,需要避免。 最后,生成相关问题时,要围绕PWM配置、动态调整、多通道同步、硬件连接等可能的问题展开,帮助用户进一步解决可能遇到的难点。</think>### HC32F460JETA PWM控制RGBW灯带实现方法 #### 1. 硬件连接 - RGBW灯带需连接至支持PWM输出的GPIO引脚,例如PA5(LED1)、PA6(LED2)、PA7(LED3)、PA8(LED4)等[^2] - 每个颜色通道(R/G/B/W)需独立连接至不同PWM通道,建议选择同一TimerA的多个通道实现同步控制 #### 2. 工程配置 - 按照官方DDL库建立工程模板(需包含`hc32f460_ddl_Rev2.1.0`库文件)[^3] - 在`hc32f460_timera.c`中添加PWM相关驱动代码 - 配置系统时钟至200MHz(默认配置) #### 3. PWM配置步骤 **步骤1:GPIO初始化** ```c void PWM_GPIO_Config(void) { stc_port_init_t portCfg; MEM_ZERO_STRUCT(portCfg); // 配置PA5~PA8为TimerA通道输出 portCfg.enPinMode = Pin_Mode_Alt6; // TimerA通道输出模式 portCfg.enPullUp = Disable; PORT_Init(GpioPortA, GpioPin5, &portCfg); // CH0 PORT_Init(GpioPortA, GpioPin6, &portCfg); // CH1 PORT_Init(GpioPortA, GpioPin7, &portCfg); // CH2 PORT_Init(GpioPortA, GpioPin8, &portCfg); // CH3 } ``` **步骤2:TimerA基础配置** ```c void TimerA_PWM_Init(void) { stc_timera_base_init_t baseCfg; MEM_ZERO_STRUCT(baseCfg); baseCfg.enClkDiv = TimeraPclkDiv1; // 200MHz baseCfg.enCntMode = TimeraCountModeSaw; // 锯齿波模式 baseCfg.enCntDir = TimeraCountDirUp; // 向上计数 baseCfg.enSyncStart = Disable; baseCfg.u16Period = 20000; // PWM周期=20ms(50Hz) baseCfg.enTimaLoad = TimeraLoadImmediately; Timera_BaseInit(TimeraUnit1, &baseCfg); // 使用TimerA Unit1 } ``` **步骤3:PWM通道配置** ```c void PWM_Channel_Config(void) { stc_timera_compare_init_t compareCfg; MEM_ZERO_STRUCT(compareCfg); // 通道0(R通道) compareCfg.enCompareFunc = TimeraCompareFunctionPwm; compareCfg.enCompareMatchOutput = TimeraCompareMatchOutputReverse; compareCfg.enStartCountOutput = TimeraCompareStartOutputLow; compareCfg.enStopCountOutput = TimeraCompareStopOutputLow; compareCfg.u16CompareValue = 1500; // 初始占空比7.5% Timera_CompareInit(TimeraUnit1, TimeraChannel0, &compareCfg); // 重复配置通道1~3(G/B/W通道)... } ``` #### 4. 动态调节占空比 ```c void PWM_SetDuty(uint8_t ch, uint16_t duty) { if(duty > 20000) duty = 20000; // 限制占空比范围 switch(ch){ case 0: Timera_SetCompareValue(TimeraUnit1, TimeraChannel0, duty); break; case 1: Timera_SetCompareValue(TimeraUnit1, TimeraChannel1, duty); break; case 2: Timera_SetCompareValue(TimeraUnit1, TimeraChannel2, duty); break; case 3: Timera_SetCompareValue(TimeraUnit1, TimeraChannel3, duty); break; } } ``` #### 5. 应用示例 ```c int main(void) { PWM_GPIO_Config(); TimerA_PWM_Init(); PWM_Channel_Config(); Timera_Start(TimeraUnit1); while(1){ // 渐变效果示例 for(int i=0; i<20000; i+=100){ PWM_SetDuty(0, i); // 调节红色亮度 PWM_SetDuty(1, 20000-i); // 调节绿色亮度 Delay_ms(10); } } } ``` #### 注意事项: 1. 需在`hc32f460_clock.c`中确认系统时钟配置正确 2. PWM周期计算:$$T_{pwm} = \frac{(Period+1)}{f_{clk}}$$ 3. 占空比分辨率由Period值决定,示例配置为20000对应20ms周期 4. 多通道同步更新需使用`Timera_WriteTriggerCmd()`函数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思绪无限

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值