新闻详情

新闻详情

首页 / 资讯中心 / 详情

YOLO目标检测实战:Trash-ICRA19数据集转换与训练指南

发布时间:2026/9/26 23:54:18来源:尧图网络
YOLO目标检测实战:Trash-ICRA19数据集转换与训练指南
简介面向YOLO目标检测与海洋垃圾识别任务Trash-ICRA19 Dataset提供了1144张真实海洋场景图像及一一对应的XML标注文件标注框完整适合计算机视觉学习者、高校学生以及目标检测研究者直接用于模型训练、评估或用于课程设计、期末大作业和毕业设计实验。整个RAR压缩包共2288个文件其中1144个JPG图像和1144个XML标注文件各占一半压缩后仅26.21MB轻量易保存。目前已有259人学习/下载说明该数据在目标检测项目中具有一定参考价值。由于标注信息完整可直接对接YOLOv5、YOLOv8等主流框架使用者可集中精力于模型调优与效果改进文件命名规范便于批量处理与数据集划分小巧体积也适合本地快速迭代尤其能为需要真实数据集支撑的本科毕业设计、期末大作业提供便利。1. YOLO目标检测遇上Trash-ICRA191144张海洋垃圾标注图直接能用做水下目标检测的人大概都经历过同一个噩梦在昏暗的深水视频里一帧一帧画框。画到第800张的时候眼睛看什么都是带边框的。如果你正在做毕业设计或者课程设计主题恰好是YOLO目标检测、海洋垃圾识别那手头这份Trash-ICRA19 Dataset标注包就是来救命的——1144张图像全部来自真实水下视频拆帧每一张都带对应的XML标注文件类别、坐标、图像尺寸都写好了解压就能用来训练YOLOv5/YOLOv8。它不是那种网上流传的残缺版本而是整理过、可以直接进训练流程的完整标注集。适合三类人赶毕设节点、需要真实数据支撑论文的本科生打算用海洋目标检测练手的算法入门者以及想快速验证YOLO训练管线是否跑通、不想在标注环节浪费时间的研究生。2. 数据和标注格式先把Trash-ICRA19的底细摸清2.1 文件名里的三个前缀obj、bio与帧号这份数据集的图像命名是有讲究的不是随便拍的编号。打开压缩包后你会看到类似obj0871_frame0000120.jpg、bio0003_frame0000185.jpg这样的文件前缀obj和bio分别对应不同的内容来源obj段通常是从水下机器人拍摄对象视频里截取的帧bio段偏向生物背景区域。中间的数字是视频段编号frame后面的数字是具体帧号。文件名不负责标注类别类别在对应的XML里。但建议你在解压后用一句话统计一下图像总数确认不是缺帧或者混入了重复文件。我一般会先跑一个最基本的调研命令cd Trash-ICRA19 ls *.jpg | wc -l ls *.xml | wc -l这里ls *.jpg列出所有图像wc -l统计行数两个数字应该一致都是1144。如果图像数量和标注文件数量对不上后面训练时会出现「找不到标签」或者「图像没有标注」的运行时错误。另外建议把jpg和xml的文件名批量比对一遍for f in *.jpg; do xml${f%.jpg}.xml [ -f $xml ] || echo missing xml: $f done这个循环遍历每张 jpg把后缀换成 .xml 后检查是否存在缺哪个立刻打印出来。排查数据完整性这一步花不了两分钟却能把后面训练阶段的坑提前填掉一大半。2.2 打开一个XMLVOC风格标注的关键字段这份资源的标注文件是VOC格式的XML和Pascal VOC、ImageNet检测任务用的结构完全一致。随便打开一个XML核心字段就这些annotation folderTrashICRA19/folder filenameobj0871_frame0000120.jpg/filename size width1920/width height1080/height depth3/depth /size object nameplastic/name bndbox xmin412/xmin ymin308/ymin xmax638/xmax ymax461/ymax /bndbox /object /annotation稍微解释一下filename字段和实际图像文件名必须完全一致很多转格式报错就是因为两张图像的filename写反了size记录原始图像的宽高和通道数转YOLO格式时需要靠它做坐标归一化object可以出现多个表示图像里有多个目标每个name是类别字符串bndbox是左上角和右下角的像素坐标。调研的时候建议把整个数据集里出现的所有name值去重打印一遍确认类别总数。Trash-ICRA19 这个数据集的常见类别包含生物、织物、渔网、塑料、绳索等。类别名是字符串还没转数字ID所以在转YOLO格式时要自己维护一张「字符串 → 数字ID」的映射表。2.3 三分钟看清数据分布类别统计与图像尺寸在动手转格式前先花一分钟统计类别分布和图像尺寸这一步能直接决定你是否需要在训练时开启letterbox或者调整输入分辨率。边做边想如果这1144张图里大部分都是1920x1080的大图而少数是低分辨率帧训练时统一缩放到640x640会让小图被严重拉伸。import xml.etree.ElementTree as ET import glob from collections import Counter xml_files glob.glob(*.xml) class_counter Counter() size_counter Counter() for xml_file in xml_files: tree ET.parse(xml_file) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) size_counter[(w, h)] 1 for obj in root.iter(object): name obj.find(name).text class_counter[name] 1 print(类别统计:, class_counter) print(尺寸统计:, size_counter.most_common(10))这段代码用xml.etree.ElementTree解析XMLglob.glob拿到所有XML文件Counter做累加统计。输出的类别分布能让你判断类别是否均衡——如果plastic占了800个而bio只有90个训练时就要考虑对少数类别加权或者用focal loss。尺寸统计则告诉你是否需要统一分辨率预处理。3. 把XML转成YOLO训练格式转换脚本与四个边界坑3.1 为什么必须转XML是人看的txt是YOLO吃的VOC格式的XML虽然信息完整但YOLO系列训练时并不直接读取XML。Ultralytics YOLO、Darknet YOLO 期望的标注是一行一个目标的txt文件每行五个数字类别ID center_x center_y width height其中坐标全部归一化到0到1之间。你拿到的资源只提供XML所以训练前的第一道工序就是格式转换。转换关系并不复杂但一对一的坐标换算只是表面工作真正的坑集中在类别映射、越界裁剪、空文件处理和文件名对齐上。先说结论XML转txt不是简单的字符串替换而是一个需要校验的过程。VOC的bndbox记录的是绝对像素坐标YOLO需要的是相对于图像宽高的比例同时XML里允许出现目标完全在图像外的脏数据YOLO不吃那一套。3.2 转换脚本逐行拆解下面这个脚本是我处理类似数据集时最常用的一版参数全部集中在文件头部直接按你的数据集实际情况修改即可。资源本身也强调「参数化编程、注释明细」下面的写法延续同样的风格import os import xml.etree.ElementTree as ET from glob import glob # 参数区根据实际数据集修改 IMG_DIR images # 图像存放目录 XML_DIR annotations # XML存放目录 OUT_DIR labels # 输出的YOLO txt目录 CLASS_NAMES [bio, fabirc, fishnet, plastic, root, rope] # ↑ 这里必须和最终训练时 data.yaml 里的 names 顺序一致 os.makedirs(OUT_DIR, exist_okTrue) # 转换函数 def convert(xml_path, out_path): tree ET.parse(xml_path) root tree.getroot() w int(root.find(size/width).text) h int(root.find(size/height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in CLASS_NAMES: print(f跳过未知类别: {name} in {xml_path}) continue cls_id CLASS_NAMES.index(name) bndbox obj.find(bndbox) xmin float(bndbox.find(xmin).text) ymin float(bndbox.find(ymin).text) xmax float(bndbox.find(xmax).text) ymax float(bndbox.find(ymax).text) # 边界裁剪把完全越界或部分越界的框拉回图像内 xmin max(0, min(xmin, w - 1)) xmax max(0, min(xmax, w - 1)) ymin max(0, min(ymin, h - 1)) ymax max(0, min(ymax, h - 1)) if xmax xmin or ymax ymin: print(f跳过无效框: {xmin},{ymin},{xmax},{ymax} in {xml_path}) continue # 归一化到0~1 cx (xmin xmax) / 2.0 / w cy (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) if len(lines) 0: # 该图没有有效目标写一个空文件训练时YOLO会自动跳过 open(out_path, w).close() return False with open(out_path, w) as f: f.write(\n.join(lines)) return True # 主流程 xml_list glob(os.path.join(XML_DIR, *.xml)) ok 0 for xml_path in xml_list: base os.path.splitext(os.path.basename(xml_path))[0] convert(xml_path, os.path.join(OUT_DIR, base .txt)) ok 1 print(f转换完成: {ok}/{len(xml_list)} 个标注文件已处理)代码逻辑分三段头部参数区集中维护所有可调项转换函数里先读图像宽高再遍历每个object算出归一化的中心坐标和宽高主流程把所有XML逐个处理。参数说明如下CLASS_NAMES类别列表的先后顺序就是类别IDbio对应0rop对应1这个顺序必须和你稍后写的data.yaml中的names完全一致否则训练出来的模型预测类别全部错位。越界裁剪操作max(0, min(xmin, w-1))把坐标钳制在0到宽高减1的范围内。实战中发现部分框会越出图像边界100像素以上不裁剪的话归一化坐标会出现负数或大于1的值。空文件处理有些帧里确实没有任何目标XML里没有object节点脚本会生成一个空txt。YOLO训练时遇到空文件会直接跳过该图像不会报错但前提是不能缺失这个txt——缺失会让数据加载器不知道这张图有没有标注直接报assertion错误。3.3 验证转换结果把txt画回图像上转完格式别急着训练第一件事是把txt标注画回图像上肉眼扫一遍。这一步能发现坐标错位、框偏移、类别错乱等一眼可见的翻车问题。我常用的验证代码只有十几行import cv2 for line in open(labels/obj0871_frame0000120.txt): cls_id, cx, cy, bw, bh map(float, line.split()) cx_px int(cx * 1920) cy_px int(cy * 1080) bw_px int(bw * 1920) bh_px int(bh * 1080) x1 int(cx_px - bw_px / 2) y1 int(cy_px - bh_px / 2) x2 int(cx_px bw_px / 2) y2 int(cy_px bh_px / 2) img cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imwrite(check.jpg, img)这只是一段快速抽查脚本反算回去画框。关键点是如果框整体偏移了半个身位多半是归一化时把宽高比搞混了如果类别显示成数字而不是名字这只是显示问题不影响训练如果框被压缩变形那说明XML里的size和你实际读图的尺寸不一致需要检查cv2.imread出来的宽高和XML记录是否匹配。3.4 四个边界坑第一坑类别ID必须从0开始连续编号。不少网友从网上拷的类别列表中间缺了一位比如[bio, fabirc, plastic]跳过了2结果训练时YOLO内部把label张量的维度按类别数分配ID为3的类别会越界报错。第二坑越界框必须裁剪或丢弃。数据集中真实存在目标框右侧超过图像宽度的情况不处理的话归一化后bw cx可能大于1推理时NMS阶段会出现异常表现为预测框位置莫名偏移。第三坑xml文件名和jpg文件名必须完全同前缀。这份资源已经保证了这一点但如果你自己往数据集里补图新加的XML命名一旦对不上转换脚本会静默生成空txt训练时这张图被跳过你根本不知道数据少了。第四坑空XML要保留而不是删除。删除空XML会导致图像的txt缺失Ultralytics YOLO在训练时遇到图像但找不到对应txt会直接抛异常比空txt更严重。4. 用YOLOv8跑通训练环境、配置与损失曲线怎么读4.1 环境配置miniconda Python 3.10 Ultralytics如果要跑YOLOv8第一步是把环境装干净。网上关于YOLOv8 anaconda环境配置要求的提问很多其实核心就三步装好CUDA版PyTorch装Ultralytics包确认GPU驱动版本和PyTorch匹配。我通常用miniconda建独立环境避免把系统Python搞乱conda create -n yolo python3.10 -y conda activate yolo pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics nvidia-smiconda create新建名为yolo的环境Python版本固定3.10是因为Ultralytics对3.10兼容性最稳。--index-url指定从PyTorch官方源安装CUDA 11.8版本的torch这一步最容易翻车——如果只执行pip install torch装出来的是CPU版训练慢到怀疑人生。最后nvidia-smi查看显卡驱动支持的CUDA版本只要驱动版本比11.8新cu118的torch就能正常用。显卡很关键。如果手头是V100或者更老的显卡显存只有16G甚至更少训练batch size就往下调。这个数据集是1920x1080的大图训练时YOLO会在内部做letterbox缩放但显存占用依然比常规的小图数据集高不少。4.2 数据yaml怎么写转换完标注后还需要一个数据集配置文件告诉YOLO去哪里找图像、去哪里找标签、类别有哪些。在数据集根目录新建trash.yamlpath: /home/user/Trash-ICRA19 # 改成你的数据集绝对路径 train: images/train val: images/val names: 0: bio 1: fabirc 2: fishnet 3: plastic 4: root 5: ropepath建议写绝对路径。train和val是相对于path的目录指向你存放训练图像和验证图像的文件夹。names的序号和顺序必须和第3章转换脚本里的CLASS_NAMES完全一致一个字母都不能差。比如转换脚本里bio是0yaml里bio也必须出现在序号0的位置上。还需要手动划分训练集和验证集。常见的做法是84%训练、16%验证约960张训练、184张验证。别用随机划分就完事要保证验证集里每个类别都出现至少一次。可以直接用random.sample画一个划分脚本把图像和标签文件同步移动import os import random from shutil import move files [f for f in os.listdir(images) if f.endswith(.jpg)] random.seed(42) random.shuffle(files) val_count int(len(files) * 0.16) val_files files[:val_count] os.makedirs(images/train, exist_okTrue) os.makedirs(images/val, exist_okTrue) os.makedirs(labels/train, exist_okTrue) os.makedirs(labels/val, exist_okTrue) for f in val_files: move(fimages/{f}, fimages/val/{f}) move(flabels/{f.replace(.jpg, .txt)}, flabels/val/{f.replace(.jpg, .txt)}) for f in files[val_count:]: move(fimages/{f}, fimages/train/{f}) move(flabels/{f.replace(.jpg, .txt)}, flabels/train/{f.replace(.jpg, .txt)})固定随机种子42保证每次划分结果一致方便复现。val_count这里算出184张val_files切片获取验证集。注意标签文件也要跟着移动否则训练集有图没标注加载器直接报错。4.3 训练命令与关键参数环境配好、yaml写好后训练命令其实很短yolo detect train datatrash.yaml modelyolov8s.pt epochs100 imgsz640 batch16 workers4 patience20这行命令的核心参数拆开看就是这样datatrash.yaml数据集配置文件路径。modelyolov8s.pt加载YOLOv8s的预训练权重。第一次跑的时候会自动下载yolo预训练模型网不好就手动下载后放到本地指定路径。yolov8s是small版本速度和精度的折中显存有限的情况下比yolov8l稳得多。epochs100训练轮数。这个规模的数据集100轮足够收敛再多收益不大。imgsz640训练输入分辨率。虽然原图是1080p但YOLO内部会做缩放640是比较常规的设置太低丢失小目标太高显存不够。batch16一次迭代喂入16张图。显存8G的建议改到8或4别硬撑后面避坑部分会细说。workers4数据加载线程数。Windows下这个值建议设0否则容易报BrokenPipeError。patience20连续20轮验证集mAP没有提升就提前终止帮你省时间。训练开始后终端会实时打印进度条、每个batch的损失值、当前学习率以及每一轮结束后的验证指标。训练结束会在runs/detect/train/目录下生成weights/best.pt验证集mAP最高的权重和weights/last.pt最后一轮的权重后续推理用best.pt。4.4 读训练日志损失曲线和混淆矩阵这里重点看Ultralytics训练结束后自动保存的三张损失图——box_loss、cls_loss、dfl_loss。box_loss是边界框回归损失下降越快说明模型学框位置的速度越快cls_loss是分类损失这个值如果迟迟不降大概率是类别不平衡或标注错误dfl_loss是Distribution Focal Loss负责边界框细粒度回归。混淆矩阵那块提醒一句YOLO的混淆矩阵每一行之和不是100%因为预测结果存在漏检和误检背景类也会占掉一部分。如果你看到的混淆矩阵对角线数字之和和mAP对不上不必怀疑训练出了问题这是正常的。5. 避坑五个翻车现场与定位思路5.1 显存不够batch16直接OOM现象训练跑完第一个batch就报CUDA out of memory进程被掐掉机器直接卡死。原因1920x1080的原始图像即使缩放到640中间特征图占用的显存仍然比普通小图数据集大得多batch16对8G显存的显卡来说就是天文数字。不少网友第一次用V100以外的显卡训练都是栽在这里。解决把batch从16改成4workers改成0imgsz从640改成512三者组合通常能把显存占用压到6G以内。如果还是爆就优先降batch它是显存占用的最大头。5.2 训练完mAP全是0类别名没对上现象训练正常跑完验证时每个类别的mAP都是0但loss在下降。原因转换脚本里的CLASS_NAMES和trash.yaml里的names顺序不一致。比如转换脚本里bio是0、fabirc是1但yaml里bio被排到了序号2的位置模型学到的标注ID和它认为的类别ID错位训练出来的模型在验证时对不上号。解决写一个小脚本输出CLASS_NAMES和trash.yaml中names的逐项对比或者干脆只维护一份类别列表由它同时生成转换脚本和yaml从源头杜绝不一致。5.3 预测框全部偏大真实目标被大框套小框现象训练结束推理时每个目标都被一个大框包住框边界明显超出了目标本身。原因这是最坑的一个。你刚解压出来的XML可能涉及两种坐标系——有的框是bndbox像素坐标有的来自外部工具是整数坐标但训练时被当作归一化坐标处理了。转换脚本虽然做了归一化但没有检查bndbox的数值范围是否和size匹配。比如XML里图像宽是1920但某个框的xmax是960你以为这是半球实际上它可能是另一套坐标系下的归一化数值。解决在转换脚本里加一个尺寸合理性检查凡是xmin、xmax的取值范围超出图像宽度的20%以上直接打印警告让你人工复核。5.4 空标注文件导致训练直接中断现象训练开始没两分钟数据加载器报AssertionError: Label file ... not found。原因有些帧确实没有目标XML里没有object节点转换脚本虽然生成了空txt但你在整理目录时可能把空文件删了或者move的时候漏掉了空文件导致图像存在但没有对应txt。解决训练前跑一个检查循环遍历每一张图像确认对应的txt文件存在。空txt保留着没问题YOLO训练时会跳过它所在图像但缺失txt是硬错误。5.5 水下图像整体偏蓝数据增强越增强越离谱现象训练出来的模型在真实水下视频上表现差但在训练集上mAP很高过拟合迹象明显。原因这份数据集是水下场景图像色调偏蓝且光照分布特殊。YOLO默认开启的HSV色域增强会把图像颜色拉得很奇怪比如把水底的蓝色拉伸成紫色模型学到的颜色分布和真实场景脱节。解决训练时关闭颜色相关的增强在命令里加hsv_h0 hsv_s0 hsv_v0只保留轻微的平移和缩放增强。这是我实际用过且效果最大的一个参数调整能直接把验证集mAP提升2到3个点。6. 验证与部署把模型接到自己的测试视频上6.1 用已有标签算指标验证集脚本训练产生的best.pt到底行不行别靠眼睛看用你预留的184张验证集图像跑一遍官方评估脚本yolo detect val datatrash.yaml modelruns/detect/train/weights/best.pt这个命令输出mAP0.5和mAP0.5:0.95两组数字。对这个数据集mAP0.5在0.7以上就算可用的效果mAP0.5:0.95相对低一些是正常的因为水下垃圾目标偏小小目标的IoU要求更苛刻。6.2 调节置信度门限如果你拿模型去跑一段新的水下视频会发现默认0.25的置信度门槛输出了一堆置信度只有0.3的噪声框。这个场景下0.3到0.4之间的阈值比较合理过滤掉大部分水底噪点。推理时直接指定yolo detect predict modelruns/detect/train/weights/best.pt sourcetest_video.mp4 conf0.35conf0.35让模型只输出置信度大于35%的检测框。如果目标是丢到课程设计演示里想看到识别效果又不显杂乱conf0.4更干净。6.3 视频流检测与帧率观察保存预测结果时加一个saveTrue输出视频会带检测框。如果要在自己的环境里跑实时摄像头或在线视频流Ultralytics也支持直接对rtsp://地址做推理命令不变把source换成流地址即可。有一点要提醒CPU推理1080p视频大概只有每秒5到8帧想实时跑得把imgsz降到416并且换一张支持半精度推理的显卡。从那以后我每拆一份目标检测数据集都强制走一遍「统计类别 → 转换格式 → 回显检查 → 单卡小batch试跑」的流程。这套流程救过我太多次了希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Altium Designer工程级IntLib元件库实战指南 2026/9/27 1:11:26

Altium Designer工程级IntLib元件库实战指南

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

阅读更多 →
NI 488.2驱动安装与GPIB通信实战指南 2026/9/27 1:11:19

NI 488.2驱动安装与GPIB通信实战指南

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

阅读更多 →
STM32嵌入式系统实战:从电路设计到鸽舍智能控制 2026/9/27 1:11:19

STM32嵌入式系统实战:从电路设计到鸽舍智能控制

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

阅读更多 →
埃夫特机器人仿真软件ER-Factory-Trail实操:从安装到工作站搭建全流程 2026/9/27 1:11:19

埃夫特机器人仿真软件ER-Factory-Trail实操:从安装到工作站搭建全流程

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

阅读更多 →
Wi-Fi 6核心调度机制拆解:OFDMA、MU-MIMO与TWT实战指南 2026/9/27 1:11:13

Wi-Fi 6核心调度机制拆解:OFDMA、MU-MIMO与TWT实战指南

去年帮一家创业公司改造办公网络,五十多人挤在两层楼里,下午三点一开全员视频会议,路由器直接卡成PPT画质。同事说“设备都换了便宜的,怎么还这样”,我拿终端一测,2.4G和5G两块频段的空口利用率高得吓人&am…

阅读更多 →
ax:面向智能体的轻量级调度与编排系统 2026/9/27 1:11:13

ax:面向智能体的轻量级调度与编排系统

1. 项目概述:从“ax”这个极简标题出发,我们到底在谈什么?“ax”——两个字母,没有空格,没有标点,甚至不像一个完整单词。但放在当前技术语境下,它绝不是随手敲出的乱码。结合热搜词里反复出现的…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉