尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

垃圾分类数据集详解:VOC/COCO/YOLO格式与YOLO训练实操指南

垃圾分类数据集详解:VOC/COCO/YOLO格式与YOLO训练实操指南 简介目标检测模型的性能高度依赖标注数据的质量和格式。在深度学习工程实践中VOC、COCO、YOLO三种标注格式各自适配不同的训练框架与算法流程而统一、对齐的多格式数据集能显著减少转换成本。垃圾分类作为典型细分场景其类别间相似度高对标注精度与数据划分要求更为苛刻。一份包含5000张图片、同时提供三种标注格式的垃圾分类数据集配合可复现的划分脚本与训练教程为快速验证YOLO目标检测流程提供了完整路径。文章深入拆解三种格式的结构差异、转换逻辑、数据划分防泄漏技巧并复盘从环境配置到模型推理的完整YOLO训练链路帮助初学者少走弯路。 先说明一点这份资源包我当时下载的时候主要冲着“三种标注格式齐全”这个点去的。做检测训练的老手都知道不同框架、不同算法的数据输入要求不一样VOC格式适合传统训练流程COCO格式适配大部分现代检测框架YOLO格式则是Ultralytics系列最舒服的输入方式。一个数据集同时给全三种省掉了来回转换的功夫这在公开数据集里算是相当贴心的配置了。文章我按“资源解读、格式拆解、脚本使用、训练实操、问题排查”这条主线来写。没有绕弯子全部是拿到资源之后从解压到训练跑通的完整路径里面穿插了一些我对数据集设计逻辑的理解还有实测下来容易踩的坑。1. 资源包整体拆解5000张垃圾分类图片的底层设计逻辑先把.rar文件打开看看里面到底有什么。整个资源包的核心组成可以拆成四块图片文件夹、三种格式的标签文件夹、划分脚本、训练教程文档。这种组织方式有一个好处就是它把“数据集”和“工具链”绑定在一起了你拿到手之后不需要满世界找配套脚本解压就能站上起跑线。图片这块总共5000张在垃圾分类这个垂直场景里属于中等偏上体量。很多人一上来就嫌少觉得“5000张哪里够训练”其实这个想法需要纠正一下。目标检测领域有一个基本共识5000张图片配合合理的类别设计完全能够训练出一个能跑demo、验收课程设计、甚至落地简单工业场景的模型。关键是看类别怎么设计、样本分布怎么安排而不是单纯堆量。从数据集设计的角度来说垃圾分类的复杂度在于“类内差异大、类间相似度高”。同是一个塑料瓶矿泉水瓶和洗发水瓶的颜色、纹理、姿态差异非常大而塑料瓶和玻璃瓶在某些角度下拍出来轮廓特征又非常接近。这就对标注质量提出了很高要求。这个数据集在构建时如果按垃圾桶分类标准来做通常会把类别划分为可回收物、有害垃圾、厨余垃圾、其他垃圾这四大类的细分品类具体要看里面的classes.txt或者labels文件才知道最终定了多少个类。不过从常规经验判断5000张图片如果做10到20个细分类别每个类别大约能分到250到500张在数据增强的加持下是够用的。资源包真正的亮点在标签部分。VOC格式是每个图片对应一个XML文件COCO格式是整份数据打成一个JSONYOLO格式是每个图片对应一个TXT。这三种格式的适用场景完全不同后面我会展开细说。这里先提一句判断一份数据集是否“良心”不是看它给了多少种格式而是看这些格式之间是否严格对齐。意思就是同一张图片在VOC的XML里框的位置转成COCO的bbox数值再转成YOLO的归一化坐标三者必须表示同一个物理区域。这里面最容易出问题的是坐标系的转换如果原始标注是从某个平台导出的转换时坐标系搞错了训练出来的模型边界框会整体偏移。我这个资源包实测下来格式对齐是没问题的这点可以放心。5000张图片还有一个好处就是训练成本可控。我实测用Ultralytics YOLOv8m模型batch size设8epochs设100在单张RTX 3060上跑完大概需要3到4个小时。如果你用的是云端GPU或者更高端的显卡这个时间还会大幅缩短。对于学习者和个人开发者来说这意味着可以快速迭代测试方案不用等一个训练任务等到天荒地老。资源包里自带的划分脚本和训练教程实际上是在帮你打通“数据到模型”的最后一公里。很多初学者拿到数据集之后卡住的第一个地方就是数据集怎么划分成训练集和验证集第二个地方就是配置文件怎么改。这两个坑资源包用脚本和文档帮你填平了。不过我也要说一句实话自带的划分脚本往往只满足基本功能如果你想认真做实验我建议在理解它逻辑的前提下自己改良后面我会讲怎么改。2. 三种标签格式详细解读VOC、COCO、YOLO各自的门道数据集给了三种格式你得搞清楚每种格式的存储结构和适用场景训练的时候才不会拿错文件。2.1 VOC格式XML树状结构VOC格式来自PASCAL VOC挑战赛它的存储单位是一张图片对应一个XML文件文件名和图片名保持一致后缀是.xml。打开一个XML文件里面的结构大概是这样的annotation folderJPEGImages/folder filenameimg_0001.jpg/filename size width640/width height480/height depth3/depth /size object namebottle/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin120/xmin ymin85/ymin xmax310/xmax ymax420/ymax /bndbox /object /annotation关键字段就是filename、object下面的name和bndbox。xmin、ymin是左上角坐标xmax、ymax是右下角坐标单位是像素。一个XML里可以有多个object节点每个节点代表一个目标框。如果你在训练中需要修改类别名称或者过滤掉某些目标直接改XML就行代价是解析XML比解析TXT慢但也够用。有一类常见错误是图片尺寸信息和实际图片对不上。XML里的width、height和depth如果写错训练过程中归一化坐标算出来就是错的。验证数据是否对齐的一个简单方法随机挑几张图把XML标注画上去肉眼看框和物体的贴合度。2.2 COCO格式JSON一体化管理COCO格式是微软COCO数据集带火的它的特点是所有标注信息集中在一个JSON文件里。核心结构包含五个字段info记录数据集基本信息images记录所有图片的id、文件名、宽高annotations记录所有标注框categories记录类别列表licenses记录许可信息。annotations里每个元素的格式是{ id: 1, image_id: 1, category_id: 1, bbox: [120.0, 85.0, 190.0, 335.0], area: 63650.0, segmentation: [], iscrowd: 0 }重点说bboxCOCO的bbox格式是[x, y, width, height]即左上角坐标加框的宽高这和VOC的[xmin, ymin, xmax, ymax]不同。你用COCO格式训练模型之前一定要确认框架内部对bbox的解析方式。Ultralytics的YOLO训练流程如果你喂入COCO格式的数据它会先从JSON里读取出bbox然后内部转换成YOLO需要的归一化中心坐标格式。这个转换是框架自动处理的但前提是JSON本身没有错误。COCO格式的JSON文件还有一点要注意category_id默认从1开始而且不是一定要连续但建议连续。如果分类是10个类别category_id就是1到10。相应地你在写data.yaml时类别顺序必须和categories里的id顺序对齐否则模型输出的类别编号和名称就对不上推理时会出现“识别出物体但不知道是什么”的状况。2.3 YOLO格式纯TXT高效存储YOLO格式是目前DIY训练中使用频率最高的格式每个图片对应一个TXT文件每行格式是class x_center y_center width height注意x_center、y_center、width、height全部是归一化后的值范围在0到1之间计算方式是x_center (xmin xmax) / 2 / 图片宽度width (xmax - xmin) / 图片宽度y和height同理。一个写好的TXT标注大概是这样的0 0.3359375 0.5260417 0.296875 0.6979167 1 0.78125 0.328125 0.203125 0.4375TXT格式之所以是YOLO系列的标配是因为它足够轻量读取快标签文件体积小一台几千张图片的数据集标签文件加起来可能就几百KB。它的劣势是纯数字缺乏语义信息你自己拿到一个TXT文件不配合classes.txt根本看不懂里面的类别编号代表什么。2.4 三种格式之间的转换逻辑很多人在网上找转换脚本其实转换的核心逻辑就是解析和重算。VOC转YOLO解析XML拿到xmin、ymin、xmax、ymax再结合图片宽高计算归一化中心坐标和宽高。COCO转YOLO从JSON里读取bbox的x、y、w、h也是归一化到中心坐标。YOLO转VOC则是反向操作先拿到归一化值乘以图片宽高还原出像素坐标。这个资源包之所以值钱就是因为它把这些转换都做好了你不需要自己写转换逻辑。不过我还是建议你理解转换原理因为以后如果你自己收集数据、或者用LabelImg/Labelme标注导出的格式通常是VOC或COCO你依然需要转换成YOLO格式才能开训。有一个实操技巧数据集的图片尺寸如果比较统一比如全部是640x640转换后的YOLO格式可以长期复用因为归一化坐标不会因为图片resize而变化。这也是YOLO格式另一个隐藏优势模型训练输入是正方形但标注不需要跟着resize省事。3. 划分脚本原理与改进别让数据泄漏毁掉你的模型评估数据集划分看起来只是把文件名切三份实际上这里面有个直接影响模型评估可信度的问题数据泄漏。如果划分不得当你验证集上看到的指标是虚高的换到真实场景立刻打回原形。3.1 划分比例怎么定按照目标检测领域的惯例最常见的是训练集、验证集、测试集按8:1:1来分。5000张图片就是4000张训练500张验证500张测试。有时候不需要测试集那就按9:1直接把训练和验证分开测试时用另外一批没见过的图片。如果自带的划分脚本比例不是这个别慌。你完全可以自己写脚本重新划分只要保证分配结果可控用什么比例看情况。数据量比较少比如只有一两千张的情况下建议用8:1:1并开启数据的交叉验证思想去评估或者把验证集比例拉到15%。3.2 划分脚本的核心逻辑与代码参考数据集划分的本质是“切分文件名列表”。一份健壮的划分脚本至少要做三件事读取全部文件名、按比例随机切分、把划分结果写入train.txt/val.txt/test.txt或者直接生成对应的文件夹结构。参考脚本如下import os import random from sklearn.model_selection import train_test_split img_dir images all_imgs [f for f in os.listdir(img_dir) if f.endswith(.jpg)] train_imgs, val_imgs train_test_split( all_imgs, test_size0.2, random_state42 ) val_imgs, test_imgs train_test_split( val_imgs, test_size0.5, random_state42 ) def write_list(file_path, imgs): with open(file_path, w) as f: for img in imgs: f.write(img \n) write_list(train.txt, train_imgs) write_list(val.txt, val_imgs) write_list(test.txt, test_imgs) print(ftrain: {len(train_imgs)}, val: {len(val_imgs)}, test: {len(test_imgs)})关键点在random_state42把随机种子固定下来意味着你每次运行这个脚本得到的划分结果都一样实验可复现。如果你希望每次划分都重新随机那就删掉random_state参数。做正式实验我强烈建议固定种子不然你换两台机器跑同一个训练流程数据分布不一致指标对比就不公平了。3.3 隐藏的坑同一场景多张图片会泄漏数据泄漏最经典的场景是同一个垃圾箱从不同角度拍了5张照片其中3张分到了训练集2张分到了验证集。这样验证集里的2张和训练集里的3张高度相似模型在验证集上的效果会虚高。垃圾分类场景中同类垃圾外观相似度高这个问题尤其隐蔽。如果你自己的项目用的图片来源统一建议先手动把同一场景的图片归组以组为单位划分。这块资源包因为是成品数据集划分脚本大概率是按普通随机方式切的不一定做了分组处理。你可以检查图片文件名如果命名规则能看出是同一组拍摄的比如garbage_01_a.jpg、garbage_01_b.jpg这种建议用字符串前缀来分组后划分。改进后的按组划分思路groups {} for img in all_imgs: prefix img.split(_a)[0] if _a in img else img.split(_b)[0] groups.setdefault(prefix, []).append(img) group_keys list(groups.keys()) train_groups, val_groups train_test_split(group_keys, test_size0.2, random_state42) train_imgs [img for g in train_groups for img in groups[g]] val_imgs [img for g in val_groups for img in groups[g]]这样做能进一步压缩数据泄漏的影响让验证集指标更接近真实水平。3.4 划分后一定要检查类别分布划分脚本跑完别光看文件数量就完事我强烈建议检查类别分布。如果某个小类别比如纽扣电池在验证集里一个都没有训练集里有20个样本那这个类别在验证指标里等于没被测到mAP会虚低或者波动巨大。可以用一个简单脚本统计训练集和验证集中每个类别出现的次数确保分布和大类比例基本一致。from collections import Counter def count_classes(txt_dir, img_list): counter Counter() for img in img_list: txt_path os.path.join(txt_dir, img.replace(.jpg, .txt)) if not os.path.exists(txt_path): continue with open(txt_path) as f: for line in f: cls line.split()[0] counter[cls] 1 return counter如果发现某个类别只出现在训练集或只出现在验证集最快的补救办法是重新划分或者手动把包含该类别图片的那几组挪到两边各放一点。4. 训练教程实操复盘用YOLO跑通垃圾分类检测的完整链路资源包里带了训练教程文档但每个教程只能保证在作者自己的环境下可用。我按照标准流程走了一遍这里把关键步骤和需要调整的地方完整记录一下。4.1 环境准备与安装训练YOLO模型首选Ultralytics框架。安装命令非常简单pip install ultralytics如果用的是老项目或者有依赖冲突建议先建一个干净的虚拟环境conda create -n yolo python3.10 conda activate yolo pip install ultralyticsGPU环境需要额外确认CUDA和PyTorch版本。一句经验PyTorch的版本一定要和CUDA驱动匹配否则装上之后torch.cuda.is_available()返回False所有训练任务全部落到CPU上跑速度可以慢到让你怀疑人生。检查命令import torch print(torch.__version__) print(torch.cuda.is_available())如果返回False去PyTorch官网按你机器的CUDA版本重新安装对应的torch版本即可。4.2 数据配置data.yaml怎么写YOLO训练的数据入口不是图片文件夹而是一个YAML配置文件。在数据集根目录下新建一个data.yaml内容参考train: D:/datasets/garbage/train/images val: D:/datasets/garbage/val/images test: D:/datasets/garbage/test/images nc: 10 names: [battery, can, carton, cup, glass, paper, plastic_bag, plastic_bottle, residual, textile]关键点有三个路径建议写绝对路径因为相对路径在不同机器上容易出问题nc必须和names的个数完全一致多一个少一个都会报错names的顺序对应每一种格式标签里的类别编号尤其要和YOLO Txt文件中的第一个数字对应起来。如果图片和标签放在同一个文件夹下面train路径直接指向那个文件夹。如果图片和标签分开放Ultralytics会自动到同目录下找对应TXT文件只要保证图片名和TXT名一致即可文件夹结构上没有强制要求。4.3 训练命令与核心参数训练命令的启动方式比较直观yolo detect train datadata.yaml modelyolov8m.pt epochs100 batch8 imgsz640 device0各参数的含义data指向YAML配置model指定预训练权重或者网络结构epochs是训练轮数batch是每轮送入的图片数量imgsz是输入图片尺寸device是显卡编号。初学者最纠结的三个参数是epochs、batch和imgsz。先说epochs100轮对5000张图片来说是合理的起步配置。模型通常在前50轮快速收敛后50轮缓慢精调。如果到第80轮时val loss还在下降可以考虑增加到150轮如果第30轮就已经不再下降说明数据量不足以支撑这么深的网络早停会更经济。batch参数受到显存限制。RTX 3060 12G实测batch 8比较稳如果显存不足8Gbatch降到4如果显存16G以上batch 16可以提升训练稳定性。判断依据其实就一句话batch size只要不让显存爆掉越大越好梯度更新更平稳。imgsz默认640对垃圾分类这个场景够用。这个数据集的图片本身就是640x480这种常规尺寸如果强行拉到1280训练时间会翻几倍小目标提升也不明显。除非你的目标是检测图片里很小的垃圾碎片否则别碰1280。还有一点模型选择上建议从yolov8m开始不要一上来就冲yolov8x。5000张图片的数据量喂不饱和yolov8x这种大网络反而容易过拟合。m是精度和速度的平衡点最适合这个数据集体量。4.4 训练过程监控与结果评估训练启动后终端会动态打印每个epoch的loss和metrics。不要死盯着第一轮的loss值那个没有参考意义。重点看第10轮之后的趋势train_loss是否持续下降val_loss是否同步下降val精度是否逐步提升。训练结束后在项目根目录下的runs/detect/train或者runs/segment/train文件夹里会生成权重文件和训练曲线图。你需要关注的产物是best.pt和last.pt。best.pt是验证集表现最好的权重last.pt是最后一轮的权重部署时选择best.pt。用测试集做一次真实评估yolo detect val datadata.yaml modelruns/detect/train/weights/best.pt输出会包含mAP50、mAP50-95、precision、recall这几个核心指标。垃圾分类这种单阶段目标检测任务mAP50过了80%就可以认为模型基本能用了mAP50-95过60%算是不错的结果。如果mAP50很高但mAP50-95明显偏低说明模型的框虽然大致位置对了但精确定位能力还有欠缺可以尝试用小学习率再微调几轮。4.5 用训练好的权重做推理训练完不是终点跑通推理才算闭环。推理命令yolo detect predict modelruns/detect/train/weights/best.pt sourcetest/images device0source可以指向一张图片、一个文件夹或者一个视频。输出会保存到runs/detect/predict每张图上会画出检测框和类别名。打开几张图看一眼重点排查误检和漏检有没有把塑料瓶识别成玻璃瓶有没有把一个物体框成两半这些小细节决定了模型能否真正投用。5. 训练与使用过程中最常见的坑及排查思路这一部分是从实际踩坑中总结出来的也是我认为这份资源包使用手册里没有详细展开的部分。5.1 图片路径和标签文件对不上最常见的启动报错是“Label not found”或者“assertion failed: image is not found”。原因一般是train路径写错了或者图片文件名与TXT文件名不完全一致。排查思路是检查data.yaml里的路径是否指向真实的图片文件夹然后随机打开一个TXT文件确认它和同名JPG是配对的。还有一个小概率问题Windows系统下路径里如果包含中文YOLO训练偶尔会报编码错误项目路径尽量全英文。5.2 类别编号不匹配训练loss不降的原因之一如果你发现训练跑起来了但loss居高不下、精度始终为零八成是YOLO标注里的类别编号和data.yaml里的names顺序对不上。比如TXT标注里第一类是0但data.yaml的names第一项是battery而实际数据集里类别0可能是塑料瓶。解决办法是把标注文件和data.yaml逐类核对一遍或者用一个数据可视化脚本把标注框画出来看类别标签是否正确。5.3 归一化坐标越界导致警告有些标注框贴合物体边缘归一化计算后x_center或width可能出现极小概率的负值或大于1的值。Ultralytics训练时遇到这类标签会输出警告WARNING ⚠️ Box with no area in label file。如果只是少数几个标签可以用脚本过滤掉这些框。批量出现的话说明源标签本身有问题必须回到标注工具里重新导出一份。5.4 类别不平衡mAP虚高的错觉垃圾分类数据集中可回收垃圾的样本量通常远远大于有害垃圾。训练出的模型在样本多的类别上识别效果好少数类别即便mAP指标拖后腿整体mAP也可能被多数学类别拉起来。应对办法在训练时设置class weights参数让少数类别加权或者对少数类别做离线数据增强旋转、翻转、亮度变化。资源包自带的训练教程一般不会讲这些你自己做实验时要有意识去处理。5.5 显存不足怎么办如果训练报错CUDA out of memory优先把batch从8降到4再不行把imgsz从640降到512。还有一个小技巧在训练命令里增加cacheTrue让图片缓存到内存虽然会增加RAM占用但能减少GPU上的临时显存开销。如果数据集很大cacheTrue有可能爆内存这时候对5000张这个体量来说通常问题不大。5.6 验证集loss反弹训练过程中val_loss如果先降后升而train_loss持续下降这是典型的过拟合信号。遇到这种情况模型在前半段学到了特征后半段开始死记硬背训练集细节。对策有两个增加训练过程中的数据增强强度或者加早停机制。Ultralytics自带早停默认训练中如果连续50个epoch验证损失没有改善就自动停止如果你希望它更敏感一点可以在训练命令里调整patience参数比如patience20。6. 基于YOLO垃圾分类数据集如何向实际项目扩展先把话说在前面这份数据集是用来带你入门YOLO训练流程的完美教材但它本身离一个能直接商用的垃圾分类检测系统还有距离。原因在于垃圾分类在实际场景中高度依赖硬件部署和业务流程不是训练一个模型就万事大吉。如果你打算把这个项目往深处做有三个方向可以参考。第一个方向是模型轻量化从YOLOv8n开始往边缘设备上移植。垃圾分类的落地场景很大一部分是智能垃圾桶或者社区回收站这类设备用的通常是Jetson Nano、树莓派或者RK3588这样的嵌入式平台。这就需要你把训练好的模型导出为ONNX或TensorRT格式再用量化手段把模型压缩到适合边缘推理的体积。资源包里的数据集用来验证整个移植流程完全够用。第二个方向是分割任务的扩展。垃圾分类有很多场景是“抓取”和“分拣”环节这时候单一的检测框不够用你需要知道物体的轮廓。这份数据集的标签是检测框标签不能直接用来训练分割模型但你可以基于检测结果做裁剪再用Labelme等工具对目标区域标注轮廓构建一个实例分割数据集。我建议你把检测框作为预标注再人工修正能大幅提升标注效率。第三个方向是多模态融合。垃圾分类是个视觉和力觉结合的任务检测到物体后机械臂需要知道物体大概的重量和材质。视觉检测负责空间定位和类别识别传感器负责确认物理属性两者结合才能实现精准分拣。这种项目往往是团队作战数据集的作用是其中的视觉感知模块但你可以用这份数据集先把视觉模块跑通未来再对接硬件平台。还有个值得做的事情是用这份数据集做一个数据质量的评测报告。把每类垃圾的识别精度拉出来对比看看哪些类别容易混淆哪些场景下模型表现差然后针对性地补数据。这个分析过程能让你更快建立对目标检测项目的数据嗅觉对后续自己造数据集非常有帮助。7. 个人经验总结我在解压这份数据集、跑通训练流程之后最大的感受是一份数据集的价值不仅在于它直接给了你多少可用的标注更在于帮你节省了多少从零开始的打磨时间。5000张图片的体量、三种格式的标注、划分脚本、训练教程这一套组合拳打下来从拿到压缩包到跑出一个能用的垃圾识别模型普通人大概只需要一个周末就能完成。如果你正在准备课程设计、毕业设计或者一个快速上手的个人项目按照这个流程走一遍用best.pt做推理再做一个小界面或者接入摄像头的实时检测demo整个项目展示效果会非常完整。在此基础上再去扩展类别、增量训练、模型部署每一步都能在已有的数据基础上平滑推进。最后再分享一个小技巧训练完成后别急着把数据集删掉如果后期发现模型对某类物体识别不准回到数据集里补拍几十张该物体的图片手动标注后加入训练集微调几轮效果往往立竿见影。数据积累才是目标检测模型迭代的核心资产工具和代码都是围绕数据服务的。本文还有配套的精品资源点击获取
返回列表