垃圾分类目标检测毕设实战:从YOLO训练到系统部署

发布时间:2026/9/16 12:09:16
垃圾分类目标检测毕设实战:从YOLO训练到系统部署 简介面向计算机专业毕业设计、课程设计与期末大作业场景这是一套基于深度学习的垃圾分类目标检测系统完整源码另附答辩PPT可有效解决毕业设计选题难、系统不完整的问题。项目采用Python实现覆盖数据标注、模型训练、目标检测与结果展示全流程适合需要快速搭建可演示原型的中级学习者。压缩包共126个文件66.07MB以py源码和ipynb分析脚本为主包含vue前端、html页面、js交互逻辑、png可视化图表以及onnx权重模型与pptx答辩材料另附参考报告docx、sqlite3数据库等结构清晰目录按前后端、模型、文档模块划分便于二次开发。目前已有199人学习下载。项目评审分99分代码完整可运行除核心模型与界面外还提供文档模板与实践报告可帮助使用者理解系统构建思路并顺利通过答辩是一份实操性强、可直接改造的毕业设计参考也可作为课程设计与项目实战练习的优质案例。1. 垃圾分类目标检测毕设先别急着训模型垃圾分类目标检测这类毕业设计卡住人的通常不是模型跑不出来而是从一开始就把“垃圾分类”四个字想简单了。很多人第一步就从网上找现成数据集结果发现标注格式五花八门类别体系互相矛盾模型训练完一跑演示视频错检全来自“可回收物里的纸箱和塑料瓶长得像”这类标签打架。这个标题真正要交付的东西很具体一套用 Python 和深度学习里的目标检测算法实现的垃圾分类系统包含可复现的训练流程、可二次开发的源码、以及答辩现场能直接用上的演示材料。适合两类人一类是要完成毕设但不想只交文档的在校生另一类是准备把“目标检测落地经验”写进简历的开发者。系统本身不复杂但每一个环节都有值得说清楚的细节。2. 数据集与标签格式垃圾分几类模型就长什么样2.1 分类体系先定别用四类硬训目标检测国内生活垃圾分类标准通常把垃圾分成可回收物、有害垃圾、厨余垃圾、其他垃圾四大类很多同学拿这套四分类直接训练检测器结果很差。原因在标签信息量太小纸箱、矿泉水瓶、易拉罐在图像形态上差异极大却要共用同一个“可回收物”类别网络被迫学一个不存在统一视觉特征的目标。卷积神经网络能学的是纹理、形状、颜色不是“可回收”这种语义概念。我一般建议毕设里把细分类别控制在 10 到 30 类之间既保证每个类别视觉特征足够区分又不至于因为类别过多导致训练数据量不够。答辩时导师问“为什么分这么多类”标准答法是检测模型的输出粒度取决于标注粒度细分类才能体现目标检测的价值而不是分类网络的“整图判断”。常见的二级分类体系可以做成这样一级分类细分类别典型训练标签可回收物纸张、纸箱、塑料瓶、玻璃瓶、易拉罐、旧衣物paper, cardboard, plastic_bottle, glass_bottle, can, cloth有害垃圾电池、过期药品、废灯管battery, medicine, tube厨余垃圾果皮、剩菜、骨头fruit_peel, leftovers, bone其他垃圾烟蒂、陶瓷碎片、一次性餐具cigarette_butt, ceramics, disposable_tableware这套体系下每个类别都有相对独立的颜色、形状和纹理检测器学到的东西才是可解释的。注意类别数决定nc参数后面训练配置文件里要一一对应。2.2 公开数据集与自建补充数据的博弈目前公开可用的垃圾图像数据集主要有两种一种是学术性质的 TrashNet 这类小型图像分类集另一种是面向目标检测的垃圾标注数据集比如华为云 AI 市场上的垃圾分类数据。前者干净但缺框标注后者规模更大但标注质量参差不齐经常出现定位框偏大、类别标错、同一样本重复出现的问题。这里有个容易被低估的点公开数据集的图片大多来自实验室棚拍背景单一、物体居中模型在这种数据上训练完拿到宿舍走廊一测就崩。常见做法是用手机在真实地面、桌面、垃圾桶旁各拍几百张借助开源标注工具补齐边界框再把公开数据和自建数据混在一起训练。数据量的优先级是每类至少 300 个标注实例总的标注图片数最好在 3000 张以上。如果某些细类实在凑不够宁可在 2.1 的分类表里删掉这一类也不要用 20 张图硬训出一个什么都检不出的类别。2.3 把 COCO / XML 标注转成 YOLO 格式从公开数据集拿到的标注格式大多是 COCO JSON 或 PASCAL VOC XML而当前主流的 YOLO 目标检测流程要求每张图片对应一个同名.txt文件每行格式是class cx cy w h四个坐标值都归一化到 0 到 1。这里必须自己写转换脚本不能手工改。import json import os def coco_to_yolo(coco_path: str, image_dir: str, out_dir: str) - int: # 读取 COCO 格式标注输出 YOLO 格式 txt with open(coco_path, encodingutf-8) as f: coco json.load(f) os.makedirs(out_dir, exist_okTrue) # image_id 到图片信息的映射 img_info {im[id]: im for im in coco[images]} # 原始类别 id 映射到从 0 开始的连续 id cat_map {cat[id]: i for i, cat in enumerate(coco[categories])} written 0 for ann in coco[annotations]: img img_info[ann[image_id]] img_w, img_h img[width], img[height] x, y, w, h ann[bbox] cx (x w / 2) / img_w cy (y h / 2) / img_h nw w / img_w nh h / img_h line f{cat_map[ann[category_id]]} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}\n txt_name img[file_name].rsplit(., 1)[0] .txt with open(os.path.join(out_dir, txt_name), a, encodingutf-8) as f: f.write(line) written 1 return written这份代码把 COCO 的bbox左上角 x、y 和宽高换算成中心点坐标再分别除以图片宽高完成归一化。关键点有两个类别 id 必须从 0 开始连续排列否则训练时类别数和names对不上坐标必须归一化因为 YOLO 训练时会对图片做缩放和填充绝对像素值在不同分辨率下没有可比性。转换完之后做一次自查随机挑 5 张图把 txt 里的坐标按公式还原成像素框画在原图上人工过一遍。这一步能筛掉最隐蔽的标注偏移比如公开数据集里某些图片的宽高信息写反了。2.4 小目标标注的清洗与数据增强垃圾分类场景里小目标问题尤其突出烟蒂、纽扣电池、碎纸片在整张图中的面积占比经常小于 1%。对小目标来说标注精度比标注数量更关键边界框多包含 10 个像素的背景训练时就会让模型把背景纹理学进去。数据增强层面先把马赛克增强打开这是 YOLO 流程内置的增强策略之一通过把四张图拼成一张提升单张图片里的目标数量和尺度多样性。不要对细长目标使用过强的随机旋转像温度计、笔这类长条形物体旋转 90 度后语义会发生歧义模型容易把一个横着的温度计认成别的类别。如果发现某个小类别召回率低可以对该类样本做裁剪放大把小目标区域切出来复制到背景图上本质上是在增加“该类别在图像中占比大”的训练样本。3. YOLO 目标检测流程里的训练配置与参数调优3.1 为什么选 YOLO 而不是 Faster R-CNN毕设答辩里最常被问的问题是“目标检测算法那么多为什么选 YOLO”。两阶段检测器 Faster R-CNN 原理上更好讲但工程闭环太慢数据处理要单独组织推理部署要写一堆样板代码。YOLO 这类单阶段检测器把从数据加载到训练再到导出权重做成了统一流程所有环节的源码都是公开可读的且生态里已经内置了标注时的数据增强、超参数搜索、混淆矩阵输出这些功能这在毕设周期里能省出大量时间。深度学习 CNN 提取特征的整个过程对垃圾分类是有效的垃圾图像和自动驾驶场景相比背景更简单YOLO 的骨干网络完全够用分类边界不清晰的问题主要出在类别体系设计而不是网络容量。如果要填训练速度快的理由记得补充一句单阶段检测器直接在特征图上回归类别和边界框没有候选区域生成阶段因此在相同计算资源条件下训练和推理都更快这在演示现场很加分。3.2 用 ultralytics 跑通第一轮训练我这里用的是 ultralytics 提供的 YOLOv8n 预训练模型作为起点这套流程在一台普通 GPU 机器上就能跑完。pip install ultralytics yolo detect train datatrash.yaml modelyolov8n.pt epochs150 \ imgsz640 batch16 device0 patience30训练前需要准备数据集描述文件trash.yaml# 垃圾分类数据集配置 path: ./trash_dataset # 数据集根目录 train: images/train # 训练图片路径 val: images/val # 验证图片路径 nc: 16 # 类别数量与转换后的类别 id 对应 names: 0: cardboard 1: paper 2: plastic_bottle 3: glass_bottle 4: can 5: battery 6: medicine 7: fruit_peel 8: leftovers 9: cigarette_butt 10: ceramics 11: cloth 12: tube 13: disposable_tableware 14: bone 15: other第一次跑yolov8n.pt会从网络下载预训练权重训练过程中会自动在runs/detect/train目录下生成权重文件、训练曲线图和混淆矩阵。需要理解的关键点是modelyolov8n.pt表示在这个预训练权重基础上微调而不是从随机权重开始这样收敛快且对中小规模数据集更稳。若显存不够把batch降到 8同时确认device0指向的是可用 GPU没有 GPU 的机器可以改devicecpu但训练时间会慢一个量级毕设最好还是找云 GPU 或学校机房。3.3 必调的五个参数与训练日志怎么读同样一个数据集训练参数不同最终 mAP 能差出 10 个点以上。下面是这个场景里最需要关注的参数表参数推荐取值作用常见误用imgsz640 或 1280输入分辨率盲目上 1280 导致 OOM小目标多时才值得加大epochs100 到 200完整遍历数据集的轮数只看轮数不看早停浪费大量时间batch显存上限的 16 或 32每次迭代的样本数batch 太大造成后期振荡patience30 到 50连续多少轮指标不升就停止设太大训练耗时设太小模型欠收敛pretrained默认 True是否加载预训练权重小数据量下关闭预训练通常精度更差训练日志重点看两件事train/loss是否稳步下降val/loss是否同步下降。val loss 在前面几十轮先降后升是过拟合信号此时不要急着增数据先看是不是某个类别的训练样本太少。另一个常见故障是 loss 卡在高位不变化比如在 4 左右横盘这时优先检查标注 txt 是否出现了nan数值或者图片里存在大量没有对应标注的文件。训练完成后优先看验证集上的混淆矩阵从里面挑出互相混淆最多的两个类别回到数据层面检查是不是标注边界太接近。3.3.1 小目标检测场景推荐放大 imgsz实际操作中若是烟蒂、电池这类小物体频繁漏检我会把imgsz从 640 提到 1280同时把batch降一半。分辨率提升让特征图上对应小目标的像素点更多即便模型结构不变召回率也能明显改善。代价是训练时长翻倍。毕设场景的折衷方案是先用 640 跑通全流程验证数据没问题后再用 1280 做最终训练最终报告里也能多一个“分辨率对精度的影响”的对比实验。3.4 类别不均衡真正拖垮 mAP 的元凶垃圾分类数据集天然不均衡塑料瓶、易拉罐这类常见垃圾样本有几百上千个纽扣电池、温度计只有几十个。类别不均衡的直接后果是 mAP50 看着还不错但少数类的召回率几乎为 0。网络把绝大多数学习能力都分配给了高频类别。毕设场景里最快的做法是样本倍率把少样本类别的图片在训练集里重复复制。不要一上来就用 Focal Loss这类损失函数在小数据集上调参成本高而且效果未必比扩充样本明显。其次可以针对少数类目标做离线裁剪把原始大图中的小目标区域裁出来贴在背景图上生成新样本这不改变原始标注还能顺带解决小目标数量不足。最后验证集里务必保留所有类别的样本否则测试时少类全漏检也不会反映在分数上。4. 从权重到系统Python 推理封装与演示界面4.1 推理脚本的核心结果对象怎么解析训练完的best.pt只是一个权重文件要变成毕设系统需要写一个干净的预测接口。最常见的错误是直接拿命令行跑yolo predict演示时把终端日志转给导师看这在答辩现场观感很差。正确做法是把模型封装成 Python 函数返回结构化结果。from ultralytics import YOLO # 全局只加载一次模型避免每次请求都读磁盘权重 model YOLO(weights/best.pt) def predict_image(image_path: str, conf: float 0.35): results model.predict( sourceimage_path, confconf, # 置信度阈值 iou0.5, # NMS 的 IoU 阈值 verboseFalse # 关闭终端日志输出 )[0] detections [] for box in results.boxes: # xyxy 是左上角和右下角像素坐标 x1, y1, x2, y2 box.xyxy[0].tolist() cls_id int(box.cls[0].item()) score float(box.conf[0].item()) detections.append({ box: [x1, y1, x2, y2], class_id: cls_id, class_name: results.names[cls_id], score: score, }) return detectionsbox.cls和box.conf是 PyTorch 张量必须用.item()转成 Python 数值否则序列化到 JSON 会报错。results.names是类别 id 到名称的字典不要自己再写一份类别表来映射直接用它才能保证 id 对齐。这个函数是后续所有演示和界面的公共入口把置信度阈值暴露成参数方便现场调整。命令行方式不是不能用yolo predict modelweights/best.pt sourcedemo.jpg saveTrue适合快速看单张图片效果但系统集成时一定要走 API 封装。4.2 用 Streamlit 或 PyQt5 搭一个能点的界面毕设演示页面两个方案最稳Streamlit 写起来快PyQt5 更像本地软件。我倾向建议用 Streamlit因为代码量少一个量级且答辩时不容易因为 Qt 依赖链问题启动失败。import streamlit as st from ultralytics import YOLO st.set_page_config(page_title垃圾分类目标检测演示, layoutcentered) model YOLO(weights/best.pt) st.title(垃圾分类目标检测系统) uploaded st.file_uploader(上传一张垃圾图片, type[jpg, jpeg, png]) if uploaded is not None: with open(tmp_upload.jpg, wb) as f: f.write(uploaded.getvalue()) detections model.predict( sourcetmp_upload.jpg, conf0.35, iou0.5, verboseFalse )[0] rows [] for box in detections.boxes: cid int(box.cls[0].item()) rows.append({ 类别: detections.names[cid], 置信度: round(float(box.conf[0].item()), 2), }) if rows: st.table(rows) else: st.write(未检出目标请降低置信度阈值后再试)启动命令是streamlit run app.py默认监听 8501 端口。模型必须放在页面代码之外加载避免每次上传图片都重新读一次权重。演示时可以准备几张不同难度的图片一张大件纸箱、一张桌面上的电池、一张混有多个垃圾的复杂场景分别展示高置信度检出、小目标检出、多目标并发三种能力。如果现场网络受限确认图片上传用的是本地文件不要依赖任何外部图像 API。4.3 离线可用是毕设系统的隐藏要求答辩教室的网络环境没人说得准常见翻车点有三个权重路径写死了本机绝对路径换机器就崩依赖没有锁版本现场pip install悄悄把 ultralytics 升了大版本导致接口变化模型文件放在优盘里但启动时又从默认路径找。准备时把best.pt、app.py、requirements.txt放在同一目录相对路径引用依赖文件里锁主版本号例如ultralytics8.0,9.0。答辩前一晚拔掉网线跑一遍完整流程最保险。4.4 摄像头与视频演示的保底方案很多同学觉得自己笔记本摄像头现场演示很酷但实际效果经常是光线差、目标小、画面抖动识别结果惨不忍睹。摄像头演示的保底做法是先录制一段 720p 以上的实物视频提前剪掉无效片段现场播放视频文件。如果导师要求看实时画面再用命令行兜底yolo predict modelweights/best.pt source0 showTrue注意source0表示默认摄像头这个方案没有任何 UI 美化只用于应急。更稳的现场方案是准备一个短视频循环播放配合副屏展示检测结果界面既能看到实时推理效果又不会因为手持摄像头画面抖动影响识别。5. 答辩 PPT 里的技术呈现与现场排障5.1 页面结构与讲解节奏答辩 PPT 控制在一页 60 秒的节奏内总页数 8 到 10 页最合适。开头不要用大段文字介绍垃圾分类背景放一张数据分布图更直观。核心页放在“目标检测流程设计”和“训练结果分析”上这两页决定了导师对整个技术工作的判断。页码内容讲解重点1系统总体框架图数据、训练、推理三个模块的边界2数据集类别分布说明分类体系为什么这样设计每类样本数量3标注格式与预处理放一张 COCO 转 YOLO 的示意图4模型选型对比一页表格对比 YOLO 与两阶段检测器5训练过程曲线loss 曲线和 mAP 曲线展示收敛状态6检测效果示例大目标、小目标、多目标各一张结果图7系统界面截图Streamlit 页面和检测结果表格8演示视频提前剪好的 1 分钟视频训练指标页不要只贴 mAP 一个数字把 mAP50、mAP50-95、各类别召回率列成小表并解释为什么某些类召回率低。诚实说“电池样本不足导致召回率只有 60%”比编一个不存在的 95% 更有说服力导师也知道数据量限制是客观存在的。5.2 三个必须提前验证的现场动作现场演示翻车大部分不是技术不行而是准备不够。第一件事确认笔记本合上盖子再打开以后Streamlit 进程还能访问模型权重文件避免路径强制绑定了外接显示器导致重连失败。第二件事把演示视频存成 MP4 格式并使用本地播放器打开不要在浏览器里播在线视频防止现场网络限速。第三件事提前把分辨率固定缩放比例设为 100%否则投影布上界面字体发虚窗口控件位置错乱导师只看得到系统界面的粗糙而不是识别能力。如果现场检测效果不理想最常见的修法是降置信度阈值。接口里的conf0.35改为conf0.2通常能救回不少漏检代价是误检变多所以准备图片样本时选干净背景的图现场演示就能兼顾召回和精度。最后把nvidia-smi和streamlit run app.py两个命令背熟出现显存溢出或端口占用时能第一时间恢复。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询