生活垃圾分类可视化大屏
基于 Python 的桌面端智能识别与可视化系统:融合深度学习目标检测/实例分割、桌面 GUI、ECharts 数据分析与本地归档存储,实现生活垃圾多目标识别、分割展示、准确率分析与可视化大屏展示。
目录
-
[所用 Python 算法与原理](#所用 Python 算法与原理)
一、项目简介
本程序面向「生活垃圾分类」场景,提供从 图像/视频输入 → 深度学习推理 → 可视化标注 → 统计分析 → 日志归档 的完整闭环。界面采用大屏风格,顶部图标导航切换各功能页,适合演示、课程设计与二次开发。
核心能力一句话概括:
用 YOLO 实例分割识别画面中的多个生活垃圾目标,画出检测框并标注分类与准确率,再通过 ECharts 对当前(或历史)结果做多维度可视化分析,结果自动按日期保存到文件与 SQLite。
二、功能说明
2.1 功能模块一览
| 页面/模块 | 功能要点 |
|---|---|
| 智能识别 | 上传图片/视频;多目标检测 + 实例分割;检测框、分类名、准确率;分割裁剪图;缩放/旋转/拖拽 |
| 日志记录 | 操作日志检索;当日结果图列表与预览;打开日志目录;清空日志 |
| 数据分析 | ECharts 多图看板;「仅当前结果」/「结合历史」双模式;随机或全量图表组合 |
| 参数配置 | 模型路径、设备、置信度/IoU、存储目录、数据库路径等 |
| 主题样式 | 主题配色、字体字号、顶栏/按钮/表格等尺寸;即时预览与保存 |
| 自动归档 | 原图、结果图、裁剪图、参数 JSON、日志按日期落盘,并写入 SQLite |
2.2 生活垃圾四分类
系统最终展示的分类为:
| 类别 | 典型含义 | 界面配色(示意) |
|---|---|---|
| 可回收物 | 瓶、杯、书、电子设备等 | 绿色 |
| 有害垃圾 | 有害相关物品等 | 红色 |
| 厨余垃圾 | 果蔬、食品等 | 黄色 |
| 其他垃圾 | 其余或未明确映射类别 | 灰色 |
默认模型为通用 COCO 预训练权重时,通过 类别名映射规则 将检出物体归入上述四类;接入自训练权重后可直接输出四类名称。
2.3 识别结果图上显示的内容
-
彩色 检测方框(白边 + 彩色框 + 角点)
-
垃圾分类名称 与 准确率(置信度 %)
-
原始检测类别名与目标序号
-
半透明 实例分割掩膜
-
单目标 分割裁剪图(棋盘格背景突出前景)
三、基础框架与技术架构
3.1 总体分层
┌─────────────────────────────────────────────────────────┐
│ 表现层(PyQt5) │
│ 顶部导航 · 智能识别 · 日志 · 数据分析 · 配置 · 样式 │
├─────────────────────────────────────────────────────────┤
│ 业务核心层(core/) │
│ 检测器 · 配置 · 存储 · 日志 · 数据库 · 图表数据组装 │
├─────────────────────────────────────────────────────────┤
│ 算法/引擎层 │
│ Ultralytics YOLO-Seg · PyTorch · OpenCV · Pillow │
│ ECharts / ecStat(经 QWebEngineView 渲染) │
├─────────────────────────────────────────────────────────┤
│ 持久化层 │
│ SQLite · JSON 配置 · 按日期文件系统(images/results/logs)│
└─────────────────────────────────────────────────────────┘
3.2 基础框架说明
| 层次 | 框架/库 | 在本项目中的作用 |
|---|---|---|
| GUI 基础框架 | PyQt5 | 主窗口、多页面、控件、样式表(QSS)、信号槽、后台线程 QThread |
| 内嵌浏览器 | PyQtWebEngine | 在桌面内加载本地 HTML,渲染 ECharts 看板 |
| 深度学习框架 | PyTorch | YOLO 模型底层张量计算与推理(CPU/CUDA) |
| 检测封装框架 | Ultralytics | 加载权重、统一 predict 接口,输出 boxes / masks / conf / cls |
| 图像算法库 | OpenCV / NumPy / Pillow | 读写图像、掩膜处理、叠加、中文标注绘制 |
| 可视化引擎 | Apache ECharts 5 + echarts-stat | 面积/柱/饼/环/雷达/散点/盒须/回归等图表 |
| 本地数据库 | SQLite3(Python 标准库) | 识别记录、操作日志、参数历史 |
| 配置管理 | JSON | config/settings.json 持久化运行参数与 UI 参数 |
3.3 技术栈汇总
| 类别 | 技术 |
|---|---|
| 语言 | Python 3(建议 3.10+) |
| 界面 | PyQt5、PyQtWebEngine、自定义 QSS 主题 |
| AI | PyTorch、Ultralytics YOLOv8-Seg |
| 图像 | OpenCV、Pillow、NumPy |
| 图表 | ECharts、ecStat |
| 存储 | SQLite、JSON、按日目录归档 |
| 并发 | QThread 异步推理,避免界面卡顿 |
3.4 关键数据流
用户上传图片/视频
↓
DetectWorker(QThread)解码帧
↓
WasteDetector.predict_image()
↓
YOLO 推理 → boxes + masks + confidence + class
↓
类别映射(COCO→四分类)→ 绘制框/标签/掩膜 → 裁剪分割图
↓
界面展示 + Storage 按日期存盘 + Database 写记录 + Logger 写日志
↓
ChartPage 读取「当前结果」或「当前+历史」→ 生成 ECharts HTML → WebEngine 显示
四、所用 Python 算法与原理
本节说明程序中真正用到的 算法/方法,以及它们在代码中的位置与作用。
4.1 目标检测与实例分割:YOLOv8-Seg
算法类型: 单阶段深度学习目标检测 + 实例分割(Instance Segmentation)
原理要点:
-
输入图像经骨干网络提取特征;
-
检测头输出每个目标的边界框(Bounding Box)、类别与置信度;
-
分割头输出与目标对应的像素级掩膜(Mask);
-
推理阶段结合 置信度阈值(conf) 过滤低分框,用 IoU / NMS 抑制重叠框。
本项目用法:
-
默认权重:
yolov8n-seg.pt(轻量分割模型) -
调用:
ultralytics.YOLO(...).predict(source, conf, iou, max_det) -
输出解析:
result.boxes(xyxy、cls、conf)、result.masks(实例掩膜) -
实现文件:
core/detector.py→WasteDetector
4.2 非极大值抑制与阈值过滤(NMS / Confidence)
算法类型: 经典检测后处理
| 参数 | 含义 | 界面可调 |
|---|---|---|
confidence |
低于该置信度的检测丢弃 | 是 |
iou |
NMS 中重叠框合并/抑制阈值 | 是 |
max_det |
单图最多保留目标数 | 是 |
由 Ultralytics 在 predict 内完成;业务层只传入阈值。
4.3 类别映射算法(规则映射)
算法类型: 基于字典/别名的规则分类(非再训练)
当使用 COCO 预训练模型时,将检出英文类名映射到生活垃圾四类,例如:
-
bottle/cup/book/cell phone→ 可回收物 -
banana/apple/pizza等 → 厨余垃圾 -
hair drier等 → 有害垃圾 -
未命中规则 → 其他垃圾
同时支持中文类名、英文别名(如 recyclable、kitchen)直接归一。 实现:WasteDetector._map_category()。
说明:这是工程上的 后处理映射。若要提高真实垃圾场景精度,应使用专用数据集训练 YOLO,使模型直接输出四类。
4.4 掩膜可视化与图像合成
算法类型: 图像处理 / Alpha 混合
-
将实例掩膜缩放到原图尺寸;
-
按类别颜色填充 overlay;
-
cv2.addWeighted(overlay, α, base, 1-α)半透明叠加; -
再绘制检测框与文字,避免标签被半透明层冲淡。
参数 mask_alpha 控制分割透明度。
4.5 分割目标裁剪与棋盘格背景
算法类型: 基于掩膜的 ROI 提取 + 背景合成
-
按 bbox 裁剪;
-
仅保留 mask 前景像素;
-
背景用棋盘格填充,便于观察分割边界;
-
轮廓描边强化边缘。
4.6 中文标注绘制
算法类型: 光栅文字渲染(Pillow)
OpenCV 默认字体不支持中文,因此:
-
BGR → RGB;
-
Pillow
ImageDraw+ 系统字体(如微软雅黑); -
绘制带背景色的标签块;
-
再转回 BGR。
4.7 视频抽帧识别策略
算法类型: 时序下采样 + 最优帧选择(启发式)
-
读取视频帧率 FPS;
-
按「视频抽帧 FPS」计算采样间隔;
-
对采样帧分别推理;
-
选取检出目标数量最多的一帧作为展示与保存结果。
适用于演示场景,避免逐帧全量推理过慢。
4.8 准确率(置信度)统计分析
算法类型: 描述性统计 + 分档评估
对单次识别结果的置信度列表计算:
-
均值 / 最小 / 最大;
-
高(≥70%)、中(45%~70%)、低(<45%)计数;
-
给出等级(优秀/良好/一般/较差)与文字建议。
此处「准确率」在工程上展示的是模型 置信度 Confidence,用于衡量检测可信程度;若有人工标注真值,可另行计算 Precision/Recall/mAP。
4.9 数据分析侧的聚合与统计
实现于 core/chart_data.py 与 ui/echarts_builder.py:
| 方法 | 说明 |
|---|---|
| 计数聚合 | Counter 统计各类别目标数 |
| 分组聚合 | 按类别收集置信度列表 |
| 分箱(Binning) | 将置信度划入 0--20%...80--100% 区间,用于堆叠面积图 |
| 漏斗过程 | 原始目标 → 有效检测 → 完成分类 → 高置信保留 |
| 五数概括 | 最小值、Q1、中位数、Q3、最大值 → 盒须图 |
| 线性回归 | 前端 echarts-stat 对「目标序号--准确率」做一元线性回归 |
| 雷达映射 | 将类别占比、平均准确率、高置信占比映射为 AQI 风格雷达指标 |
4.10 双模式分析策略
| 模式 | 算法数据来源 | 默认 |
|---|---|---|
| 仅当前识别结果 | 内存中本轮 DetectResult.objects |
是 |
| 结合历史记录 | 当前结果 ∪ SQLite detect_records.details(不足则用类别计数字段近似展开) |
否 |
4.11 界面与系统侧算法/机制
| 机制 | 说明 |
|---|---|
| 异步推理 | QThread + 信号槽,推理不阻塞 UI |
| 主题样式 | 配置驱动生成 QSS;多主题色板 |
| 随机组合图表 | random.Random(seed) 从 11 种 ECharts 类型中抽取布局 |
| 日期归档 | 按 YYYY-MM-DD 创建子目录存储 |
五、环境与依赖
5.1 运行环境
-
操作系统:Windows 10/11(主要验证平台)
-
Python:3.10+ 推荐
-
可选:NVIDIA GPU + CUDA(配置中设备选
cuda) -
首次运行需联网下载 YOLO 权重(若本地尚无)
5.2 Python 依赖(requirements.txt)
PyQt5>=5.15.0
PyQtWebEngine>=5.15.0
torch>=2.0.0
ultralytics>=8.0.0
opencv-python>=4.8.0
matplotlib>=3.7.0
Pillow>=10.0.0
numpy>=1.24.0
| 包名 | 用途 |
|---|---|
| PyQt5 | 桌面 GUI 基础框架 |
| PyQtWebEngine | 内嵌网页渲染 ECharts |
| torch | 深度学习计算后端 |
| ultralytics | YOLO 训练/推理框架封装 |
| opencv-python | 图像与视频处理 |
| Pillow | 中文标注与图像转换 |
| numpy | 数组与数值计算 |
| matplotlib | 历史兼容/辅助(主看板已用 ECharts) |
前端静态资源(无需 pip):
-
assets/echarts/echarts.min.js -
assets/echarts/ecStat.min.js
六、安装与启动
6.1 进入项目目录
cd python2
6.2 安装依赖
pip install -r requirements.txt
若使用 GPU,请另行安装与本机 CUDA 匹配的 PyTorch 版本(参见 PyTorch 官网)。
6.3 启动程序
python main.py
或:
py -3 main.py
入口文件 main.py 会:
-
将项目根目录加入
sys.path; -
在创建 QApplication 之前 导入
QtWebEngineWidgets(WebEngine 硬性要求); -
加载配置与字体;
-
打开主窗口并进入事件循环。
七、使用方式与操作流程
7.1 界面导航
顶部图标按钮(无侧边栏):
-
🔍 智能识别
-
📋 日志记录
-
📊 数据分析
-
⚙️ 参数配置
-
🎨 主题样式
窗口大小会按屏幕可用区域自适应。
7.2 推荐完整操作流程
① 启动 python main.py
↓
②(可选)参数配置:模型路径、存储目录、cpu/cuda、默认阈值
↓
③(可选)主题样式:字号/主题调到适中并保存
↓
④ 智能识别:上传图片或视频 → 调整置信度等 → 开始识别
↓
⑤ 查看「分割结果」:确认方框、分类名、准确率、掩膜
↓
⑥ 点击列表/缩略图 →「分割目标」查看单目标分割图
↓
⑦(可选)显示全部信息 / 保存结果
↓
⑧ 数据分析:默认「仅当前结果」刷新看板;需要时改「结合历史」
↓
⑨ 日志记录:检索操作、预览当日归档结果图
7.3 智能识别页详解
| 操作 | 说明 |
|---|---|
| 上传图片 | 支持 jpg/png/bmp/webp 等 |
| 上传视频 | 支持 mp4/avi/mov/mkv 等;抽帧识别 |
| 置信度/IoU/最大检测数 | 直接影响检出数量与框质量 |
| 分割透明度 | 掩膜叠加强度 |
| 视频抽帧 FPS | 越大抽帧越密、越慢 |
| 开始识别 | 后台线程推理 |
| 完整分割图 | 切回整图结果标签 |
| 显示全部信息 | 弹窗展示全部目标与分割图 |
| 保存结果 | 额外手动保存当前结果图 |
图片查看器支持:滚轮缩放、拖拽平移、左转/右转/复位。
7.4 数据分析页详解
模式:
| 选项 | 含义 | 默认 |
|---|---|---|
| 仅当前识别结果 | 只分析本轮识别目标 | ✅ |
| 结合历史记录分析 | 当前 ∪ 数据库历史明细 | ❌ |
图表:
可随机组合或一次显示全部,类型包括:渐变堆叠面积、带背景柱状、标签旋转柱状、嵌套环形、饼图纹理、数据聚合、聚合过程漏斗、线性回归、单轴散点、AQI 雷达、盒须图。
7.5 日志 / 配置 / 样式
-
日志:关键词搜索、刷新、清空库内日志、打开日志目录、预览当日结果图。
-
配置 :路径与模型参数保存到
settings.json,并可重新加载模型。 -
样式:主题与字号即时预览,保存后全局生效。
八、数据存储与配置
8.1 目录约定(按日期划分)
data/
├── images/YYYY-MM-DD/ # 原图备份
├── results/YYYY-MM-DD/ # 标注结果图
│ └── crops/ # 单目标分割裁剪
├── logs/YYYY-MM-DD/ # app.log、参数 JSON 快照
├── charts/dashboard.html # 最近一次 ECharts 看板
└── waste_classify.db # SQLite 数据库
8.2 SQLite 表
| 表名 | 用途 |
|---|---|
detect_records |
识别记录(路径、目标数、平均置信度、类别 JSON、明细 JSON、参数 JSON) |
operation_logs |
操作日志 |
param_history |
参数历史快照 |
8.3 配置文件
-
路径:
config/settings.json -
内容:模型、阈值、设备、各存储目录、UI 主题字号、图表相关参数等
模型文件默认:models/yolov8n-seg.pt
九、项目目录结构
python2/
├── main.py # 程序入口
├── requirements.txt # Python 依赖
├── README.md # 本说明文档
├── config/settings.json # 运行配置
├── assets/echarts/ # ECharts / ecStat
├── models/ # YOLO 权重
├── core/ # 业务与算法核心
│ ├── config.py # 配置与日期目录
│ ├── detector.py # YOLO 检测分割与标注
│ ├── database.py # SQLite
│ ├── logger.py # 双写日志
│ ├── storage.py # 文件归档
│ └── chart_data.py # 分析数据组装
├── ui/ # 界面层
│ ├── main_window.py # 主窗口
│ ├── nav_bar.py # 顶部导航
│ ├── detect_page.py # 识别页
│ ├── log_page.py # 日志页
│ ├── chart_page.py # 数据分析页
│ ├── echarts_builder.py # ECharts HTML 生成
│ ├── settings_page.py # 参数配置
│ ├── style_page.py # 主题样式
│ ├── theme.py # 主题与 QSS
│ └── widgets/image_viewer.py # 图片查看器
└── data/ # 运行时数据
十、自定义模型
-
准备 Ultralytics 兼容的
.pt权重(建议分割模型以获得掩膜)。 -
打开 参数配置 → 选择模型文件 → 保存。
-
点击 重新加载模型。
-
若类别名为四类中文名或其别名,将直接使用;否则走 COCO 映射逻辑。
十一、常见问题
Q:第一次启动很慢? A:正在加载或下载 YOLO 权重,请保持网络畅通;之后使用本地 models/ 缓存。
Q:数据分析没有数据? A:默认只看「当前识别结果」。请先识别成功,再进入数据分析刷新;或切换「结合历史记录」。
Q:检出类别不准? A:默认是通用 COCO 模型 + 规则映射,适合演示。正式垃圾分类请换专用训练权重。
Q:中文标签乱码/方框? A:需系统存在中文字体(如微软雅黑)。程序会自动尝试常见字体路径。
Q:如何用 GPU? A:安装 CUDA 版 PyTorch,配置中设备选 cuda 并重新加载模型。
Q:视频很慢? A:降低抽帧 FPS,或提高置信度阈值减少后处理目标数。
Q:ECharts 页面空白? A:确认已安装 PyQtWebEngine,且 assets/echarts/ 下 JS 文件完整;main.py 需在创建应用前导入 WebEngine。
十二、快速开始
pip install -r requirements.txt
python main.py
最短演示路径:
-
打开「智能识别」→ 上传一张含瓶/水果等物体的图片 → 开始识别;
-
在「分割结果」中查看方框、分类与准确率;
-
打开「数据分析」(默认仅当前结果)查看 ECharts 组合图;
-
在「日志记录」中确认当日结果已归档。
附录:算法与框架对照速查
| 需求 | 采用的基础框架/库 | 采用的算法/方法 |
|---|---|---|
| 桌面界面 | PyQt5 | 信号槽、QThread、QSS |
| 多目标检测+分割 | PyTorch + Ultralytics | YOLOv8-Seg、NMS、置信度过滤 |
| 四分类展示 | 纯 Python 规则 | 字典/别名映射 |
| 画框与中文标签 | OpenCV + Pillow | 几何绘制、字体栅格化、Alpha 混合 |
| 视频处理 | OpenCV | 抽帧、最优帧启发式选择 |
| 统计分析 | collections / 自研聚合 | 计数、分箱、分位、漏斗 |
| 可视化大屏 | ECharts + WebEngine | 多种图表 + 线性回归插件 |
| 持久化 | SQLite + JSON + 文件系统 | 按日期归档 |
说明
本项目适用于学习、演示与课程设计。默认预训练模型并非专用垃圾数据集训练,真实投放前建议使用标注好的生活垃圾数据微调 YOLO,以提升分类与分割精度。






