前言:为什么选择这个项目?

又到了一年一度的毕业设计季,相信很多计算机专业的同学都在为毕设项目发愁:

  • 环境配置困难:PyTorch、CUDA版本不匹配,各种依赖包报错
  • 代码看不懂:GitHub上的项目代码复杂,没有详细注释
  • 数据集难找:想要训练自己的模型,却找不到合适的数据集
  • 没有UI界面:命令行运行的项目,展示效果差,导师不满意

如果你也遇到了这些问题,那么今天分享的这个基于YOLOv8的垃圾分类检测系统绝对能帮到你!

项目优势

纯Python开发:无需复杂配置,环境搭建简单
一键运行:提供完整的UI界面,点击即用
功能完善:支持图片检测、视频检测、摄像头实时检测
数据集丰富:包含3490+张标注好的VOC格式图片
代码规范:详细的中文注释,易于理解和二次开发
分类智能:自动将38种垃圾分为4大类(可回收物、厨余垃圾、有害垃圾、其他垃圾)


系统演示

主界面展示

在这里插入图片描述

从图中可以看到,系统界面简洁美观,功能模块清晰:

  • 左侧:模型选择、检测模式选择(图片/视频/摄像头)
  • 中间:实时显示检测结果
  • 右侧:显示检测到的垃圾类别、置信度、坐标位置等信息

检测效果展示

在这里插入图片描述

从检测结果可以看到:

  • 识别准确率高:系统能够准确识别出图片中的多种垃圾,置信度普遍在85%以上
  • 检测速度快:单张图片检测时间<100ms,视频检测FPS>30
  • 分类准确:自动将检测到的垃圾分类为可回收物、厨余垃圾、有害垃圾、其他垃圾四大类
  • 界面友好:检测结果以表格形式展示,包含序号、文件路径、识别结果、置信度、垃圾类别、坐标位置等信息

核心技术栈

本项目采用的技术栈如下:

技术 说明
Python 主要开发语言,语法简洁,生态丰富
PyTorch 深度学习框架,社区活跃,文档完善
PyQt5 GUI框架,界面美观,跨平台支持
OpenCV 计算机视觉库,图像处理必备
YOLOv8 最新的目标检测算法,速度快精度高
PIL/Pillow Python图像处理库

为什么选择这些技术?

  1. Python:语法简洁,适合快速开发,有丰富的第三方库支持
  2. PyTorch:相比TensorFlow更容易上手,动态图机制调试方便,适合学术研究和项目开发
  3. PyQt5:相比Tkinter功能更强大,界面更美观,适合做毕业设计展示
  4. 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:使用系统进行检测

图片检测

  1. 点击"选择图像"按钮
  2. 选择要检测的图片(支持jpg、png格式)
  3. 调整置信度阈值(可选,默认0.5)
  4. 查看检测结果

视频检测

  1. 点击"选择视频"按钮
  2. 选择要检测的视频文件(支持mp4、avi格式)
  3. 系统会自动逐帧检测并显示结果

摄像头实时检测

  1. 点击"打开摄像头"按钮
  2. 系统会打开电脑摄像头进行实时检测
  3. 再次点击可关闭摄像头

训练自己的模型(可选)

如果你想用自己的数据集训练模型:

# 1. 准备VOC格式数据集
# 将图片放在 VOCdevkit/VOC2007/JPEGImages/
# 将XML标注文件放在 VOCdevkit/VOC2007/Annotations/

# 2. 生成训练和验证集列表
python voc_annotation.py

# 3. 开始训练
python train.py

# 4. 训练完成后,模型权重会保存在 logs/ 目录下

训练参数说明

  • Freeze_Epoch = 100:冻结训练100个epoch
  • UnFreeze_Epoch = 300:解冻训练300个epoch
  • Freeze_batch_size = 8:冻结阶段batch size
  • Unfreeze_batch_size = 8:解冻阶段batch size
  • Init_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: 可以检测其他类别的物体吗?

可以!只需要:

  1. 准备新的数据集并标注
  2. 修改 model_data/my_classes.txt 文件
  3. 重新训练模型

获取源码方式

由于篇幅限制,本文仅展示了项目的核心功能和部分代码片段。

完整项目包含

  • ✅ 完整的源代码(带详细中文注释)
  • ✅ 训练好的模型权重文件
  • ✅ 3490+张标注好的数据集
  • ✅ 完整的项目文档和使用说明
  • ✅ 万字项目报告(适合做毕设参考)
  • ✅ 环境配置视频教程
  • ✅ 项目运行演示视频

获取方式
请点击下方卡片/链接获取完整源码和资料。

项目获取链接:https://my.feishu.cn/wiki/UoEjwqsL1iyyc4koWdzcNkh1ndf?from=from_copylink

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐