新闻详情

新闻详情

首页 / 资讯中心 / 详情

YOLOv5智能垃圾分类系统:从环境配置到部署全攻略

发布时间:2026/9/26 12:46:49来源:尧图网络
YOLOv5智能垃圾分类系统:从环境配置到部署全攻略
简介基于YOLOv5的智能生活垃圾分类系统源码面向计算机视觉、深度学习方向的高校学生适合作为毕业设计、期末大作业或课程设计的完整参考项目。资源围绕生活垃圾分类检测场景运用YOLOv5目标检测框架覆盖数据配置、模型训练与推理检测等关键环节。资源包共76个文件以Python脚本、YAML配置和Markdown说明文档为主。py文件约40个包含训练、验证、检测等核心处理流程yaml文件约22个用于定义模型结构与数据参数另有Markdown文档可辅助理解整体思路。压缩包约178KB结构清晰。目前已有165人学习下载。项目代码含注释、界面简洁功能覆盖垃圾识别与目标定位经过严格调试可直接部署运行。作为导师认可度较高的高分毕设项目对需要快速搭建视觉识别系统、完成课程设计或毕设演示的同学具备实在的参考与复用价值。1. 为什么垃圾分类毕设选YOLOv5从选题价值到可跑通性每年毕业设计选“智能垃圾分类”这个题目的学生不少但真正能交出一套可运行、可演示、可答辩系统的并不多。大多数人的项目卡在同一个位置模型训练跑通了检测结果却一塌糊涂或者环境装了一星期最后连 demo 都没跑起来。这套基于 YOLOv5 的智能生活垃圾分类系统解决的核心问题就是把“目标检测”这件事落到真实的垃圾分类场景输入一张垃圾照片输出带有类别标签的检测框对应到可回收物、有害垃圾、厨余垃圾和其他垃圾。适合两类人一类是做毕设、需要完整源码和文档支撑的学生另一类是刚接触深度学习目标检测、想找一个完整项目练手的新手。下面按我实际拆这个项目的顺序来写。2. 环境与源码结构两天跑通基线的配置路径2.1 环境版本Python、CUDA、PyTorch怎么匹配YOLOv5 对环境的要求不算苛刻但版本错配是最容易翻车的点。装环境之前先确认三件事显卡型号和显存大小、显卡驱动版本、以及你打算用的 PyTorch 版本。很多人在这步栽跟头是因为没搞清“驱动支持的 CUDA 版本”和“PyTorch 运行时实际调用的 CUDA 版本”是两回事。nvidia-smi 里显示的高版本 CUDA只代表驱动上限不代表你 pip 安装的 PyTorch 就能用它。我一般建议的配置组合如下表所示注意根据自己的显卡选择而不是照抄教程。组合PythonCUDAPyTorch适用场景稳妥组合3.811.71.13.1老显卡、多次装环境失败的情况新卡组合3.1012.12.1.0RTX 30/40 系显卡创建虚拟环境时用 conda因为 conda 创建的 Python 环境和系统 Python 隔离得干净后面装错版本想回退也容易。激活环境后先装核心依赖不要一开始就把 requirements.txt 整个装上那样出了问题不好定位。conda create -n yolov5 python3.10 -y conda activate yolov5 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121这里指定了 cu121 的 wheel 源PyTorch 会捆绑对应的 CUDA 运行时。--index-url参数把安装源指向 PyTorch 官方 wheel 仓库避免从 PyPI 默认源装到 CPU 版本。装完之后验证一下 GPU 是否可用python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))打印结果为True和显卡名称说明 CUDA 环境是通的。如果这里输出False基本可以判定是 PyTorch 装成了 CPU 版重新用指定 CUDA 版本的命令覆盖安装即可。2.2 源码目录每个文件是干什么的源码包解压之后你会发现目录结构和官方 YOLOv5 仓库基本一致这是好事因为查阅资料时可以照着官方文档和社区问答来排查问题。花半小时把目录过一遍比直接开跑要靠谱得多至少你要知道 train.py 是训练入口、detect.py 是推理入口别把两者混了。文件/目录作用日常使用频率train.py训练主入口加载数据配置和模型结构高detect.py推理入口支持图片、视频、摄像头高models/网络结构定义yolov5s.yaml 等中data/数据集配置和超参数配置高utils/数据增强、损失计算、指标评估等工具低runs/训练和推理输出目录自动生成中项目里垃圾分类相关的代码和数据配置一般集中在 data/ 和 utils/ 中你要改的其实就是 data/garbage.yaml 和 models/yolov5s.yaml。前者定义数据集路径和类别数后者定义网络结构大小。训练时输出的图纸、权重、日志都在 runs/train/exp 里这个目录是你后期调参时盯得最多的地方。2.3 首次跑通先用官方权重验证环境拿到源码先别急着训练自己的数据集。正确的顺序是用官方预训练权重跑一次推理确认整条链路是通的再做后续替换。python detect.py --source data/images/bus.jpg --weights yolov5s.pt --conf-thres 0.25--source指定输入图片--weights指定预训练权重--conf-thres是置信度阈值低于这个值的检测框会被过滤掉。跑完在 runs/detect/exp 里能看到标注了类别和得分的输出图。这一步的意义在于验证环境完整性。如果这一步都报错问题一定出在环境配置或依赖版本上而不是你的数据或代码逻辑。等到能稳定输出结果再开始准备自己的数据集这样能把“环境问题”和“数据问题”分开排查避免到时候训练失败不知道锅该甩给谁。3. 数据集构建与标注从原始图片到YOLO格式的完整链路3.1 类别设计按物品分类还是按垃圾四分法垃圾分类数据集的类别设计直接决定模型的可用性和训练难度。现在公开的垃圾分类数据集有按物品细分的比如纸张、塑料、玻璃、金属、布料、电池、灯管、药品、果皮、剩饭也有直接按“可回收物、有害垃圾、厨余垃圾、其他垃圾”四分类的。两种方案各有取舍。按物品细分类别模型学的是“这个物体是什么”比如一个饮料瓶无论它是否被压扁、是否带有标签模型都要认得出来。这个方案的好处是后续可以按映射表把物品映射到四分类比如塑料瓶映射到可回收物坏处是标注工作量大、类别间外观差异有时很小。按四分类直接做标注工作量小但模型要学“什么东西属于可回收物”这种抽象概念同一类别的物体外观差异极大对数据量和训练难度都不友好。作为毕设项目我建议折中选择 10 类左右的常见物品细分类别像纸板、塑料瓶、玻璃瓶、易拉罐、果皮、电池、灯管、布料、香烟头、一次性餐盒训练完成后在推理脚本里维护一张映射表把物品类别映射到四分类桶再输出投放建议。这样既控制了标注成本又能讲清楚“为什么这么做”的设计逻辑。3.2 标注规范用labelImg时要注意的几件事标注工具推荐 labelImg因为它生成的 VOC 格式 XML 文件转换路径最清晰社区资料也多。标注时有一条硬性要求类别名称统一用英文字母或数字不要用中文。YOLO 读取类别时按 classes.txt 的行号索引中文字符编码问题会导致类别错位甚至读不出文件。另外标注框要贴合目标轮廓。垃圾物品往往形状不规则比如被压扁的纸箱、揉成团的塑料袋别把整张桌子框进去也别只框一半。标注框边缘只需留 1 到 2 个像素的余量这样训练出来的框回归更精准。还有一条容易被忽略的背景不标注。很多人把垃圾所在的桌面、地面、垃圾桶也标进去了这会把大量背景像素教成物体推理时满屏误检。3.3 VOC转YOLO转换脚本与坐标校验labelImg 默认保存为 VOC 格式的 XML 文件每个 XML 里包含图片尺寸和所有标注框的左上角、右下角坐标。YOLO 训练需要的是 txt 文件每行一个框格式为class x_center y_center width height四个坐标都已归一化到 0 到 1 之间。转换脚本是必经之路下面这个脚本是清理过的最核心逻辑。import xml.etree.ElementTree as ET import os def convert(size, box): dw 1.0 / size[0] dh 1.0 / size[1] x_center (box[0] box[1]) / 2.0 y_center (box[2] box[3]) / 2.0 w box[1] - box[0] h box[3] - box[2] return x_center * dw, y_center * dh, w * dw, h * dh def xml_to_txt(xml_path, out_path, classes): tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) with open(out_path, w) as f: for obj in root.iter(object): cls obj.find(name).text if cls not in classes: continue box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) cx, cy, w, h convert((img_w, img_h), (xmin, xmax, ymin, ymax)) f.write(f{classes.index(cls)} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}\n)convert函数把左上角和右下角坐标换算成中心点加宽高的形式再除以图片宽高做归一化。注意w和h在推导时用的是box[1] - box[0]也就是 x 方向差和 y 方向差别把顺序搞混。classes是一个列表顺序必须和后面data/garbage.yaml里的names完全一致否则会错位。转换完必须校验。打开生成的 txt 文件看坐标是否都在 0 到 1 之间有没有出现负数或大于 1 的异常值。常见问题是用 PIL 读图片尺寸时size是(width, height)而用 OpenCV 读是(height, width)搞反了会导致宽高互换标注框全部错位。3.4 数据划分训练集、验证集的目录得长这样YOLOv5 读取数据时按目录自动匹配图片和标签。标准结构是images/train、images/val和labels/train、labels/val两套目录一一对应。图片叫001.jpg标签就必须叫001.txt后缀可以不同文件名主体必须一致。datasets/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── garbage.yaml划分比例我按 8:1:1 来做训练集占八成验证集和测试集各占一成。划分时不要用 random 函数瞎洗要按目录分层采样比如按拍照场景分同一场景的图片不要同时落进训练集和验证集否则会引入数据泄漏验证集指标虚高实际部署后立刻现原形。4. 训练与调参从默认超参到稳定收敛4.1 先写对数据配置文件yaml里的每个字段都有用训练前的第一步是配置data/garbage.yaml这个文件描述数据集位置和类别信息。YOLOv5 新版把train和val的路径放在 yaml 顶层注意路径是相对运行目录的写绝对路径也没问题但绝对路径在换机器后要全部改一遍所以我会用相对路径加项目根目录的方式。path: ./datasets train: images/train val: images/val test: images/test nc: 10 names: [cardboard, plastic_bottle, glass_bottle, can, fruit_peel, battery, lamp, cloth, cigarette_butt, lunch_box]path是数据集根目录train和val是相对于path的子目录。nc是类别数必须和names列表长度一致这是最常见的低级错误。names的顺序和检测模型输出的类别索引一一对应推理时系统靠这个列表把 0、1、2 之类的数字翻译成“塑料瓶”“玻璃瓶”。一个容易被忽略的坑是训练集、验证集图片和标签文件必须一一配对。如果某张图片没有对应的 txt 标签YOLOv5 训练时会跳过它并输出警告但如果某个 label 存在而图片缺失会直接报错。我在准备数据后会用脚本检查两边文件数量是否一致确保没有孤儿文件。4.2 训练命令核心参数怎么传数据配置写好后就开始训练。第一次跑建议用官方预训练权重做迁移学习也就是--weights yolov5s.pt以 COCO 预训练模型作为初始化再微调到垃圾分类数据集上。从零训练不是不行但需要的数据量和训练轮次都要成倍增加毕设项目没必要。python train.py --data data/garbage.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --batch-size 16 --epochs 100 --imgsz 640 --workers 4--batch-size受显存限制8G 显存跑 16 已经到极限。--epochs先设 100后期看曲线再决定是否提前终止。--imgsz是输入分辨率640 是精度和速度的平衡点如果数据里的目标比较小可以试 960显存不足降到 512 也行。--workers是数据加载线程数Windows 下建议设 0 或 2设太高容易报 DataLoader worker 相关错误。训练过程中终端会滚动输出 GPU 利用率、当前 epoch、各类 loss、mAP 等指标。我一般盯两个关键指标一个是box_loss和cls_loss是否稳定下降另一个是验证集上 mAP0.5 是否在持续上升。如果训练到一半 loss 不再下降甚至回升就要考虑调学习率或者回退到上一个检查点。4.3 超参数决定收敛质量的几个关键项YOLOv5 的超参数集中在data/hyps/hyp.scratch.yaml里。毕设场景不需要动太多专注调整几个影响最明显的项目即可。超参数默认值影响说明lr00.01初始学习率数据量小时调小到 0.001 更稳lrf0.01最终学习率因子控制学习率衰减终点mosaic1.0是否用 mosaic 增强显存不足时设 0fl_gamma0.0焦点损失参数类别不平衡时设为 0.5-1.0垃圾分类数据集的常见问题是类别分布不均衡比如“其他垃圾”里的物品形态杂、样本多但某些类别样本极少。对于样本很少的类别靠增加图片数量比调超参数更有效因为过采样策略比损失函数调整更直观。如果实在收集不到图片则可以裁剪已有图片做数据扩充——注意是裁剪后作为新样本加入训练集而不是简单的翻转和旋转。另一个常被忽视的参数是--cache加在 train.py 参数里可以把图片预加载到内存训练提速明显但显存小的机器慎用。磁盘速度慢、图片数量多的情况下这个参数带来的收益很可观。4.4 训练产物weights和曲线图怎么读训练完成后runs/train/exp目录下有几个必须搞清楚的文件。weights/best.pt是验证集上 mAP 最高的权重部署时选它weights/last.pt是最后一个 epoch 的权重断点续训时用它。results.png汇总了所有训练曲线包括损失函数曲线、精确率、召回率和 mAP 曲线。看 results.png 时有个技巧是看验证集 loss 曲线是否出现拐点。训练集 loss 持续下降、验证集 loss 却掉头向上的那个位置就是过拟合开始的信号最佳权重往往就在拐点之前。best.pt 选择的是 mAP 最高的 epoch这个权重不一定和损失拐点完全一致但通常处于同一区间。另一个常见困惑是训练结束后有多份 exp 目录。跑多次训练会生成 exp、exp2、exp3 这样的递增目录注意确认 weights 属于哪一次实验别在部署时拿错权重。我一般会在训练结束后直接复制一份 best.pt 到项目根目录并改名避免后面被 runs 目录下的多个 exp 搞混。5. 避坑垃圾分类训练中六个真实翻车现场5.1 CUDA和PyTorch版本不匹配一跑就报CUDA error现象执行torch.cuda.is_available()输出 True但一跑 train.py 就报CUDA error: no kernel image is available for execution on the device。原因这个报错说明 PyTorch 编译时的 CUDA 版本和当前显卡驱动支持的版本不一致通常是显卡驱动版本太老或者 PyTorch 的 CUDA 版本高于驱动能支持的版本。比如装了 cu121 的 PyTorch驱动却是老版本。解决先查nvidia-smi确认驱动支持的 CUDA 版本然后到 PyTorch 官网安装和驱动匹配的版本。驱动老就直接pip install torch1.13.1 torchvision0.14.1 --index-url https://download.pytorch.org/whl/cu117降级。从这个坑之后我养成了习惯每次装完环境先把训练跑起来再去做别的。5.2 归一化坐标全为0或超出范围VOC转YOLO时数据全废现象转换脚本跑完没有报错但打开 txt 文件发现坐标要么都是 0要么出现 1.5 这样的越界值。训练时 loss 直接飞起模型根本学不进去。原因大部分情况是读 XML 时图片尺寸取错。YOLOv5 的图片读取和 labelImg 的尺寸记录方式不同导致归一化时除以错误的宽高坐标全部错位。解决转换后在脚本里加入校验逻辑凡是坐标小于 0 或大于 1 的直接抛异常不要默默写进 txt。同时抽样对比原图和标注框写一个简单的可视化脚本把检测框画到图上人工过一遍。这个过程虽然琐碎但能提前拦下大部分数据问题。5.3 mosaic增强导致显存溢出连640分辨率也救不了现象batch-size 设 8 还是 OOM报RuntimeError: CUDA out of memory。原因YOLOv5 默认开启了 mosaic 增强这个增强会把 4 张图拼成 1 张参与训练相当于单样本实际显存消耗是肉眼看到的 4 倍。小显存显卡不开 mosaic 反而跑得动。解决在 train.py 参数里加--mosaic 0关闭 mosaic或者把 batch-size 降到 4。更折中的方案是保留 mosaic 但调小--imgsz到 512。垃圾分类的检测目标一般不大imgsz 降到 512 对精度的影响在可接受范围内。5.4 训练loss不降学习率太大或类别不平衡现象跑了 20 个 epochbox_loss 始终在 0.08 左右抖动cls_loss 纹丝不动mAP 曲线基本贴着 0。原因分类 loss 不下降的最常见原因是主线清楚、垃圾类别间相似度太高比如瓶装可乐和易拉罐外形接近模型始终分不清另一个常见原因是正负样本比例失衡某些类别样本太少模型干脆把所有样本都预测为多数类。解决如果确认数据没问题先把lr0从 0.01 改成 0.001 重新训练。如果依然不降集中检查少数类别的标注框——样本少的类别逐一肉眼复核别轻易依赖自动标注工具。5.5 mAP很高但实测效果差数据分布和真实场景脱节现象验证集 mAP0.5 到 0.9 以上结果用摄像头一拍满屏漏检连塑料瓶都找不到。原因这是最典型的过拟合变体。训练集中大量图片是网上下载的干净背景目标大、光线好、角度正而真实场景是桌面、地面、垃圾桶里的垃圾光线变化大、目标互相遮挡分布完全不在一个维度。解决去真实场景补拍一批图片并加入训练集或者把一张大图裁切成多张小图来扩充场景多样性。这个坑提醒我明白了一点验证集指标只是参考模型最终是为了应对真实环境而不是刷分。5.6 训练时best.pt一直没有更新mAP曲线异常现象训练跑完了但 best.pt 一直停留在前几个 epoch后续 mAP 不再刷新。原因学习率衰减过快模型在后期基本停止更新或者验证集数据太少mAP 波动巨大偶尔一个高值被锁定后再也没机会刷新。解决检查lr0和lrf的设置数据量足够时把lrf调小让后半程还在微调验证集图片太少时增加验证集规模。从这之后我每次训练结束后都会看一眼 best.pt 的时间戳确认保存顺序没有异常。6. 部署与验证把模型接到摄像头做实时检测6.1 ONNX导出与OpenCV DNN推理PyTorch 训练出的模型文件不能直接部署到嵌入式设备或移动端导出为 ONNX 格式是为了让推理摆脱 PyTorch 环境依赖。ONNX 是一个通用的模型交换格式之后用 OpenCV DNN 或 ONNXRuntime 都能加载。python export.py --weights best.pt --include onnx --imgsz 640在best.pt的同级目录会生成best.onnx。这一步的作用是把模型的结构和权重序列化到 ONNX 格式导出时--imgsz必须和训练时的分辨率一致否则会报维度错误或导致精度下降。如果不想换推理后端直接用 PyTorch 的torch.hub加载本地的 best.pt 也可以但每次启动都要花时间加载权重且依赖 torch 环境。ONNX 模型的优势是体积更小、在无 GPU 的环境也能跑 CPU 推理。垃圾分类场景不追求高帧率CPU 推理一两百毫秒的延迟完全可接受。6.2 摄像头实时检测脚本把 ONNX 接到摄像头前先跑一下单张图片确认导出模型行为正常别直接上摄像头要不问题定位困难。一个简单的摄像头推理循环长这样import cv2 import onnxruntime as ort sess ort.InferenceSession(best.onnx) input_name sess.get_inputs()[0].name cap cv2.VideoCapture(0) while True: ret, frame cap.read() img cv2.resize(frame, (640, 640)) img img[:, :, ::-1].transpose(2, 0, 1) / 255.0 img img[None].astype(float32) outputs sess.run(None, {input_name: img}) # 解析outputs中的检测结果并绘制框 cv2.imshow(garbage detection, frame) if cv2.waitKey(1) 0xFF ord(q): break代码里把 BGR 转 RGB、归一化到 0-1、加 batch 维度的三步预处理每一步做错结果都会异常。ONNX 输出的是原始检测头数据需要按 YOLOv5 的格式解码候选框再叠加 NMS。建议直接用官方 detect.py 里对应的 utils 函数别自己硬写很多细节只有踩过坑才知道。从那以后我每次做检测类项目都会强制走一遍这个流程先单张图片验证、再视频验证、最后部署。少一步都可能让你在摄像头前对着满屏的误检框发呆。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

香橙派RK3588交叉编译hello实战:验证aarch64工具链完整可用 2026/9/26 13:42:27

香橙派RK3588交叉编译hello实战:验证aarch64工具链完整可用

1. 为什么一个hello程序值得单独写一篇交叉编译教程很多人看到"交叉编译hello"这个标题,第一反应是:不就是编译个hello world吗,有什么好讲的。但如果你真的在香橙派RK3588这类ARM开发板上从零走过一遍完整流程,就会明白…

阅读更多 →
嵌入式烧录下载与仿真调试工具全解析:从SWD到J-Link的实践指南 2026/9/26 13:42:27

嵌入式烧录下载与仿真调试工具全解析:从SWD到J-Link的实践指南

说来也怪,我平时代码写得顺手,真正崩溃的时候大多不是在写代码,而是在点击那个“Download”按钮之后。编译零错误零警告,烧录却弹出一串红色报错;调试器明明插好了,软件里却死活识别不到芯片。这个行业里&a…

阅读更多 →
Python Web开发入门:环境配置、框架选型与部署实践 2026/9/26 13:42:27

Python Web开发入门:环境配置、框架选型与部署实践

1. 环境起步:Python版本、虚拟环境与编辑器的坑先说个很现实的问题:很多人学Python Web开发,第一个拦路虎不是语法,不是框架,而是环境。我见过太多人卡在“装完Python之后跑框架报错”这一步,折腾半天最后发…

阅读更多 →
广义Benders分解法在园区综合能源系统优化规划中的Matlab实现 2026/9/26 13:42:27

广义Benders分解法在园区综合能源系统优化规划中的Matlab实现

去年我接了一个园区级综合能源系统的优化规划项目,设备候选里有热电联产机组(CHP)、燃气锅炉、电储能和光伏,除了要回答"哪些设备要建、建多大"这种离散决策,还得把全年8760小时的运行策略一起算进去。按照常…

阅读更多 →
5G NR ISAC系统级模拟器:架构拆解与落地避坑指南 2026/9/26 13:42:21

5G NR ISAC系统级模拟器:架构拆解与落地避坑指南

简介:面向通信工程、电子信息、自动化等专业学生的5G NR综合传感与通信(ISAC)系统级模拟器,适用于毕业设计、课程设计、大作业及初期项目演示。基于Matlab实现,代码涵盖调度实体、下行PMI选择、CQI上报、UE MAC层处理、…

阅读更多 →
EvoSafeHarness:为AI Agent自动定制安全防线,攻击成功率从45.6%降至10.0% 2026/9/26 13:42:14

EvoSafeHarness:为AI Agent自动定制安全防线,攻击成功率从45.6%降至10.0%

1. 从45.6%到10.0%:EvoSafeHarness到底解决了什么核心问题 AI Agent这两年从演示走向生产,速度比很多人预想的要快。但真正把Agent放到真实业务里跑过的人都知道,最让人睡不踏实的问题从来不是“它能不能完成任务”,而是“它会不会…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉