简介yolo算法可回收废物数据集面向目标检测模型训练需求专门为垃圾分类识别场景设计适合算法工程师、数据科学爱好者以及从事环保智能应用的开发者使用。资源覆盖玻璃瓶、纸瓶、塑料瓶、塑料袋等常见可回收物类别已经划分好训练集与验证集可直接用于yolov5、yolov8、yolov9、yolov10、yolo11等主流yolo系列算法的训练、验证与测试。标签提供两种标准格式yolo格式的txt文件按“类别、中心点x、中心点y、宽度、高度”记录归一化坐标坐标值均为0到1之间的比例值方便模型直接读取voc格式的xml文件采用常规目标框标注结构满足不同工具链和框架的需求用户可按项目偏好任选其一。压缩包内共有2000个文件以xml标签文件为主要文件类型包体大小约229.98MB整体目录组织规范便于批量导入和二次整理。已有47人学习下载对于想跳过数据标注与格式转换环节、直接获得规范数据集的开发者来说这份资源能显著降低项目启动成本让算法迭代更高效。1. 一个可以直接开训的YOLO可回收废物数据集6000张图、四类目标、双格式标签做垃圾检测识别这类视觉任务真正卡住项目进度的很少是模型选型而是数据。之前我用 yolo 算法做可回收物分拣第一版数据是自己一批一批标出来的几乎把一周时间都耗在画框上。后来换成这份 6000 张图像的可回收废物数据集训练流程才真正跑起来。数据集集中标注了四类高价值可回收物玻璃瓶、纸瓶、塑料瓶、塑料袋每张图像都带标签并且同时提供 yolo 格式txt和 voc 格式xml两套标注文件train/val/test 已经划分完毕。不管你是跑 yolov5、yolov7、yolov8还是 yolov9、yolov10、yolo11解压之后只需要改一个数据配置就能开始训练。这篇笔记把拆包验证、标签格式换算、训练参数、踩坑排查的完整过程都记下来适合正在找现成数据集做垃圾分类、废品识别和移动端垃圾检测的开发者。2. 拆包先看货目录结构、双标签格式对照与数据划分检查2.1 解压之后先别动文件看清 images、labels_yolo、labels_voc 是怎么组织的拿到 zip 之后我习惯先解压到一个独立目录不要直接拖进训练工程里。解压命令很基础关键是要先看清目录层级再动手改东西。unzip yolo算法-可回收废物数据集-6000张图像带标签-玻璃瓶纸瓶塑料瓶塑料袋.zip -d recyclable_waste_6000 find recyclable_waste_6000 -maxdepth 3 -type d | sort-d参数指定解压目标目录避免 zip 直接把一堆文件铺在当前目录下。find -maxdepth 3是为了只看三层结构不会把 6000 多个文件全部刷出来。我这里看到的结构是 images 下按 train、val、test 拆分labels 分成两个目录分别放 yolo 格式的 txt 和 voc 格式的 xmlclasses.txt 在根目录。如果你解压出来是扁平结构说明打包时不带目录层级先用ls images | head看一眼再决定要不要自己重新组织目录。这个数据集比较省事的一点是 train/val/test 已经划好而且划分结果同步反映在 images 和 labels 两侧不需要再写随机划分脚本。自己划分数据常见的问题是类别分布不均如果把某个类别的大部分图都分到训练集val 里只剩下零星几张指标波动会非常难看。拿到这份数据后我第一件事不是急着训练而是把划分比例和各子集的类别数量都统计出来确认没有出现某类在 val 里完全缺失的情况。2.2 YOLO 格式和 VOC 格式的差异从像素坐标到归一化坐标的换算这个数据集的双格式标签是它比较实用的地方。VOC 格式来自标注工具默认输出适合用 labelImg 打开人工复查YOLO 格式可以直接喂给训练脚本省去每次训练前做格式转换。两种格式本质是在表达同一个框只是坐标系不同。一份 yolo 格式的 txt 文件里一行就是一个目标例如0 0.5123 0.4567 0.3211 0.2876四个浮点数分别代表中心点 x、中心点 y、宽度、高度而且全部是相对图像宽度和高度的比例值范围在 0 到 1 之间。第一列是类别索引从 0 开始这个数据集的四类目标会映射成 0 到 3。对应的 VOC 格式 xml 里面同一个框会写成绝对像素坐标object nameplastic_bottle/name bndbox xmin128/xmin ymin96/ymin xmax256/xmax ymax224/ymax /bndbox /object两种格式差异用表格总结就是对比项VOC 格式xmlYOLO 格式txt坐标基准图像绝对像素坐标归一化比例坐标类别标识name 字符串从 0 开始的类别索引框表达xmin、ymin、xmax、ymaxx_center、y_center、width、height常见来源labelImg 默认输出yolo 系列训练直接输入如果以后要自己从 VOC 换算成 YOLO公式是x_center (xmin xmax) / 2 / image_width y_center (ymin ymax) / 2 / image_height width (xmax - xmin) / image_width height (ymax - ymin) / image_heightVOC 的 xml 里size元素会带原始图像宽高转换时必须依赖它。很多转换脚本跑出来坐标错乱就是没读 size 或者图片被 resize 过后没有同步更新导致归一化结果整体偏移。2.3 核对图像与标签的一一对应关系用脚本把划分情况打出来不管格式多标准我都会在训练前先核对一遍图像和标签是否同名、两个标签目录的条目是否一致、train/val/test 之间有没有重叠。这个检查用一个小脚本就能完成。from pathlib import Path base Path(recyclable_waste_6000) for split in [train, val, test]: img_dir base / images / split yolo_dir base / labels_yolo / split voc_dir base / labels_voc / split img_stems {p.stem for p in img_dir.iterdir()} yolo_stems {p.stem for p in yolo_dir.glob(*.txt)} voc_stems {p.stem for p in voc_dir.glob(*.xml)} print(split, images, len(img_stems), yolo, len(yolo_stems), voc, len(voc_stems), missing_yolo, len(img_stems - yolo_stems), missing_voc, len(img_stems - voc_stems)) all_img set() for split in [train, val, test]: all_img | {p.name for p in (base / images / split).iterdir()} print(total unique images:, len(all_img))脚本逻辑是先按划分目录收集 stem也就是去掉扩展名后的文件名然后用集合减法判断缺失最后把三个划分的文件名汇总看有没有跨集重复。正常情况下 missing 应该都是 0total unique images 就是 6000 出头。如果出现 missing 不为 0优先检查是不是后缀名差异比如 jpg 和 jpeg 混用或者标签被放进了子目录。文件命名是 img_067_686 这种编号在集合里是比较干净的标识不容易看花眼。提示检查脚本只读不改是安全的。发现问题先记录不要顺手删文件等确认原因再统一处理。3. 训练前三件事data.yaml 路径、图像尺寸统一与标签体检3.1 写好 data.yaml路径尽量用绝对路径类别顺序第一次就定死yolov5、yolov8、yolov9、yolo11 这几个版本对数据集配置文件的字段基本兼容差别主要在默认读取路径的基准位置。为了避免版本之间的路径理解差异我一般直接用绝对路径写 data.yamlpath: /home/user/datasets/recyclable_waste_6000 train: images/train val: images/val test: images/test nc: 4 names: 0: glass_bottle 1: paper_bottle 2: plastic_bottle 3: plastic_bagpath指向数据集根目录train、val、test是相对这个根目录的路径。nc是类别数必须和实际标签里的最大类别索引加一相同写少了训练时直接报索引越界写多了则会让模型多学一个空类。names的顺序一旦定下来就不要改因为标签 txt 里的 0、1、2、3 是按这个顺序生成的。以后换了别的包也需要保持同一套类别顺序否则推理出来的框里玻璃瓶和纸瓶标签会互相错位。3.2 图像预处理统一尺寸、过滤损坏图片、确认通道数据集里的图片来源可能不一样尺寸差异大是正常现象有的训练图是 4032x3024有的是 1920x1080。yolo 训练时会自己做 letterbox也就是等比缩放加灰边所以不强制要求把原图统一 resize 后再存盘。但有一个问题必须处理损坏图片。某些下载图从视觉上看是好的字节流也不完整cv2.imread 读出来是空数组训练时可能报错也可能导致内存分配异常。我会先跑一遍图像可读性检查import cv2 from pathlib import Path img_dir Path(recyclable_waste_6000/images) bad_files [] for split in [train, val, test]: for p in (img_dir / split).glob(*): if p.suffix.lower() not in (.jpg, .jpeg, .png): continue img cv2.imread(str(p)) if img is None or img.size 0: bad_files.append(str(p)) continue h, w img.shape[:2] if w 64 or h 64: bad_files.append(str(p)) print(bad files:, len(bad_files)) for f in bad_files[:20]: print(f)逻辑是逐个读取图像读不出来或者尺寸小于 64x64 的都列为异常。小于 64 的图即使有标注训练时放大后也是模糊的一块对模型贡献很小。处理这些异常图时要记得同步删掉对应的 txt 和 xml否则会留下孤儿标签后续检查又会被这类文件的缺失问题干扰。3.3 标签体检空 txt、类别越界、坐标越界的检索脚本标签体检是容易被跳过但很有必要的步骤。我从网上下载数据集时见过空 txt、坐标写成 2.3、类别索引写成 4 这类情况。这些数据不检查直接训练轻则 loss 不收敛重则训练直接中断。from pathlib import Path label_root Path(recyclable_waste_6000/labels_yolo) nc 4 empty, bad_cls, bad_coord [], [], [] for txt in label_root.rglob(*.txt): lines [ln.strip() for ln in txt.read_text().splitlines() if ln.strip()] if not lines: empty.append(str(txt)) continue for ln in lines: parts ln.split() if len(parts) ! 5: bad_coord.append((str(txt), ln)) continue cls int(parts[0]) coords [float(v) for v in parts[1:5]] if cls 0 or cls nc: bad_cls.append((str(txt), cls)) if any(v 0.0 or v 1.0 for v in coords): bad_coord.append((str(txt), ln)) print(empty_txt:, len(empty)) print(class_out_of_range:, len(bad_cls)) print(coord_out_of_range:, len(bad_coord))脚本把三类问题分开统计文件里没有任何标注内容、类别索引不在 0 到 3 之间、坐标超出 0 到 1。坐标越界是大问题因为归一化坐标是比例值出现 1.3 说明转换时没有读对图像宽高或者原始框本身就超出了图片边界。这类 txt 如果直接训练模型某些 batch 会算出异常的 loss表现出来就是训练曲线先降后跳。注意坐标越界不要用 clip 强行截断先回到 VOC xml 重新生成。clip 只会把数字压回区间但中心点偏移的问题依然存在。4. 我用 yolov5 跑了一遍这份数据集训练命令、loss/mAP 观察与结果验证4.1 训练命令与四个核心参数epoch、batch、imgsz、学习率6000 张图不算大我用了 yolov5s 权重做迁移学习训练命令如下python train.py --data data.yaml --weights yolov5s.pt --img 640 --batch 16 --epochs 200 --cache换成 yolov8 的写法也差不多yolo detect train datadata.yaml modelyolov8s.pt imgsz640 batch16 epochs200--weights yolov5s.pt是拿 COCO 预训练权重做初始化。对于纸瓶、玻璃瓶这类外观比较固定的目标迁移学习收敛速度会明显快于随机初始化。--img 640是输入分辨率如果后续测试发现塑料瓶小目标漏检严重可以提到 960显存占用会成倍增加。--batch 16在 8G 显存上比较稳妥显存不足时降到 8 或 4。--cache会把图像提前缓存到内存6000 张图大概会吃几个 G 的内存如果不富裕就忍一忍训练时的磁盘读取开销。关于--epochs 200这个数据量下通常 120 到 160 个 epoch 左右 mAP 已经趋于平缓后面多是过拟合信号。我习惯先跑 200中间看到 val loss 不再下降就手动停掉不会傻等到最后一个 epoch。4.2 训练过程的几个观察点loss 曲线、cls loss 与 mAP训练时每个 epoch 结束会打印一行指标格式大致是 Epoch、GPU 内存、box loss、obj loss、cls loss、目标数和输入尺寸。前期 box loss 和 cls loss 会快速下降这是正常现象。如果 cls loss 一直维持在 0.03 以下说明类别可分性比较好如果 obj loss 居高不下常见原因是背景区域太多或者很多图中的目标占比太小。这四类垃圾目标里纸瓶和玻璃瓶在形状上有一定区分度比较容易学塑料袋因为形态软、透明部分标签框可能边界模糊对模型来说难度最高。看到 val mAP 在某个 epoch 后开始下降但训练 loss 还在降明显是过拟合信号这时停止训练或者调低数据增强强度重启一轮。4.3 推理验证跑 detect.py 之后要看的几个关键画面训练结束后我会拿 val 或 test 目录跑一次推理确认模型真实输出python detect.py --weights runs/train/exp/weights/best.pt --source ../recyclable_waste_6000/images/test --conf 0.3 --save-txt--conf 0.3是置信度阈值跑一遍后我会再降到 0.15 看一次对比阈值对漏检的影响。--save-txt会同时输出检测结果的 txt方便后续做统计。跑完去 runs/detect/exp 目录打开前 20 张图重点看三类问题重复框、无意义框、同类别漏检。这个步骤我称之为“人眼验收”任何 mAP 数字都不能替代人眼对真实场景图片的观察。如果模型在 test 图像上的输出框明显偏离标注位置多半是标签坐标出了问题如果某些图完全没检出任何目标先看原图里目标是否极小再考虑提高输入分辨率。5. 避坑指南五个我在标签配对、坐标归一化和训练参数上踩过的坑5.1 标签文件对不上训练时找不到标签、类别索引越界第一个坑是训练启动时报找不到标签。现象训练日志刚开始就出现WARNING: No labels found in .../images/train后续 loss 全部为 0训练卡在数据加载阶段。原因yolo 系列的读取逻辑是按 images 目录推断标签路径默认把 images 替换成 labels。如果解压后标签目录名是 labels_yolo或者标签和图像不在同一个根目录下就找不到任何标签。解决先用第 2.3 节的脚本核对目录确认标签目录和 images 是兄弟目录不行就把 data.yaml 里的路径写成绝对路径再不行就把标签文件软链到与 images 同级的 labels 目录。不要改图像文件名去迎合路径那样只会有更多连锁问题。第二个坑是类别索引越界。现象训练第一个 epoch 还没跑完就报 IndexError提示 class index 超出范围比如类别数组长度为 4索引却是 4。原因voc 的类别名和 yolo 的类别索引映射写错有人把类别从 1 开始编号导致所有索引整体偏大。解决用第 3.3 节脚本把所有 txt 的第一列过一遍凡是大于等于 nc 的记下来回到 voc xml 里按 classes.txt 的顺序重新生成 yolo 标签。5.2 训练过程不对劲loss 不降、检测结果全是空的第三个坑是 loss 迟迟不降。现象训练了 20 多个 epochbox loss 和 cls loss 在某个数值附近来回震荡mAP0.5 一直是 0。原因最常见的是把 voc 的绝对像素坐标直接写进了 yolo 的 txtx_center 和 width 远大于 1归一化完全失效。另一种是 txt 中四个值顺序写成了 xmin、ymin、xmax、ymax而不是中心点坐标和宽高。解决挑几个 txt 文件看一眼坐标取值范围用第 2.2 节的换算公式重新归一化。修正后删除训练缓存目录重来不要直接覆盖旧权重继续训。第四个坑是 mAP 一直很低尤其小目标漏检严重。现象loss 在下降但 mAP0.5 在 0.3 附近徘徊塑料瓶这类小目标经常整张图都没检出。原因输入分辨率 imgsz 设太小目标在 640x640 里只剩几十个像素学习率过高也会让模型在小目标特征上震荡。解决把 imgsz 提到 960batch 降到 8学习率从默认的 0.01 降到 0.005重启一轮训练。这个过程很吃显存如果硬件扛不住优先保证分辨率再考虑压缩 batch。5.3 推理阶段翻车阈值不合适、类别名顺序写反、图像尺寸不一致第五个坑是验证集指标不错但真实场景图片检测不出来。现象测试集 mAP 能到 0.8换到自己手机拍的塑料袋照片上一个都识别不出来。原因有几种可能。第一是验证集和训练集分布太接近都是同一来源的图第二是推理时的 imgsz 和训练时不一致第三是 conf 阈值设太高把低分框全滤掉了第四是 names 顺序和训练时对不上模型输出的类别对应错了。解决拿一组完全没有参与训练的现场图片做验证close-up 和远距离都要覆盖。推理时--imgsz和训练保持一致conf 从 0.25 开始逐步降低观察哪些目标在低阈值下被召回。如果发现真实场景里目标普遍很小训练时就需要提高分辨率单纯调阈值救不回来。6. 进阶技巧用脚本把 VOC 标签批量转成 YOLO 格式顺带清洗异常框最后这一步是我拿到任何带 VOC 标注的数据集都会做的事把 xml 重新转成 yolo 格式并且在转换过程中过滤异常框。即使这份数据已经同时提供了 yolo 格式也建议自己跑一遍因为转换过程本身就是一次数据清洗。import xml.etree.ElementTree as ET from pathlib import Path xml_dir Path(labels_voc) out_dir Path(labels_yolo_generated) out_dir.mkdir(parentsTrue, exist_okTrue) classes [] for xml_file in xml_dir.rglob(*.xml): tree ET.parse(xml_file) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in classes: classes.append(name) cls_id classes.index(name) box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) x_center ((xmin xmax) / 2) / img_w y_center ((ymin ymax) / 2) / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h if not (0.0 w 1.0 and 0.0 h 1.0) or not (0.0 x_center 1.0 and 0.0 y_center 1.0): print(fskip abnormal bbox: {xml_file.name} {name}) continue lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) out_file out_dir / (xml_file.stem .txt) out_file.write_text(\n.join(lines), encodingutf-8) for i, name in enumerate(classes): print(i, name)脚本先读 xml 里的图像宽高再逐条解析 object 和 bndbox算出归一化坐标后做一次边界检查。宽高小于等于 0 的框直接跳过中心点不在 0 到 1 范围内的也跳过保证输出的每一行都是合法标注。类别列表是动态构建的顺序和第一次出现的顺序一致转换完把 classes 打印出来和根目录的 classes.txt 做对比确认两边顺序相同。这个脚本最大的价值在于把“转换”和“体检”合并成一步既能生成新的 yolo 标签又能把原标注里不合理的框暴露出来。从那以后我每次拿到新的标注数据都会先跑一遍这个转换体检脚本再开始训练很多所谓玄学问题事后看都出在坐标没对上。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
基于STM32的超声波雾化片驱动设计:从电路到自动频率跟踪 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 1:39:19
OpenHarmony I2C开发实战:协议、HDF驱动与排障全攻略 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 1:39:19
STM32H750开发环境搭建:Keil社区版免费激活与芯片包安装指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 1:39:13
Spingboot启动预热的实现 启动预热的适用场景启动预热适合以下情况:数据主要来自第三方接口,无法直接从本地数据库读取。第三方接口响应较慢,首次访问容易超时。一个页面需要调用多个第三方接口或逐项查询。数据读取频繁,但变化不频繁。希望服务启动后&… · 2026/9/28 3:40:12
学Java别走弯路,这5个方向最吃香 学Java的人很多,但学明白的人不多。有人学了半年还在写控制台程序,有人一年就能独当一面。差别不在天赋,而在方向。Java生态太庞大了,什么都学等于什么都没学。选对方向,事半功倍。今天盘点当前最吃香的5个Java方向&am… · 2026/9/28 3:32:15
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
制作网页比较方便的软件怎么选?一文搞懂避坑指南 制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25