ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

8341张垃圾分类检测数据集:VOC与YOLO双格式解析及YOLO训练实战

8341张垃圾分类检测数据集:VOC与YOLO双格式解析及YOLO训练实战 简介这份垃圾分类检测数据集面向计算机视觉学习者与目标检测开发者用于训练和验证垃圾材质识别模型可服务于智能回收、环境分拣等场景。数据按纸盒、玻璃、金属、纸质、塑料五类材质标注共8341张清晰图片每张均配有对应的VOC格式xml与YOLO格式txt标注矩形框总计8815个其中塑料类框数最多达1911个纸盒、金属、纸质、玻璃依次分布类别分布相对均衡便于直接用于YOLO或VOC流程的训练与评估。压缩包约128.05MB内含图片、xml、txt三类文件xml用于VOC格式解析txt用于YOLO格式读取图片与标注一一对应无需额外清洗即可投入实验。目前已有224人学习下载适合作为课程设计、毕业设计或算法对比实验的数据基础帮助读者省去繁琐的采集与标注环节把精力集中在模型结构、训练调参与效果验证上。1. 8341 张垃圾分类检测数据集VOC 与 YOLO 双格式到底怎么选手上有个做智能回收箱的活儿算法同事第一句话不是问模型结构而是问“有没有现成的垃圾分类检测数据集”。这话不假目标检测项目里数据标注的工程量往往比调参大得多。今天拆的这个包就是冲着这个痛点来的8341 张垃圾图片VOC 和 YOLO 两套标注格式各一份5 个材质类别总框数 8815。拿到手第一件事不是急着训练而是先搞清楚这两套格式分别在什么场景下用、目录怎么对应、标签怎么映射。这个数据集的核心价值在于“材质分类”而不是“物体分类”。它区分的是 Cardboard、Glass、Metal、Paper、Plastic 五种材质而不是“瓶子”“纸箱”这种具体物体。这意味着同一类材质可能出现在完全不同的物体形态上——塑料可能是饮料瓶也可能是塑料袋。对模型来说学的是材质纹理和反光特性不是固定形状。适合做分拣线视觉、回收箱满溢识别、垃圾投放口材质判别这类场景。8341 张的体量不算大但作为基线训练和迁移学习的起点够用了。2. 拆包先看目录VOC 与 YOLO 双格式的对应关系2.1 三个文件夹各装了什么压缩包解开后是三个文件夹结构很直白JPEGImages8341 张 jpg 原图文件名和标注文件一一对应Annotations8341 个 xml 文件VOC 格式标注labels8341 个 txt 文件YOLO 格式标注三个文件夹的文件数量完全一致说明每张图都有两套标注。这种“双格式同源”的做法省去了自己写转换脚本的麻烦但也带来一个隐患两套标注是否严格对齐我一般会抽 20 张做交叉验证后面避坑章节会讲具体怎么查。2.2 VOC xml 的字段含义随便打开一个 xml结构是标准 Pascal VOCannotation folderJPEGImages/folder filenamesl_images_6626.jpg/filename size width640/width height480/height depth3/depth /size object namePlastic/name bndbox xmin112/xmin ymin88/ymin xmax305/xmax ymax402/ymax /bndbox /object /annotation关键字段就三个filename对应图片名size记录原图宽高object里的name是类别、bndbox是左上角和右下角绝对坐标。VOC 格式的好处是可读性强用 LabelImg 直接打开就能改坏处是坐标是绝对像素值换分辨率就得重算。2.3 YOLO txt 的归一化逻辑同一个标注对应的 YOLO txt 长这样4 0.325781 0.510417 0.301563 0.654167五个数字分别是类别索引、中心点 x 归一化、中心点 y 归一化、框宽归一化、框高归一化。类别索引从 0 开始按字母序排列索引类别名框数0Cardboard17851Glass16012Metal17703Paper17484Plastic1911总框数 8815平均每张图约 1.06 个框说明大部分图片只有一个目标少数有多目标。这个分布对训练有影响如果按图做随机划分要保证每个类别的框数在训练集和验证集里比例接近否则小类别容易在验证集里消失。2.4 两套格式怎么选选 VOC 还是 YOLO取决于你用的框架和后续要不要改标注用 Ultralytics 系YOLOv5/v8/v11训练直接用labels文件夹配一个data.yaml就能跑用 Detectron2、MMDetection、PaddleDetectionVOC xml 更省事或者用脚本转 COCO需要人工复核标注VOC xml 用 LabelImg 打开更直观要做数据增强后重新生成标注YOLO 归一化坐标在缩放、裁剪时计算更简单我一般会保留两套训练用 YOLO复核用 VOC互相对照。3. 从零跑通 YOLO 训练data.yaml 配置与目录重组3.1 目录重组原始三个文件夹是平铺的Ultralytics 要求 images 和 labels 分 train/val 子目录。先建结构mkdir -p dataset/images/train dataset/images/val mkdir -p dataset/labels/train dataset/labels/val然后按 8:2 划分。注意要按“图片”划分而不是按“框”划分且尽量让每个类别的分布均衡。下面这个脚本按类别分层抽样import os import random import shutil from collections import defaultdict random.seed(42) img_dir JPEGImages lbl_dir labels out_img dataset/images out_lbl dataset/labels # 统计每张图包含的类别 img_classes defaultdict(set) for txt in os.listdir(lbl_dir): if not txt.endswith(.txt): continue with open(os.path.join(lbl_dir, txt)) as f: for line in f: cls int(line.split()[0]) img_classes[txt.replace(.txt, .jpg)].add(cls) # 按主类别分组保证每类都有验证样本 groups defaultdict(list) for img, classes in img_classes.items(): main_cls sorted(classes)[0] groups[main_cls].append(img) train_list, val_list [], [] for cls, imgs in groups.items(): random.shuffle(imgs) split int(len(imgs) * 0.8) train_list.extend(imgs[:split]) val_list.extend(imgs[split:]) for phase, items in [(train, train_list), (val, val_list)]: for img in items: shutil.copy(os.path.join(img_dir, img), os.path.join(out_img, phase, img)) shutil.copy(os.path.join(lbl_dir, img.replace(.jpg, .txt)), os.path.join(out_lbl, phase, img.replace(.jpg, .txt))) print(ftrain: {len(train_list)}, val: {len(val_list)})这段脚本的关键点是main_cls取排序后第一个类别作为分组依据。因为大部分图只有一个框这样分组能保证每个类别在验证集里都有代表。如果某张图有多个类别归到索引最小的那类不影响整体均衡。random.seed(42)固定随机种子方便复现。3.2 data.yaml 写法path: ./dataset train: images/train val: images/val nc: 5 names: 0: Cardboard 1: Glass 2: Metal 3: Paper 4: Plasticpath是数据集根目录train和val是相对路径。nc必须和 names 数量一致names 的顺序必须和 txt 里的类别索引严格对应。这里最容易翻车如果 names 写成[Plastic, Glass, ...]模型学出来的类别就全乱了而且 loss 看起来还在降属于典型的“静默错误”。3.3 启动训练yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ workers4 \ projectruns/garbage \ namebaseline参数说明model用预训练权重做迁移学习8341 张的体量从零训容易过拟合imgsz640是常见起点如果原图分辨率远大于 640小目标会丢batch16看显存调8G 显存跑 yolov8n 可以到 32workers是数据加载线程Windows 下设 0 或 2 避免卡死。训练完在runs/garbage/baseline/weights/下拿best.pt。3.4 验证与推理yolo detect val modelruns/garbage/baseline/weights/best.pt datadataset/data.yaml yolo detect predict modelruns/garbage/baseline/weights/best.pt sourcetest.jpg saveTrue看验证结果重点不是 mAP 绝对值而是每个类别的 AP 分布。如果 Plastic 的 AP 明显低于其他类大概率是塑料材质反光导致纹理特征不稳定后面可以针对性做增强。4. 避坑与排查标注对齐、类别错位、小目标漏检4.1 两套标注不对齐现象用 VOC 转出来的框和 YOLO txt 画出来的框位置对不上偏移几个像素甚至更多。原因VOC 的 xmax/ymax 是包含边界的有些转换脚本按(xmax - xmin)算宽有些按(xmax - xmin 1)差一个像素。8341 张里如果混了不同工具生成的标注就会不一致。解决写个校验脚本把 YOLO txt 反算成绝对坐标和 xml 的 bndbox 比对差值超过 2 像素的挑出来人工看。4.2 类别索引错位现象训练 loss 正常下降但推理时把 Glass 识别成 Metal或者置信度普遍偏低。原因data.yaml里 names 的顺序和 txt 里的索引不一致。YOLO txt 只存索引不存名字索引一错模型学到的就是错映射。解决先统计所有 txt 里出现的索引值确认是 0-4 连续分布再和 names 逐一对齐。我习惯在 data.yaml 旁边写个注释标明索引来源。4.3 小目标漏检现象验证集 mAP 还行但实际推理时远处的小垃圾框不出来。原因原图分辨率高缩放到 640 后小目标只剩几个像素。解决训练时把imgsz提到 960 或 1280或者用切片推理SAHI把大图切块检测。代价是显存和耗时上升需要权衡。4.4 验证集类别缺失现象训练完发现某个类别 AP 为 0 或 nan。原因随机划分时该类别全进了训练集验证集里一个样本都没有。解决用 3.1 里的分层抽样脚本按类别分组后再划分。如果某类样本极少比如只有几十个框考虑过采样或专门为它留验证样本。4.5 图片与标注文件名不匹配现象训练时报“找不到 label 文件”或“图片读取失败”。原因原始文件名里有空格、中文或特殊字符复制过程中被截断。解决统一重命名为纯数字或字母下划线组合同时改 xml 和 txt 里的 filename 字段。批量重命名前先备份。5. 进阶技巧用 8815 个框做类别平衡与增强策略8341 张图、8815 个框五个类别的框数在 1601 到 1911 之间分布其实相当均匀最大最小差 310 个框比例约 1.19:1。这个均衡度在真实数据集里算难得不需要做重采样。但“框数均衡”不等于“难度均衡”——Glass 和 Metal 都有反光问题Plastic 形态差异大Paper 容易被揉皱后失去纹理。所以增强策略要按类别区分。我一般会分两步走。第一步先跑一版 baseline看混淆矩阵。如果 Glass 和 Metal 互相误判多说明反光特征没学好可以加随机亮度、对比度扰动模拟不同光照下的反光变化。如果 Plastic 的召回低加随机裁剪和缩放让模型见到更多局部形态。Ultralytics 内置的增强参数在data.yaml同级配一个hyp.yamllr0: 0.01 lrf: 0.01 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3.0 box: 7.5 cls: 0.5 dfl: 1.5 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 10.0 translate: 0.1 scale: 0.5 shear: 2.0 perspective: 0.0 flipud: 0.0 fliplr: 0.5 mosaic: 1.0 mixup: 0.1 copy_paste: 0.1关键几个hsv_v调到 0.4 增强光照鲁棒性对反光材质有用scale0.5 让目标在画面里大小变化更丰富mosaic1.0 是 YOLO 的招牌增强四图拼接能显著提升小目标检测但训练后期建议关掉否则真实分布偏移mixup和copy_paste各 0.1轻度使用多了会让材质边界模糊。第二步是验证增强有没有用。不能只看 mAP 涨没涨要分类别看。我习惯每训练 20 个 epoch 存一次验证结果画每个类别的 AP 曲线。如果某个类别的 AP 在 60 epoch 后还在涨说明增强有效如果早早平了甚至降了说明增强过头把该类别的判别特征破坏了。还有一个容易被忽略的点这个数据集“图片是否增强”标注为“否”意味着原图是自然拍摄的没有经过旋转、裁剪、加噪。这对训练是好事因为验证集和真实场景的分布更接近。但也意味着模型没见过极端角度和遮挡如果实际部署场景有倾斜拍摄或部分遮挡需要自己补这类增强。最后说个验证技巧训练完后别只看 mAP拿 20 张验证集图片跑推理把预测框和真实框画在同一张图上肉眼看偏移。我见过 mAP 0.85 但框普遍偏右下几个像素的情况原因是标注时鼠标点偏了这种问题指标看不出来只能靠眼睛。从那以后我每次拿到新数据集都强制走一遍“抽 20 张画框比对”的流程比看任何指标都直接。希望帮到你。本文还有配套的精品资源点击获取
返回列表