垃圾分类检测系统
基于 YOLOv8 目标检测模型 + PyQt6 桌面端应用的垃圾分类识别系统,覆盖数据集构建、模型训练调优、系统集成开发的完整深度学习工程流程。
·
基于 YOLOv8 目标检测模型 + PyQt6 桌面端应用的垃圾分类识别系统,覆盖数据集构建、模型训练调优、系统集成开发的完整深度学习工程流程。
@作者:Jay
@定制联系vx:Jay8059
@开发日期:2026年
目录
项目概述
本项目针对城市生活垃圾分类场景,构建了一套端到端的 AI 识别系统:
- 目标检测模型:基于 YOLOv8n 预训练权重进行迁移学习,识别 44 种常见垃圾细类
- 分类规则引擎:将 44 个细类自动映射到「可回收物 / 厨余垃圾 / 有害垃圾 / 其他垃圾」四大类
- 桌面端应用:PyQt6 多功能检测界面,支持图片、视频、摄像头三种输入源实时检测
数据集说明
基本信息
| 项目 | 内容 |
|---|---|
| 标注格式 | YOLO TXT(由 Pascal VOC XML 转换) |
| 图像总数 | 14,761 张(有效图像;原始 14,964 张去除无图样本) |
| 大类数量 | 4 类(可回收物、厨余垃圾、有害垃圾、其他垃圾) |
| 细类数量 | 44 类 |
| 图像格式 | JPEG(.jpg) |
| 数据集划分 | train / val / test = 7 : 1 : 2 |
子集分布
| 子集 | 图片数量 | 用途 |
|---|---|---|
| train | 10,319 张 | 模型训练 |
| val | 1,478 张 | 训练过程中的验证评估 |
| test | 2,964 张 | 最终性能测试 |
垃圾分类体系
| 大类 | 细类数 | 代表细类 |
|---|---|---|
| 可回收物 | 26 类 | 饮料瓶、易拉罐、纸盒纸箱、玻璃器皿、旧衣服、充电宝… |
| 厨余垃圾 | 7 类 | 剩饭剩菜、果皮果肉、菜帮菜叶、鱼骨、蛋壳… |
| 有害垃圾 | 3 类 | 干电池、过期药物、软膏 |
| 其他垃圾 | 8 类 | 一次性快餐盒、烟蒂、陶瓷器皿、污损塑料… |
标注格式示例
每张图片对应一个同名 .txt 文件,每行一个目标框,坐标均归一化到 [0, 1]:
class_id x_center y_center width height
6 0.4106 0.4219 0.5962 0.3379
深度学习开发流程
第一阶段:数据集构建与处理
- 原始数据收集:整合公开垃圾分类数据集,原始标注格式为 Pascal VOC XML
- 格式转换:将 XML 标注批量转换为 YOLO TXT 格式(
class_id x_center y_center w h归一化坐标) - 数据清洗:剔除无有效标注框的样本(14,964 → 14,761 张)
- 数据集划分:按 7:1:2 比例随机划分训练/验证/测试集,确保类别分布均衡
- 分类规则构建:编写
classify_rule.json,建立细类 → 大类的映射规则,支持推理后的大类归并
第二阶段:模型训练与调优
- 模型选型:选择 YOLOv8n(Nano 版本)作为基础架构,参数量小、推理速度快,适合桌面端部署
- 迁移学习:加载 COCO 预训练权重
yolov8n.pt,在垃圾数据集上进行微调,加速收敛 - 数据增强:启用 Mosaic 拼接(
mosaic=1.0)、随机水平翻转(fliplr=0.5)、HSV 色彩扰动、随机缩放等多种增强策略 - 训练策略:
- 前 3 个 epoch 进行学习率 Warmup,逐步从
warmup_bias_lr=0.1过渡到lr0=0.01 - 后期采用余弦退火式线性衰减(
lrf=0.01),避免学习率过高导致振荡 - 最后 10 个 epoch 关闭 Mosaic 增强(
close_mosaic=10),提升模型对真实样本的拟合能力
- 前 3 个 epoch 进行学习率 Warmup,逐步从
- 混合精度训练:启用 AMP(
amp=True),降低显存占用,提升训练吞吐 - 结果保存:自动保存最优权重
best.pt和最终权重last.pt,并记录完整训练日志results.csv
第三阶段:系统集成与功能开发
- 检测器封装:将 Ultralytics YOLO 推理接口封装为
Detector类,统一管理模型加载、参数配置和推理调用 - 多线程架构:视频和摄像头检测采用
QThread异步处理,检测线程与 UI 线程分离,保证界面流畅 - 历史记录持久化:使用 SQLite 存储每次检测的结果,支持按类型筛选和关键词搜索
- 训练结果可视化:读取
results.csv,使用 Matplotlib 绘制多维度分析图表,嵌入 PyQt6 界面
训练参数
| 参数 | 值 | 说明 |
|---|---|---|
| 基础模型 | yolov8n.pt | COCO 预训练 Nano 版本 |
| 训练轮次 | 100 epochs | — |
| 批次大小 | 16 | — |
| 输入尺寸 | 640×640 | — |
| 初始学习率 | 0.01 | lr0 |
| 最终学习率 | 0.01 × lrf = 0.0001 | 线性衰减至 lr0×lrf |
| Warmup 轮次 | 3.0 | — |
| 优化器 | auto(SGD) | — |
| 动量 | 0.937 | — |
| 权重衰减 | 0.0005 | — |
| Box Loss 权重 | 7.5 | — |
| Cls Loss 权重 | 0.5 | — |
| DFL Loss 权重 | 1.5 | — |
| IoU 阈值(NMS) | 0.7 | — |
| 混合精度 | AMP 开启 | — |
| Mosaic 增强 | 1.0(后 10 epoch 关闭) | — |
| 水平翻转 | 0.5 | — |
| HSV 色调扰动 | 0.015 | — |
| HSV 饱和度扰动 | 0.7 | — |
| 随机缩放 | 0.5 | — |
| 自动增强 | randaugment | — |
| 随机擦除 | 0.4 | — |
| 总训练时长 | ≈ 2.54 小时 | 9,161 秒 |
训练指标与结果
核心指标(基于验证集)
| 指标 | 最优值(Best Epoch) | 最终值(Epoch 100) |
|---|---|---|
| mAP@0.5 | 0.6991(Epoch 81) | 0.6971 |
| mAP@0.5:0.95 | 0.5954(Epoch 89) | 0.5981 |
| Precision | 0.7997(Epoch 53) | 0.7564 |
| Recall | 0.6455(Epoch 66) | 0.6270 |
| F1 Score | ≈ 0.714 | ≈ 0.681 |
损失曲线趋势
| 损失项 | 初始值(Epoch 1) | 最终值(Epoch 100) | 说明 |
|---|---|---|---|
| train/box_loss | 0.760 | 0.419 | 边界框回归损失,下降 ≈ 45% |
| train/cls_loss | 3.871 | 0.562 | 分类损失,下降 ≈ 85.5% |
| train/dfl_loss | 1.294 | 1.032 | 分布焦点损失 |
| val/box_loss | 0.893 | 0.599 | 验证集边界框损失 |
| val/cls_loss | 2.717 | 1.090 | 验证集分类损失 |
训练集与验证集损失同步下降,无明显过拟合现象,模型具备良好的泛化能力。
可视化图表说明
系统内置两套可视化工具:
指标展示页内置图表
| 图表名称 | 含义 |
|---|---|
| 训练/验证 Box Loss | 模型预测边界框与真实框之间的位置偏差,值越低说明定位越准确 |
| 训练/验证 Cls Loss | 类别分类的交叉熵损失,值越低说明分类越准确 |
| 训练/验证 DFL Loss | 分布焦点损失,辅助边界框精细化回归 |
| mAP@0.5 曲线 | IoU 阈值为 0.5 时的平均精度均值,衡量整体检测性能 |
| mAP@0.5:0.95 曲线 | 在多个 IoU 阈值(0.5~0.95)下的综合性能,要求更严格 |
| Precision 曲线 | 精确率 = 正确检测数 / 总预测数,反映误报率 |
| Recall 曲线 | 召回率 = 正确检测数 / 真实目标数,反映漏报率 |
| F1 分数曲线 | Precision 与 Recall 的调和平均,综合衡量两者均衡性 |
| 学习率衰减曲线 | 展示 Warmup → 线性衰减的学习率变化过程 |
| 综合性能雷达图 | 将 mAP、Precision、Recall、F1、损失收敛度等多维指标以雷达形式可视化 |
| 各指标对比柱状图 | 汇总最优 epoch 的四项核心指标便于横向比较 |
独立可视化脚本(plot_results.py)
运行 python plot_results.py 后,自动为每个训练指标生成独立 PNG 图片,保存至 runs/detect/train/charts/,包含最优值标注。
系统功能
🔐 登录注册
- 用户名 + 密码登录,支持注册新账号
- 账号信息持久化存储于
users.json
🖼️ 图片识别
- 支持点击打开或拖拽导入图片(JPG / PNG / BMP / WebP)
- 一键开始检测,实时展示标注结果图
- 统计摘要:总检测数、类别数、平均 / 最高置信度
- 类别分布表、详细检测数据表(坐标 + 置信度)
- 置信度直方图分布
- 支持导出标注图片、导出 CSV 结果文件
🎬 视频识别
- 打开本地视频文件,按帧间隔检测
- 实时展示带标注的视频帧
- 当前帧 / 累计检测统计
- 可随时停止检测
📷 摄像头识别
- 支持多路摄像头切换(索引 0~10)
- 检测开关分离,可仅预览不检测
- 实时统计目标数量、类别、置信度
- 一键截图保存,会话结果写入历史
📋 检测历史
- 图片 / 视频 / 摄像头检测记录自动入库(SQLite)
- 支持按检测类型筛选、关键词搜索
- 点击记录查看完整详情
- 支持导出历史 CSV、一键清空
⚙️ 模型管理
- 自动加载默认权重
runs/detect/train/weights/best.pt - 支持手动浏览指定任意
.pt / .onnx模型文件 - 可视化调节置信度阈值、IoU 阈值、最大检测数
- 展示模型信息与 44 类别说明
📊 指标展示
- 训练曲线:损失、mAP、Precision、Recall 全程变化
- 指标汇总:核心指标大字展示 + 柱状对比图
- 综合分析:7 维雷达图 + 学习率曲线 + P/R/F1 三线对比
技术栈
| 类别 | 技术 / 库 |
|---|---|
| 深度学习框架 | PyTorch |
| 目标检测 | Ultralytics YOLOv8 |
| 图像处理 | OpenCV(cv2) |
| 数值计算 | NumPy |
| 可视化 | Matplotlib(QtAgg 后端) |
| 桌面 UI | PyQt6 |
| 数据库 | SQLite3(Python 内置) |
| 开发语言 | Python 3.9 |
项目结构
垃圾分类检测/
├── main.py # 程序入口
├── plot_results.py # 独立指标可视化脚本
├── requirements.txt # 依赖清单
├── users.json # 用户账号(自动生成)
├── detection_history.db # 检测历史数据库(自动生成)
│
├── datasets/ # 数据集
│ ├── images/
│ │ ├── train/ # 训练图片(10,319 张)
│ │ ├── val/ # 验证图片(1,478 张)
│ │ └── test/ # 测试图片(2,964 张)
│ ├── labels/
│ │ ├── train/ # 训练标注(YOLO TXT)
│ │ ├── val/
│ │ └── test/
│ ├── garbage.yaml # YOLO 训练配置
│ ├── classify_rule.json # 细类 → 大类映射规则
│ ├── train_classes.txt # 44 类名称列表
│ └── README.md # 数据集说明
│
├── runs/
│ └── detect/
│ └── train/
│ ├── weights/
│ │ ├── best.pt # 最优模型权重(系统默认加载)
│ │ └── last.pt # 最终轮次权重
│ ├── results.csv # 训练指标日志(100 轮)
│ ├── args.yaml # 训练参数记录
│ └── charts/ # plot_results.py 输出图表
│
├── utils/ # 工具层
│ ├── styles.py # 全局 QSS 样式
│ ├── db.py # SQLite 历史数据库操作
│ └── detector.py # YOLO 检测器封装
│
└── ui/ # 界面层
├── widgets.py # 共享组件(卡片、统计块、标题)
├── login_window.py # 登录 / 注册窗口
├── main_window.py # 主窗口(顶部导航栏)
└── pages/
├── image_page.py # 图片识别页
├── video_page.py # 视频识别页
├── camera_page.py # 摄像头识别页
├── history_page.py # 检测历史页
├── model_page.py # 模型管理页
└── metrics_page.py # 指标展示页
启动教程
环境准备
Python 版本要求: Python 3.9
安装所有依赖:
pip install -r requirements.txt
如需 GPU 加速推理,请提前安装与 CUDA 版本匹配的 PyTorch,详见 pytorch.org
准备模型权重
将训练好的模型权重放置于:
runs/detect/train/weights/best.pt
系统启动时将自动加载该路径的权重。也可以在运行后于「模型管理」页面手动指定其他权重文件。
启动系统
在项目根目录执行:
python main.py
登录界面默认账号:
| 账号 | 密码 |
|---|---|
| admin | admin123 |
重新训练模型(可选)
如需在自有数据集上重新训练,在项目根目录执行:
yolo train data=datasets/garbage.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=16
训练完成后,将新权重路径在「模型管理」页面重新加载即可。
生成独立指标图表
python plot_results.py
图表将保存至 runs/detect/train/charts/,每个指标对应一张 PNG 文件。
作者信息
| 项目 | 内容 |
|---|---|
| 作者 | Jay |
| 定制联系 | vx:Jay8059 |
| 开发日期 | 2026 年 |
如需定制数据集扩充、模型微调、UI 二次开发或部署方案,欢迎联系作者。





















更多推荐
所有评论(0)