简介这份资源面向从事目标检测学习与垃圾分类应用开发的学生、研究人员及算法工程师提供一套真实场景下的YOLO垃圾分类检测数据集可直接用于YOLO系列模型的训练与验证。压缩包共约2000个文件整体约410MB以1985个xml标注文件为主另含少量txt、html与py脚本分别对应标签数据、教程说明与划分工具。所有图片均使用labelimg标注标注框质量较高并同时提供voc、coco和yolo三种格式标签分文件夹存放便于直接接入不同训练框架。资源还附赠环境搭建与训练案例教程以及训练集、验证集、测试集划分脚本可按需自行划分数据。目前已有1346人学习下载适合希望快速搭建垃圾分类检测实验、复现训练流程并掌握数据划分方法的读者参考使用。1. 一万张垃圾图片到手后先别急着喂给 YOLO拿到「YOLO垃圾分类检测数据集(含10000张图片)对应voc、coco和yolo三种格式标签划分脚本训练教程.rar」这类资源包很多人的第一反应是解压、找train.py、改data.yaml、开跑。我见过太多人卡在这一步图片能读标签路径也对训练却报No labels found或者 mAP 一直趴在 0.01 不动。问题几乎都不在模型而在数据格式没对齐。这个资源包真正值钱的地方不是那 10000 张图而是它同时给了 VOC、COCO、YOLO 三套标签和一份划分脚本。垃圾分类检测本身是个典型的小目标 类别不均衡任务可回收物、厨余、有害、其他四大类里纸箱、塑料瓶样本多灯管、药品样本少。三种格式对应三种训练链路——VOC 喂 SSD/Faster R-CNNCOCO 喂 Detectron2/MMDetectionYOLO 格式喂 YOLOv5/v8。你要做的是先确认自己走哪条链路再把标签、划分、类别名三件事对齐。这篇笔记按「格式转换 → 划分 → 训练 → 排错」的顺序讲清楚新手能照着跑通熟手能直接抄参数。2. 三种标签格式到底差在哪VOC、COCO、YOLO 的坐标与目录结构2.1 同一张图三种格式的标注长什么样先建立一个直觉三种格式描述的是同一个框只是坐标系和存储方式不同。VOC 用 XML一个图一个文件坐标是绝对像素值原点在左上角annotation folderimages/folder filenameplastic_bottle_001.jpg/filename size width640/width height480/height depth3/depth /size object namerecyclable/name bndbox xmin112/xmin ymin88/ymin xmax305/xmax ymax402/ymax /bndbox /object /annotationCOCO 用一个大的 JSON 文件装所有图坐标同样是绝对像素但字段名是bbox: [x, y, width, height]注意这里是宽高不是右下角{ images: [{id: 1, file_name: plastic_bottle_001.jpg, width: 640, height: 480}], annotations: [ {id: 1, image_id: 1, category_id: 1, bbox: [112, 88, 193, 314], area: 60602, iscrowd: 0} ], categories: [{id: 1, name: recyclable}, {id: 2, name: kitchen_waste}] }YOLO 格式最省事一个图一个.txt每行类别索引 x_center y_center width height全部归一化到 0~10 0.325781 0.510417 0.301563 0.654167 1 0.712500 0.333333 0.150000 0.200000三者的核心差异就三点坐标是绝对还是归一化、一个文件装一张图还是全部图、类别用名字还是用索引。搞清这三点转换就是纯体力活。2.2 目录结构不对训练脚本第一步就挂YOLO 训练对目录极其敏感。资源包里如果给的是 VOC 原始结构直接指给 YOLOv8 会读不到标签。我一般会先整理成下面这个结构再动手garbage_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yamldata.yaml是 YOLO 的入口配置四个字段必须对path: /data/garbage_dataset train: images/train val: images/val nc: 4 names: [recyclable, kitchen_waste, hazardous, other]path是数据集根目录train/val是相对path的路径nc是类别数names的顺序必须和标签里的索引严格对应。这里最容易翻车names 写成中文、顺序和标注时不一致、nc 写错都会让模型学到一堆错类别。血泪经验是改完data.yaml先用一小批图跑 1 个 epoch看 loss 有没有正常下降再上全量。2.3 用脚本把 VOC 批量转成 YOLO 格式资源包通常带转换脚本但很多人不敢改。下面这段是我常用的 VOC→YOLO 转换逻辑清晰改路径就能用import os import xml.etree.ElementTree as ET # 类别名到索引的映射顺序必须和 data.yaml 的 names 一致 CLASSES [recyclable, kitchen_waste, hazardous, other] CLASS_MAP {name: i for i, name in enumerate(CLASSES)} def voc_to_yolo(xml_path, img_w, img_h, out_path): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text.strip() if name not in CLASS_MAP: continue # 跳过不在类别表里的脏标注 bnd obj.find(bndbox) xmin float(bnd.find(xmin).text) ymin float(bnd.find(ymin).text) xmax float(bnd.find(xmax).text) ymax float(bnd.find(ymax).text) # 归一化并转成中心点宽高 xc (xmin xmax) / 2.0 / img_w yc (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h # 裁剪到 [0,1]防止越界框导致训练报错 xc, yc min(max(xc, 0), 1), min(max(yc, 0), 1) w, h min(max(w, 0), 1), min(max(h, 0), 1) lines.append(f{CLASS_MAP[name]} {xc:.6f} {yc:.6f} {w:.6f} {h:.6f}) with open(out_path, w) as f: f.write(\n.join(lines))逻辑说明先解析 XML 拿到绝对坐标再除以图片宽高做归一化最后按 YOLO 的中心点宽高顺序写出。参数上CLASSES必须和data.yaml的names一字不差img_w/img_h要从对应图片读不能写死因为数据集里图片尺寸往往不统一。裁剪到[0,1]是后悔药标注工具偶尔会画出越界框不裁的话 YOLO 会直接抛异常。3. 划分脚本怎么用别让训练集和验证集串了图3.1 划分比例与随机种子的选择10000 张图常见划分是 8:1:1 或 8:2。垃圾分类这种类别不均衡的任务我建议按类别分层抽样而不是纯随机。纯随机的坑在于某个稀有类比如有害垃圾里的灯管可能全被分进训练集验证集里一个都没有mAP 看着高实际一上线就漏检。划分脚本的核心就两件事固定随机种子、按类别分层。下面这段是可直接用的分层划分import os import random from collections import defaultdict from sklearn.model_selection import train_test_split random.seed(42) # 固定种子保证每次划分结果一致方便复现 def collect_by_class(label_dir): 按类别收集样本用于分层划分 class_to_files defaultdict(list) for txt in os.listdir(label_dir): if not txt.endswith(.txt): continue with open(os.path.join(label_dir, txt)) as f: classes {line.split()[0] for line in f if line.strip()} # 一张图可能含多类取主类第一个做分层依据 main_cls sorted(classes)[0] if classes else empty class_to_files[main_cls].append(txt[:-4]) return class_to_files def split_dataset(class_to_files, val_ratio0.2): train, val [], [] for cls, files in class_to_files.items(): tr, va train_test_split(files, test_sizeval_ratio, random_state42) train.extend(tr) val.extend(va) return train, val逻辑说明collect_by_class先扫一遍所有标签文件按主类别归类split_dataset对每个类别单独做train_test_split保证每个类在训练集和验证集里都有。参数val_ratio控制验证集比例random_state和全局seed一起保证可复现。注意empty类无标注的纯背景图也要参与划分否则模型没见过背景容易误检。3.2 划分后必须做的两项校验划分完不要直接开训先做两个检查。第一统计训练集和验证集每个类别的框数量看分布是否接近def count_boxes(label_dir, files): counter defaultdict(int) for name in files: with open(os.path.join(label_dir, name .txt)) as f: for line in f: if line.strip(): counter[line.split()[0]] 1 return counter第二确认图片和标签一一对应没有孤儿文件。图片有、标签没有YOLO 会当成背景图标签有、图片没有训练直接报错。我一般用集合差集查imgs {f[:-4] for f in os.listdir(images) if f.endswith(.jpg)} lbls {f[:-4] for f in os.listdir(labels) if f.endswith(.txt)} print(有图无标签:, imgs - lbls) print(有标签无图:, lbls - imgs)这两步花不了五分钟但能省掉后面几小时的排查。很多人跳过校验直接训loss 不降就怀疑模型其实是数据在作祟。4. 用 YOLOv8 跑通垃圾分类训练环境、命令与关键参数4.1 环境配置与最小可跑命令环境这块YOLOv8 对 PyTorch 版本有要求我一般用 conda 建独立环境避免和系统里的包打架conda create -n garbage python3.10 -y conda activate garbage pip install ultralytics # 会自动装匹配的 torch装完先验证yolo checks能打印出环境信息、CUDA 是否可用就说明装好了。然后是最小训练命令yolo detect train \ data/data/garbage_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0逻辑说明data指向data.yamlmodel用预训练权重垃圾分类样本量不算大从头训容易过拟合epochs先跑 100 看趋势imgsz是输入尺寸batch按显存调device0指定第一块 GPU。第一次跑建议把epochs改成 3确认能跑通再上全量。4.2 垃圾分类场景下必调的四个参数默认参数能跑但垃圾分类有几个特性需要针对性调参数默认值建议值原因imgsz640640~960灯管、药片这类小目标放大输入能提召回batch168~32按显存调太小梯度不稳太大显存爆lr00.010.005~0.01小数据集用偏小学习率防震荡patience5020~30早停垃圾分类容易过拟合别硬训imgsz是最值得调的。我实测过同样 10000 张图640 和 960 在小目标上的召回能差好几个点代价是显存和训练时间翻倍。如果显存吃紧可以先用 640 跑通再上 960 微调。4.3 训练过程看什么loss 曲线与 mAP 的读法训练日志里重点看三个指标box_loss、cls_loss、mAP50。box_loss管框的位置cls_loss管类别两个都应该稳步下降。如果cls_loss不降反升多半是类别索引和names对不上回去查data.yaml。mAP50是 IoU0.5 时的平均精度垃圾分类能到 0.85 以上算不错。但别只看这个数要看每个类别的 AP。用验证命令导出分类别结果yolo detect val modelruns/detect/train/weights/best.pt data/data/garbage_dataset/data.yaml输出里会按类别列 AP如果hazardous的 AP 明显低于其他类就是样本太少需要补数据或做增强。这一步是很多人忽略的只看总 mAP 会掩盖类别不均衡的问题。5. 训练垃圾分类模型最容易踩的五个坑5.1 报错 No labels found标签路径或格式不对现象训练启动后立刻报No labels found in ...或者警告一堆图没有标签。原因九成是data.yaml里的train/val路径写错或者标签不是 YOLO 格式比如还是 VOC 的 XML。YOLO 只认.txt且文件名必须和图片同名。解决先确认labels/train下是.txt不是.xml再确认data.yaml的路径是相对path的。用ls labels/train | head看一眼再拿一个标签文件和图片对一下名字。5.2 mAP 一直是 0类别索引和 names 顺序错位现象loss 在降但mAP50始终接近 0验证时框的位置对但类别全错。原因标签里的类别索引和data.yaml的names顺序不一致。比如标注时0是可回收data.yaml里0写成了厨余。解决把names的顺序和转换脚本里的CLASSES对齐重新生成标签。这个坑最隐蔽因为 loss 正常只有看分类别 AP 才能发现。5.3 显存溢出 CUDA out of memorybatch 和 imgsz 没配合现象训练跑几个 batch 后报CUDA out of memory。原因batch或imgsz超过显存承受范围或者没开混合精度。解决先把batch减半还不行就降imgsz。YOLOv8 默认开 AMP 混合精度如果手动关了记得开回来。另外workers设太大也会占内存一般设成 CPU 核数的一半。5.4 验证集指标虚高训练集和验证集图片重复现象mAP50高得离谱0.98但实际测试图效果差。原因划分时没去重同一张图或高度相似的连拍图同时进了训练集和验证集模型等于在背答案。解决划分前对图片做哈希去重或者按拍摄批次划分。垃圾分类数据集里同一物体的多角度图很常见必须按物体而不是按图片划分。5.5 小目标漏检严重输入尺寸和 anchor 不匹配现象大件垃圾检测正常灯管、电池这类小目标几乎检不到。原因默认imgsz640下小目标经过下采样后特征太少或者 anchor 尺寸偏大。解决提高imgsz到 960 或 1280YOLOv8 是 anchor-free 的主要靠输入分辨率。另外可以在data.yaml附近开 mosaic、mixup 增强让小目标出现得更频繁。如果还不行考虑切片推理SAHI这类专门处理小目标的方案。6. 把训练好的垃圾分类模型推到能用的程度验证与调优技巧训练跑完拿到best.pt只是开始真正决定能不能用的是推理阶段的调优。我一般会先在一批没参与训练的实拍图上跑看漏检和误检分别出在哪。置信度门限是最直接的旋钮。默认conf0.25垃圾分类场景我通常调到 0.4~0.5因为误检一个「其他垃圾」为「可回收」比漏检更影响体验。命令里直接带yolo detect predict \ modelruns/detect/train/weights/best.pt \ source/data/test_images \ conf0.45 \ iou0.5 \ saveTrueconf是置信度门限iou是 NMS 的 IoU 阈值。iou调低会合并更多重叠框适合密集堆叠的垃圾调高则保留更多框适合稀疏场景。这两个参数没有万能值得拿实际图试。另一个容易被忽略的是类别阈值。YOLO 支持按类别设不同门限稀有类可以放宽常见类收紧。在验证脚本里加conf逐类扫一遍找到每类的平衡点。最后说个习惯每次改完参数我都会把这次实验的data.yaml、命令、关键指标记一行到实验日志里。垃圾分类这种类别不均衡的任务调参很容易绕圈没有记录就会重复踩同一个坑。模型能不能上线往往不取决于你用了多大的模型而取决于你有没有把数据和参数对齐这件事做扎实。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
AI Research Skills 模型合并实战:基于生成一致性的无监督系数自动调优(AdaMMS 方法) AI 技能人工智能大模型深度学习 【免费下载链接】AI-Research-SKILLs Comprehensive open-source library of AI research and engineering skills for any AI model. Package the skills and your claude code/codex/gemini agent will be an AI research agent with full hor… · 2026/9/23 17:37:30
BI学习资源大全:从官方文档到实战模板,一文搞定 经常有人问我:做BI这行,到底该去哪些网站找资料?说实话,这个问题我每次听到都觉得既简单又难答。简单是因为BI相关资源确实不少,Power BI、帆软BI、各类开源工具,随便一搜就是一大堆;难是因为大… · 2026/9/23 17:37:30
电脑怎么用蓝牙耳机避坑指南:搞定配对延迟与断连的实战手册 电脑怎么用蓝牙耳机避坑指南:搞定配对延迟与断连的实战手册 复制来的代码跑不通不知道怎么调,这大概是很多技术人最头疼的瞬间。你以为只是复制粘贴的事,结果一运行全是报错,或者蓝牙一连上,声音卡得像PPT翻页。别急,这不是你的问题,是底层协议和系… · 2026/9/23 18:49:29
Python数据挖掘:Apriori与FP-Growth算法对比测试与实战 简介:这份资源面向计算机、数据科学与大数据技术、人工智能等专业的在校学生与教师,提供基于Python实现的数据挖掘经典频繁项集挖掘算法对比测试项目,可用于课程设计、期末大作业、毕业设计或入门进阶练习。压缩包共3个文件,包含2… · 2026/9/23 18:49:29
TUPE解耦位置编码:提升Transformer长文本与中文预训练效果 1. 为什么位置编码值得单独拿出来聊做NLP这行的朋友应该都有体会,Transformer架构从2017年那篇《Attention Is All You Need》出来之后,几乎重塑了整个自然语言处理的玩法。大家一开始关注的都是自注意力机制、多头注意力、残差连接这些结构层面的东西&a… · 2026/9/23 18:49:29
地震资料处理中的NMO动校正:从双曲线时距到速度谱实战 简介:动校正(NMO)是地震数据处理中消除正常时差、使同一反射界面信号对齐的关键步骤,直接影响叠后剖面的分辨率与解释精度。这套压缩包面向地震勘探相关专业的初学者与处理工程师,基于Matlab实现,完整覆盖了… · 2026/9/23 18:49:23
规则图校验生产环节覆盖关系:识别结论性记录缺失过程证据的工程实现 面向需要将制造业业务数据接入内容生成链路的开发者。当输入资料里出现“具备自动化组装线”“可承接OEM/ODM定制”这类结论性描述,而下游任务需要产出可追溯的过程说明时,如果缺少中间证据字段,生成结果往往无法解释结论从何而来。本文以“呼… · 2026/9/23 18:49:23
5个坑教你做美食相机,新手避坑指南 5个坑教你做美食相机,新手避坑指南 别再说“看了一堆教程还是不会写项目”了。我见过太多应届生,收藏夹里塞满了“Python入门”、“OpenCV实战”,但真让你做一个【美食相机】应用,脑子直接一片空白。这就是典型的【新手避坑】失败案例。问题… · 2026/9/23 18:49:10
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29