尧图精选

YOLOv5垃圾检测实战:PyQt界面+标注数据集+高mAP权重

🕒 发布时间:2026/10/2 2:39:37 📁 来源:尧图网络
简介本资源是一套开箱即用的YOLOv5垃圾目标检测完整实践方案面向计算机视觉初学者、AI项目开发者及环境监测类应用研究者解决生活垃圾图像识别与快速部署难题。压缩包共2000个文件含1858个标注用txt标签文件对应COCO/YOLO格式、61张实拍测试图像、34个核心Python脚本含训练/推理/PyQt界面代码、28个配置yaml文件含数据集路径、类别定义、超参设置以及xml标注备份、shell环境配置脚本和PDF技术说明文档整体大小213.62MB。已有279人学习下载资源提供map超90%的预训练权重、PR曲线与Loss收敛图等关键评估结果并附带可直接运行的PyQt可视化检测界面支持图片/视频实时推理与结果展示。所有代码基于PyTorch框架兼容标准YOLOv5环境无需额外模型训练即可完成端到端检测演示大幅降低入门门槛与开发验证成本。1. YOLOv5垃圾检测实战包开箱即用的PyQt界面标注数据集90% mAP权重3分钟跑通检测流程你刚拿到一个标着“YOLOv5垃圾检测PyQt界面标注数据集”的压缩包解压后看到labels.cache、一堆.jpg文件比如2010_002226.jpg、xml/和txt/两个标签文件夹还有一堆.pt权重和ui_mainwindow.py——别急着双击运行。这不是“下载即用”的玩具模型而是一套完整闭环的工业级轻量垃圾识别落地方案它用真实城市环卫场景采集的图像训练覆盖瓶子、罐子、烟头、餐盒、易拉罐、垃圾袋等6类高频暴露垃圾mAP0.5达92.3%PR曲线平滑、loss收敛稳定PyQt5界面非Demo级——支持实时摄像头推流、批量图册检测、结果导出Excel带框图、阈值动态调节最关键的是它不依赖CUDA 11.8或torch 1.12这种玄学组合在conda环境里仅需4条命令就能复现全部功能。适合一线算法工程师快速验证业务逻辑、城管/环卫单位做原型演示、高校课程设计直接交作业也适合想练手YOLOv5全流程但被COCO格式绕晕的新手——它把VOC转YOLO、labelImg标注规范、train/val划分比例、PyQt信号槽绑定这些血泪经验全打包装进去了。2. 模型与数据集结构解析为什么这个包能直接跑通而不是又一个“环境配三天”的坑2.1 权重文件与评估指标92.3% mAP背后的真实训练配置项目提供的.pt文件如best.pt、last.pt是基于YOLOv5s-v6.0版本训练所得不是魔改版也不是剪枝版。关键参数如下输入尺寸640×640兼顾精度与推理速度实测在GTX1060上达28FPS训练轮数300 epochs早停策略触发于val_loss连续15轮不降优化器SGDmomentum0.937, weight_decay0.0005学习率cosine annealing初始lr0.01末尾lr0.0001数据增强Mosaic1.0,MixUp0.1,HSV H/S/V 0.015/0.7/0.4针对户外光照变化强的垃圾图像特调提示results.png中的PR曲线显示烟头small object召回率在0.5 IoU下仍达86.1%说明anchor匹配策略已针对小目标优化kmeans聚类得到新anchor[10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326]这点比直接套用默认anchor的模型强得多。2.2 数据集双格式标注txtYOLO与xmlPASCAL VOC如何共存且互不干扰数据集根目录结构清晰避免常见混乱dataset/ ├── images/ # 所有.jpg原始图共1247张 ├── labels_txt/ # YOLO格式每张图对应同名.txt每行cls_id x_center y_center w h归一化 ├── annotations_xml/ # VOC格式每张图对应同名.xml含filenamesizeobjectbndbox完整结构 └── train_val_split.txt # 明确列出train:val 998:2498:2比例非随机shuffle按拍摄日期分组避免时序泄露为什么同时提供两种格式labels_txt/直接喂给YOLOv5训练脚本train.py无需转换annotations_xml/用于兼容LabelImg二次标注、或导入CVAT做半自动标注train_val_split.txt是硬性保障——很多开源数据集只给train/val文件夹但实际划分可能混入同一场景多帧导致val指标虚高。这里明确按时间戳分组val集全是独立拍摄日的图像泛化性更可信。2.3 PyQt界面工程结构不是简单封装而是生产级GUI交互逻辑gui/目录下包含main.py主入口初始化QApplication并加载UIui_mainwindow.py由Qt Designer生成的界面定义按钮、视频控件、阈值滑块、结果表格detector.py核心检测模块封装了cv2.VideoCapture、torch.hub.load()、NMS后处理、坐标映射到UI控件的逻辑utils/含draw_bbox.py抗锯齿绘制、export_result.pyExcel导出含置信度类别坐标注意PyQt5版本锁定为5.15.6因5.15.7存在QVideoSink内存泄漏该包已规避。所有信号槽连接采用lambda方式而非partial避免Python闭包引用导致的崩溃——这是我在树莓派部署时踩过的坑。3. 环境配置与模型加载4条命令完成从零到检测拒绝“pip install失败”式翻车3.1 Conda环境一键创建绕过torchcuda版本地狱不要用pip install -r requirements.txt该项目已预编译适配主流显卡驱动。执行以下命令Windows/Linux通用# 创建干净环境Python 3.8.10是YOLOv5官方推荐版本 conda create -n garbage_det python3.8.10 conda activate garbage_det # 安装PyTorchCUDA 11.3适配GTX10/16/20/30系显卡 conda install pytorch1.10.2 torchvision0.11.3 torchaudio0.10.2 cudatoolkit11.3 -c pytorch # 安装YOLOv5依赖注意必须指定v6.0分支v8.x不兼容 pip install -U https://github.com/ultralytics/yolov5/archive/refs/tags/v6.0.zip # 安装PyQt5及配套工具 pip install pyqt55.15.6 pyqt5-tools5.15.4.2.2 opencv-python4.7.0.72 pandas1.5.3逻辑说明v6.0.zip直接安装源码而非pip install yolov5确保models/common.py中Detect层与权重文件结构完全匹配opencv-python4.7.0.72是最后一个支持cv2.dnn.readNetFromONNX无报错的版本后续版本对YOLOv5导出的ONNX有兼容问题。3.2 加载预训练权重并验证3行代码确认模型可用在detect.py同级目录下新建test_load.pyimport torch from models.experimental import attempt_load # 加载权重路径需替换为你的实际路径 model attempt_load(weights/best.pt, map_locationcuda:0) # 或cpu model.eval() # 验证输入输出形状 img torch.zeros((1, 3, 640, 640), devicecuda:0) # 模拟单张图 pred model(img) print(fOutput shape: {pred[0].shape}) # 应输出 torch.Size([1, 25200, 6])参数说明map_locationcuda:0强制指定GPU设备避免CUDA out of memory错误若显存不足改为cpupred[0].shape中25200是YOLOv5s的anchor数量3 scales × 8400 anchors/scale6代表[x,y,w,h,obj_conf,cls_conf]若报错AttributeError: NoneType object has no attribute shape说明权重路径错误或.pt文件损坏——此时应校验MD5包内附weights.md5。3.3 运行PyQt界面启动即检测无需修改任何路径确保当前目录为项目根目录含gui/、weights/、dataset/执行cd gui python main.py界面启动后点击【打开图片】→ 选择dataset/images/2010_002226.jpg→ 自动检测并显示带框图点击【打开视频】→ 选择任意MP4 → 实时检测FPS显示在右下角拖动【置信度阈值】滑块至0.3 → 烟头检出数量增加但误检增多验证阈值敏感性点击【导出结果】→ 生成result_2010_002226.xlsx含每框的类别、置信度、左上/右下坐标。关键细节main.py中self.detector Detector(weights../weights/best.pt)使用相对路径../因此必须在gui/目录下运行否则路径报错。这是新手最常犯的错误——不是代码问题是启动位置错了。4. 常见问题排查这6个现象我全遇到过原因和解法写进注释里4.1 现象PyQt界面启动后黑屏/无响应控制台无报错原因Qt平台插件缺失尤其Windows系统缺少qwindows.dll或OpenCV视频后端冲突。解决Windows用户在main.py顶部添加import os os.environ[QT_QPA_PLATFORM_PLUGIN_PATH] rC:\Users\XXX\anaconda3\envs\garbage_det\Lib\site-packages\PyQt5\Qt5\plugins\platforms路径需替换为你的conda环境实际路径用conda list pyqt5查安装位置Linux用户执行export QT_QPA_PLATFORMoffscreen再运行或安装libxcb-xinerama0库。4.2 现象检测结果框错位框在图外/偏移严重原因图像原始分辨率与模型输入尺寸640×640缩放比例未对齐且detector.py中resize_and_pad函数未启用letterbox。解决打开gui/detector.py找到def preprocess(self, img)函数将原生cv2.resize替换为def letterbox(img, new_shape(640, 640), color(114, 114, 114)): shape img.shape[:2] # [height, width] if isinstance(new_shape, int): new_shape (new_shape, new_shape) r min(new_shape[0] / shape[0], new_shape[1] / shape[1]) new_unpad int(round(shape[1] * r)), int(round(shape[0] * r)) dw, dh new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1] dw / 2 dh / 2 if shape[::-1] ! new_unpad: img cv2.resize(img, new_unpad, interpolationcv2.INTER_LINEAR) top, bottom int(round(dh - 0.1)), int(round(dh 0.1)) left, right int(round(dw - 0.1)), int(round(dw 0.1)) img cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, valuecolor) return img, r, (dw, dh) # 在preprocess中调用 img_resized, ratio, (dw, dh) letterbox(img, (640, 640))然后在postprocess中用ratio和(dw, dh)反向映射坐标。4.3 现象训练时loss不下降val mAP始终10%原因数据集路径配置错误YOLOv5默认读取data/coco.yaml但本项目使用自定义data/garbage.yaml且train:字段指向了错误路径。解决检查data/garbage.yaml内容train: ../dataset/images # 必须是相对路径且与yaml文件位置一致 val: ../dataset/images nc: 6 names: [bottle, can, cigarette, food_box, cola_can, garbage_bag]若garbage.yaml放在yolov5/目录下则../dataset/images正确若放在项目根目录需改为./dataset/images。4.4 现象导出Excel时报错PermissionError: [Errno 13] Permission denied原因Windows系统下Excel文件被其他程序如Excel软件占用或路径含中文/空格。解决关闭所有Excel进程修改gui/utils/export_result.py中导出路径# 将原路径 save_path fresult_{os.path.basename(img_path).split(.)[0]}.xlsx # 改为绝对路径且不含空格 save_path os.path.join(os.getcwd(), output, fresult_{int(time.time())}.xlsx) os.makedirs(output, exist_okTrue)4.5 现象PyQt界面点击【打开摄像头】后报错cv2.VideoCapture(0) returned False原因OpenCV未正确链接摄像头驱动尤其USB摄像头需额外权限。解决Linux执行sudo usermod -a -G video $USER重启终端Windows以管理员身份运行cmd再启动python main.py通用在detector.py中添加设备探测for i in range(10): cap cv2.VideoCapture(i) if cap.isOpened(): print(fCamera found at index {i}) break cap.release()5. 微调自己的垃圾数据集从YOLOv5权重迁移学习3步搞定新类别适配5.1 数据准备严格遵循本包的标注规范否则训练必崩你新增了“塑料袋”、“废纸团”两类必须按以下规则整理图像放入my_dataset/images/命名用IMG_0001.jpg格式禁止中文、空格、特殊字符标签用LabelImg标注保存为YOLO格式.txt且类别ID必须续接原6类之后即plastic_bag6,waste_paper7my_dataset/labels/中每个.txt文件行数必须等于图像中目标数空图也要建空.txt划分用本包提供的split_dataset.py位于tools/目录它会按train:val:test7:2:1比例分组并保证同一拍摄地点的图不跨集。血泪经验曾因手动复制粘贴标签导致.txt末尾多了一个空行YOLOv5训练时IndexError: index 7 is out of bounds for axis 0 with size 7——因为类别数设为7但空行被解析为第8类。现在我每次生成标签后都用sed -i /^$/d *.txt清理空行。5.2 修改配置文件两处关键改动决定微调成败编辑data/my_garbage.yamltrain: ../my_dataset/images/train val: ../my_dataset/images/val test: ../my_dataset/images/test # 可选用于最终评估 nc: 8 # 必须更新原6类新增2类 names: [bottle, can, cigarette, food_box, cola_can, garbage_bag, plastic_bag, waste_paper]重点nc: 8必须与names列表长度严格一致且names顺序必须与.txt中类别ID一一对应ID0→bottleID7→waste_paper。5.3 启动迁移训练冻结Backbone只训Head层在yolov5/目录下执行假设权重路径为../weights/best.ptpython train.py \ --data ../data/my_garbage.yaml \ --weights ../weights/best.pt \ --cfg models/yolov5s.yaml \ --epochs 100 \ --batch-size 16 \ --name garbage_finetune \ --freeze 10 # 冻结前10层Backbone只训Neck和Head参数说明--freeze 10YOLOv5s共有25层冻结前10层CSPDarknet部分可防止小数据集过拟合--batch-size 16若显存不足按比例缩小如GTX1060用8--name garbage_finetune生成runs/train/garbage_finetune/目录含weights/best.pt和results.png训练100轮后val/mAP0.5应从初始的0%升至75%因迁移学习起点高。5.4 验证微调效果用PyQt加载新权重对比原权重将runs/train/garbage_finetune/weights/best.pt复制到weights/目录重命名为best_finetune.pt。修改gui/detector.py中权重路径self.model attempt_load(weights/best_finetune.pt, map_locationself.device)重启PyQt用新增的plastic_bag.jpg测试——此时应检出“塑料袋”类别且原6类准确率无明显下降。若新类别漏检严重说明--freeze层数过多尝试--freeze 5重新训练。从那以后我每次微调新数据集都强制走一遍三步验证① 用labelImg检查标签ID是否越界② 用python utils/general.py --check-dataset data/my_garbage.yaml校验路径和类别数③ 用test.py单图推理看log输出是否含新类别置信度。少走一步后面debug三天。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →