简介这是一套面向高校学生与深度学习初学者的智能生活垃圾分类实战项目基于YOLOv5目标检测框架实现可直接用于毕业设计、期末大作业或课程设计。项目代码注释完整新手也能读懂部署流程简单下载后即可运行使用。资源包共76个文件约178KB以40个Python脚本为核心涵盖模型训练、推理检测、摄像头调用与机械控制等模块22个YAML文件用于数据集与网络结构配置另有4个Markdown说明文档、2个Shell脚本及Dockerfile等部署文件目录结构清晰便于按模块查阅。目前已有166人学习下载。项目经过严格调试功能完善、界面美观、操作便捷读者可获得完整的垃圾分类检测方案、可复用的训练与推理代码、模型配置模板以及部署参考既能快速完成毕设答辩也能作为深度学习目标检测入门的实践案例。1. 从一堆废纸到可运行系统这套 YOLOv5 垃圾分类毕设到底值不值得拆去年帮学弟看毕设他发来一个压缩包解压后 300 多 MB里面塞了训练好的权重、标注好的数据集、一份 60 多页的说明文档还有能直接跑的 PyTorch 推理脚本。他问我的第一句话是「哥这玩意儿能过答辩吗」。我打开detect.py跑了一张外卖盒的照片框出来了置信度 0.87类别是「其他垃圾」。那一刻我就知道这套基于 YOLOv5 的智能生活垃圾分类系统不是那种只贴几张截图糊弄人的水货。它解决的核心问题很具体把摄像头拍到的一袋混合垃圾实时框出每个物品并归到四大类可回收物、厨余垃圾、有害垃圾、其他垃圾。适合谁计算机专业本科毕设卡在「深度学习方向不知道做什么」的人以及想拿一个完整 Python 项目练手目标检测全流程的初学者。源码包里通常包含train.py、detect.py、data/下的 yaml 配置、weights/下的.pt文件以及一份讲清楚环境配置和训练命令的 Word 或 PDF 文档。你不需要从零标注几千张图也不需要自己调网络结构但你需要知道怎么把这份资源跑起来、怎么换成自己的数据、以及答辩时老师会追问哪几个参数。下面按「先跑通、再改数据、最后避坑」的顺序拆一遍。2. 环境配置与推理跑通把.pt权重变成屏幕上的检测框2.1 为什么是 YOLOv5 而不是 v8 或 Faster R-CNN这套资源选 YOLOv5 作为检测 backbone不是因为它最新而是因为它在「毕设场景」下综合成本最低。YOLOv5 的工程化程度高requirements.txt里依赖版本明确torch和torchvision的兼容性问题比 v8 少很多。Faster R-CNN 虽然精度在某些小目标上更好但推理速度在普通笔记本 CPU 上跑一张图要好几秒答辩演示时卡顿是硬伤。YOLOv5s 模型大小约 14 MB在 GTX 1050 上就能跑到 30 FPS 以上这对「实时垃圾分类」的演示需求刚好够用。另一个现实原因是资料多。你遇到任何报错搜「YOLOv5 错误关键词」基本都能找到中文解答。v8 的很多 API 变了网上教程新旧混杂新手容易在版本兼容上耗掉一周。这套资源的文档里通常写明了推荐环境Python 3.8、PyTorch 1.7 到 1.10、CUDA 10.2 或 11.3。如果你没有 NVIDIA 显卡用 CPU 也能跑推理只是训练会非常慢。2.2 从零把推理脚本跑起来的四步假设你已经解压了源码包目录结构大概是yolov5-master/下面有models/、utils/、data/、weights/。第一步不是急着pip install而是先确认 Python 版本。# 查看当前 Python 版本必须是 3.8 或 3.9 python --version # 创建独立虚拟环境避免污染系统包 python -m venv venv_garbage # Windows 激活 venv_garbage\Scripts\activate # Linux/Mac 激活 source venv_garbage/bin/activate虚拟环境这步很多人跳过结果后面torch和系统里的numpy打架报DLL load failed。血泪经验毕设代码最怕环境冲突隔离环境是后悔药。第二步装依赖。源码包里的requirements.txt可能锁定了旧版本直接pip install -r requirements.txt有时会卡在pycocotools编译上。我一般会先手动装 PyTorch再装其余依赖。# 根据是否有 CUDA 选择安装命令这里以 CUDA 11.3 为例 pip install torch1.10.0cu113 torchvision0.11.1cu113 -f https://download.pytorch.org/whl/torch_stable.html # 再安装项目其余依赖忽略已安装的 torch pip install -r requirements.txt --no-deps--no-deps的意思是只装requirements.txt里列出的包不自动解析依赖树避免它把你刚装好的 torch 又降级。装完后用python -c import torch; print(torch.cuda.is_available())验证返回True说明 GPU 可用。第三步确认权重文件和类别配置。源码包里的weights/best.pt是训练好的模型data/garbage.yaml里定义了类别名和数量。打开 yaml 看一眼# data/garbage.yaml 典型内容 train: ../garbage_dataset/images/train val: ../garbage_dataset/images/val nc: 4 names: [recyclable, kitchen, hazardous, other]nc: 4表示四分类names的顺序必须和训练时一致否则推理结果会张冠李戴。如果你只做推理train和val路径不存在也没关系但nc和names必须对。第四步跑推理。用源码自带的测试图片或自己拍一张。# 对单张图片推理--weights 指定权重--source 指定输入 python detect.py --weights weights/best.pt --source data/images/test.jpg --conf 0.4 --device 0 # 对文件夹批量推理结果默认保存在 runs/detect/exp/ python detect.py --weights weights/best.pt --source data/images/ --conf 0.4 --device 0--conf 0.4是置信度阈值低于 0.4 的框不显示。垃圾分类场景下我一般会调到 0.35 到 0.45 之间太高会漏掉被遮挡的瓶子太低会把背景里的花纹误判成垃圾。--device 0指定第一块 GPU没有 GPU 就写--device cpu。跑完后去runs/detect/exp/看结果图如果框的位置和类别都对说明环境和权重都没问题。2.3 参数怎么改conf、iou 和 img-size 的实际影响detect.py里有三个参数最常调--conf、--iou、--img-size。--iou是 NMS非极大值抑制的 IoU 阈值默认 0.45。两个框重叠超过这个比例时保留置信度高的那个。垃圾分类里如果两个瓶子挨得很近IoU 设太低会只剩一个框设太高会出现重复框。我一般保持 0.45 不动除非发现密集小目标漏检。--img-size默认 640表示推理前把图片缩放到 640x640。如果你的图片里垃圾占比很小比如整张图只有一个远处的易拉罐可以调到 1280但显存占用会翻倍。反过来如果只是演示640 足够。注意--img-size必须是 32 的倍数否则 YOLOv5 的下采样会报错。还有一个隐藏参数--augment开启测试时增强会对同一张图做翻转、缩放再合并结果精度略升但速度减半。答辩演示不建议开实时性更重要。3. 用自己的数据训练从标注到best.pt的完整链路3.1 数据集怎么组织才不会被train.py拒收源码包自带的数据集通常只有几百张类别也不一定覆盖你学校垃圾桶的真实情况。想换自己的数据第一步是搞清 YOLOv5 要求的数据格式。它不看xml也不看json只认每张图对应一个.txt文件每行格式是类别索引 x_center y_center width height且所有坐标都归一化到 0 到 1 之间。目录结构必须是这样garbage_dataset/ ├── images/ │ ├── train/ │ │ ├── 001.jpg │ │ └── 002.jpg │ └── val/ │ ├── 003.jpg │ └── 004.jpg └── labels/ ├── train/ │ ├── 001.txt │ └── 002.txt └── val/ ├── 003.txt └── 004.txtimages/train/001.jpg对应labels/train/001.txt文件名必须一致只是扩展名不同。常见翻车点有人把labels写成label或者train和val的图片混在一起train.py不会报错但会静默跳过找不到标签的图最后训练集实际数量少了一半。标注工具用 LabelImg 或 Roboflow 都行。LabelImg 导出的是 YOLO 格式直接就是.txt。标注时注意只框垃圾主体不要把整张桌子框进去。四类的边界要提前定清楚比如「外卖餐盒」如果没洗干净算厨余还是其他我的建议是看学校垃圾桶的实际分类规则统一标准否则模型学出来会混淆。3.2 修改 yaml 和超参数nc、names、lr0怎么设数据准备好后复制一份data/garbage.yaml改成自己的路径# data/my_garbage.yaml train: ../garbage_dataset/images/train val: ../garbage_dataset/images/val nc: 4 names: [recyclable, kitchen, hazardous, other]nc改成你的实际类别数names顺序和标注时的类别索引对应。如果你只分三类nc: 3names删掉一个。注意nc改了之后预训练权重yolov5s.pt的检测头维度不匹配YOLOv5 会自动跳过不匹配的层重新初始化这是正常现象不是报错。超参数在data/hyp.scratch.yaml里。毕设场景最需要关注三个lr0初始学习率、batch批次大小、epochs训练轮数。lr0默认 0.01如果 loss 震荡厉害降到 0.001。batch根据显存调4 GB 显存用--batch 88 GB 用--batch 16。epochs默认 300但毕设数据量小100 到 150 轮通常就收敛了再多会过拟合。# 开始训练--img 640 表示输入尺寸--batch 16 批次--epochs 150 python train.py --img 640 --batch 16 --epochs 150 --data data/my_garbage.yaml --weights yolov5s.pt --device 0--weights yolov5s.pt表示从官方预训练权重开始微调这比从零训练快得多精度也更高。训练过程中看runs/train/exp/下的results.csv重点看mAP0.5是否在上升、val_loss是否在下降。如果mAP卡在 0.3 以下大概率是标注质量有问题回去检查.txt里的框是不是偏了。3.3 训练完怎么验证混淆矩阵和test.py的正确用法训练结束后runs/train/exp/weights/下会有best.pt和last.pt。best.pt是验证集 mAP 最高的那一轮推理用它。验证时不要只看results.csv里的数字打开confusion_matrix.png看每一类的误判情况。垃圾分类最常见的混淆是「厨余」和「其他」——剩饭和脏纸巾在视觉上确实像。如果混淆矩阵显示这两类互相误判超过 30%说明你的标注标准本身模糊需要重新定义边界。用test.py在测试集上跑一遍# 在测试集上评估 best.pt python test.py --weights runs/train/exp/weights/best.pt --data data/my_garbage.yaml --img 640 --batch 16 --device 0test.py会输出每一类的 P精确率、R召回率、mAP0.5 和 mAP0.5:0.95。毕设答辩时老师常问「你的 mAP 是多少」记住 mAP0.5 在 0.85 以上算不错0.9 以上算优秀。如果只有 0.6 左右要么数据量太少低于 500 张要么标注框太松。4. 避坑与排查训练不收敛、显存爆炸、推理结果错位的真实原因4.1 现象训练 loss 一直是nan模型完全不学原因通常有三个学习率太大、数据里有坏图、标注坐标超出 0 到 1 范围。YOLOv5 默认lr00.01如果你改了hyp文件但没改回来或者用了--lr0 0.1前几个 batch 就会梯度爆炸。另一个隐蔽原因是某张图的.txt里坐标写成了像素值比如320 240 100 80归一化后变成几百loss 直接飞掉。解决先用python utils/general.py里的检查脚本扫一遍标签或者手动写个脚本遍历所有.txt发现坐标大于 1 的就修正。学习率改回 0.01 或 0.001重新训练。4.2 现象CUDA out of memorybatch 降到 1 还是爆不一定是 batch 的问题。YOLOv5 在训练时会缓存图片到内存如果--img-size设了 1280 而显存只有 4 GBbatch 1 也会爆。另外如果dataloader的workers设太多每个 worker 都会复制一份数据到显存累加起来就超了。解决把--img-size降到 640--batch设 4 或 8--workers设 0 或 2。如果还爆检查是不是同时开了--cache参数它会试图把所有图片加载到内存小显存机器不要开。4.3 现象推理时框的位置对但类别全是错的这是data/garbage.yaml里names顺序和训练时不一致导致的。比如训练时names: [kitchen, recyclable, hazardous, other]推理时 yaml 写成了[recyclable, kitchen, ...]模型输出的索引 0 本来对应厨余现在被解释成可回收。框的位置由回归头决定不受names影响所以框对但类别错。解决找到训练时用的那份 yaml原封不动复制到推理环境。如果找不到看runs/train/exp/里有没有备份的opt.yaml或hyp.yaml里面记录了当时的类别顺序。4.4 现象detect.py跑完没有任何输出图片先看终端有没有报No images found。如果有说明--source路径写错了或者路径里有中文。YOLOv5 对中文路径支持不好把图片放到纯英文路径下。如果没有报错但runs/detect/exp/是空的检查--save-txt或--save-conf是不是误开了这两个参数只保存文本结果不保存图片。默认情况下detect.py会保存带框的图片除非你加了--nosave。4.5 现象换了自训练权重后detect.py报size mismatch这是因为你用的best.pt类别数和--weights加载时的默认配置不一致。YOLOv5 在加载权重时会读权重文件里的nc但如果detect.py里硬编码了--nc 80COCO 的类别数就会冲突。解决不要手动传--nc让脚本从权重里自动读。如果还是报错用python detect.py --weights best.pt --source ... --data data/my_garbage.yaml显式指定数据配置。5. 答辩加分项把 mAP 再提 3 个点的三个技巧5.1 用--evolve自动搜超参数但别在答辩前一天跑YOLOv5 自带超参数进化命令是python train.py --evolve 300它会用遗传算法搜 300 代自动找lr0、momentum、weight_decay的最优组合。我实测过在垃圾分类数据集上能把 mAP0.5 从 0.87 提到 0.90 左右。但代价是时间300 代在单卡上要跑两三天。如果你答辩还有一周可以跑 50 代试试如果只剩两天别碰老老实实调--img-size和--batch。5.2 测试时增强TTA的取舍detect.py加--augment会开启 TTA对每张图做三次不同尺度的推理再合并。精度通常涨 1 到 2 个点但速度降到三分之一。答辩演示如果用的是视频流开了会卡如果只是展示几张静态图可以开。我的习惯是训练完先用test.py看基础 mAP再加--augment跑一次对比如果涨幅不到 1 个点就不值得开。5.3 把conf阈值和业务场景对齐老师问「你这个系统误报率多少」的时候不要只回答 mAP。mAP 是综合指标实际部署时conf阈值直接决定误报和漏报的平衡。垃圾分类场景下漏报一个有害垃圾比如电池比误报一个可回收物严重得多。所以我会把有害垃圾那一类的conf单独调低到 0.25其他类保持 0.4。YOLOv5 原生不支持按类设阈值但可以在detect.py的后处理里加几行判断# 在 detect.py 的非极大值抑制之后按类别过滤 # 假设 det 是 [x1, y1, x2, y2, conf, cls] for *xyxy, conf, cls in det: cls_name names[int(cls)] if cls_name hazardous and conf 0.25: continue # 有害垃圾阈值放宽 elif conf 0.4: continue # 其他类别保持 0.4 # 继续绘制框...这段逻辑的意思是有害垃圾只要置信度超过 0.25 就保留其他类别必须超过 0.4。代价是误报会增多但答辩时你可以解释「安全优先」。老师一般会认可这种业务层面的思考。从那以后我每次帮人看毕设代码都强制先跑一遍detect.py看输出图再打开confusion_matrix.png确认没有类别错位最后才看文档写得好不好。这套 YOLOv5 垃圾分类资源只要环境配好、数据格式对、names顺序不乱跑通和改数据都不难。希望帮到你。本文还有配套的精品资源点击获取