简介这份资源面向从事水下视觉与环保监测的算法工程师、研究生及目标检测初学者提供一套真实拍摄的海洋海底垃圾检测数据集可用于海底监控场景下的垃圾识别项目也可作为通用垃圾检测数据的补充。数据集共1000张高质量图像覆盖海底塑料、铁罐、纸张等垃圾以及海洋生物、水下探测器与垃圾同框、打光拍摄等多种场景标注包含plastic、bio、rov、metal、paper、wood、rubber、timestamp、unknown九个类别。资源包为1个PDF文件大小约2.77MB内附数据集基本情况介绍与获取方式并说明提供VOC、COCO、YOLO三种标签格式可直接用于YOLO等算法训练。随附YOLO11一键训练脚本支持GPU、CPU及Mac芯片多平台方案并给出训练结果日志供参考。目前已有540人学习适合需要快速验证模型、补充水下数据或搭建训练流程的读者。1. 海洋垃圾检测数据集1000 张图、三种标签格式与 YOLO11 一键训练到底怎么落地海面漂浮物巡检、河道保洁、近岸生态监测这些场景里最耗人的不是模型结构而是数据。你拿到一个「目标检测-海洋垃圾检测数据集-1000张图-对应VOC/COCO/YOLO三种格式标签支持GPU(GPUs)/CPU/Mac三平台YOLO11一键训练脚本」的标题真正要问的是三件事这 1000 张图够不够训一个能用的检测器、三种标签格式各自什么时候用、一键脚本在 GPU、CPU、Mac 上分别会踩什么坑。这篇不聊虚的按我实际跑这类小数据集的顺序把目录结构、格式转换、训练参数、平台差异和排错一次讲透。适合手里有标注数据、想快速验证 YOLO 系列YOLOv8/YOLO11 一路到 yolov26 目标检测这类新版本能不能出结果的人也适合只想先跑通再谈调优的新手。1000 张图在目标检测里属于「小数据集」但海洋垃圾这个任务有个特点类别少常见就塑料瓶、塑料袋、渔网、泡沫、其他漂浮物几类目标形态重复度高背景以水面为主。这意味着它比通用 COCO 数据集更容易在小样本下收敛但也更容易过拟合到某几种拍摄角度。所以这套数据的价值不在「量大」而在「格式全 脚本能一键跑」让你把精力放在验证流程而不是环境上。下面从数据组织讲到三平台训练再到避坑和进阶技巧。2. 三种标签格式的取舍VOC、COCO、YOLO 各自该在什么时候用2.1 先看清三种格式的字段差异同一批 1000 张图配三套标签不是冗余是因为不同工具链吃不同格式。VOC 是 XML一个图一个文件框用xmin/ymin/xmax/ymax绝对像素坐标COCO 是单个 JSON所有图共用images/annotations/categories三个数组框用[x, y, w, h]绝对像素YOLO 是每图一个 txt每行class cx cy w h全部归一化到 0~1。搞混坐标系是新手第一大翻车点。格式存储方式坐标类型典型用途VOC每图一个 XML绝对像素 xmin/ymin/xmax/ymaxLabelImg 默认、老检测框架COCO单 JSON绝对像素 x/y/w/hpycocotools 评估、COCO 预训练微调YOLO每图一个 txt归一化 cx/cy/w/hUltralytics YOLO 系列训练选型逻辑很简单训练 YOLO11 就用 YOLO 格式要拿 pycocotools 算 mAP 或者和 COCO 预训练权重对齐就留一份 COCOVOC 主要是给标注工具和部分老代码做兼容。三份都留着转换脚本跑一次就行别到用的时候再补。2.2 目录结构要一次定死我一般把数据集组织成下面这样训练脚本只认这个结构换数据集也不用改代码marine_litter/ ├── images/ │ ├── train/ # 约 800 张 │ ├── val/ # 约 150 张 │ └── test/ # 约 50 张 ├── labels/ │ ├── train/ # 与 images/train 同名的 .txt │ ├── val/ │ └── test/ ├── annotations_voc/ # 原始 VOC XML ├── annotations_coco.json └── marine_litter.yaml划分比例 8:1.5:0.5 是小数据集的常见做法验证集别低于 100 张否则 mAP 抖动大到没法判断模型好坏。注意images/train和labels/train里的文件名必须一一对应只差扩展名YOLO 靠文件名配对配不上就静默丢样本这是最隐蔽的坑之一。2.3 从 VOC 转 YOLO 的转换脚本假设你手里是 VOC XML先转成 YOLO。下面这段是核心逻辑读 XML、取尺寸、归一化、写 txtimport os import xml.etree.ElementTree as ET # 类别名要和 yaml 里的 names 顺序完全一致 CLASSES [bottle, bag, net, foam, other] def voc_to_yolo(xml_dir, out_dir, classes): os.makedirs(out_dir, exist_okTrue) for fn in os.listdir(xml_dir): if not fn.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, fn)) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in classes: continue # 未登记类别直接跳过避免索引错位 cls_id classes.index(name) 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) # 归一化并转中心点格式 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}) with open(os.path.join(out_dir, fn.replace(.xml, .txt)), w) as f: f.write(\n.join(lines)) voc_to_yolo(annotations_voc, labels/train, CLASSES)逻辑说明CLASSES的顺序决定 txt 里第一列的数字一旦和 yaml 的names不一致模型学到的类别就全错位而且训练不报错只是 mAP 奇低。归一化用图像真实宽高不是固定 640这点很多人写死 640 导致框整体偏移。{:.6f}保留 6 位是 YOLO 官方推荐精度位数太少小目标框会退化。参数说明xml_dir指向 VOC 目录out_dir指向对应 split 的 labels 目录转换时 train/val/test 要分别跑别把验证集 XML 混进训练集。转换完随手抽查几张用可视化脚本把框画回图上确认没偏。2.4 生成 COCO JSON 与 yaml 配置COCO 那份用pycocotools或自己拼 JSON 都行关键是images里要有id/file_name/width/heightannotations里bbox是[x, y, w, h]绝对像素、category_id从 1 开始0 通常留给背景。yaml 则是 YOLO 训练的入口# marine_litter.yaml path: ./marine_litter train: images/train val: images/val test: images/test names: 0: bottle 1: bag 2: net 3: foam 4: otherpath用相对路径方便整个数据集打包搬走names的键必须从 0 连续跳号会让部分类别永远学不到。这份 yaml 是后面一键脚本唯一需要改的文件类别数变了只改这里。3. YOLO11 一键训练脚本从环境到首轮收敛的完整命令3.1 环境准备与依赖安装一键脚本的前提是环境干净。GPU 机器上先确认驱动和 CUDA 可用再装 PyTorch 和 Ultralytics。CPU 和 Mac 走不同安装命令这是三平台差异的根源。# GPUNVIDIA机器先验证驱动 nvidia-smi # 安装带 CUDA 的 PyTorch版本按官方矩阵选别硬记 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 pip install ultralytics # CPU-only 机器 pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu pip install ultralytics # MacApple SiliconMPS 加速 pip install torch torchvision pip install ultralytics逻辑说明nvidia-smi能列出显卡和驱动版本说明 GPU 链路通如果这条命令就报错后面训练一定失败先解决驱动。PyTorch 的 CUDA 版本要和驱动兼容装错版本会出现在torch.cuda.is_available()返回 False 的情况。Mac 不需要单独装 CUDA 版Ultralytics 会自动尝试 MPS。参数说明--index-url指定 wheel 源cu121 对应 CUDA 12.1按你驱动支持的版本换。装完跑一句python -c import torch; print(torch.cuda.is_available())确认GPU 机器要打印 True。3.2 一键训练脚本本体把训练封装成一个脚本三平台靠一个--device参数切换这是最省心的做法from ultralytics import YOLO import argparse parser argparse.ArgumentParser() parser.add_argument(--device, default0, help0GPU, cpuCPU, mpsMac) parser.add_argument(--epochs, typeint, default100) parser.add_argument(--imgsz, typeint, default640) parser.add_argument(--batch, typeint, default16) args parser.parse_args() # 从预训练权重起步小数据集必须靠迁移学习 model YOLO(yolo11n.pt) model.train( datamarine_litter.yaml, epochsargs.epochs, imgszargs.imgsz, batchargs.batch, deviceargs.device, patience20, # 20 轮无提升就早停防过拟合 cacheTrue, # 1000 张小数据集可全缓存进内存 projectruns_litter, nameexp1, )逻辑说明yolo11n.pt是最小的 nano 权重1000 张图用 nano 或 small 足够上大模型只会过拟合。patience20是早停小数据集很容易在 30~50 轮后开始过拟合早停能省时间。cacheTrue把图片缓存进内存1000 张图完全放得下能明显加快每轮速度。参数说明--device是平台开关GPU 填0纯 CPU 填cpuMac 填mps--batch在 CPU 和 Mac 上要调小到 4~8否则内存吃紧--imgsz默认 640如果海洋垃圾里小目标多远处漂浮物可以提到 960但显存和速度代价要自己权衡。3.3 三平台启动命令与预期差异同一份脚本三个平台这样跑# GPU 服务器 python train.py --device 0 --batch 16 --epochs 100 # 纯 CPU 机器速度慢适合验证流程 python train.py --device cpu --batch 4 --epochs 30 # MacApple Silicon python train.py --device mps --batch 8 --epochs 50逻辑说明GPU 上 100 轮 nano 模型大概几十分钟到一两小时CPU 上同样规模可能要十几小时所以 CPU 只建议跑 20~30 轮验证流程通不通别指望出最终模型Mac 的 MPS 介于两者之间适合个人开发者本地调试。三平台产出的权重格式一致都能拿去做推理。参数说明CPU 和 Mac 上把workers也调小脚本里可加workers2否则多进程数据加载在部分系统上会卡死。GPU 上workers8通常没问题。3.4 训练过程该盯哪几个指标训练日志里重点看三个box_loss和cls_loss是否稳定下降、mAP50是否在涨、验证集 loss 是否开始反弹。海洋垃圾任务里mAP50到 0.6~0.8 通常就算可用具体看类别难度。如果训练 loss 一直降但验证 mAP 不涨基本是过拟合回去加数据增强或减轮数。Ultralytics 默认开了 mosaic、翻转等增强小数据集上这些增强是救命的别关。4. 避坑与排查小数据集 三平台最容易翻车的 5 个点4.1 训练不报错但 mAP 接近 0现象脚本正常跑完loss 也在降但验证 mAP 一直在 0.01 附近。原因九成是类别索引错位——txt 里的 class id 和 yaml 的names顺序对不上或者 VOC 转换时类别名大小写不一致被跳过。解决抽一张训练图用可视化脚本把 YOLO 标签画回原图确认框位置和类别都对再打印 yaml 的names和 txt 第一列的唯一值比对。4.2 GPU 上torch.cuda.is_available()返回 False现象明明有显卡训练却自动落到 CPU速度慢十倍。原因PyTorch 装成了 CPU 版或 CUDA 版本和驱动不匹配。解决pip list看 torch 版本带不带cu不带就是 CPU 版按 3.1 的命令重装对应 CUDA 版本再确认驱动版本满足该 CUDA 要求。4.3 Mac 上 MPS 报内存或算子不支持现象Mac 训练中途报MPS backend out of memory或某算子 fallback 到 CPU 导致极慢。原因MPS 对部分算子和大 batch 支持有限。解决把--batch降到 4--imgsz降到 512 先跑通如果仍报算子不支持临时切--device cpu验证流程最终训练放 GPU 机器。4.4 验证集 mAP 抖动剧烈现象每轮 mAP 上下跳 0.1 以上看不出趋势。原因验证集太小低于 100 张或类别分布不均。解决把验证集补到 150 张以上尽量让每个类别都有样本训练时开deterministicTrue减少随机性但会略降速度。4.5 图片和标签文件名对不上导致静默丢样本现象训练能跑但日志里train样本数比实际图片少。原因images/train里有图但labels/train里没有同名 txtYOLO 直接跳过不报错。解决写个校验脚本遍历 images 目录检查每个文件名在 labels 里是否存在缺的要么补标要么删图别让脏数据混进去。5. 进阶把 1000 张图的效果再往上抬一档跑通只是起点。1000 张图想榨出更好效果我一般做三件事。第一是针对性增强海洋垃圾里小目标和遮挡多把mosaic、mixup开着再手动加copy_paste把稀有类别比如渔网复制粘贴到更多背景上缓解类别不平衡。第二是分辨率策略先 640 快速迭代确认流程最终模型用 960 或 1280 训一轮小目标召回通常能涨几个点代价是显存和时间的线性增长。第三是推理阶段的置信度门限训练完别直接用默认 0.25拿验证集画一条confidence对precision/recall的曲线海洋垃圾巡检通常宁可多报也别漏报门限可以压到 0.15~0.2。验证方法上除了看 mAP我更信「拿 20 张没参与训练的实拍图跑一遍人眼数漏检和误检」。mAP 是统计量实拍图才是业务真相。下面这个推理片段可以直接复用from ultralytics import YOLO model YOLO(runs_litter/exp1/weights/best.pt) results model.predict( sourcetest_images/, conf0.2, # 压低门限减少漏检 iou0.5, # NMS 阈值密集漂浮物可调到 0.6 imgsz960, saveTrue, )逻辑说明conf控制置信度门限越低召回越高但误检增多iou是 NMS 的 IoU 阈值海面漂浮物容易挨在一起调高能减少互相抑制导致的漏检。saveTrue把画框结果存下来方便人工复核。参数说明best.pt是训练中验证集最优权重别用last.pt后者是最后一轮往往已经过拟合。imgsz推理时和训练一致或略高别低于训练分辨率。血泪经验是小数据集上数据清洗和增强的收益远大于换模型结构。我见过太多人一上来就改 backbone、加注意力结果不如老老实实把 50 张错标修掉。先保证标签干净、格式对齐、流程可复现再谈涨点。这套 1000 张图 三格式 一键脚本的组合最大的价值就是让你把「环境」和「格式」这两件破事一次性解决把时间留给真正影响效果的地方。希望帮到你。本文还有配套的精品资源点击获取