news 2026/10/2 3:14:24

基于深度学习的垃圾分类系统:YOLO+PyTorch完整课程设计实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于深度学习的垃圾分类系统:YOLO+PyTorch完整课程设计实战

简介:这份资源是面向深度学习入门者、课程设计或毕业设计学生的垃圾分类系统完整项目包,基于YOLO目标检测算法实现垃圾图像的自动识别与分类,帮助解决传统人工分类效率低、成本高的问题。压缩包共7个文件,约12KB,以3个csv数据文件、2个py脚本、1个pyc缓存和1个md说明文档为主,涵盖标签数据、用户信息、历史记录以及主程序与检测逻辑,结构紧凑便于快速理解项目全貌。目前已有59人学习下载。项目围绕实时对象检测展开,包含主程序入口、前端视图与静态资源等模块,读者可据此掌握从数据集标注、模型推理到界面交互的完整实现思路,并参考其中的目录组织方式与代码分层,用于二次开发或课程答辩演示,具备较强的实践参考价值。

1. 垃圾分类系统遇上深度学习:一份能跑通的课程设计资源

很多同学做垃圾分类毕设时,第一反应是去网上找现成的 YOLO 权重,结果下载下来发现类别对不上、环境跑不起来、训练脚本缺失,最后只能对着别人的截图干瞪眼。这份「基于深度学习的垃圾分类系统.zip」就是冲着这个痛点来的——它把数据、模型、训练、推理、界面串成了一条完整链路,适合正在做课程设计或毕业设计、想拿一个能演示能答辩的完整项目的同学。核心用的是 YOLO 系列目标检测,配合 Python 和 PyTorch,覆盖可回收物、厨余垃圾、有害垃圾、其他垃圾四分类。你拿到手不是一堆散装文件,而是一个能从头复现的工程。下面我按实际拆包顺序,把环境、数据、训练、推理和踩坑点逐个讲清楚。

2. 环境配置与依赖安装:把 PyTorch 和 YOLO 装进同一套环境

2.1 为什么选 PyTorch + YOLO 而不是 TensorFlow

垃圾分类本质是目标检测任务,不是简单图像分类。一张图里可能同时出现塑料瓶和纸盒,分类模型只能给一个标签,检测模型才能框出多个目标并分别给类别。YOLO 在速度和精度之间平衡得比较好,课程设计场景下用 YOLOv5 或 YOLOv8 都行,权重小、训练快、社区资料多。PyTorch 的动态图机制对调试更友好,报错信息比 TensorFlow 直观,新手排查起来少走弯路。常见做法是直接用 Ultralytics 的 YOLOv8,pip 装完就能跑,省去编译 darknet 的麻烦。

2.2 用 conda 建独立环境并装依赖

不要往 base 环境里塞,版本冲突会让你怀疑人生。下面这套命令我实测过,Python 3.9 + PyTorch 2.0 + CUDA 11.8 的组合比较稳。

# 创建独立环境,Python 版本别太高,3.9 兼容性最好 conda create -n garbage python=3.9 -y conda activate garbage # 装 PyTorch,注意 CUDA 版本要和显卡驱动匹配 # 如果没有 NVIDIA 显卡,把 cu118 换成 cpu pip install torch==2.0.1 torchvision==0.15.2 --index-url https://download.pytorch.org/whl/cu118 # 装 YOLO 框架和常用工具 pip install ultralytics opencv-python pillow numpy matplotlib tqdm pyyaml

逻辑说明:先隔离环境避免污染全局,再按 CUDA 版本装 PyTorch,最后装 ultralytics 会自带 YOLOv8 的推理和训练接口。参数上,--index-url指定 PyTorch 官方源,国内下载慢的话换成清华镜像,但注意镜像有时缺 CUDA 版本,缺了就回官方源。装完用python -c "import torch; print(torch.cuda.is_available())"验证,返回 True 才算 GPU 可用。

2.3 验证环境是否真的能跑

装完别急着训练,先跑一个官方示例确认链路通。

from ultralytics import YOLO # 加载预训练权重,第一次会自动下载 model = YOLO("yolov8n.pt") # 用一张测试图跑推理,确认前向传播没问题 results = model("https://ultralytics.com/images/bus.jpg") results[0].show()

这段代码的作用是拉一个 COCO 预训练模型做推理,能出图说明 PyTorch、CUDA、YOLO 三者都正常。如果卡在下载权重,手动去 release 页面下yolov8n.pt放到当前目录。如果报 CUDA out of memory,说明显存不够,把模型换成yolov8n这种 nano 版本,或者加device='cpu'先跑通流程。

3. 数据集组织与标注格式转换:让标签对得上模型

3.1 垃圾分类数据集的目录结构

YOLO 要求的数据集结构是固定的,图片和标签分开存放,标签是 txt 格式,每行类别 中心x 中心y 宽 高,坐标都归一化到 0 到 1。常见做法是建一个datasets/garbage目录,下面分images和labels,再各自分train和val。

datasets/garbage/ ├── images/ │ ├── train/ # 训练图片,jpg 或 png │ └── val/ # 验证图片 ├── labels/ │ ├── train/ # 对应训练标签,txt │ └── val/ # 对应验证标签 └── data.yaml # 数据集配置文件

图片和标签必须同名,比如images/train/001.jpg对应labels/train/001.txt。少一个标签文件,训练时就会报找不到 label,这个坑我踩过,排查半天以为是路径写错,其实是标注工具导出时漏了一张。

3.2 data.yaml 的写法与类别顺序

data.yaml是 YOLO 训练入口,写错类别数或路径,训练直接崩。

# 数据集根路径,用绝对路径最稳,相对路径容易找不到 path: /home/user/datasets/garbage train: images/train val: images/val # 类别数必须和 names 长度一致 nc: 4 names: 0: recyclable # 可回收物 1: kitchen # 厨余垃圾 2: harmful # 有害垃圾 3: other # 其他垃圾

参数说明:nc是类别数量,四个类别就写 4,多一个少一个都会在训练时抛维度不匹配。names的键从 0 开始,顺序要和标注时用的类别索引一致。如果你拿到的数据集标注是中文类别名,得先转成数字索引,否则 YOLO 读不懂。

3.3 从 VOC 或 COCO 格式转 YOLO 格式

很多公开垃圾分类数据集是 VOC 的 xml 或 COCO 的 json,不能直接喂给 YOLO。下面这个脚本把 VOC 的 xml 转成 YOLO 的 txt。

import xml.etree.ElementTree as ET import os # 类别映射,必须和 data.yaml 里的顺序一致 classes = ["recyclable", "kitchen", "harmful", "other"] def convert_voc_to_yolo(xml_path, out_path): tree = ET.parse(xml_path) root = tree.getroot() size = root.find("size") w = int(size.find("width").text) 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 cls_id = classes.index(cls) bbox = obj.find("bndbox") # VOC 坐标是左上角和右下角,YOLO 要中心点和宽高 x1 = float(bbox.find("xmin").text) y1 = float(bbox.find("ymin").text) x2 = float(bbox.find("xmax").text) y2 = float(bbox.find("ymax").text) # 归一化 cx = ((x1 + x2) / 2) / w cy = ((y1 + y2) / 2) / h bw = (x2 - x1) / w bh = (y2 - y1) / h f.write(f"{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}\n") # 批量转换 for xml_file in os.listdir("annotations"): if xml_file.endswith(".xml"): name = xml_file.replace(".xml", ".txt") convert_voc_to_yolo(f"annotations/{xml_file}", f"labels/{name}")

逻辑说明:VOC 用绝对像素坐标,YOLO 用归一化中心坐标,转换核心就是先算中心点再除以宽高。参数上classes列表的顺序决定了类别索引,改顺序等于改标签含义,训练前务必核对。转换完抽查几个 txt,确认坐标都在 0 到 1 之间,出现大于 1 说明原标注框超出图片边界,得手动修。

4. 模型训练与参数调优:从零到能出检测框

4.1 训练命令与关键参数含义

环境通了、数据齐了,训练就一行命令的事,但参数得知道在调什么。

yolo detect train \ data=datasets/garbage/data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ patience=20 \ project=runs/garbage \ name=exp1

参数说明:model用预训练权重做迁移学习,比从零训快得多,垃圾分类数据量通常几千张,迁移学习是标配。epochs是训练轮数,100 轮起步,看验证集指标不再提升就可以停。imgsz是输入尺寸,640 是 YOLO 默认值,显存不够降到 416 或 320。batch是批大小,16 适合 8G 显存,爆显存就减半。lr0是初始学习率,0.01 是 YOLO 常用值,太大震荡太小收敛慢。patience是早停耐心值,20 轮没提升就自动停,省时间。

4.2 训练过程看什么指标

训练日志里重点盯三个:box_loss、cls_loss、mAP50。box_loss 是边界框回归损失,cls_loss 是分类损失,两个都应该随轮数下降。mAP50 是 IoU 阈值 0.5 时的平均精度,垃圾分类场景下能到 0.85 以上就算不错。如果 box_loss 降但 mAP 不涨,多半是标注框质量差;如果 cls_loss 不降,检查类别是否标错或样本不均衡。

# 训练完用验证集跑一遍,看每类精度 from ultralytics import YOLO model = YOLO("runs/garbage/exp1/weights/best.pt") metrics = model.val(data="datasets/garbage/data.yaml") print(metrics.box.map) # 总体 mAP print(metrics.box.maps) # 每个类别的 mAP

metrics.box.maps会返回每个类别的精度数组,如果某一类特别低,比如有害垃圾只有 0.5,说明这类样本太少,得补数据或做数据增强。

4.3 数据增强与样本不均衡处理

垃圾分类数据集天然不均衡,可回收物一堆,有害垃圾没几张。YOLO 自带增强参数,在训练命令里加就行。

yolo detect train \ data=datasets/garbage/data.yaml \ model=yolov8n.pt \ epochs=100 \ hsv_h=0.015 hsv_s=0.7 hsv_v=0.4 \ degrees=10 translate=0.1 scale=0.5 \ fliplr=0.5 mosaic=1.0

参数说明:hsv_h/s/v是色调饱和度明度扰动,模拟不同光照。degrees旋转角度,translate平移比例,scale缩放比例,这三个让模型对位置和大小不敏感。fliplr水平翻转概率,垃圾左右翻转不影响类别。mosaic是马赛克增强,把四张图拼一张,YOLOv8 默认开,对小目标检测帮助大。样本不均衡还可以在 loss 里加类别权重,但 YOLO 没直接暴露这个参数,常见做法是复制少数类图片到训练集,简单粗暴但有效。

5. 推理部署与界面集成:让答辩现场能演示

5.1 单张图片和视频流的推理

训练完拿到best.pt,推理就几行代码。

from ultralytics import YOLO import cv2 model = YOLO("runs/garbage/exp1/weights/best.pt") # 单张图片推理 results = model("test.jpg", conf=0.5) results[0].save("result.jpg") # 视频流推理,适合答辩演示实时检测 cap = cv2.VideoCapture(0) # 0 是摄像头,也可以传视频路径 while cap.isOpened(): ret, frame = cap.read() if not ret: break results = model(frame, conf=0.5) annotated = results[0].plot() # 把检测框画到帧上 cv2.imshow("Garbage Detection", annotated) if cv2.waitKey(1) & 0xFF == ord("q"): break cap.release() cv2.destroyAllWindows()

参数说明:conf=0.5是置信度阈值,低于 0.5 的检测框不显示,调低会出更多框但误检也多,答辩演示建议 0.5 到 0.6。results[0].plot()返回画好框的 numpy 数组,直接喂给 OpenCV 显示。摄像头推理帧率取决于显卡,CPU 跑会卡,答辩前一定在演示机器上试一遍。

5.2 用 PyQt 或 Gradio 搭一个演示界面

课程设计通常要求有界面,Gradio 最快,几行代码出网页。

import gradio as gr from ultralytics import YOLO model = YOLO("runs/garbage/exp1/weights/best.pt") def detect(image): results = model(image, conf=0.5) return results[0].plot() # 输入图片,输出标注后的图片 demo = gr.Interface(fn=detect, inputs="image", outputs="image", title="垃圾分类检测") demo.launch(server_name="0.0.0.0", server_port=7860)

逻辑说明:gr.Interface把函数包成网页,输入输出都是图片。server_name="0.0.0.0"让局域网内其他设备也能访问,答辩时用手机拍一张传上去就能看结果。如果要求桌面程序,用 PyQt 加载模型,把results[0].plot()转成 QImage 显示,逻辑一样,只是多写几十行界面代码。

5.3 模型导出与推理加速

如果演示机器没装 PyTorch,可以把模型导出成 ONNX,用 onnxruntime 推理。

# 导出 ONNX 格式 yolo export model=runs/garbage/exp1/weights/best.pt format=onnx imgsz=640 # 导出后目录下会多一个 best.onnx
import onnxruntime as ort import numpy as np import cv2 session = ort.InferenceSession("best.onnx") # 预处理:resize 到 640x640,归一化,转 NCHW img = cv2.imread("test.jpg") img = cv2.resize(img, (640, 640)) img = img[:, :, ::-1].transpose(2, 0, 1).astype(np.float32) / 255.0 img = np.expand_dims(img, axis=0) outputs = session.run(None, {session.get_inputs()[0].name: img}) # outputs 是检测结果,后处理包括 NMS 和坐标还原

ONNX 推理不依赖 PyTorch,部署到没装深度学习框架的机器上很方便。参数上imgsz=640要和训练时一致,不一致精度会掉。后处理里的 NMS 阈值一般设 0.45,太高会保留重叠框,太低会漏检。

6. 避坑与常见问题排查:那些让我熬夜的报错

6.1 训练 loss 为 nan 或不下降

现象:训练几轮后 box_loss 变成 nan,或者一直停在 1.0 附近不动。原因通常是学习率太大或标注坐标越界。解决:把lr0降到 0.001 再试,同时用脚本检查所有标签文件,坐标必须在 0 到 1 之间,出现负数或大于 1 就修正。另外确认图片路径没有中文和空格,YOLO 对中文路径支持不好,会静默读不到图。

6.2 验证集 mAP 为 0

现象:训练 loss 正常降,但验证集 mAP 一直是 0。原因多半是data.yaml里val路径写错,或者验证集标签没放对位置。解决:先确认datasets/garbage/images/val和labels/val里文件数量一致且同名,再检查data.yaml的path是不是绝对路径。还有一个隐蔽原因:类别索引对不上,训练时用的 names 和标注时的类别顺序不一致,模型学到的全是错的。

6.3 推理时检测框乱飞或类别全错

现象:模型能出框,但框的位置离谱,或者所有物体都标成同一类。原因通常是训练时nc和实际类别数不匹配,或者导出 ONNX 后预处理没对齐。解决:重新核对data.yaml的nc和names,确认标注文件里的类别 id 在 0 到 nc-1 之间。ONNX 推理时检查输入是否做了归一化和通道转换,YOLO 要 RGB 输入,OpenCV 读进来是 BGR,忘了转就会颜色错乱导致检测异常。

6.4 显存不足导致训练中断

现象:训练到一半报 CUDA out of memory。原因:batch 太大或图片尺寸太高。解决:把batch从 16 降到 8 或 4,imgsz从 640 降到 416。还可以开梯度累积,用batch=4累积 4 次等效batch=16,YOLO 里用nbs参数控制。如果还不行,换yolov8n这种小模型,参数量少显存占用低。

6.5 答辩现场摄像头打不开

现象:代码在宿舍能跑,到答辩教室摄像头报错。原因:教室电脑没装摄像头驱动,或者 OpenCV 的VideoCapture(0)索引不对。解决:提前准备一段测试视频,用cv2.VideoCapture("test.mp4")代替摄像头,保证演示不翻车。另外把best.pt和测试图片一起拷到 U 盘,现场重新配环境来不及,直接跑推理脚本最稳。

7. 进阶技巧:把 mAP 再往上推几个点

训练完第一版模型,mAP 卡在 0.85 上不去,这时候别急着换模型,先做几件性价比高的事。第一,检查标注质量,用yolo detect val把预测框和真实框画在一起,肉眼比对,错标漏标改一轮,mAP 通常能涨 2 到 3 个点。第二,针对低精度类别补数据,比如有害垃圾样本少,就专门去拍或找这类图片,加到训练集里,类别均衡比调参管用。第三,试不同的输入尺寸,640 不一定最优,垃圾分类目标通常比较大,512 可能更快且精度不降,用imgsz=512重训一版对比。

# 用不同尺寸训练,对比 mAP yolo detect train data=datasets/garbage/data.yaml model=yolov8s.pt epochs=100 imgsz=512 batch=16 yolo detect train data=datasets/garbage/data.yaml model=yolov8s.pt epochs=100 imgsz=640 batch=16

模型规模也可以升一级,yolov8n换yolov8s,参数量翻倍但精度通常涨 1 到 2 个点,代价是推理变慢。答辩演示用 nano 够了,如果写论文要刷指标,用 small 或 medium。还有一个技巧是冻结 backbone 先训几轮,再解冻全量微调,YOLO 里用freeze=10冻结前 10 层,适合数据量小的时候防止过拟合。

# 先冻结 backbone 训 20 轮,再全量微调 yolo detect train data=datasets/garbage/data.yaml model=yolov8s.pt epochs=20 freeze=10 yolo detect train data=datasets/garbage/data.yaml model=runs/garbage/exp/weights/last.pt epochs=80

最后说个验证方法:把验证集按类别拆开,单独算每一类的 mAP,找出最差的那类重点优化。我一般会写个脚本统计每个类别的检测结果,混淆矩阵一看就知道哪两类容易混,比如厨余和其他垃圾经常分不清,那就针对这两类补数据。从那以后我每次训完模型都强制走一遍分类别评估,不再只看总体 mAP,这个习惯帮我省了很多返工时间。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 3:14:23

基于YOLOv8的脑肿瘤检测毕设全流程:从LabelMe标注到推理部署

简介:这份资源是基于YOLOv8的脑肿瘤检测完整项目包,面向深度学习入门者、医学影像方向学生以及需要完成毕业设计、课程设计或期末大作业的人群,帮助读者理解目标检测模型在脑部MRI/CT影像中定位与分类肿瘤的完整流程。压缩包共19个文件&#…

作者头像 李华
网站建设 2026/10/2 3:13:34

R语言随机森林生态数据建模全流程:从预处理到变量重要性评估

简介:这份资源面向具备一定R语言基础、希望将随机森林方法应用于生态数据分析的学习者与科研人员,提供从数据准备到模型构建、评估与优化的完整实践素材。压缩包共2个文件,包含1个csv数据文件与1个R脚本,整体约4KB,体量…

作者头像 李华
网站建设 2026/10/2 3:12:27

从HttpClient到流式对话:.NET接入豆包大模型API完整实践

1. 接入前的整体思路:豆包在.NET生态里到底怎么定位1.1 豆包API的兼容协议与生态位置豆包是字节跳动训练的大语言模型系列,对外统一通过火山引擎方舟平台对外开放。对.NET开发工程师来说,“豆包”三个字其实要拆成两层理解:普通用…

作者头像 李华
网站建设 2026/10/2 3:11:48

1000MW燃煤机组燃料智能管控系统:配煤掺烧与度电成本闭环

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 3:11:21

2026大流量节能直饮机选型指南:办公室与工厂场景全解析

做商用净水这些年,经手的项目从几十人的初创公司到上千人的制造工厂都碰过。2026年怎么选商用净水设备,最近被问得特别多,尤其是办公室行政和工厂后勤,开口就要大流量、要节能。这个需求不是矫情,是被现实逼出来的&…

作者头像 李华
网站建设 2026/10/2 3:11:09

Python双目立体视觉测距系统源码:标定、极线校正与SGBM实战

简介:Python双目立体视觉测距系统源码,为具备一定Python基础的开发者与高校机器视觉学习者提供一套可运行的参考实现,覆盖双摄像头标定、立体匹配、视差计算与距离测量等核心环节,适用于课程设计、入门实践或小型项目原型验证。资…

作者头像 李华