ARTICLE DETAIL

资讯详情

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

YOLO可回收废物检测:6000张带标签数据集训练与避坑指南

YOLO可回收废物检测:6000张带标签数据集训练与避坑指南 简介面向YOLO系列目标检测的可回收废物数据集聚焦玻璃瓶、纸瓶、塑料瓶、塑料袋等常见可回收物适合需要训练垃圾分类检测模型的开发者、研究人员及算法学习者也适用于环保回收场景的项目验证与课程实验。数据集已完成训练集与验证集划分兼容YOLOv5、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLO11等主流算法下载后可直接用于模型训练、评估与测试。压缩包共2000个文件以XML标签文件为主同时配套YOLO格式TXT标签整体大小约229.98MB两类标签分别存放于独立文件夹中TXT标签采用类别索引与归一化后的目标框坐标字段记录XML则对应VOC标注规范两类文件均可被常见检测框架直接读取。已有47人学习下载资源免去自行采集、清洗与标注的繁琐工作拿到手即可投入到目标检测任务中特别适合需要快速上手YOLO系列算法或验证垃圾识别方案的实践者。1. 可回收废物数据集YOLO算法的第一份6000张带标签训练原料接到一个垃圾分类识别需求手头没有现成数据这是最焦虑的时刻。这个标题给到的是一份打包好的YOLO算法训练素材6000张图像全部带标签目标类别锁定玻璃瓶、纸瓶、塑料瓶、塑料袋四类整体放在一个zip压缩包里。对我这种经常要在短周期内交付视觉方案的工程师来说这类数据集的价值不是省掉标注那么简单而是让你能立刻把YOLO训练管线跑通得到一张可验证的mAP报告再去谈模型优化。适合刚入门目标检测的开发者快速走一遍全流程也适合已经在做智能回收箱、分拣机器人视觉单元的团队拿来做baseline验证。标题里带标签三个字值得强调意味着不需要再花一两周去人工框目标解压、分目录、改配置三个步骤就能进训练。2. 数据集解剖四类可回收物的区分度与标注逻辑2.1 玻璃瓶、纸瓶、塑料瓶同为瓶形模型靠什么区分三个类别的外观在形状上高度接近都是柱状瓶体加瓶颈结构。YOLO这类单阶段检测器输出的是类别概率和边界框它不会显式建模这是玻璃的折射而是直接从训练图像的像素统计里找规律。玻璃瓶的特征是透光、反光玻璃面的高光区域会在不同拍摄角度下移动纸瓶比如牛奶盒、饮料纸盒的表面是哑光的有印刷图案和接缝几乎没有镜面反射塑料瓶通常是PET材质半透明瓶身有褶皱和标签受挤压时形状会轻微变形。这部分区分度的差异直接决定了训练时该做什么预处理。我一般会在数据加载阶段保留原始颜色空间不加灰度化因为瓶类的判别信息很大程度在颜色与反射上。如果拍照环境光源单一同一类瓶子的颜色分布会很集中模型会倾向记住高光玻璃瓶到现场换一个灯光环境就掉点。所以对这份数据集训练时要加色彩抖动和亮度扰动别让模型把材质特征学成照明特征。还有一个容易忽略的点瓶盖。玻璃瓶配金属盖或皇冠盖塑料瓶配塑料螺纹盖纸瓶的吸管孔和折角也是强特征。标注的时候如果瓶盖露出来模型其实会偷偷依赖瓶盖区域分类。这本身不是坏事但当现场出现玻璃瓶装塑料盖这类混搭时模型会犹豫。想验证这个判断训练完可以把图像里的瓶盖区域裁掉再推理你会发现置信度明显下降。了解这个机制就知道为什么有些现场模型换个包装就翻车。2.2 塑料袋柔性目标为什么拖垮刚框检测器塑料袋和三类瓶子最大的区别是瓶子的形状刚性、稳定塑料袋没有固定形态。一个袋子的轮廓可能是三角形、团球形、展开成一片YOLO的边界框是轴对齐矩形天生和这类柔性目标不对齐。同一个袋子在不同姿态下框的宽高比能从1:1变到4:1这给边界框回归头增加了不小的负担。打开这份数据集的标签看八成会发现同一个袋子在不同图里有两种标注习惯一种框住袋子整体的最小外接矩形另一种只框袋子里有内容物的实心区域。这两种倾向混在一起会让模型无所适从。我的处理原则是统一按袋身可视范围的最大外接矩形来框忽略飘出来的提手因为提手不是判别特征还会把宽高比拉得过于极端。训练时还要留意半透明袋子塑料袋透出背景内容模型容易把背景误学到袋子的特征里。遇到这种图常规做法是手动把背景杂乱的样本挑出来做难例或者对这类样本提高图像增强里mosaic的参与权重让模型在混乱背景下仍能找到袋子主轮廓。另外塑料袋的类别混淆常常发生在白色塑料袋和纸瓶之间两者都是浅色、表面有褶皱纹理。如果验证时发现这两个类互相串优先怀疑标注阶段是否把某些白色塑料袋当纸瓶标了因为纸瓶有明确的矩形棱角塑料袋没有人眼分得清但标注疲劳时很容易手滑。2.3 标签体系与文件目录训练前必须确认的五件事拿到zip包第一件事不是解压就训练先按清单确认五件事能省很多查错的功夫。第一标签格式。YOLO系列通常用txt格式每行一个目标格式是 class x_center y_center width height全部归一化到0-1。如果标签是VOC XML或者COCO json要先转换你后面写的data.yaml才能被train代码正确读取。第二文件名对应。图像和标签必须同名同前缀比如 img_0001.jpg 对应 img_0001.txt。差一个后缀字符训练时就会被静默跳过而数据集loader不会主动提示你某个图没有标签。检查方法也直接统计图像文件数和txt文件数两者差值超过30张就要警惕。第三类别顺序。txt第一列数字0-3对应哪个类别要和配置文件里的names列表严格一致。最怕的是标注人按玻璃瓶、纸瓶、塑料瓶、塑料袋标而你在yaml里写成纸瓶、玻璃瓶、塑料瓶、塑料袋整个模型学出来是完全错位的且这类错的隐蔽性极强因为train loss照样能降。第四图像尺寸。6000张图如果来源杂乱可能从几百像素到几千万像素都有YOLO会统一resize到imgsz参数指定的尺寸但分辨率差异过大的数据会造成训练不稳定。建议把分布统计一次低于640像素的图要么补一下要么imgsz下调到640减少输入尺寸波动。第五划分是否完成。数据集的train/val划分为8:2或9:1是常规如果包内只有全部图像和标签、没有划分好的目录需要自己先划分再做训练否则验证时泄露训练样本mAP虚高没有参考价值。提示打开标签前用任意可视化脚本把标注画回原图抽查100张再动手训练。标注错位、漏标这类问题在图像上看一眼就明白靠日志排查要慢得多。3. 用YOLO训练可回收废物检测模型从zip解压到出权重的完整操作3.1 环境准备与预训练模型选择训练首选ultralytics这一套YOLO实现安装简单pip install ultralytics装好后确认版本再准备预训练模型。常见做法是下载YOLOv8系列预训练权重作为起点。具体选哪个size个人显存在8GB以上可以直接用yolov8s6GB以下用yolov8n。6000张数据集不算大不需要上yolov8l这种大模型过拟合概率高训练时间翻几倍收益很小。预训练模型选COCO版本即可因为可回收物虽然在COCO里没有完全对应的类但底层特征如边缘、纹理、显著性是有迁移价值的。如果后续想要把塑料袋轮廓精确分割出来可以考虑YOLO实例分割系列但那就是另一套需求了需要polygon或mask标注。这份数据集如果只提供矩形框标签就老老实实走目标检测不要硬塞分割任务。3.2 数据集目录转换与配置文件改写先把zip解压并梳理成YOLO目录结构mkdir -p dataset/images/train dataset/images/val \ dataset/labels/train dataset/labels/val unzip -q yolo算法-可回收废物数据集-6000张图像带标签-玻璃瓶纸瓶塑料瓶塑料袋.zip -d raw解压后注意用ls raw确认里面的实际根目录结构有些zip包会自带一层同名文件夹直接导致后面脚本路径不对。确认结构后按8:2划分。写一个脚本完成分配import os, random, shutil random.seed(42) # 固定随机种子保证多次实验划分结果可复现 raw_img_dir raw/images raw_lab_dir raw/labels files [f for f in os.listdir(raw_img_dir) if f.endswith(.jpg)] random.shuffle(files) val_count int(len(files) * 0.2) for i, name in enumerate(files): split val if i val_count else train src_img os.path.join(raw_img_dir, name) src_lab os.path.join(raw_lab_dir, name[:-4] .txt) if not os.path.exists(src_lab): continue # 跳过没有同名标签的图像避免训练时空标签报错 shutil.copy(src_img, fdataset/images/{split}/{name}) shutil.copy(src_lab, fdataset/labels/{split}/{name[:-4]}.txt)这段脚本的核心是随机种子固定同一个包在多次复现实验里划分结果一致后续做对比实验才公平。另外先检查标签存在再复制文本标签缺失时直接跳过比训练时让dataloader报错更省事。然后写数据配置# recyclable.yaml path: ./dataset train: images/train val: images/val names: 0: glass_bottle 1: paper_bottle 2: plastic_bottle 3: plastic_bag这里的关键是names的顺序必须和标签txt第一列的数字完全一致。如果发现标签里第一列顺序是0玻璃、1纸、2塑料、3袋那就保持原样不要按自己的偏好重新排。3.3 训练命令与关键超参数说明yolo detect train \ modelyolov8s.pt \ datarecyclable.yaml \ epochs100 \ imgsz640 \ batch16 \ patience20 \ cacheTrue \ workers4 \ seed42 \ projectruns/recycle各参数的调整意图epochs100对6000张数据够用一般在60-80代附近收敛设100是留余量。imgsz640YOLO的默认分辨率玻璃瓶这种中大型目标足够。如果瓶类在图中占比很小可以试imgsz960但显存占用和训练时间会同步上涨。batch168GB显存下yolov8s的稳妥值显存紧张降到8。patience20连续20代验证集分数不提升就提前停表防止后期过拟合干等。cacheTrue把数据缓存进内存6000张图通常能吃下能显著加快训练代价是内存占用变高。workers4Windows下别用默认8数据加载线程过密容易卡死。从预训练模型起步而不是完全随机初始化收敛速度能快一到两倍最终精度也更高。特别是玻璃瓶这种透明材质的特征在COCO预训练模型里已经有大量类似的透明容器响应迁移效果很直观。3.4 训练监控YOLO损失函数三条曲线与过拟合信号训练开始后除了盯着终端里的mAP数字我习惯看三个曲线box_loss、cls_loss、dfl_loss。YOLO的损失函数不是单个值检测头那一堆叠加项里主要有三类边界框回归损失衡量预测框和真值框位置差使用CIoU或DFL变体分类损失多类别时用BCE With Logits负责把这是不是玻璃瓶的概率压向正确类DFL损失配合Distribution Focal Loss让框边更贴合目标边缘在塑料袋这种不规则目标上它的曲线波动通常比瓶类更大。用Ultralytics自带的results.png能看到这几条曲线TensorBoard接入也可以。合理形态是训练初期loss快速下降中期变缓验证集loss不随训练集继续降反而是过拟合信号。如果cls_loss卡在0.6以上不降先别调参回到2.3去重新检查标签与names顺序八成是类别错位这类低级问题。4. 避坑6000张图里最容易翻车的5个地方4.1 现象某一类mAP特别低比如纸瓶AP只有0.2原因多数不是模型问题而是标注口径不统一。有的标注员把带塑料盖的纸盒也算纸瓶有的只算纯纸包装模型学习的类内一致性被破坏。另一个常见原因是该类别样本量偏少6000张总量如果按类均匀分布每类1500张还好就怕玻璃瓶2500、纸瓶500。解决方法是先把每类的目标框数量统计出来低于800个框的类就做该类别的复制粘贴增强或者去线下补拍并统一标注口径后修正标签。4.2 现象loss曲线先降后涨验证集mAP波动很大这类现象最容易被归因于学习率我栽过的坑是标签里混入软标签。软标签指类别分布不是硬0/1而是带概率的比如有人用半自动标注工具导出时给了float类型得分或者同一条数据被不同人标成两个类。YOLO的训练代码对txt标签只取第一个数字当类别索引一旦出现0.6 0.3 0.2 0.1这种浮点开头解析直接错位。解决写脚本过滤所有第一列非整数的行lines open(label.txt).readlines() clean [] for ln in lines: parts ln.split() if parts and parts[0].isdigit(): clean.append(ln) open(label_fixed.txt, w).writelines(clean)对6000张图挨个跑一遍这个过滤能在训练前排除这类脏数据。4.3 现象训练启动即报Dataset not found或找不到图像这种情况常见于解压后的zip目录。很多数据集zip里用中文文件夹嵌套解压工具和YOLO的路径处理一冲突就找不到文件。另一个更隐蔽的问题是路径里的空格和特殊字符Windows下从资源管理器复制出的路径经常带空格。解决先把整个数据集copy到一个纯英文路径下比如 C:\train_data\recycle再把路径参数用相对路径写在recyclable.yaml里。如果压缩包打开时提示需要密码或报CRC错误先确认是不是伪加密伪加密的zip用主流解压工具可以直接解不需要另找工具。解出来以后做一次全量文件数核对6000张图像对应至少6000个标签文件数量对不上就要回头检查解压是否完整。4.4 现象训练中途OOM或者机器直接卡死显存溢出最常见原因是batch或imgsz设置超出显存。6000张图训练到一半爆显存改小参数后从头来时间全浪费。我一般先跑20步热身yolo detect train modelyolov8s.pt datarecyclable.yaml epochs1 imgsz640 batch16epochs1先跑通一条流水线确认显存峰值和耗时再把epochs改回去正式训练。同时把workers设成4而不是默认的8数据加载线程过多在Windows下容易卡死。这个习惯能挡掉一半以上的中途失败。4.5 现象训练集mAP到0.95验证集才0.5除了过拟合最常见的解释就是划分不当。如果原始图像里同一个瓶子的多张连续拍摄被同时放进训练集和验证集模型其实在背这组相似图。解决划分前先把相似帧聚类一下或者按拍摄批次目录划分而不是按文件名随机划分。另一个做法是划分完以后抽样看一眼验证集图像与训练集的重复度肉眼抽100张足够看出问题。6000张数据看着多实际可能只来自几十个拍摄批次盲目随机划分正是这类隐患的来源。5. 验证与评估混淆矩阵、PR曲线和漏检的边界5.1 混淆矩阵怎么看瓶类互相污染怎么办训练结束先打开confusion_matrix.png。最理想是对角线深色其它位置接近0。可回收物数据集里最常出现的混淆是玻璃瓶和塑料瓶互相污染因为两者半透明且有高光。打开混淆矩阵后按行看如果玻璃瓶那一行的非对角线格子里塑料瓶占了30%先检查2.1说的光照归一化是否做足再看标注本身是否有错比如透明矿泉水瓶被标成玻璃瓶这种情况在图像采集时非常普遍人工复核一下最容易混淆的几百张图就能定位问题。5.2 用脚本输出各类mAP与召回率用Ultralytics的验证命令可以直接得到每类指标yolo detect val \ modelruns/recycle/weights/best.pt \ datarecyclable.yaml \ save_jsonTrue跑完打开runs/recycle/val/下的results重点看每类的precision、recall和mAP50-95。mAP50-95对框位置要求更严玻璃瓶这种边界清晰的目标容易高分塑料袋这类柔性目标低一些是正常的别为这个慌只要recall在0.7以上就算可用。pr_curve.png能进一步看每类的置信度-召回权衡曲线下面积小且曲线尾部陡降说明某个类要靠低置信度才能找回召回这时就该去补样本而不是调阈值。5.3 数据增强与难例挖掘把6000张用出1.5万张的效果如果验证集暴露塑料袋召回率偏低常规做法是给训练配置加增强项hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.5 degrees: 15 translate: 0.1 scale: 0.5 mosaic: 1.0这些参数在ultralytics里默认已经使用手动调整的意义在于塑料袋这类柔性目标对旋转和尺度变化敏感适度放大degrees和scale能让模型学到袋子揉成团也是袋子。难例挖掘方面改mosaic概率到1.0让训练样本里每张图都包含四张拼贴模型被迫在杂乱背景下找目标这对半透明塑料袋特别有效。要留意增强不是越大越好degrees超过30度会让瓶子的形状特征失真反而掉点。我见过有人把scale调到0.9瓶子大得只剩局部模型最后把瓶颈纹理当成了瓶类特征实际场景一测全是误检。6. 最后一章把模型接到图片文件夹或摄像头跑实时识别训练完best.pt之后最快的验证方式是对照一批真实未标注图片做推理from ultralytics import YOLO model YOLO(runs/recycle/weights/best.pt) results model.predict(live_samples, conf0.4, imgsz640, saveTrue) for r in results: print(r.boxes.cls, r.boxes.conf)conf阈值我习惯在0.3-0.5之间按场景调在回收箱这种静态且用户会配合的场景用0.5减少误检在传送带高速运行场景降回0.35优先保住召回。部署阶段如果只想跑CPU把推理图尺寸从640降到480帧率能提升近一倍代价是瓶子上的小商标特征可能丢失要现场实测权衡。这一版踩下来我对这份6000张数据集的判断是能作为垃圾分类检测的可靠baseline但不能指望它覆盖所有现场光照和姿态。每次换场景我都会先跑100张现场难例回放把置信度0.3-0.6的中间地带样本筛出来人工复核再决定要不要补充数据微调。数据集的边界清晰是好事现场场景不清晰才是常态。希望这些踩坑经验帮到你。本文还有配套的精品资源点击获取
返回列表