首页/新闻资讯/正文详情

Trash-ICRA19数据集实战:从标注到YOLOv8训练全流程

发布时间:2026/9/26 14:59:02 来源:云帆数科 栏目:资讯中心
Trash-ICRA19数据集实战:从标注到YOLOv8训练全流程
简介这套YOLO目标检测配套数据包取自Trash-ICRA19海洋垃圾检测数据集已经过统一整理形成可被现有训练框架直接读取的标注格式面向需要海洋漂浮物与水下废弃物检测样本的学生和研究人员也适合计算机、电子信息、数学等专业完成课程设计或毕业设计。压缩包内全部文件共2288个其中1144张JPG原始图像与1144个XML标签文件一一对应标签覆盖常见水下垃圾类型命名规范方便按帧序与目标类别进行筛选可直接划分训练集、验证集和测试集资源整体约26.21MB体积适中下载和存储压力较小。目前已有259人学习下载稳定可用。作者为资深算法工程师在资源基础上补充了参数化设计和注释清晰的代码编写思路可帮助使用者减少数据格式转换、目录整理等重复劳动更快完成YOLO模型训练、数据增强和检测效果调优也可作为海洋目标检测算法对比实验的基准数据。1. 为什么说Trash-ICRA19是海洋垃圾检测最省事的起点1144张图已标注的背后做目标检测最难熬的不是写网络结构而是数据。手里没有干净标注YOLO再强也白搭。Trash-ICRA19 Dataset这份海洋检测数据集一共1144张图像对应标注文件全给齐直接解压就能进YOLO流程正好踩中“YOLO目标检测已标注直接使用”这个刚需。它在ICRA 2019的TrashCan赛事里推出初衷是让机器人在水下识别垃圾和海底生物所以场景是浑浊水下的近景拍摄和一般街景COCO数据集完全两回事。适合谁想做水下机器人打捞、河道垃圾监测、海洋生态评估又不想从零标数据的人拿它当第一版验证集非常合适。2. 拆包后先做核对Trash-ICRA19的数据结构、类别分布与VOC标注格式2.1 解开rar之后先核对什么一级目录与两类标注文件的差异rar解压后先别急着写训练脚本花五分钟把目录结构看清楚。我解压后看到的事实是图像文件与标注文件分离存放这部分最关键。图像集中在JPEGImages类目录里编号命名标注文件则在Annotations目录中。第一类标注是VOC格式的XML文件文件名和图像一一对应每个XML里记录filename、size以及每个object的name和bndbox坐标。第二类标注是CRLF结尾的纯文本往往是label x y w h的字符串也就是某套工具导出时顺手生成的。这两类格式的差别决定了你后续改脚本的方向。VOC XML适合直接转成YOLO的txt因为框坐标是左上右下顶点的整数像素值纯文本那套则要看它是绝对坐标还是归一化坐标。注意我遇到过解压后文本标注行尾有\rPython读进来不strip会直接报ValueError。所以第一步不是改模型是把每个XML与图像名逐一比对确保没有缺失配对。常见做法是写个两行脚本做差集import os img_dir JPEGImages xml_dir Annotations imgs {f.split(.)[0] for f in os.listdir(img_dir)} xmls {f.split(.)[0] for f in os.listdir(xml_dir)} print(图像无标注:, list(imgs - xmls)[:10]) print(标注无图像:, list(xmls - imgs)[:10]) print(图像总数:, len(imgs), 标注总数:, len(xmls))这段逻辑很直接把两边的文件名主键各取一遍差集就是问题文件。若两边总数都等于1144基本说明压缩包内容完整。我一般还顺手打印扩展名分布因为曾见过同图双份标注一个XML一个txt的情况这种冗余在后续转换脚本里会导致重复写文件训练时同一张图吃了两次mAP虚高却不好查。参数上你只要把img_dir和xml_dir改成自己解压后的实际路径目录名未必就叫JPEGImages以实际为准。2.2 类别盘点与标注格式解析VOC XML如何映射成YOLO txt接下来做类别盘点。打开任意一个XML看objectnameTrash-ICRA19的类别体系有讲究它的原始任务分两类视角一类只标“要不要捡”class 0/1另一类做细化实例分割。但很多人拿到的是直接迁移过的检测版最常见类别字段是trash部分样本里有sea urchin海胆甚至R/G这类语义含糊的标签。下图是某样本XML的结构annotation folderJPEGImages/folder filename000120.jpg/filename size width640/width height480/height /size object nametrash/name bndbox xmin120/xmin ymin80/ymin xmax200/xmax ymax160/ymax /bndbox /object /annotation转换成YOLO格式的公式不复杂中心点x取(xminxmax)/2再除以图宽中心点y取(yminymax)/2再除以图高框宽(xmax-xmin)除图宽框高(ymax-ymin)除图高类别id从0起排。这里要提醒的是YOLO的类别编号只认txt里的整数第一列不是认XML里的name字符串。因此trash映射成0sea urchin映射成1其他杂类如果不想要就统一归到0或直接跳过。这一步的取舍直接影响后续mAP的语义别小看。还有个细节常被忽略size里的width/height与实际图像的宽高是不是一致。Trash-ICRA19采集自水下镜头部分图像被后期裁剪过但XML未同步更新宽高不一致会让归一化坐标整体漂移训练器看不到漂移只会奇怪loss降不下去。我建议转换前做一次全量校验读取图像自身尺寸与XML的size比对不一致的单独列出来手动改XML或重新生成。对1144张图来说这步也就几秒钟的事但能帮你省下后面三天排查时间。3. 把已标注XML转成YOLO txt并划好train/val两段可改即用的Python脚本3.1 把XML转成YOLO txt最小可用的Python脚本很多人一上来就找“一键转换工具”其实自己写脚本最稳因为Trash-ICRA19的XML结构和标准VOC略有出入GUI工具遇到字段缺失往往会静默跳过造成部分图像无标注却不报错。我一般用下面这个脚本来转换import os import xml.etree.ElementTree as ET from PIL import Image xml_dir Annotations img_dir JPEGImages out_dir labels os.makedirs(out_dir, exist_okTrue) # 类别映射按需把不需要的类滤掉 class_map {trash: 0, sea urchin: 1} for xml_name in os.listdir(xml_dir): if not xml_name.endswith(.xml): continue xml_path os.path.join(xml_dir, xml_name) tree ET.parse(xml_path) root tree.getroot() # 以图像实际尺寸为准避免XML里size被裁切后失真 img_name root.findtext(filename) img_path os.path.join(img_dir, img_name) with Image.open(img_path) as im: W, H im.size out_lines [] for obj in root.findall(object): name obj.findtext(name).strip() if name not in class_map: continue box obj.find(bndbox) xmin float(box.findtext(xmin)) ymin float(box.findtext(ymin)) xmax float(box.findtext(xmax)) ymax float(box.findtext(ymax)) # 容错滤掉坐标无效的框 if xmax xmin or ymax ymin: print(f跳过非法框: {xml_name}, {name}) continue x_center ((xmin xmax) / 2.0) / W y_center ((ymin ymax) / 2.0) / H w (xmax - xmin) / W h (ymax - ymin) / H out_lines.append(f{class_map[name]} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) txt_name xml_name.replace(.xml, .txt) with open(os.path.join(out_dir, txt_name), w) as f: f.write(\n.join(out_lines))逻辑说明读XML树走findtext取节点值图像尺寸特意用PIL读实际像素是为了防止XML里的size与真实图不一致导致框偏移。容错部分把xmax xmin这种坐标脏数据筛掉打印出来让你知道有哪些图被“部分忽略”。输出格式严格遵循class cx cy w h保留6位小数。参数说明两点class_map决定哪些类进训练如果你只想先跑通管道建议只留trash: 0其他类别全忽略这样第一版实验的类别单一、收敛看得更清楚out_dir尽量放在数据集根目录下新建的labels不要混进原始目录方便后用YOLO训练器直接读。转换完检查一下如果labels下txt数量与JPEGImages图像数不相等多半是某张图的XML解析抛异常中断了循环回头去查那一个文件即可。3.2 按8:1:1划分数据集并生成yaml路径与类别顺序是最大坑转换脚本跑完下一步是切分数据集和写YAML数据描述文件。很多新手在Ultralytics YOLOv8上翻车不是因为网络而是data.yaml里的path、train、val写成了相对路径却放在错误位置导致训练器一启动就报“dataset not found”。划分脚本很简单import os import random random.seed(42) labels sorted(os.listdir(labels)) imgs sorted(os.listdir(JPEGImages)) # 只保留有labels的图像防止空标注混入 valid [f for f in imgs if f.replace(.jpg, .txt) in labels] random.shuffle(valid) train_ratio 0.8 val_ratio 0.1 n len(valid) train valid[:int(n * train_ratio)] val valid[int(n * train_ratio):int(n * (train_ratio val_ratio))] test valid[int(n * (train_ratio val_ratio)):] for split, files in [(train, train), (val, val), (test, test)]: os.makedirs(fimages/{split}, exist_okTrue) os.makedirs(flabels/{split}, exist_okTrue) for img in files: os.rename(os.path.join(JPEGImages, img), os.path.join(fimages/{split}, img)) txt img.replace(.jpg, .txt) os.rename(os.path.join(labels, txt), os.path.join(flabels/{split}, txt)) print(len(train), len(val), len(test))逻辑说明random.seed(42)保证每次跑划分结果一致是让实验可复现的关键参数。先过滤掉“有图无标注”的样本再打乱。按比例切片后把图像和标签同步移动进images/train、images/val这种Ultralytics约定目录。如果你不想移动原文件也可以不移动、直接在data.yaml里写不同子目录的路径但移动更干净后续打包迁移都方便。划分完成后在数据集根目录新建data.yaml内容如下path: /absolute/path/to/your/dataset train: images/train val: images/val test: images/test nc: 1 names: [trash]参数说明path务必写绝对路径train和val是相对path的目录nc等于类别数names列表的索引必须和txt第一列的类别id严格对应。这里最大的坑是names顺序——如果你训练时让YOLO自动下载预训练模型它默认按COCO80类输出你自己的数据只有1类时训练前会重新初始化最后一层names不匹配看不见报错但mAP会莫名其妙低原因是预测时把trash当成了索引0而你的names第二项才是trash。4. 用YOLOv8把数据集跑起来Anaconda环境配置、训练命令与置信度门限调节4.1 先装对环境conda里YOLOv8依赖点版本组合环境配置是新手最容易卡住的环节刚接触YOLOv8的人经常受“cuda版本不匹配”“torch编译不过”折磨。先说Anaconda的常规做法我一般这样建环境conda create -n yolo python3.10 -y conda activate yolo pip install ultralytics按道理三步就完事但实际执行时有两个变量要确认。第一是PyTorch版本pip install ultralytics会拉最新torch如果硬件是旧显卡建议先装匹配的torch再装ultralytics避免cu121的包在黑机上跑不了。例如pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics第二是命令里的ultralytics版本较新版本对Python的最低要求是3.9极老环境装不上就直接conda create python3.10最省心。训练前检查GPU是否可用import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else CPU)这步输出的意义是让你知道自己到底在用什么跑。很多人CPU跑了一晚上还觉得模型垃圾看了才知道从没调用到GPU。我见过最惨的情况是torch能import但cuda不可用原因往往是装了CPU版torch卸掉重装GPU版即可。若机器确实没GPU训练不是不能跑但建议把imgsz降到320、epochs降到30先验管道通不通再考虑上服务器。4.2 训练启动命令与必须调的三组参数epochs、imgsz、置信度门限环境就绪后训练命令只要一行yolo detect train datadata.yaml modelyolov8s.pt epochs100 imgsz640 batch8 device0 projecttrash_icra19 nameexp1逐项说明参数data.yaml路径卡错是高频报错源头建议绝对路径modelyolov8s.pt选s是因为水下垃圾场景的目标不算极小s足够起步想更快就n想追精度就m或l但1144张图喂给l级大概率过拟合不推荐epochs100是最低建议Trash-ICRA19的图像风格接近但物体形态多样少于60轮很难收敛batch8按显存调8G显存配640分辨率这个值安全爆显存就降到4并同步降imgsz到512device0指定第一张GPU多卡环境要确认nvidia-smi的卡序号。这三组参数里最容易被忽视的是置信度门限conf。训练时它不管预测输出但验证和推理时它决定哪些框算检出。跑完用训练出的权重做验证yolo detect val modeltrash_icra19/exp1/weights/best.pt datadata.yaml conf0.25conf0.25意味着低于0.25置信度的预测全部丢弃对Trash-ICRA19这种背景杂、目标与水体颜色相近的数据集0.25可能偏严漏检率会高。常见做法是用conf0.1看完整预测分布再根据PR曲线抬到0.2~0.4之间找平衡点。没人能替你定值这个门限取决于你的下游是“捞垃圾要少漏”还是“接机械臂要少错”前者门限压低后者门限抬高你必须自己做一次推理实验来权衡。5. 用这批数据训练最常踩的4个坑从标注句柄到类别泄漏的排查记录5.1 现象标注全部偏移loss正常但预测框偏一边训练曲线很漂亮但验证时所有框都往左上偏了一段固定距离。原因几乎可以锁定归一化坐标使用的图宽高与实际图像尺寸不一致。Trash-ICRA19的XML里size保存的尺寸可能是原始帧的而JPEGImages里的图像被脚本裁剪缩放后标记没同步。解决拿PIL重新读一遍img.size作为分母重新生成txt替代XML里的size字段。我第三章里的脚本已经内置这个逻辑如果你用的是别人转好的txt必须自己抽查十几个文件的尺寸对应关系别迷信“已标注直接使用”这句话——直接使用意味着“作者说能用”不代表“尺寸全对齐”。5.2 现象txt里只有一行标注但结果变成空文件打开某些txt发现内容被清空或只剩回车空行。原因大多出在strip()环节XML里的name字段末尾带了换行或空格name.strip()后是空字符串class_map查不到key整个object被跳过如果该图恰好只有一个object输出就是空文件。另一种可能是读文件时用了默认编码遇到CRLF的标注文件把\r带进了数值解析。解决转换脚本里对所有字符串字段先strip再判断非空写txt时用\n连接且不追加read前的原内容用with open(path, w, newline\n)避免Windows下自动换行符干扰。训练前加一步检查脚本空文件直接删掉并在日志里标记图名方便定位是哪张图被跳过。5.3 现象mAP极低因为模型把类全预测成了同一类Trash-ICRA19官方原始版本其实分多个类别但很多流通的压缩包只剩一个标签字段“trash”或者把原始G/R标志保留。如果你在class_map里同时映射了trash、R、G但标注本身语义重叠模型学不到区分特征预测结果会偏爱某类mAP整体被拉低。解决先统计所有XML中的name出现次数把出现极少的类直接归并到主要类只保留1~2个语义上真正可分的类别如“垃圾”和“海胆”。我通常开局只用单类trash跑通再根据统计决定是否加第二类。类别数量不是越多越好小数据集加类等于给模型加负担。5.4 现象训练loss一路降低但val mAP波动大过拟合明显1144张图对YOLOv8s来说偏少尤其水下场景颜色分布集中模型很容易死记背景纹理。表现是train的loss降到1.0以下val的mAP在0.3到0.6之间疯狂抖动。原因就是样本多样性不足验证集对训练集的类内变化太敏感。解决除了imgsz降到512限制模型容量还可以启用Ultralytics的数据增强参数如hsv_h0.015调色相模拟水下偏色flipud0.5做上下翻转水下场景翻转语义不会变这点跟街景不一样mosaic0.5降低马赛克增强权重。再不够就加早停patience20让模型val不涨20轮自动停省时间也省显存。这里特别提醒上下翻转在水下场景是合法增强因为机器人视角没有“地面法线”约束加了能明显缓解过拟合。6. 让这批数据集发挥更大价值用热图定位漏检再迁移到ROV与水下场景模型训练完先别急着吹mAP我会先做一次全量验证集推理把预测框和真值框画在同一张图上输出带置信度的热图排查漏检位置。Ultralytics自带model.predict可以直接落图from ultralytics import YOLO model YOLO(trash_icra19/exp1/weights/best.pt) model.predict( sourceimages/val, conf0.15, saveTrue, save_txtTrue, projectpred_vis, nameconf015, )参数说明conf0.15是我在Trash-ICRA19上的经验起点比训练验证时低一档为的是先看全量输出再收紧save_txt会输出预测的txt可以直接与真值比对。这一步能帮你直观看到模型是在近景小物体上漏检多还是远景模糊目标上漏检多。对Trash-ICRA19这类场景我踩过的规律是漏检集中在绿色塑料袋和半透明渔网上颜色与水体太接近建议后续直接采集更多同色系负样本而不是盲目调网络结构。迁移到ROV或水下实拍场景时有一个习惯值得保留把Trash-ICRA19训练好的权重当预训练模型再在自己的几百张实拍数据上微调。这个做法比从头训收敛快得多但要注意把lr0降到0.001~0.003加热身轮数否则实拍数据会把预训练权重冲垮。微调后如果浮游生物被误检成垃圾多半是类别不平衡把生物类单独开一类再多补充样本就行。这套流程走下来你对“已标注数据直接使用”的理解会比只看压缩包外形深刻得多——标注格式是死的训练管道是活的。每次拿到新数据集我都先跑转换、统计、基线这三板斧比先改模型结构有效得多。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

中通顶象验证码逆向全解析:从抓包到风控加固
中通顶象验证码逆向全解析:从抓包到风控加固

这两年做Web安全与反爬对抗,我绕不开一个东西——验证码。尤其是中通快递这类体量巨大的业务系统,页面上的顶象验证码几乎成了所有自动化脚本的第一道拦路虎。很多朋友在群里问“中通顶象验证码逆向怎么搞”,我今天不打算给一个所谓的“秒过方… · 2026/9/26 14:58:43

Atlas 300V部署YOLO实战:从驱动到调优的完整指南
Atlas 300V部署YOLO实战:从驱动到调优的完整指南

有人问“Atlas 300V 24G到底是不是一张正常的运算加速卡”,这问题我一年前也问过自己。后来在昇腾环境上把YOLOv5、YOLOv8的推理部署完整跑通,才意识到大多数人对它的误解都来自用GPU的思维惯性。这篇文章就把Atlas上部署YOLO的完整流程、参数设置、调优… · 2026/9/26 14:58:43

Kimi 智能助手核心能力全景拆解:从配置到效果验证的 TaoToken 实践
Kimi 智能助手核心能力全景拆解:从配置到效果验证的 TaoToken 实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 14:58:25

java.lang.IllegalArgumentException: the bind value at index 1 is null 排查实录:用 TaoToken 统一 Key 打通 AI 辅
java.lang.IllegalArgumentException: the bind value at index 1 is null 排查实录:用 TaoToken 统一 Key 打通 AI 辅

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 15:37:04

Agent Harness 版本发布与回滚策略:用 TaoToken 统一 Key 打通配置骨架
Agent Harness 版本发布与回滚策略:用 TaoToken 统一 Key 打通配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 15:37:04

OpenAI 把 Codex 接进 Claude Code:TaoToken 统一 Key 的工程化配置骨架
OpenAI 把 Codex 接进 Claude Code:TaoToken 统一 Key 的工程化配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 15:37:04

SWE-agent 智能体接口机制解析:TaoToken 统一 Key 接入与 config.toml 配置骨架
SWE-agent 智能体接口机制解析:TaoToken 统一 Key 接入与 config.toml 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 15:37:04

【DeerFlow 2.0】代码详解(三):SubAgent 并发执行引擎的配置骨架与验证路径
【DeerFlow 2.0】代码详解(三):SubAgent 并发执行引擎的配置骨架与验证路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 15:36:58

QQ智能服务架构:AstrBot+NapCat+DeepSeekAI本地化部署指南
QQ智能服务架构:AstrBot+NapCat+DeepSeekAI本地化部署指南

1. 这不是“挂机脚本”,而是一套可落地的QQ智能服务架构最近两周,我连续收到17条私信,问的都是同一个问题:“能不能用AstrBot搭个能自动回消息、查天气、读文档的QQ机器人?”——不是那种点几下就完事的玩具&#xff0… · 2026/9/26 15:36:58

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码