
简介这份资源面向从事海底监控、海洋环保与水下视觉检测的算法工程师及目标检测学习者提供一套真实拍摄的海洋垃圾检测数据集可用于训练与验证 YOLO 等目标检测模型也可作为通用海底垃圾检测场景的数据补充。数据集共1000张高质量海底图像覆盖塑料垃圾、铁罐金属、纸张、木头、手套等目标并包含海洋生物、水下探测器与垃圾同框及打光拍摄等复杂场景标注涵盖plastic、bio、rov、metal、paper、wood、rubber、timestamp、unknown九个类别。资源包为1个PDF文件大小约2.77MB内附数据集基本情况介绍与获取方式标注采用labelimg完成同时提供VOC、COCO、YOLO三种格式标签便于直接接入主流训练流程。随附YOLO11一键训练脚本支持GPU、CPU及Mac多平台运行并给出训练结果日志供参考。目前已有540人学习适合需要快速开展海洋垃圾检测实验的读者。1. 海洋垃圾检测数据集1000 张图、三种标签格式与 YOLO11 一键训练到底怎么落地海面漂浮物检测这件事真正卡住大多数团队的往往不是模型结构而是数据。你拿到一个目标检测需求第一反应可能是去调 YOLO11 的 backbone但实际跑起来才发现公开的海洋垃圾数据要么类别定义混乱要么只有 COCO 没有 YOLO 格式要么标注框把整片浪花都框进去了。这个标题给出的方案很直接——1000 张图同时提供 VOC、COCO、YOLO 三种标签格式配一套能在 GPU、CPU、Mac 三平台跑起来的 YOLO11 一键训练脚本。它解决的是从「有数据」到「能训出第一版权重」之间那段最耗时的脏活。适合刚接触目标检测、想拿一个真实场景练手的人也适合需要快速验证海洋垃圾检测可行性的工程团队。下面按数据格式转换、环境配置、训练脚本、踩坑排查的顺序拆开讲。2. 三种标签格式的差异与转换VOC、COCO、YOLO 到底该用哪个2.1 三种格式的坐标体系与适用场景VOC 格式用 XML 存储每个目标一个object节点坐标是左上角和右下角的绝对像素值xmin, ymin, xmax, ymax。它的好处是可读性强标注工具支持广缺点是文件数量多1000 张图就是 1000 个 XML批量处理时 I/O 开销明显。COCO 格式用一个 JSON 文件管所有图images、annotations、categories三个数组通过id关联坐标是[x, y, width, height]的绝对像素值。它的优势是生态完整pycocotools 能直接算 mAP缺点是单文件体积大多人协作时容易冲突。YOLO 格式每张图一个.txt每行class_id x_center y_center width height全部是归一化到 0 到 1 的相对值。它训练时读取最快但可读性差脱离图片就看不懂坐标。选哪个取决于你的下游任务。如果只是用 YOLO11 训练直接用 YOLO 格式最省事。如果要做 benchmark 对比或者投稿COCO 格式方便算指标。如果标注团队还在用 LabelImgVOC 是中间产物。这个数据集三种都给意味着你不需要自己写转换脚本但理解转换逻辑仍然必要因为实际项目中你总会遇到只有一种格式的情况。2.2 VOC 转 YOLO 的完整脚本与边界处理下面这段代码把 VOC 的 XML 批量转成 YOLO 的 txt处理了图片尺寸读取、坐标越界裁剪和类别映射三个关键点。import xml.etree.ElementTree as ET import os from PIL import Image # 类别映射根据你的数据集实际类别修改 CLASS_MAP {plastic: 0, metal: 1, glass: 2, paper: 3, rubber: 4} def voc_to_yolo(xml_dir, img_dir, out_dir): os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() # 用对应图片读取真实宽高不要信 XML 里的 size img_name xml_file.replace(.xml, .jpg) img_path os.path.join(img_dir, img_name) if not os.path.exists(img_path): print(fmissing image: {img_name}) continue with Image.open(img_path) as im: w, h im.size lines [] for obj in root.findall(object): cls_name obj.find(name).text.strip() if cls_name not in CLASS_MAP: continue bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 裁剪到图像边界内防止标注越界导致归一化后为负 xmin max(0, min(xmin, w)) xmax max(0, min(xmax, w)) ymin max(0, min(ymin, h)) ymax max(0, min(ymax, h)) if xmax xmin or ymax ymin: continue xc (xmin xmax) / 2.0 / w yc (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{CLASS_MAP[cls_name]} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}) with open(os.path.join(out_dir, xml_file.replace(.xml, .txt)), w) as f: f.write(\n.join(lines))逻辑说明先读图片真实尺寸而不是 XML 里的size因为标注工具偶尔会写错。坐标裁剪是必须的海洋垃圾标注里经常出现框超出图像边缘的情况不裁剪会导致归一化后出现负值YOLO 训练时直接报错。类别映射用字典控制不在映射表里的类别直接跳过避免引入噪声。参数方面CLASS_MAP必须和你的data.yaml里的names顺序一致否则训练出来的类别全是错的。2.3 COCO 转 YOLO 的注意事项COCO 转 YOLO 的核心是遍历annotations用image_id找到对应图片的宽高再把[x, y, w, h]转成归一化的中心点格式。常见坑是 COCO 的category_id不连续比如只有 1、3、7而 YOLO 要求从 0 开始的连续整数。你需要自己建一个映射表把原始category_id重映射到 0 到 N-1。另一个坑是 COCO 里可能有iscrowd1的标注这类目标通常面积很大且不参与评估转 YOLO 时建议直接跳过否则模型会学到一堆无意义的背景框。3. YOLO11 三平台环境配置GPU、CPU、Mac 分别怎么装3.1 GPU 环境CUDA 版本与 PyTorch 的对应关系GPU 训练是首选但 CUDA、cuDNN、PyTorch 三者的版本匹配是新手翻车最多的地方。截至我写这篇笔记时YOLO11 依赖的 ultralytics 包对 PyTorch 2.x 支持最好。如果你用的是 NVIDIA 显卡先跑nvidia-smi看驱动支持的 CUDA 上限再决定装哪个版本的 PyTorch。不要直接pip install torch那样装到的是 CPU 版。# 查看驱动支持的 CUDA 版本 nvidia-smi # 以 CUDA 12.1 为例安装对应 PyTorch pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 # 安装 ultralytics pip install ultralytics # 验证 GPU 是否可用 python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))如果输出True和你的显卡型号说明环境通了。如果输出False先检查驱动版本再检查是不是装成了 CPU 版 PyTorch。参数上--index-url后面的cu121要和你实际安装的 CUDA 版本对应cu118、cu121、cu124 都是常见选项。显存方面1000 张图用 YOLO11n 或 YOLO11sbatch size 设 16 在 8GB 显存上基本够用如果 OOM 就降到 8 或 4。3.2 CPU 与 Mac 环境能跑但要有预期CPU 训练只适合验证流程1000 张图跑 100 个 epoch 可能要十几个小时。安装时直接pip install ultralytics即可PyTorch 会自动装 CPU 版。Mac 用户分两种Intel 芯片用 CPU 版M 系列芯片可以用 MPS 加速。# Mac M 系列验证 MPS 是否可用 python -c import torch; print(torch.backends.mps.is_available()) # 训练时指定 device yolo detect train datadata.yaml modelyolo11n.pt epochs100 devicempsMPS 的加速比纯 CPU 快不少但和 NVIDIA GPU 仍有数量级差距。我的血泪经验是Mac 上跑通流程、调好参数然后把脚本原样丢到 GPU 机器上跑正式训练。这样既利用了 Mac 的便携性又不浪费时间。device参数可以填0第一块 GPU、cpu、mps多卡时填0,1。3.3 一键训练脚本的目录结构与 data.yaml 写法一键脚本的核心不是把命令写得多复杂而是把路径、类别、超参数都收敛到一个配置文件里。推荐目录结构如下marine_litter/ images/ train/ val/ labels/ train/ val/ data.yaml train.pydata.yaml是 YOLO11 训练的数据入口写法必须严格path: /absolute/path/to/marine_litter train: images/train val: images/val nc: 5 names: [plastic, metal, glass, paper, rubber]path用绝对路径最稳相对路径在不同工作目录下容易找不到文件。nc是类别数必须和names长度一致。names的顺序必须和标签里的class_id对应这个顺序错了训练 loss 会正常下降但预测结果全乱属于典型的玄学问题。4. YOLO11 一键训练脚本拆解参数怎么设、日志怎么看4.1 训练命令与关键参数含义最简训练命令是一行但真正影响结果的是那几个关键参数。yolo detect train \ datamarine_litter/data.yaml \ modelyolo11n.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ workers8 \ projectruns/marine \ nameexp1 \ patience20 \ save_period10model可选 yolo11n、yolo11s、yolo11m、yolo11l、yolo11xn 最小最快x 最准最慢。1000 张图属于小数据集建议从 yolo11n 或 yolo11s 起步直接上 x 几乎必然过拟合。imgsz640是默认值海洋垃圾目标通常不大可以试 640 和 1280 对比1280 对小目标更友好但显存翻倍。patience20表示 20 个 epoch 指标不提升就早停小数据集上这个参数能省不少时间。workers是数据加载线程数Linux 上设 8 没问题Windows 上设太高反而会卡建议 4。4.2 训练日志里的三个关键指标训练开始后控制台会滚动输出每个 epoch 的指标。重点看三个box_loss、cls_loss、mAP50。box_loss下降说明框的位置在收敛cls_loss下降说明类别判断在变好。如果box_loss一直震荡不降检查学习率是不是太大或者标签坐标有没有越界。mAP50是 IoU 阈值 0.5 时的平均精度小数据集上能到 0.6 以上就算可用。如果mAP50在训练集上很高但验证集很低就是过拟合需要加数据增强或者减模型规模。4.3 从训练到推理的最小验证流程训练完成后权重默认存在runs/marine/exp1/weights/best.pt。用下面命令做推理验证yolo detect predict \ modelruns/marine/exp1/weights/best.pt \ sourcetest_images/ \ conf0.25 \ saveTrueconf0.25是置信度阈值低于这个值的框不显示。海洋垃圾检测里如果漏检严重就降到 0.1如果误检太多就升到 0.4。saveTrue会把画框后的图片存到runs/detect/predict。这一步的目的是肉眼检查不要只看 mAP 数字实际图片上的框才是最终交付物。5. 海洋垃圾检测的避坑与排查5 个真实翻车记录5.1 现象训练 loss 正常下降但预测框全部偏移原因通常是标签格式不匹配。YOLO 要求归一化的中心点坐标如果误用了 VOC 的绝对坐标直接除以图像尺寸或者把xmin, ymin, xmax, ymax当成了x, y, w, h训练时 loss 会缓慢下降但框的位置完全错乱。解决方法是随机抽 5 张图用脚本把 YOLO 标签还原成框画到图上肉眼确认框是否套住目标。5.2 现象mAP 始终为 0cls_loss 不下降先检查data.yaml里的nc和names是否与标签中的class_id范围一致。如果标签里有class_id5但nc5合法 id 是 0 到 4ultralytics 会直接忽略这个类别或者报索引错误。另一个常见原因是names顺序和标签生成时的映射表不一致导致模型学到的类别和评估时的类别对不上。解决方法是统计所有标签文件里的class_id分布确认最大值小于nc。5.3 现象GPU 显存充足但训练报 CUDA out of memory不一定是 batch size 太大。YOLO11 在训练初期会做一次缓存如果workers设得太高每个 worker 都会复制一份数据到显存导致实际占用远超预期。把workers从 8 降到 4 或 2 往往能解决。另外imgsz从 640 提到 1280 会让显存占用变成原来的 4 倍左右8GB 显存跑 1280 基本必爆。解决顺序是先降workers再降batch最后降imgsz。5.4 现象Mac 上训练极慢一个 epoch 要半小时MPS 加速对 YOLO11 的支持在部分 PyTorch 版本上并不完整某些算子会回退到 CPU。先确认torch.backends.mps.is_available()返回True然后在训练命令里显式加devicemps。如果仍然慢检查是不是装成了 CPU 版 PyTorch。Mac 上的合理预期是用 yolo11n、imgsz320、batch8一个 epoch 控制在几分钟内用来验证流程不要指望在 Mac 上出最终模型。5.5 现象验证集 mAP 很高但实际图片漏检严重这是典型的分布不一致。1000 张图如果按随机划分训练集和验证集可能来自同一批视频帧背景高度相似验证集指标虚高。实际场景里光照、浪高、拍摄角度一变模型就失效。解决方法是按视频来源或拍摄日期划分训练集和验证集确保验证集里的背景和训练集有差异。另外海洋垃圾里透明塑料和白色泡沫在浪花背景下对比度极低标注时容易漏训练时也会漏可以针对这两类单独做困难样本挖掘。6. 把 1000 张图用出 10000 张的效果小数据集的增强与验证技巧1000 张图在目标检测里算小数据集直接训很容易过拟合。我一般会做三件事第一用 ultralytics 内置的增强参数把mosaic、mixup、copy_paste打开其中copy_paste对小目标尤其有效它把目标复制粘贴到其他图上相当于免费扩增。第二用degrees、translate、scale做几何增强海洋垃圾的姿态和位置本来就随机这些增强符合真实分布。第三把hsv_h、hsv_s、hsv_v调大一点模拟不同光照和水色。yolo detect train \ datamarine_litter/data.yaml \ modelyolo11s.pt \ epochs200 \ imgsz640 \ batch16 \ device0 \ mosaic1.0 \ mixup0.15 \ copy_paste0.3 \ degrees15 \ translate0.1 \ scale0.5 \ hsv_h0.02 \ hsv_s0.7 \ hsv_v0.4 \ patience30参数说明mosaic1.0表示始终启用马赛克增强mixup0.15表示 15% 概率做图像混合copy_paste0.3表示 30% 概率做目标复制粘贴。degrees15是随机旋转角度范围海洋垃圾方向不固定这个值可以设。scale0.5是随机缩放比例模拟不同距离拍摄。hsv_s0.7和hsv_v0.4是饱和度和明度扰动模拟水面反光和阴天。验证阶段不要只看 mAP我习惯做两件事一是用yolo detect val输出混淆矩阵看哪两个类别最容易混海洋垃圾里塑料和纸张经常互混如果混淆严重就考虑合并类别或者加更多区分性样本。二是把验证集里置信度在 0.1 到 0.3 之间的预测框单独导出这些是模型的「犹豫区」人工检查一遍能发现标注错误和困难样本。最后说一个我踩过的坑不要用测试集去调超参数。1000 张图本来就不多如果反复在验证集上调conf、iou、imgsz验证集就变成了训练集的一部分最终指标没有参考价值。我的习惯是先把数据切成 train/val/test 三份test 只在最后跑一次中间所有调参都在 val 上做。这个习惯让我少了很多「上线就翻车」的时刻。希望帮到你。本文还有配套的精品资源点击获取