资讯详情

基于YOLOv5的智能生活垃圾分类系统:从数据集构建到边缘部署全链路实战

📅 2026/10/11 20:20:07 | 华诺云谱 👁 阅读
基于YOLOv5的智能生活垃圾分类系统:从数据集构建到边缘部署全链路实战
简介这是一套面向高校学生与深度学习入门者的智能生活垃圾分类实战项目基于YOLOv5目标检测框架实现可直接用于毕业设计、期末大作业或课程设计。项目代码注释完整新手也能看懂部署后即可运行适合需要高分毕设方案或想快速上手目标检测应用的人群。资源包共76个文件约178KB以40个Python脚本为核心涵盖模型训练、推理检测、摄像头调用与机械控制等模块22个YAML文件用于数据集与模型结构配置另有4个Markdown文档、2个Shell脚本及Dockerfile等部署文件目录结构清晰便于按功能检索。目前已有166人学习下载。项目功能完善、界面美观、操作简单包含训练、测试、视频与图像检测等完整流程并附带详细文档说明能帮助读者理解YOLOv5在垃圾分类场景中的落地方式快速完成环境搭建与二次开发。1. 从一张宿舍楼下的四分类桶照片说起YOLOv5 垃圾分类毕设到底在做什么去年帮学弟看毕设答辩 PPT他做的就是这个题目。评委老师第一个问题不是问 mAP 多少而是问「你这个系统摄像头拍到一个矿泉水瓶从进画面到屏幕显示『可回收物』中间到底走了几步」他答得磕磕巴巴最后只拿了个中。这件事让我意识到基于 YOLOv5 的智能生活垃圾分类系统这类毕设真正拉开分数的不是模型多花哨而是你能不能把「数据—训练—推理—界面—部署」这条链路讲清楚、跑通、并且知道每一环的边界在哪。这个方向适合两类人一类是计算机、自动化、物联网专业的本科或研究生需要一个能演示、能写文档、能答辩的完整项目另一类是想入门目标检测的工程师拿垃圾分类当练手场景因为它类别少、数据好找、效果直观比一上来就啃 COCO 友好得多。它解决的核心问题很具体把「可回收物、厨余垃圾、有害垃圾、其他垃圾」这四类有的方案细分到可回收物再分纸类/塑料/金属从一张图或一段视频里框出来并分类。听起来简单但坑集中在数据标注一致性、小目标、类别不平衡和部署端算力上。下面我按自己复现过一遍的顺序把这条链路拆开讲。2. 先想清楚检测方案YOLOv5 四个版本怎么选、数据集怎么攒2.1 为什么是 YOLOv5 而不是 v8、v11 或 Faster R-CNN毕设场景选 YOLOv5理由不是它最新而是它工程成熟度最高。Ultralytics 那套仓库把训练、验证、导出、推理脚本全给你写好了train.py、detect.py、export.py一条命令跑通文档和中文教程铺天盖地出问题搜得到答案。相比之下 YOLOv8/v11 的 API 更干净但对新手来说封装太深改个 loss 要翻半天源码Faster R-CNN 两阶段精度可能略高但推理慢想在树莓派或者 RK3568 这类边缘设备上跑实时基本没戏。YOLOv5 有五个规格n、s、m、l、x参数量从 1.9M 到 86M 递增。垃圾分类这个任务类别少、目标相对规整我一般直接上 yolov5s在 640 分辨率下单张 GPU 推理能到 100 FPSmAP 和 m 版本差距通常只有一两个点。如果你要部署到树莓派 4B 或者 RK3568n 版本更稳但精度会掉需要靠数据量和增强补回来。选型时记住一个原则先保证能实时跑起来再谈精度毕设答辩现场卡成 PPT 是致命的。2.2 数据集从哪来、怎么标、怎么划分公开数据集里TrashNet 只有分类没有检测框华为云垃圾分类大赛的数据集偏竞赛格式最省事的做法是自己攒。我的经验是手机拍 300500 张覆盖四类每类至少 80 张再叠加公开数据补充。拍摄时注意三个变量——光照白天/晚上/室内灯、角度俯拍/侧拍、背景桌面/地面/手持这三个维度不覆盖模型上线就翻车。标注用 labelImg 或 X-AnyLabeling输出 YOLO 格式的 txt每行类别id 中心x 中心y 宽 高全部归一化到 01。这里有个血泪经验标注框要贴紧目标边缘但别把阴影框进去阴影会让模型学到错误特征。标完做一次交叉检查同一张图两个人标IoU 低于 0.7 的挑出来重标。数据集划分按 8:1:1 走训练/验证/测试。目录结构必须长这样YOLOv5 认这个格式dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamldata.yaml是入口配置文件内容如下# 数据集根路径建议写绝对路径避免找不到 path: /home/user/dataset train: images/train val: images/val test: images/test # 类别数四分类就是 4 nc: 4 # 类别名顺序必须和标注时的 id 对应 names: [recyclable, kitchen, hazardous, other]提示names的顺序一旦定了就不能改改了要重新映射所有标注文件的类别 id否则模型学出来的类别全是错的。2.3 用 YOLOv5 训练自己的数据集最小可跑命令环境用 conda 建一个 Python 3.8 的虚拟环境装 PyTorch按 CUDA 版本去官网选命令然后克隆 YOLOv5 仓库装依赖。训练命令我一般这么写# 从预训练权重开始迁移学习收敛快 python train.py \ --weights yolov5s.pt \ --data dataset/data.yaml \ --epochs 100 \ --batch-size 16 \ --img 640 \ --device 0 \ --workers 4 \ --project runs/train \ --name trash_v1逐项说参数--weights yolov5s.pt用官方预训练权重做迁移比从零训快得多小数据集上尤其明显--epochs 100是起步值看验证集 mAP 曲线如果 80 轮还在涨就加到 150--batch-size 16受显存限制8G 显存跑 640 分辨率大概能到 16爆显存就降到 8--img 640是训练分辨率和推理保持一致--device 0指定第一块 GPUCPU 训练会慢到怀疑人生--workers 4是数据加载线程数Windows 上设 0 避免多进程报错。训练过程中重点盯三个指标box_loss、cls_loss、mAP0.5。loss 震荡不降先查学习率YOLOv5 默认用余弦退火一般不用动mAP 卡在低位八成是标注有问题或者类别不平衡。训练完权重存在runs/train/trash_v1/weights/best.pt这个文件就是后面推理和部署要用的。3. 推理、界面与部署把模型变成能演示的系统3.1 单图、批量、视频三种推理模式怎么写YOLOv5 自带的detect.py能直接跑但毕设要的是集成到自己的系统里所以得会调 Python API。下面这段是我常用的推理封装import torch import cv2 import numpy as np # 加载训练好的权重map_location 保证没 GPU 也能跑 model torch.hub.load(ultralytics/yolov5, custom, pathruns/train/trash_v1/weights/best.pt, force_reloadFalse) model.conf 0.4 # 置信度阈值低于这个的框不显示 model.iou 0.45 # NMS 的 IoU 阈值控制重叠框合并 model.classes None # None 表示检测所有类别 def detect_image(img_path): # 读图并转 RGBYOLOv5 内部按 RGB 处理 img cv2.imread(img_path) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results model(img_rgb, size640) # pandas 格式的结果方便取框和类别 df results.pandas().xyxy[0] for _, row in df.iterrows(): x1, y1, x2, y2 int(row[xmin]), int(row[ymin]), int(row[xmax]), int(row[ymax]) label f{row[name]} {row[confidence]:.2f} cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) return img if __name__ __main__: out detect_image(test.jpg) cv2.imwrite(result.jpg, out)逻辑说明torch.hub.load第一次会去拉仓库之后走本地缓存conf和iou是最常调的两个参数conf调高漏检变多、误检变少调低反过来垃圾分类场景我一般设 0.4results.pandas()把结果转成 DataFrame比直接解析 tensor 直观得多。视频推理就是把cv2.imread换成cv2.VideoCapture逐帧读注意每帧都要 resize 到 640 附近太大推理慢太小精度掉。3.2 用 PyQt5 或 Streamlit 搭一个能答辩的界面毕设演示界面不用花哨能上传图片、显示结果、给出类别统计就够了。两条路线PyQt5 做桌面端打包成 exe 双击就能跑答辩现场不依赖网络Streamlit 做 Web 端代码量少但需要浏览器。我倾向 PyQt5因为评委看到的是一个独立软件观感更完整。核心逻辑就三步按钮触发文件选择 → 调上面的detect_image→ 把原图和结果图并排显示再在下方用 QLabel 列出「可回收物 x2厨余垃圾 x1」。这里有个容易忽略的点中文显示。OpenCV 的putText不支持中文直接写会变成问号解决办法是用 PIL 的ImageDraw配合中文字体文件比如simhei.ttf绘制或者干脆在界面上用 QLabel 显示类别图上只画框不写字。3.3 部署到树莓派 4B 或 RK3568 的关键动作如果毕设要求边缘部署树莓派 4B 和 RK3568 是两个高频选择。树莓派上跑 PyTorch 原生模型很吃力正确姿势是先导出 ONNX再用 ONNX Runtime 或 NCNN 推理# 导出 ONNXopset 12 兼容性最好 python export.py --weights runs/train/trash_v1/weights/best.pt \ --include onnx --img 640 --opset 12 # 树莓派上装 onnxruntime pip install onnxruntime # RK3568 走 RKNN 路线需要先转 rknn 模型 python export.py --weights best.pt --include rknn --img 640树莓派 4B 上 ONNX Runtime 跑 yolov5s 大概 35 FPS够演示但不流畅想提速就换 yolov5n 或者降到 416 分辨率。RK3568 有 NPU转成 RKNN 后能到 15 FPS 以上但转换过程坑多量化校准集要选有代表性的图否则精度掉得厉害。量化前后一定要在同一批测试图上对比 mAP我见过量化后 mAP 从 0.85 掉到 0.6 的情况就是校准集太单一导致的。4. 避坑与排查那些让毕设翻车的细节4.1 训练 loss 不降、mAP 卡在 0.3 上不去现象训练几十轮box_loss一直在 0.1 附近晃mAP0.5死活上不了 0.5。原因通常是标注格式错了或者类别 id 越界。YOLO 要求类别 id 从 0 开始连续如果你标注时用了 1、2、3、4模型会认为有 5 类而data.yaml写nc: 4直接对不上。解决写个脚本扫一遍所有 label 文件统计出现的类别 id确认最大值等于nc-1且没有跳号。4.2 模型在测试集上很好一到摄像头就乱框现象验证集 mAP 0.9接上 USB 摄像头实时检测背景里的椅子、手都被框成垃圾。原因是训练数据背景太单一模型把「桌面」「白墙」当成了类别特征的一部分。解决补拍数据时故意换背景或者在训练时开 Mosaic 增强YOLOv5 默认开再叠加--augment推理时的 TTA。另一个可能是光照训练全是白天图晚上摄像头噪点多模型没见过补夜间样本即可。4.3 类别不平衡导致小类别几乎检不出现象可回收物和厨余垃圾检得挺好有害垃圾电池、药品几乎全漏。原因很简单有害垃圾样本太少模型倾向于预测多数类。解决有三招一是补数据有害垃圾至少凑到 100 张二是用--cls加权或者复制小类样本过采样三是在data.yaml同级写个hyp.yaml调大cls损失的权重。我一般先补数据实在补不上再用加权因为加权容易让模型在多数类上过拟合。4.4 导出 ONNX 后推理结果和 PyTorch 对不上现象PyTorch 里框得好好的转 ONNX 后框偏移或者置信度全变。原因是预处理不一致。PyTorch 版 YOLOv5 内部做了 letterbox 填充ONNX 导出后这步要你自己在推理代码里实现忘了做就会错位。解决用官方export.py导出的 ONNX 自带元信息推理时严格按 letterbox 的缩放比例还原坐标别自己瞎 resize。另外--opset版本别乱选12 最稳15 以上有些算子 ONNX Runtime 不支持。4.5 答辩现场摄像头打不开或延迟爆炸现象代码在宿舍跑得好好的到答辩教室插上摄像头要么黑屏要么延迟两三秒。原因通常是摄像头被其他程序占用或者分辨率设太高。解决提前在教室环境测一遍代码里把cv2.VideoCapture的宽高显式设成 640x480别用默认的 1080p再加一个异常捕获摄像头打不开时自动切到本地视频文件兜底。这个后悔药一定要提前吃现场翻车没得救。5. 让毕设从「能跑」到「拿高分」文档、消融与一个提分技巧5.1 详细文档说明到底该写什么标题里「详细文档说明」不是让你把代码注释抄一遍评委想看的是你的设计决策链。我建议文档按这个结构写第一章需求分析说清楚为什么做四分类而不是二分类第二章数据集构建放标注规范、类别分布柱状图、样本示例图第三章模型选型对比 YOLOv5s/m/l 在你自己数据集上的 mAP 和推理速度用表格呈现第四章训练细节贴超参数表、loss 曲线、mAP 曲线第五章系统实现放界面截图和流程图第六章测试与部署给不同设备上的 FPS 对比。每一章都要有数据支撑别写空话。5.2 做一个消融实验答辩直接加分评委最爱问「你这个改进有没有用」。与其被动挨打不如主动做一组消融。比如对比三组基线 yolov5s、加 Mosaic 混合增强、换用 CIOU loss。每组跑三次取平均结果做成表实验组数据增强LossmAP0.5推理速度(FPS)A 基线默认CIOU0.82105BMosaicMixUpCIOU0.86103CMosaicMixUpEIOU0.88102这张表一放你的工作量和技术判断力立刻体现出来。注意每组只改一个变量否则说不清是谁的贡献。5.3 一个提分技巧把「误检」变成「拒识」垃圾分类系统最尴尬的场景是摄像头对着空桌子模型硬框出一个「其他垃圾」。与其让模型强行分类不如加一个置信度阈值 面积过滤的后处理置信度低于 0.5 的框直接丢框面积小于图像 1% 的也丢。更进一步可以训一个二分类的「有无垃圾」前置判断没有垃圾时界面显示「未检测到垃圾」比乱框体面得多。这个技巧成本低、效果好答辩时讲出来评委会觉得你真的想过实际使用场景。我自己做这类项目最大的教训是别在模型结构上折腾太久把时间花在数据和后处理上收益高十倍。当初为了改一个注意力模块熬了三个通宵mAP 只涨了 0.5 个点后来老老实实补了两百张夜间图直接涨了 6 个点。毕设的时间有限把链路跑通、把文档写扎实、把演示做稳比追求 SOTA 实在得多。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑