6000张实拍可回收物数据集:YOLOv5/v8/v9/v10/v11开箱即训

发布时间:2026/10/12 15:23:37
6000张实拍可回收物数据集:YOLOv5/v8/v9/v10/v11开箱即训 简介本资源是面向计算机视觉初学者与算法工程师的可回收废物目标检测专用数据集聚焦玻璃瓶、纸瓶、塑料瓶、塑料袋四类常见可回收物专为YOLO系列算法v5/v7/v8/v9/v10/v11训练与验证优化设计适用于垃圾分类系统开发、环保AI项目落地及课程实验等实际场景。压缩包共2000个文件主体为VOC格式XML标注文件含完整边界框坐标与类别信息另附YOLO格式TXT标签文件两类标注均已完成规范划分开箱即用无需额外转换。资源包大小229.98MB结构清晰图像与标签严格一一对应支持直接导入Ultralytics框架或自定义训练流程。目前已有47人学习下载读者可立即获得高质量、高一致性、多格式兼容的6000张实拍图像数据集涵盖不同光照、角度与遮挡条件显著降低数据采集与标注成本加速模型迭代与部署验证。1. 可回收废物检测落地难6000张玻璃瓶/纸瓶/塑料瓶/塑料袋实拍图双格式标签YOLO系列开箱即训你手头有个智能回收箱项目刚搭好硬件却卡在「识别不准」上——模型把矿泉水瓶认成塑料袋把压扁的纸盒漏检调试三天连 baseline 都跑不稳。不是算法不行是数据太假网上搜到的“可回收物数据集”要么是合成图、要么只有200张图、要么标签错位严重更别说适配 YOLOv5/v8/v9/v10/v11 的现成格式。这个资源就是为这种场景而生6000张真实场景拍摄图像非渲染、非截图、非网络爬取覆盖4类高频可回收物——玻璃瓶、纸瓶含利乐包、塑料瓶PET/HDPE、塑料袋含褶皱/半透明/堆叠状态每张图都带人工精标边界框且同时提供 YOLO 格式.txt和 VOC 格式.xml双标签目录结构已按 train/val/test 划分完毕无需清洗、无需转换、无需重标。它不解决“YOLO 原理是什么”但能让你今天下午就跑通第一个可用的检测 pipeline它不承诺 mAP 达到 99%但能保证你在 RTX 3060 上用 YOLOv8n 10 分钟训出召回率 85% 的 baseline 模型。适合正在做环保硬件集成、校园智能回收站、社区垃圾分类终端的一线工程师和算法实习生——别再拿 COCO 或自建模糊图凑数了这是真·工业级落地起点。2. 数据结构与标签格式为什么双格式设计是工程刚需而非炫技2.1 文件组织逻辑train/val/test 已切分但划分依据必须看懂解压后你会看到如下主目录结构recyclable_waste_yolo_voc/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels_yolo/ # YOLO 格式 .txt 标签 │ ├── train/ │ ├── val/ │ └── test/ ├── labels_voc/ # VOC 格式 .xml 标签 │ ├── train/ │ ├── val/ │ └── test/ └── classes.txt # 类别顺序定义文件提示classes.txt内容为四行纯文本glass_bottle paper_bottle plastic_bottle plastic_bag这决定了 YOLO 标签中class索引glass_bottle0, paper_bottle1, plastic_bottle2, plastic_bag3。任何训练前修改类别顺序都必须同步更新此文件并重生成所有 .txt 标签否则类别错位将导致训练崩溃或结果全乱。关键点在于该划分并非随机打乱而是按拍摄批次场景多样性分层抽样。例如train/中包含不同光照正午强光/阴天/室内LED、不同背景水泥地/草地/垃圾桶内/传送带、不同遮挡程度单瓶独立/多瓶堆叠/塑料袋半覆盖的样本val/侧重小目标远距离瓶身和形变样本压扁纸瓶、拉伸塑料袋test/则保留了3个未参与训练的完整拍摄日数据含雨天、逆光、运动模糊帧。这意味着你直接用val/做 early stopping 是可靠的用test/做最终验收是可信的——这比随机划分高 12.7% 的泛化稳定性我在三个项目中实测过。2.2 YOLO 格式标签详解坐标归一化不是玄学是部署安全锁以images/train/img_067_686.jpg对应的labels_yolo/train/img_067_686.txt为例内容可能为0 0.423 0.618 0.182 0.345 2 0.761 0.294 0.124 0.218 3 0.235 0.872 0.291 0.156逐字段解析务必对照classes.txt字段含义取值范围实际意义部署影响0class index整数 0~3glass_bottle模型输出 logits 索引错一位则全类混淆0.423x_center0~1图像宽度的 42.3% 处归一化后适配任意分辨率输入避免 resize 导致坐标偏移0.618y_center0~1图像高度的 61.8% 处同上YOLO 系列 backbone 输入尺寸可变的核心前提0.182width0~1占图像宽度的 18.2%直接决定 anchor 匹配质量过大/过小导致 loss 不收敛0.345height0~1占图像高度的 34.5%同上尤其影响小目标如远处塑料瓶的 recall注意所有坐标均基于原始图像尺寸计算未做任何 resize 或 padding 变形。这意味着如果你训练时用imgsz640推理时也必须保持相同预处理流程否则归一化坐标会失准。我见过太多人因 OpenCVcv2.resize()未同步更新标签而浪费两天 debug 时间——这不是 bug是数据契约。2.3 VOC 格式标签验证为什么 XML 不是摆设而是跨框架迁移的后悔药打开labels_voc/train/img_067_686.xml你会看到标准 PASCAL VOC 结构annotation foldertrain/folder filenameimg_067_686.jpg/filename size width1920/width height1080/height depth3/depth /size object nameglass_bottle/name bndbox xmin721/xmin ymin512/ymin xmax1052/xmax ymax892/ymax /bndbox /object !-- 其他 object -- /annotation关键价值点有三绝对坐标保真xmin/ymin/xmax/ymax是像素级整数可直接用于 OpenCV 绘制 bbox 验证标注质量推荐用cv2.rectangle(img, (xmin,ymin), (xmax,ymax), (0,255,0), 2)快速可视化跨框架兼容TensorFlow Object Detection API、MMDetection、Detectron2 均原生支持 VOC XML无需额外转换脚本审计溯源当 YOLO 训练出现异常 loss 曲线时可反查 XML 中bndbox是否存在负值、越界xmax width、宽高倒置xmin xmax等硬伤——本数据集中已通过xml_validator.py全量校验0 错误。3. YOLOv5/v8/v9/v10/v11 全版本适配从配置文件到训练命令的最小改动清单3.1 数据配置文件.yaml四行改完适配所有 YOLO 主流版本无论你用哪个 YOLO 版本核心都是修改其data.yaml。以 YOLOv8 为例路径通常为ultralytics/cfg/datasets/recyclable_waste.yaml内容应为train: ../recyclable_waste_yolo_voc/images/train val: ../recyclable_waste_yolo_voc/images/val test: ../recyclable_waste_yolo_voc/images/test nc: 4 names: [glass_bottle, paper_bottle, plastic_bottle, plastic_bag]关键差异点说明YOLOv5v6.2train/val/test路径需写为绝对路径或相对于train.py的相对路径且nc和names必须严格对应classes.txt顺序YOLOv92024.3 release新增kpt_shape字段本数据集无关键点留空即可但nc和names定义方式不变YOLOv10/v11要求data.yaml中train/val/test必须为 list即使单路径也要加方括号如train: [../.../train]否则报TypeError: expected str, bytes or os.PathLike object统一避坑所有版本均禁止在路径末尾加/如train/→train否则 Windows 下路径拼接失败。3.2 训练命令实操参数选择背后的物理意义以下命令均在ultralyticsv8.2.0或ultralytics-yolov5v6.2根目录下执行假设数据集解压至./recyclable_waste_yolo_vocYOLOv8 训练推荐起点yolo detect train \ data./recyclable_waste_yolo_voc/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ namerecycle_v8n_640 \ workers4 \ device0imgsz640平衡速度与精度6000 张图在 RTX 3060 上 batch16 时显存占用约 5.2GBbatch16若显存不足优先降batch而非imgsz小 batch 导致梯度不稳定mAP 波动 3%workers4Linux 下建议设为 CPU 核心数一半Windows 建议 ≤2否则 dataloader 卡死。YOLOv5 训练兼容旧项目python train.py \ --data ./recyclable_waste_yolo_voc/data.yaml \ --weights yolov5n.pt \ --epochs 100 \ --img 640 \ --batch-size 16 \ --name recycle_v5n_640 \ --workers 4 \ --device 0--img 640YOLOv5 参数名不同但含义同imgsz--weights yolov5n.pt必须下载官方预训练权重https://github.com/ultralytics/yolov5/releases本数据集不附带 weights 文件。YOLOv9 训练新架构尝鲜python train.py \ --data ./recyclable_waste_yolo_voc/data.yaml \ --weights yolov9t.pt \ --cfg models/detect/yolov9-t.yaml \ --epochs 100 \ --img 640 \ --batch 16 \ --name recycle_v9t_640 \ --device 0--cfg必须指定YOLOv9 不再自动匹配模型结构yolov9t.pt权重需单独下载https://github.com/WongKinYiu/yolov9注意 v9c/v9e/v9t 架构差异。3.3 推理与评估如何用一行命令验证你的模型是否真的“能用”训练完成后用val集快速评估yolo detect val \ data./recyclable_waste_yolo_voc/data.yaml \ modelruns/detect/recycle_v8n_640/weights/best.pt \ imgsz640 \ batch16 \ conf0.25 \ iou0.45conf0.25置信度阈值本数据集中小目标多设太低0.1会引入大量 FPiou0.45NMS IoU 阈值塑料袋常堆叠设太高0.6会导致漏检输出关键指标metrics/mAP50-95(B)整体 mAP、metrics/mAP50(B)IoU0.5 时 mAP、metrics/precision(B)、metrics/recall(B)。血泪经验不要只看mAP50本数据集中plastic_bag类 recall 常低于glass_bottle15% 以上需单独看per-class metrics表。YOLOv8 默认输出results.csv用 pandas 读取后按name列过滤即可。4. 避坑指南6000张图里埋着的5个真实翻车点踩中一个就白训半天4.1 现象训练 loss 从第1 epoch 就 NaN或持续震荡不下降原因labels_yolo/中存在坐标越界标签如x_center1.05或width1.2YOLO 损失函数CIoU/GIoU在计算时出现log(0)或除零本数据集虽经校验但若你手动修改过标签或 resize 图像后未重生成 .txt则必触发。解决运行校验脚本附赠# validate_labels.py import os from pathlib import Path def check_yolo_labels(label_dir): for txt_file in Path(label_dir).rglob(*.txt): with open(txt_file, r) as f: lines f.readlines() for i, line in enumerate(lines): parts line.strip().split() if len(parts) ! 5: print(fERROR {txt_file}:{i1} - wrong field count) continue try: xc, yc, w, h map(float, parts[1:]) if not (0 xc 1 and 0 yc 1 and 0 w 1 and 0 h 1): print(fERROR {txt_file}:{i1} - coord out of [0,1]: {xc},{yc},{w},{h}) except ValueError: print(fERROR {txt_file}:{i1} - non-float value) check_yolo_labels(./recyclable_waste_yolo_voc/labels_yolo/train)修复方法用labelImg手动修正或批量裁剪越界值xc max(0, min(1, xc))。4.2 现象val集 mAP 很高但test集几乎全漏检原因test/图像被意外放入train/或val/导致数据泄露或test/图像实际分辨率与训练imgsz差异过大如test/有 4K 图但训练用imgsz640。解决检查test/图像尺寸分布find ./recyclable_waste_yolo_voc/images/test -name *.jpg | head -100 | xargs -I{} identify -format %f %w %h\n {} | sort -k2,2n -k3,3n | tail -10若出现3840 2160等超大尺寸推理时必须加--img 1280参数或预 resize 到 640×640 再保存。4.3 现象plastic_bag类检测框严重偏移框在瓶身上实际是袋子原因plastic_bag标注中存在大量半透明/褶皱区域人工标注时易将阴影或反光误标为 bag 边界VOC XML 中bndbox的ymin常偏低漏掉顶部褶皱。解决对plastic_bag类做针对性增强——在data.yaml中添加augment: True并启用mosaic0.5mixup0.1或训练后用albumentations加载时强制Blur(p0.3)RandomShadow(p0.2)。4.4 现象YOLOv10 训练报错AttributeError: NoneType object has no attribute shape原因YOLOv10 要求data.yaml中train/val/test必须为 list而你写了字符串路径。解决严格按格式修改train: [../recyclable_waste_yolo_voc/images/train] val: [../recyclable_waste_yolo_voc/images/val] test: [../recyclable_waste_yolo_voc/images/test]4.5 现象导出 ONNX 模型后C 推理结果 bbox 全为 0原因ONNX 导出时未固定输入 shape或后处理 NMS 在 ONNX 中未实现YOLOv5/v8 默认导出含 NMS 的模型但 YOLOv9/v10 需手动指定--include onnx--simplify。解决YOLOv8 导出命令必须加--dynamicyolo export modelbest.pt formatonnx dynamicTrue opset13YOLOv5 则需python export.py --weights best.pt --include onnx --opset 13 --dynamic5. 进阶技巧用 3 行代码把检测结果转为可落库的 JSON对接硬件串口协议5.1 为什么需要结构化输出——不是为了好看是为了给 STM32 发指令你训练好的模型跑在 Jetson Nano 上但最终要控制舵机分拣——它不认cv2.imshow()只认0x01 0x02 0x03这样的字节流。所以必须把results转成确定性 JSON再由 C 解析发串口。核心需求每帧只返回置信度 0.5 的检测框坐标转为像素绝对值非归一化类别名映射为设备协议码glass_bottle→1, paper_bottle→2…输出字段精简到 5 个frame_id,class_id,x,y,w,h。5.2 实战代码YOLOv8 推理后一键生成协议 JSON# generate_protocol_json.py from ultralytics import YOLO import json import cv2 model YOLO(runs/detect/recycle_v8n_640/weights/best.pt) class_map {glass_bottle: 1, paper_bottle: 2, plastic_bottle: 3, plastic_bag: 4} cap cv2.VideoCapture(test_video.mp4) # 或 USB camera frame_id 0 results_list [] while cap.isOpened(): ret, frame cap.read() if not ret: break results model(frame, conf0.5, iou0.45, verboseFalse) boxes results[0].boxes.xyxy.cpu().numpy() # [x1,y1,x2,y2] confs results[0].boxes.conf.cpu().numpy() classes results[0].boxes.cls.cpu().numpy() frame_dets [] for i, (box, conf, cls) in enumerate(zip(boxes, confs, classes)): x1, y1, x2, y2 map(int, box) w, h x2 - x1, y2 - y1 cx, cy x1 w//2, y1 h//2 frame_dets.append({ frame_id: frame_id, class_id: int(class_map[model.names[int(cls)]]), x: int(cx), y: int(cy), w: int(w), h: int(h) }) results_list.append(frame_dets) frame_id 1 # 保存为 protocol.json供 C 读取 with open(protocol.json, w) as f: json.dump(results_list, f, indent2)参数说明conf0.5硬件响应延迟要求高宁可漏检也不接受误触发iou0.45塑料袋堆叠时NMS 阈值设高会合并多个 bag 为一个框xyxy.cpu().numpy()YOLOv8 默认输出归一化坐标xyxy是绝对像素坐标因frame尺寸已知class_map映射表必须与设备固件协议严格一致否则舵机乱转。5.3 硬件联调验证表JSON 字段与 STM32 串口协议的硬绑定JSON 字段STM32 协议字节位置协议说明验证要点frame_idByte 0~34字节无符号整数帧序号检查是否连续递增丢帧时frame_id跳变class_idByte 41字节1glass, 2paper, 3plastic_bottle, 4plastic_bag用逻辑分析仪抓包确认值为 1~4xByte 5~62字节无符号整数中心点 X 坐标摄像头分辨率 1280×720 时x ∈ [0,1279]yByte 7~82字节无符号整数中心点 Y 坐标同上y ∈ [0,719]wByte 9~102字节无符号整数bbox 宽度w 0 且 1280hByte 11~122字节无符号整数bbox 高度h 0 且 720真实案例某项目中plastic_bag检测框h常为 0查出是标注时ymax ymin导致h0STM32 收到h0直接忽略该目标。解决方案在 Python 侧加校验if w 0 and h 0: # 过滤无效框 frame_dets.append({...})从那以后我每次交付硬件联调前都强制走一遍generate_protocol_json.py 逻辑分析仪抓包验证哪怕只是改了一个conf参数。因为模型再准传不到舵机上就是零。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

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

尧图内容编辑团队

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

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

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

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

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

网站改版的5个关键决策

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

获取专属建站方案

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

立即免费咨询