Python深度学习实战:YOLOv8垃圾分类检测系统,支持图片/视频/摄像头,准确率95%+
环境配置困难:PyTorch、CUDA版本不匹配,各种依赖包报错代码看不懂:GitHub上的项目代码复杂,没有详细注释数据集难找:想要训练自己的模型,却找不到合适的数据集没有UI界面:命令行运行的项目,展示效果差,导师不满意如果你也遇到了这些问题,那么今天分享的这个基于YOLOv8的垃圾分类检测系统绝对能帮到你!
前言:为什么选择这个项目?
又到了一年一度的毕业设计季,相信很多计算机专业的同学都在为毕设项目发愁:
- 环境配置困难:PyTorch、CUDA版本不匹配,各种依赖包报错
- 代码看不懂:GitHub上的项目代码复杂,没有详细注释
- 数据集难找:想要训练自己的模型,却找不到合适的数据集
- 没有UI界面:命令行运行的项目,展示效果差,导师不满意
如果你也遇到了这些问题,那么今天分享的这个基于YOLOv8的垃圾分类检测系统绝对能帮到你!
项目优势
✅ 纯Python开发:无需复杂配置,环境搭建简单
✅ 一键运行:提供完整的UI界面,点击即用
✅ 功能完善:支持图片检测、视频检测、摄像头实时检测
✅ 数据集丰富:包含3490+张标注好的VOC格式图片
✅ 代码规范:详细的中文注释,易于理解和二次开发
✅ 分类智能:自动将38种垃圾分为4大类(可回收物、厨余垃圾、有害垃圾、其他垃圾)
系统演示
主界面展示

从图中可以看到,系统界面简洁美观,功能模块清晰:
- 左侧:模型选择、检测模式选择(图片/视频/摄像头)
- 中间:实时显示检测结果
- 右侧:显示检测到的垃圾类别、置信度、坐标位置等信息
检测效果展示

从检测结果可以看到:
- ✅ 识别准确率高:系统能够准确识别出图片中的多种垃圾,置信度普遍在85%以上
- ✅ 检测速度快:单张图片检测时间<100ms,视频检测FPS>30
- ✅ 分类准确:自动将检测到的垃圾分类为可回收物、厨余垃圾、有害垃圾、其他垃圾四大类
- ✅ 界面友好:检测结果以表格形式展示,包含序号、文件路径、识别结果、置信度、垃圾类别、坐标位置等信息
核心技术栈
本项目采用的技术栈如下:
| 技术 | 说明 |
|---|---|
| Python | 主要开发语言,语法简洁,生态丰富 |
| PyTorch | 深度学习框架,社区活跃,文档完善 |
| PyQt5 | GUI框架,界面美观,跨平台支持 |
| OpenCV | 计算机视觉库,图像处理必备 |
| YOLOv8 | 最新的目标检测算法,速度快精度高 |
| PIL/Pillow | Python图像处理库 |
为什么选择这些技术?
- Python:语法简洁,适合快速开发,有丰富的第三方库支持
- PyTorch:相比TensorFlow更容易上手,动态图机制调试方便,适合学术研究和项目开发
- PyQt5:相比Tkinter功能更强大,界面更美观,适合做毕业设计展示
- YOLOv8:YOLO系列的最新版本,在保持高速度的同时,检测精度进一步提升,是目前最先进的目标检测算法之一
项目目录结构
yolov8-pytorch-rubbish_01/
│
├── nets/ # 网络模型定义
│ ├── backbone.py # YOLOv8骨干网络
│ ├── yolo.py # YOLO模型主体
│ └── yolo_training.py # 训练相关函数
│
├── utils/ # 工具函数
│ ├── utils.py # 通用工具函数(图像预处理等)
│ ├── utils_bbox.py # 边界框处理函数
│ ├── utils_fit.py # 训练拟合函数
│ ├── utils_map.py # mAP评估函数
│ ├── dataloader.py # 数据加载器
│ └── callbacks.py # 训练回调函数
│
├── model_data/ # 模型相关数据
│ ├── my_classes.txt # 类别名称文件(38类垃圾)
│ ├── yolov8_s.pth # 预训练权重文件
│ └── simhei.ttf # 中文字体文件
│
├── VOCdevkit/ # VOC格式数据集
│ └── VOC2007/
│ ├── Annotations/ # XML标注文件(3490个)
│ ├── JPEGImages/ # 原始图片(3490张)
│ └── ImageSets/ # 数据集划分文件
│
├── logs/ # 训练日志和权重文件
│ ├── best_epoch_weights.pth # 最佳模型权重
│ └── loss_*/ # 训练损失曲线
│
├── ui/ # UI界面资源文件
│ ├── ui.ui # Qt Designer设计文件
│ └── *.png # 界面图标资源
│
├── img/ # 测试图片
├── img_out/ # 检测结果输出
│
├── 主界面.py # 主程序入口(PyQt5界面)
├── predict.py # 命令行预测脚本
├── train.py # 模型训练脚本
├── yolo.py # YOLO检测类
├── waste_category.py # 垃圾分类函数
└── voc_annotation.py # VOC格式转换脚本
目录结构说明:
nets/:包含YOLOv8的网络结构定义,这是整个项目的核心算法部分utils/:封装了各种工具函数,包括图像预处理、数据加载、模型评估等model_data/:存放预训练模型权重和类别文件VOCdevkit/:标准VOC格式数据集,包含3490张标注好的图片logs/:训练过程中保存的模型权重和日志文件ui/:PyQt5界面设计文件和资源
核心代码展示
1. UI界面初始化与检测流程
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
# 初始化YOLO检测模型
self.yolo = YOLO()
# 设置置信度阈值下拉框(0.1-0.9)
self.comboBox.addItems(["0.1", "0.2", "0.3", "0.4", "0.5", "0.6", "0.7", "0.8", "0.9"])
self.comboBox.setCurrentIndex(4) # 默认0.5
# 绑定按钮点击事件
self.pushButton_pic.clicked.connect(self.select_img) # 图片检测
self.pushButton_video.clicked.connect(self.select_video) # 视频检测
self.pushButton_camera.clicked.connect(self.button_open_camera_clicked) # 摄像头检测
def select_img(self):
"""选择图片进行检测"""
# 打开文件选择对话框
self.img_path, _ = QFileDialog.getOpenFileName(None, 'open img', '', "*.png;*.jpg;;All Files(*)")
if self.img_path:
# 使用PIL加载图片
image = Image.open(self.img_path)
# 调用YOLO模型进行检测
r_image = self.yolo.detect_image(
image,
crop=False,
count=False,
confidence=float(self.comboBox.currentText()) # 使用设置的置信度阈值
)
# 调整图片大小并保存
r_image = r_image.resize((411, 281))
r_image.save('res3.png')
# 在界面上显示检测结果
self.label_show.setStyleSheet("image: url(./res3.png)")
# 更新检测结果表格
self.show_data()
代码说明:
- 使用PyQt5构建图形界面,界面美观易用
- 支持动态调整置信度阈值,用户可以根据需要调整检测灵敏度
- 检测流程:选择图片 → 加载模型 → 执行检测 → 显示结果
2. YOLO模型检测核心函数
def detect_image(self, image, crop = False, count = False,confidence=0.5):
self.confidence=confidence
with open('res.txt','w')as fb:
fb.write('')
#---------------------------------------------------#
# 计算输入图片的高和宽
#---------------------------------------------------#
image_shape = np.array(np.shape(image)[0:2])
#---------------------------------------------------------#
# 在这里将图像转换成RGB图像,防止灰度图在预测时报错。
# 代码仅仅支持RGB图像的预测,所有其它类型的图像都会转化成RGB
#---------------------------------------------------------#
image = cvtColor(image)
#---------------------------------------------------------#
# 给图像增加灰条,实现不失真的resize
# 也可以直接resize进行识别
#---------------------------------------------------------#
image_data = resize_image(image, (self.input_shape[1], self.input_shape[0]), self.letterbox_image)
#---------------------------------------------------------#
# 添加上batch_size维度
# h, w, 3 => 3, h, w => 1, 3, h, w
#---------------------------------------------------------#
image_data = np.expand_dims(np.transpose(preprocess_input(np.array(image_data, dtype='float32')), (2, 0, 1)), 0)
with torch.no_grad():
images = torch.from_numpy(image_data)
if self.cuda:
images = images.cuda()
#---------------------------------------------------------#
# 将图像输入网络当中进行预测!
#---------------------------------------------------------#
t1 = time.time()
outputs = self.net(images)
outputs = self.bbox_util.decode_box(outputs)
t2 = time.time()
print(t2 - t1)
with open('time.txt','w')as fb:
fb.write(str(round(t2 - t1,2)))
#---------------------------------------------------------#
# 将预测框进行堆叠,然后进行非极大抑制
#---------------------------------------------------------#
results = self.bbox_util.non_max_suppression(outputs, self.num_classes, self.input_shape,
image_shape, self.letterbox_image, conf_thres = self.confidence, nms_thres = self.nms_iou)
if results[0] is None:
return image
top_label = np.array(results[0][:, 5], dtype = 'int32')
top_conf = results[0][:, 4]
top_boxes = results[0][:, :4]
代码说明:
- 使用PyTorch进行模型推理,支持CPU和GPU两种模式
- 实现了完整的检测流程:图像预处理 → 模型推理 → 后处理(NMS) → 结果绘制
- 支持动态调整置信度阈值,灵活控制检测精度
3. 垃圾自动分类功能
qita=['xie','canjinzhi','suliaodai','naicha','zhiniaoku','kouxiangtang','zhibei','yantou','baoxianmo','wazi','huoji','yaqian','kouzhao']
chuyu=['jidanke','xia','qingcai','xiguapi','qiaokeli','diliao','jidankedddaa','mifan','neizang','xiangjiaopi','mianbao']
kehuishou=['shuibei','dao','wanou','chongdianbao','guo','baozhi','chazuo','bao','jiuping','yilaguan','dingzi']
youhai=['wenduji','dengpao','yao']
def main(name):
"""
根据检测到的垃圾名称,自动分类到四大类
Args:
name: 检测到的垃圾类别名称(如'xie'表示废旧鞋子)
Returns:
[name, 垃圾大类, 详细说明]
"""
if name in qita :
tp='其他垃圾'
content='其他垃圾,指除可回收物、有害垃圾、餐厨垃圾外的其他生活垃圾。即现环卫体系主要收集和处理的垃圾,' \
'一般都采取填埋、焚烧等方法处理,部分还可以使用生物分解的方法解决,如放蚯蚓等。其他垃圾是可回收物、' \
'厨余垃圾、有害垃圾剩余下来的一种垃圾种类。'
return [name, tp, content]
if name in youhai :
tp = '有害垃圾'
content = '有害垃圾,指生活垃圾中对人体健康或自然环境造成直接或潜在危害的物质。\
必须单独收集、运输、存贮,由环保部门认可的专业机构进行特殊安全处理。' \
'常见的有害垃圾包括废灯管、废油漆、杀虫剂、废弃化妆品、过期药品、废电池、' \
'废灯泡、废水银温度计等,有害垃圾需按照特殊正确的方法安全处理。'
return [name, tp, content]
if name in kehuishou:
tp = '可回收物'
content = '可回收物就是再生资源,指生活垃圾中未经污染、适宜回收循环利用的废物。' \
' 主要包括废弃电器电子产品、废纸张、废塑料、废玻璃、废金属等五类,' \
'是现阶段生活垃圾分类的主要工作和影响垃圾减量的重要因素。'
return [name, tp, content]
if name in chuyu:
tp = '厨余垃圾'
content = '厨余垃圾是指居民日常生活及食品加工、饮食服务、单位供餐等活动中产生的垃圾,' \
'包括丢弃不用的菜叶、剩菜、剩饭、果皮、蛋壳、茶渣、骨头(鸡骨、鱼刺类)等,其' \
'主要来源为家庭厨房、餐厅、饭店、食堂、市场及其他与食品加工有关的行业。'
return [name, tp, content]
代码说明:
- 将38种具体垃圾类别自动归类到4大垃圾类别
- 提供详细的垃圾分类说明,帮助用户了解垃圾分类知识
- 代码简洁易懂,易于扩展新的垃圾类别
如何使用/运行步骤
环境配置
方法一:使用Anaconda(推荐)
# 1. 创建虚拟环境
conda create -n pytorch python=3.8
conda activate pytorch
# 2. 安装PyQt5
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyQt5
# 3. 安装PyTorch(根据你的CUDA版本选择)
# CPU版本
pip install torch torchvision
# GPU版本(CUDA 11.0)
pip install torch torchvision -i https://pypi.mirrors.ustc.edu.cn/simple/
# 4. 安装其他依赖
pip install opencv-python==4.5.5.62
pip install matplotlib
pip install tensorboard
pip install tqdm
pip install scikit-learn
pip install Pillow==9.5.0
方法二:使用requirements.txt(如果项目提供)
pip install -r requirements.txt
运行步骤
步骤1:准备模型权重文件
将训练好的模型权重文件(best_epoch_weights.pth)放置在 logs/ 目录下。
如果没有训练好的模型,可以使用项目提供的预训练权重文件(位于 model_data/ 目录)。
步骤2:运行主程序
python 主界面.py
或者使用命令行预测:
python predict.py
步骤3:使用系统进行检测
图片检测:
- 点击"选择图像"按钮
- 选择要检测的图片(支持jpg、png格式)
- 调整置信度阈值(可选,默认0.5)
- 查看检测结果
视频检测:
- 点击"选择视频"按钮
- 选择要检测的视频文件(支持mp4、avi格式)
- 系统会自动逐帧检测并显示结果
摄像头实时检测:
- 点击"打开摄像头"按钮
- 系统会打开电脑摄像头进行实时检测
- 再次点击可关闭摄像头
训练自己的模型(可选)
如果你想用自己的数据集训练模型:
# 1. 准备VOC格式数据集
# 将图片放在 VOCdevkit/VOC2007/JPEGImages/
# 将XML标注文件放在 VOCdevkit/VOC2007/Annotations/
# 2. 生成训练和验证集列表
python voc_annotation.py
# 3. 开始训练
python train.py
# 4. 训练完成后,模型权重会保存在 logs/ 目录下
训练参数说明:
Freeze_Epoch = 100:冻结训练100个epochUnFreeze_Epoch = 300:解冻训练300个epochFreeze_batch_size = 8:冻结阶段batch sizeUnfreeze_batch_size = 8:解冻阶段batch sizeInit_lr = 1e-2:初始学习率
项目特色功能
1. 多模式检测支持
- ✅ 图片检测:单张图片快速检测
- ✅ 视频检测:支持视频文件逐帧检测
- ✅ 实时检测:摄像头实时检测,FPS>30
2. 智能垃圾分类
- ✅ 自动识别38种具体垃圾类别
- ✅ 自动归类到4大垃圾类别(可回收物、厨余垃圾、有害垃圾、其他垃圾)
- ✅ 提供详细的垃圾分类说明
3. 可视化展示
- ✅ 检测结果以表格形式展示
- ✅ 显示检测框坐标、置信度等信息
- ✅ 支持点击表格查看详细信息
4. 灵活的参数配置
- ✅ 可动态调整置信度阈值(0.1-0.9)
- ✅ 支持选择不同的YOLOv8模型(n/s/m/l/x)
- ✅ 可自定义模型权重文件
数据集说明
本项目使用的数据集包含:
- 图片数量:3490张高质量标注图片
- 标注格式:VOC格式(XML文件)
- 类别数量:38种垃圾类别
- 数据划分:训练集和验证集已划分好
常见问题解答
Q1: 运行报错 “No module named ‘PyQt5’”
需要安装PyQt5,使用命令:pip install PyQt5
Q2: 检测速度很慢怎么办?
- 如果有GPU,在
yolo.py中将cuda = True - 使用较小的YOLOv8模型(如yolov8_n)
- 降低输入图片分辨率
Q3: 如何提高检测准确率?
- 使用更大的YOLOv8模型(如yolov8_l或yolov8_x)
- 使用更多数据进行训练
- 调整数据增强参数
- 使用更好的预训练权重
Q4: 可以检测其他类别的物体吗?
可以!只需要:
- 准备新的数据集并标注
- 修改
model_data/my_classes.txt文件 - 重新训练模型
获取源码方式
由于篇幅限制,本文仅展示了项目的核心功能和部分代码片段。
完整项目包含:
- ✅ 完整的源代码(带详细中文注释)
- ✅ 训练好的模型权重文件
- ✅ 3490+张标注好的数据集
- ✅ 完整的项目文档和使用说明
- ✅ 万字项目报告(适合做毕设参考)
- ✅ 环境配置视频教程
- ✅ 项目运行演示视频
获取方式:
请点击下方卡片/链接获取完整源码和资料。
项目获取链接:https://my.feishu.cn/wiki/UoEjwqsL1iyyc4koWdzcNkh1ndf?from=from_copylink
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)