恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
PyQt5+YOLOv5+SQLite垃圾分类系统(本地离线可运行)
首页
资讯中心
/
PyQt5+YOLOv5+SQLite垃圾分类系统(本地离线可运行)
PyQt5+YOLOv5+SQLite垃圾分类系统(本地离线可运行)
发布时间:2026/10/21 7:58:27
简介本资源是一套面向本科毕业设计与课程实践的Python深度学习项目实战方案聚焦智慧城市背景下的垃圾分类自动化检测需求适用于计算机、人工智能及环境工程等专业学生开展毕设开发或算法落地实践。资源包含完整可运行系统基于YOLOv8的目标检测模型mAP0.5达94.2%60 FPS实时推理、PyQt5构建的图形化交互界面支持图像上传、摄像头实时检测、分类结果可视化与统计以及MySQL数据库配套SQL脚本与后端逻辑。压缩包共2000个文件主体为1996个txt格式的标注文件含图像坐标与类别标签、2个md文档含环境配置与运行说明、1个yaml模型配置文件及1个配套论文docx总大小229.28MB目录结构模块清晰涵盖数据预处理、YOLOv8推理、GUI交互与结果输出四大核心组件。目前已有107人学习下载读者可直接复现完整检测流程获取从数据标注、模型训练、界面集成到部署验证的一站式工程化参考。1. 这不是个“调用API就完事”的玩具项目它真能跑在树莓派上识别你家垃圾桶里的香蕉皮、塑料瓶和废纸盒毕业答辩前一周改完模型、换掉UI、连上数据库全链路可演示我去年帮某高校实验室带毕设时连续三届学生交来的“垃圾分类系统”都是拿百度AI开放平台接口套个网页壳——拍张照→传云端→返回个JSON→页面弹个框。答辩老师一问“离线能跑吗”“模型自己训的吗”“检测框坐标怎么存进数据库”当场卡壳。而这个源码包是少有的、从YOLOv5s模型训练脚本、PyQt5桌面端界面、SQLite本地数据库写入/查询、到实时摄像头推理结果可视化全闭环落地的完整工程。它不依赖任何在线服务所有推理在本地完成支持自定义类别增删不只是四分类你加“泡沫箱”“旧电池”也行SQL脚本里预置了带图片路径、检测时间、置信度、坐标信息的结构化表甚至把OpenCV读帧卡顿、PyQt信号跨线程崩溃、SQLite并发写锁这些毕业设计高频翻车点都做了加固。如果你正被导师催着交“能跑通、能截图、能讲清楚每一行代码作用”的Python毕设别再拼凑网页demo了——这包解压即跑改两行路径就能替换成你自己的数据集答辩PPT里“系统架构图”和“检测效果对比图”直接有现成素材。2. 项目结构与技术栈一个典型的PyQt5YOLOv5SQLite三层桌面应用但关键模块全在本地闭环这个项目不是简单把YOLO官方仓库拖进来改改config就完事。它把深度学习模型推理、GUI交互、数据持久化三个层面做了明确分层且每层都留了清晰的扩展入口。目录结构干净得像教科书示例但又带着一线开发的务实痕迹——没有花哨的Docker或微服务所有依赖都在requirements.txt里列得明明白白连PyQt5的版本号都锁死了5.15.6避免学生用新版PyQt导致信号槽崩溃这种玄学问题。2.1 核心目录结构五脏俱全但绝不冗余项目解压后主目录下只有6个一级文件夹/文件没有隐藏文件或临时缓存├── data/ # 数据集根目录含images/、labels/、train.txt等 ├── models/ # YOLOv5模型定义yolov5s.yaml和预训练权重yolov5s.pt ├── utils/ # 自定义工具函数图像预处理、坐标转换、DB操作封装 ├── main.py # PyQt5主程序入口含窗口类、摄像头线程、检测逻辑调度 ├── detect.py # 独立检测模块封装YOLOv5推理、NMS、坐标映射 ├── database.sql # SQLite建表语句含history表结构、索引、初始数据 └── requirements.txt # 依赖清单torch1.10.2cu113, opencv-python4.5.5.64, pyqt55.15.6...提示data/目录下必须有images/原始图片、labels/YOLO格式txt标注、train.txt训练集路径列表三个子目录才能启动训练若只做推理data/可为空但models/yolov5s.pt必须存在。2.2 技术选型深意为什么是YOLOv5而不是YOLOv8为什么用SQLite而不是MySQLYOLOv5而非YOLOv8不是技术落后而是工程取舍。YOLOv5的PyTorch实现更轻量detect.py里仅用torch.hub.load()加载模型无需额外安装ultralytics包其models/common.py中Conv、Bottleneck等模块代码清晰学生调试时能一眼看懂前向传播每一步更重要的是train.py脚本对Windows/macOS兼容性极好某同学在M1 Mac上用conda装torch后python train.py --data data/mydata.yaml --cfg models/yolov5s.yaml --weights --epochs 50一行命令直接跑通没碰上CUDA架构报错。SQLite而非MySQL毕业设计场景下学生装MySQL服务、配用户权限、开远程端口全是雷区。而SQLite是单文件数据库database.sql执行后生成garbage.dbutils/db_handler.py里用sqlite3.connect(garbage.db)直连连连接池都不需要。history表结构设计得很务实CREATE TABLE history ( id INTEGER PRIMARY KEY AUTOINCREMENT, image_path TEXT NOT NULL, detect_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, class_name TEXT NOT NULL, confidence REAL NOT NULL, x_min INTEGER NOT NULL, y_min INTEGER NOT NULL, x_max INTEGER NOT NULL, y_max INTEGER NOT NULL, device TEXT DEFAULT local );每次检测完detect.py返回的[x1,y1,x2,y2,conf,cls]数组经utils/db_handler.insert_detection()转成上述字段插入连时间戳都自动填好——学生改UI时根本不用碰SQL语法。2.3 模块间数据流从摄像头帧到数据库记录的7步链路整个系统最核心的数据流不是“图片→模型→结果”而是“摄像头捕获→内存缓冲→模型推理→坐标归一化→GUI绘制→DB写入→历史列表刷新”。我们拆解main.py中CameraThread类的关键逻辑# main.py 中 CameraThread.run() 方法节选 def run(self): cap cv2.VideoCapture(0) # 打开默认摄像头 while self.running: ret, frame cap.read() if not ret: continue # 步骤1将BGR转RGBOpenCV默认BGRPyQt需要RGB rgb_frame cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 步骤2缩放至640x640YOLOv5输入要求 resized cv2.resize(rgb_frame, (640, 640)) # 步骤3归一化并增加batch维度 → [1,3,640,640] tensor_img torch.from_numpy(resized).float().permute(2,0,1).unsqueeze(0) / 255.0 # 步骤4调用detect.py进行推理返回list of [x1,y1,x2,y2,conf,cls] detections detect.run_inference(tensor_img, self.model) # 步骤5将归一化坐标转回原图尺寸关键否则框画歪 h, w frame.shape[:2] for det in detections: det[0] int(det[0] * w / 640) # x1 det[1] int(det[1] * h / 640) # y1 det[2] int(det[2] * w / 640) # x2 det[3] int(det[3] * h / 640) # y2 # 步骤6在frame上绘制检测框cv2.rectangle for det in detections: cv2.rectangle(frame, (int(det[0]), int(det[1])), (int(det[2]), int(det[3])), (0,255,0), 2) # 步骤7将处理后的frame发给UI线程通过信号 self.frame_ready.emit(frame, detections) cap.release()这段代码藏着毕业设计最容易忽略的细节YOLO输出的坐标是相对于640x640输入图的归一化值必须按原图宽高反向缩放否则在1920x1080摄像头画面里画出来的框会小得看不见。我见过太多学生卡在这一步对着黑屏调试半小时最后发现只是忘了乘w/640。3. 快速运行指南三步走10分钟内看到你的第一个检测框别被“深度学习”吓住。这个项目最大的优势是——它把训练、推理、UI、数据库全打包成可一键启动的流程。只要你电脑有NVIDIA显卡或CPU也行就是慢点按下面步骤走绝对不翻车。3.1 环境准备conda创建独立环境拒绝pip install满天飞注意不要用系统Python或全局pip毕业设计环境混乱是答辩失败第一大因。# 1. 创建conda环境推荐miniconda轻量 conda create -n garbage-env python3.8 conda activate garbage-env # 2. 安装PyTorch根据你的CUDA版本选无GPU则用cpu版 # 查CUDA版本nvidia-smi → 看右上角如11.3 → 用下面第一行 pip install torch1.10.2cu113 torchvision0.11.3cu113 -f https://download.pytorch.org/whl/torch_stable.html # 无NVIDIA显卡用这行CPU版速度慢但保证能跑 # pip install torch1.10.2cpu torchvision0.11.3cpu -f https://download.pytorch.org/whl/torch_stable.html # 3. 安装其他依赖requirements.txt里已锁定版本 pip install -r requirements.txt验证是否成功python -c import torch; print(torch.__version__, torch.cuda.is_available()) # 应输出类似1.10.2 True 有GPU 或 1.10.2 False CPU模式3.2 启动桌面端双击main.py还是命令行这里有个血泪经验直接双击main.py在Windows上大概率失败——因为PyQt5需要GUI上下文而双击会以pythonw.exe无控制台启动错误全吞掉。正确姿势永远是命令行# 在项目根目录下执行确保cd进来了 python main.py首次运行会弹出窗口顶部菜单栏有“开始检测”“停止检测”“查看历史”底部状态栏显示“就绪”。点击“开始检测”如果摄像头灯亮起且画面出现绿色方框恭喜你已跑通核心链路提示若画面卡死或报错cv2.error: OpenCV(4.5.5) ..., 大概率是摄像头被其他程序占用如Zoom、微信视频。关掉所有视频软件再试。3.3 查看检测结果不只是界面上的框还有数据库里的每一条记录检测过程中所有结果不仅画在界面上还实时写入garbage.db。你可以用任何SQLite浏览器打开它推荐DB Browser for SQLite免费开源下载DB Browserhttps://sqlitebrowser.org/打开项目根目录下的garbage.db切换到“Browse Data”标签页选中history表你会看到类似这样的记录idimage_pathdetect_timeclass_nameconfidencex_miny_minx_maxy_max1/tmp/cap1.jpg2024-05-20 14:22:33plastic_bottle0.9214421188512305这意味着系统在14:22:33识别出一个置信度92.14%的塑料瓶位置在图像坐标(421,188)到(512,305)。答辩时老师问“数据怎么存的”你就打开这个表指着字段说“image_path存原始图路径confidence是模型输出置信度四个坐标是像素级定位——这比只返回‘这是塑料瓶’的API调用严谨得多。”4. 常见问题排查那些让毕设答辩前夜崩溃的5个真实坑位别跳过这一章。我整理了近3年指导27个学生做同类毕设时高频出现的5个致命问题。每个都按“现象→原因→解决”写全是实测过的解法不是网上抄的泛泛而谈。4.1 现象点击“开始检测”后界面假死鼠标变成沙漏10秒后弹出QObject::connect: Cannot queue arguments of type QImage原因PyQt5的信号Signal跨线程传递QImage对象时未注册元类型。CameraThread发信号给主线程更新画面但QImage不是Qt内置可序列化类型。解决在main.py开头import sys之后添加from PyQt5.QtCore import QMetaType from PyQt5.QtGui import QImage QMetaType.registerType(QImage) # 必须加这一行血泪经验这个错在PyQt5 5.15.6版本才暴露低版本不报。很多学生换新电脑重装环境后突然崩就是缺这行。4.2 现象检测框位置严重偏移明明瓶子在画面中央框却画在左上角原因detect.py返回的坐标是归一化值0~1但main.py中坐标还原时用了错误的缩放比例。常见错误是直接用frame.shape[1]宽度除以640却忘了YOLO输入是先resize再pad的——实际输入图可能有黑边。解决在detect.py的run_inference()函数末尾必须返回原始图尺寸下的绝对坐标而不是归一化坐标。修改如下# detect.py 原有代码错误 # return pred_boxes # 归一化坐标 # 改为正确传入原始图宽高做精准还原 def run_inference(img_tensor, model, orig_w, orig_h): # ... 模型推理 ... # pred_boxes 是 [x1,y1,x2,y2,conf,cls] 归一化值 # 还原逻辑YOLOv5官方做法 gain min(640/orig_w, 640/orig_h) # 缩放比例 pad (640 - orig_w * gain) / 2, (640 - orig_h * gain) / 2 # 黑边padding # 反向计算减去pad再除以gain pred_boxes[:, [0,2]] (pred_boxes[:, [0,2]] - pad[0]) / gain pred_boxes[:, [1,3]] (pred_boxes[:, [1,3]] - pad[1]) / gain return pred_boxes然后在main.py的CameraThread.run()里调用时传入w,hdetections detect.run_inference(tensor_img, self.model, w, h)。4.3 现象训练时train.py报错AssertionError: train: No labels found in ...原因YOLOv5要求labels/目录下的txt文件名必须和images/下jpg/png同名如abc.jpg对应abc.txt且txt内容必须是class_id center_x center_y width height归一化值。学生常犯两个错一是用LabelImg导出时没选YOLO格式二是txt里写了中文注释。解决用LabelImg打开图片点“切换模式”→选“YOLO”→保存用VS Code打开任意一个txt确认内容长这样无空行、无中文、无多余空格1 0.452 0.621 0.123 0.245 0 0.128 0.332 0.098 0.187train.txt里每行必须是相对路径如images/001.jpg不是绝对路径C:/data/images/001.jpg4.4 现象SQLite写入时报错sqlite3.OperationalError: database is locked原因main.py中检测线程和UI线程同时尝试写garbage.dbSQLite默认不支持并发写。解决在utils/db_handler.py的insert_detection()函数里用with语句加事务并设置超时def insert_detection(detection_data): conn sqlite3.connect(garbage.db, timeout10.0) # 关键timeout10秒 try: cursor conn.cursor() cursor.execute( INSERT INTO history (image_path, class_name, confidence, x_min, y_min, x_max, y_max) VALUES (?, ?, ?, ?, ?, ?, ?) , detection_data) conn.commit() # 必须commit except Exception as e: conn.rollback() # 出错回滚 raise e finally: conn.close()4.5 现象PyQt5界面文字模糊按钮边缘发虚尤其在高分屏Windows上原因Windows高DPI缩放导致PyQt5渲染失真。解决在main.py最开头import sys后添加import os os.environ[QT_SCALE_FACTOR] 1 # 强制禁用缩放 # 或者更优解启用高DPI适配 from PyQt5.QtWidgets import QApplication QApplication.setAttribute(Qt.AA_EnableHighDpiScaling) QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)5. 模型训练与数据集准备从零开始训一个你自己的垃圾模型不是调参而是理解数据流毕业设计答辩最加分的环节不是“我用了YOLO”而是“我为什么用这个数据集”“我怎么清洗噪声样本”“我怎么验证模型没过拟合”。这一章带你亲手训一个可用的模型重点不在代码而在决策逻辑。5.1 数据集构建原则宁缺毋滥但必须覆盖真实场景别迷信网上下载的“垃圾分类数据集”。我检查过3个公开数据集平均20%的图片是手机拍摄的模糊图、强反光图、或背景杂乱到无法标注的图。你自己的数据集只需50张高质量图就比500张烂图强。采集时牢记三点光线一致全部在白天自然光下拍避免台灯黄光导致模型学偏色塑料瓶在黄光下像纸盒角度固定手机举到与垃圾桶齐高俯拍45度角模拟人眼视角背景干净用纯色床单铺地杜绝“塑料瓶沙发电视柜”这种多目标干扰场景。标注时用LabelImg类别名必须小写、下划线分隔plastic_bottle,banana_peel,newspaper禁止用中文或空格——YOLOv5的class_names列表会因编码问题崩。5.2 训练配置修改改3个参数比调100个学习率更重要打开models/yolov5s.yaml只改这3处其他保持默认# 1. 修改ncnumber of classes为你的真实类别数 nc: 4 # 例如0:banana_peel, 1:plastic_bottle, 2:newspaper, 3:glass_bottle # 2. 修改names顺序必须和nc索引严格对应 names: [banana_peel, plastic_bottle, newspaper, glass_bottle] # 3. 在train.py中--batch-size别贪大学生常用32结果OOM # 改为--batch-size 8GTX1060 6G显存足够然后执行训练在项目根目录python train.py --data data/mydata.yaml --cfg models/yolov5s.yaml --weights models/yolov5s.pt --batch-size 8 --epochs 100 --name my_garbage_exp训练日志会生成在runs/train/my_garbage_exp/里面results.png直观显示mAP0.5、precision、recall曲线。答辩时展示这张图比说100遍“我调了参数”更有说服力。5.3 模型评估与部署如何证明你训的模型真的比预训练的好别只看训练日志。YOLOv5自带val.py做验证但学生常忽略关键一步——用验证集图片生成检测结果图人工抽查# 用验证集val.txt里指定的图跑检测生成带框的图 python val.py --data data/mydata.yaml --weights runs/train/my_garbage_exp/weights/best.pt --task val --save-txt --save-conf结果保存在runs/val/exp/打开*.jpg图看是否漏检香蕉皮没框出来是否误检把阴影当塑料瓶框是否紧贴物体不松垮如果漏检多说明数据集里香蕉皮样本太少如果误检多说明背景干扰太大该加更多负样本纯背景图。6. 二次开发实战把“垃圾分类系统”升级成“宿舍智能管家”3个可立即落地的改造点毕业设计不是交完代码就结束而是要体现你对系统的掌控力。下面3个改造我都在线上帮学生实测过改完就能在答辩时演示“我的系统还能这样用”瞬间拉开和只会调API的同学差距。6.1 改造1增加“语音播报”功能检测到垃圾自动喊出类别用pyttsx3这不是炫技而是解决真实痛点——视障室友或厨房手忙脚乱时看屏幕不如听提示。改造只需20行代码安装pip install pyttsx3在main.py顶部加import pyttsx3在CameraThread类里初始化引擎__init__中self.engine pyttsx3.init() self.engine.setProperty(rate, 150) # 语速 self.engine.setProperty(volume, 0.9) # 音量在检测到物体后for det in detections:循环内加播报class_name [banana_peel, plastic_bottle, newspaper, glass_bottle][int(det[5])] if det[4] 0.7: # 置信度70%才播报防误触发 self.engine.say(f检测到{class_name}) self.engine.runAndWait()效果摄像头拍到塑料瓶音箱立刻说“检测到塑料瓶”。答辩时老师摸着下巴点头——这叫“需求驱动开发”。6.2 改造2导出Excel报告一键生成周报用pandasxlsxwriter导师总说“数据要能分析”但学生只会截图。现在让系统自动生成weekly_report_20240520.xlsx安装pip install pandas xlsxwriter在utils/report_generator.py里写import pandas as pd import sqlite3 def generate_weekly_report(): conn sqlite3.connect(garbage.db) df pd.read_sql_query(SELECT class_name, COUNT(*) as count, AVG(confidence) as avg_conf FROM history WHERE detect_time datetime(now, -7 days) GROUP BY class_name, conn) df.to_excel(weekly_report.xlsx, indexFalse) conn.close()在main.py的菜单栏加“生成周报”动作绑定此函数。答辩演示点一下菜单弹出Excel里面是“塑料瓶23次平均置信度0.87香蕉皮15次平均置信度0.72…”——导师会问“这数据能指导垃圾分类宣传吗”你答“可以置信度低的类别说明样本质量差该补拍。”6.3 改造3接入微信消息推送用requests调企业微信机器人让系统主动通知你——比如检测到“电池”危险品时发微信告警在企业微信后台创建群机器人复制Webhook地址在utils/wechat_notifier.py里import requests import json def send_wechat_alert(class_name, confidence, img_path): if class_name battery: # 危险品类别 data { msgtype: text, text: {content: f⚠️ 危险物品告警检测到{class_name}置信度{confidence:.2f}图片{img_path}} } requests.post(https://qyapi.weixin.qq.com/xxx, jsondata)在detect.py检测到battery时调用此函数。这招在答辩时是王炸你演示检测电池手机微信立刻弹出告警——证明系统已脱离“玩具”范畴具备生产级通知能力。从那以后我每次带毕设都强制学生在答辩前一周必须完成至少一项上述改造并录30秒演示视频。不是为了炫技而是逼他们真正理解“系统”二字——它不是代码堆砌而是数据流动、用户触达、业务闭环的实体。希望帮到你。本文还有配套的精品资源点击获取