ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

YOLOv5垃圾检测PyQt可视化系统:轻量部署与工程落地实践

YOLOv5垃圾检测PyQt可视化系统:轻量部署与工程落地实践 简介本资源是一套开箱即用的YOLOv5垃圾目标检测完整实践方案面向计算机视觉初学者、AI项目开发者及环境监测类课程实践者聚焦城市垃圾分类识别这一典型工业落地场景。资源包含训练完成的高精度检测模型mAP超90%支持瓶子、罐子、烟头、餐盒、易拉罐、垃圾袋等8类常见垃圾识别并配套标注完备的双格式数据集txt与xml、PR/Loss曲线可视化结果及PyQt封装的图形化检测界面便于快速部署与交互验证。压缩包共2000个文件主体为1858个标签文件用于监督训练、61张实拍测试图像、34个Python脚本含训练/推理/界面逻辑、28个配置yaml及shell启动脚本整体体积213.62MB结构分层明确适配PyTorch环境一键运行。目前已有278人学习下载提供从数据准备、模型调用到GUI交互的全链路代码与成果显著降低YOLOv5在环保检测领域的复现门槛。1. 这不是又一个YOLOv5 demo它把垃圾检测从训练命令行推进到了可交付的PyQt界面你手头有一批带烟头、易拉罐、餐盒、垃圾袋的现场图片想快速验证检测效果——但不想每次改路径、调参数、看控制台输出你想让物业人员、环卫督导员、甚至中学生志愿者点开就用上传图/选摄像头/点检测结果直接框出来、类别标清楚、置信度数字写明白你更需要的不是“能跑”而是“能交出去”。这个资源正是为此而生它不只提供mAP 90%的YOLOv5s权重best.pt还包含完整标注数据集txtXML双格式、PR/Loss曲线可视化脚本、以及一个真正可独立运行的PyQt5图形界面。所有模块共用同一Python环境无需额外编译或DLL依赖python main.py启动即用。它面向的是需要快速落地的课程设计、社区治理小系统、环保类毕设以及希望跳过环境踩坑、直奔业务逻辑的算法工程师。2. YOLOv5垃圾检测模型的结构适配与数据集工程实践2.1 为什么是YOLOv5s而非YOLOv8或YOLOv10轻量与精度的实测平衡点该资源选用YOLOv5ssmall作为主干并非因版本陈旧而是基于垃圾检测场景的明确约束部署端多为边缘设备如Jetson Nano、树莓派4B或低配笔记本推理延迟需控制在300ms内同时目标尺度集中于20×20至300×300像素烟头最小、垃圾袋最大对小目标召回率要求高。我们对比了YOLOv5s/v5m/v5l在自建验证集上的表现模型mAP0.5推理耗时RTX 3060参数量M小目标召回率64×64YOLOv5s0.91212.3 ms7.20.861YOLOv5m0.92821.7 ms21.20.893YOLOv5l0.93538.4 ms46.50.907提示YOLOv5s在mAP仅比l版低2.3个百分点的前提下推理速度提升超3倍参数量压缩至1/6更适合嵌入式部署。YOLOv8虽支持更灵活的损失函数但其默认anchor策略对密集小目标如散落烟头泛化性反而略逊——本项目实测v5s在测试集上漏检率比v8n低1.2%。2.2 垃圾类别定义与标签格式双轨制txt与XML如何协同支撑训练与校验数据集共含1276张图像覆盖6类垃圾bottle塑料瓶、can金属罐、cigarette烟头、takeout_box餐盒、aluminum_can易拉罐、garbage_bag垃圾袋。关键设计在于标签双轨存储labels_txt/下为YOLO标准格式归一化坐标0 0.421 0.583 0.124 0.096 # bottle, x_center y_center width height 2 0.715 0.322 0.087 0.063 # cigarettelabels_xml/下为PASCAL VOC格式像素坐标object namecigarette/name bndbox xmin523/xminymin211/ymin xmax587/xmaxymax249/ymax /bndbox /object这种设计并非冗余而是为不同环节服务labels_txt/直接喂给YOLOv5训练脚本train.py无需转换labels_xml/用于人工校验用LabelImg打开可直观比对、生成COCO格式评估报告、以及后续迁移到其他框架如Detectron2双格式一致性由utils/validate_labels.py强制校验运行以下命令可批量检查python utils/validate_labels.py --img_dir datasets/images --txt_dir datasets/labels_txt --xml_dir datasets/labels_xml注意该脚本会输出所有坐标偏差5像素的样本ID并生成mismatch_report.csv。实测发现1276张图中仅3张存在轻微偏差源于标注员缩放误差已人工修正。2.3 训练配置的关键参数解析为何batch_size16、epochs300、lr00.01是收敛最优解训练使用data/garbage.yaml配置文件核心参数经网格搜索确定train: ../datasets/images/train val: ../datasets/images/val nc: 6 names: [bottle, can, cigarette, takeout_box, aluminum_can, garbage_bag]训练命令为python train.py --img 640 --batch 16 --epochs 300 --data data/garbage.yaml --weights yolov5s.pt --name garbage_yolov5s --cache--batch 16在单卡RTX 306012GB显存下batch16可使GPU利用率稳定在92%~95%显存占用10.2GB若设为32显存溢出设为8则梯度更新太频繁loss震荡加剧。--epochs 300loss曲线显示280 epoch后val_loss进入平台期继续训练仅使mAP提升0.003但过拟合风险上升val_mAP下降0.008。--cache启用内存缓存后每个epoch训练时间从482s降至315s因1276张图全部加载进RAM避免I/O瓶颈。训练过程生成的results.png包含四条关键曲线见下表其中metrics/mAP_0.5达0.912metrics/precision与metrics/recall在0.85以上证明模型具备高精度与高召回双重能力曲线类型关键拐点物理意义train/box_loss120 epoch后趋平定位损失收敛边界框回归稳定val/cls_loss220 epoch后0.08类别分类置信度充分metrics/mAP_0.5280 epoch达峰值0.912IoU0.5时的平均精度上限fitness275 epoch达0.901综合评分0.5×mAP 0.25×precision 0.25×recall3. PyQt5界面的模块化实现与实时检测逻辑封装3.1 界面架构三层分离设计UI层/逻辑层/模型层保障可维护性PyQt界面代码位于main.py采用清晰的三层结构UI层Ui_MainWindow类纯界面定义由Qt Designer生成不含任何业务逻辑逻辑层MainWindow类继承QMainWindow负责信号绑定、事件响应、状态管理模型层Detector类独立于GUI封装YOLOv5推理全流程支持CPU/GPU自动切换。这种分离使修改检测逻辑如换模型、加后处理无需触碰UI代码。例如当需增加NMS阈值调节滑块时只需在MainWindow.__init__()中添加self.nms_slider QSlider(Qt.Horizontal) self.nms_slider.setRange(30, 70) # 0.3~0.7 self.nms_slider.setValue(50) self.nms_slider.valueChanged.connect(self.update_nms_threshold) # ... 后续在update_nms_threshold中调用detector.set_nms_iou()3.2 实时检测的核心流程从OpenCV读帧到PyQt绘图的零拷贝优化检测流程严格遵循“读取→预处理→推理→后处理→绘制”链路关键优化点如下帧读取使用cv2.VideoCapture但禁用cv2.CAP_PROP_BUFFERSIZE默认4帧缓冲改为单帧抓取self.cap cv2.VideoCapture(0) self.cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) # 避免延迟累积预处理零拷贝YOLOv5要求RGB输入但OpenCV默认BGR。传统做法cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)会触发内存复制。本项目改用np.ascontiguousarray()确保内存连续并在Detector.infer()中直接用torch.from_numpy()frame_rgb np.ascontiguousarray(frame[:, :, ::-1]) # BGR→RGB切片不复制 img_tensor torch.from_numpy(frame_rgb).to(self.device).float() / 255.0结果绘制使用QPainter在QLabel上直接绘制避免cv2.imshow()弹窗干扰def draw_detections(self, frame, detections): painter QPainter(frame) pen QPen(Qt.red, 2) font QFont(Arial, 10) for *xyxy, conf, cls in detections: x1, y1, x2, y2 map(int, xyxy) painter.setPen(pen) painter.drawRect(x1, y1, x2-x1, y2-y1) painter.setFont(font) label f{self.class_names[int(cls)]} {conf:.2f} painter.drawText(x1, y1-10, label) return frame提示实测在i5-1135G7核显环境下1280×720视频流可稳定维持22 FPS较未优化版本14 FPS提升57%。3.3 检测结果导出功能支持JSON结构化数据与带框图的双格式保存界面右下角提供“导出结果”按钮一键生成两种产物results/xxx_detection.json标准JSON格式含时间戳、原始尺寸、所有检测框及置信度{ timestamp: 2024-06-15T14:22:33, image_size: [1280, 720], detections: [ {class: cigarette, confidence: 0.92, bbox: [523, 211, 587, 249]}, {class: garbage_bag, confidence: 0.87, bbox: [120, 450, 380, 690]} ] }results/xxx_detected.jpgOpenCV绘制后的带框图使用cv2.putText()添加中文标签需加载思源黑体from PIL import Image, ImageDraw, ImageFont font ImageFont.truetype(fonts/SimHei.ttf, 20) draw ImageDraw.Draw(pil_img) draw.text((x1, y1-25), f{cls_name} {conf:.2f}, fontfont, fill(0,0,255))此设计满足两类需求JSON供后台系统解析入库带框图供人工复核或汇报展示。4. 模型部署与跨平台兼容性验证从Windows开发机到Ubuntu边缘设备4.1 环境配置的最小化清单仅需6个pip包无CUDA强依赖该方案刻意规避复杂依赖requirements.txt仅含6项torch1.13.1cpu torchvision0.14.1cpu pyqt55.15.9 numpy1.23.5 opencv-python4.8.0.76 Pillow9.5.0注意torch1.13.1cpu是关键选择。它兼容Python 3.8~3.11且在无NVIDIA显卡的Ubuntu Server 22.04上可直接pip install成功若强行安装CUDA版在无驱动的机器上会报libcudart.so.11.3: cannot open shared object file错误。实测在树莓派4B4GB RAM上通过pip install torch-1.13.1-cp39-cp39-linux_armv7l.whl官方ARM轮子可正常加载模型并推理单图耗时1.8秒。4.2 Windows与Ubuntu下的可执行文件打包方案为实现“下载即用”提供两种打包方式Windows用户使用pyinstaller生成单文件exepyinstaller --onefile --windowed --iconicon.ico --add-data weights;weights --add-data data;data main.py生成dist/main.exe双击启动自动查找同目录weights/best.pt。Ubuntu用户制作AppImage兼容主流发行版# 1. 构建AppDir结构 mkdir -p MyApp.AppDir/usr/bin MyApp.AppDir/usr/lib cp main.py MyApp.AppDir/usr/bin/ cp -r weights/ data/ MyApp.AppDir/usr/lib/ # 2. 下载AppRun并设权限 wget https://github.com/AppImage/AppImageKit/releases/download/continuous/AppRun-x86_64 mv AppRun-x86_64 MyApp.AppDir/AppRun chmod x MyApp.AppDir/AppRun # 3. 生成AppImage appimagetool MyApp.AppDir输出MyApp-x86_64.AppImage赋予执行权限后双击运行。两种方案均通过os.path.join(os.path.dirname(sys.executable), weights, best.pt)动态定位权重路径确保资源不硬编码。4.3 常见报错与精准修复指南从“ModuleNotFoundError”到“QApplication: invalid style”部署中最常遇到三类错误按发生频率排序并给出根治方案报错信息根本原因一行修复命令ModuleNotFoundError: No module named PyQt5.sipPyQt5版本冲突5.15.9需sip 4.19.25pip install PyQt5-sip4.19.25QApplication: invalid style override passed, ignoring it系统主题与PyQt5不兼容常见于Ubuntu 22.04 GNOME在main.py开头添加os.environ[QT_QPA_PLATFORMTHEME] kvantum需先sudo apt install kvantumOSError: [WinError 1455] 页面文件太小Windows虚拟内存不足加载大模型失败右键“此电脑”→属性→高级系统设置→性能→设置→高级→虚拟内存→自定义大小初始2048MB最大4096MB提示所有修复均经实机验证。例如第三类错误在8GB内存Win10上必现调整虚拟内存后best.pt27MB可顺利加载无任何代码修改。5. 进阶技巧如何用现有模型快速适配新垃圾类别如电池、口罩5.1 少样本增量训练仅需5张图30分钟新增“battery”类别当需检测新类别如废旧电池无需从头训练。利用已有best.pt做迁移学习步骤极简准备5张含电池的图片用LabelImg标注为battery存入datasets/images/train/对应txt标签放入datasets/labels_txt/修改data/garbage.yaml将nc: 6改为nc: 7names末尾追加battery执行增量训练冻结主干只训headpython train.py --img 640 --batch 8 --epochs 50 --data data/garbage.yaml \ --weights runs/train/garbage_yolov5s/weights/best.pt \ --cfg models/yolov5s.yaml --name battery_finetune --freeze 10--freeze 10表示冻结前10层即Backbone仅更新Head层参数。实测50 epoch后新类别mAP0.5达0.78且原有6类mAP仅下降0.004证明迁移有效。5.2 置信度阈值动态调节用滑块实时控制检出灵敏度界面中“置信度阈值”滑块默认0.45直接映射到Detector类的self.conf_thres属性。其物理意义是仅当模型输出置信度≥该值时才保留该检测框。调节效果如下表阈值检出数量误检率适用场景0.3012.4个/图18.2%密集小目标初筛如烟头普查0.458.1个/图5.7%日常检测平衡精度与召回0.604.3个/图0.9%高置信场景如执法取证代码中通过QSlider.valueChanged信号实时更新def update_conf_threshold(self, value): self.detector.conf_thres value / 100.0 # 滑块0~100 → 0.0~1.0 self.statusBar().showMessage(fConfidence threshold set to {self.detector.conf_thres:.2f})此设计让用户无需改代码拖动滑块即可适配不同光照、遮挡条件下的检测需求。本文还有配套的精品资源点击获取
返回列表