简介:这份资源面向从事水下视觉与环保监测的算法工程师、研究生及目标检测初学者,提供一套真实拍摄的海洋海底垃圾检测数据集,可用于海底监控场景下的垃圾识别项目,也可作为通用垃圾检测数据的补充。数据集共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/ymax | LabelImg 默认、老检测框架 |
| COCO | 单 JSON | 绝对像素 x/y/w/h | pycocotools 评估、COCO 预训练微调 |
| YOLO | 每图一个 txt | 归一化 cx/cy/w/h | Ultralytics YOLO 系列训练 |
选型逻辑很简单:训练 YOLO11 就用 YOLO 格式;要拿 pycocotools 算 mAP 或者和 COCO 预训练权重对齐,就留一份 COCO;VOC 主要是给标注工具和部分老代码做兼容。三份都留着,转换脚本跑一次就行,别到用的时候再补。
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、取尺寸、归一化、写 txt:
import 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_ok=True) 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/height,annotations里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 走不同安装命令,这是三平台差异的根源。
# GPU(NVIDIA)机器:先验证驱动 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 # Mac(Apple Silicon,MPS 加速) 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", default="0", help="0=GPU, cpu=CPU, mps=Mac") parser.add_argument("--epochs", type=int, default=100) parser.add_argument("--imgsz", type=int, default=640) parser.add_argument("--batch", type=int, default=16) args = parser.parse_args() # 从预训练权重起步,小数据集必须靠迁移学习 model = YOLO("yolo11n.pt") model.train( data="marine_litter.yaml", epochs=args.epochs, imgsz=args.imgsz, batch=args.batch, device=args.device, patience=20, # 20 轮无提升就早停,防过拟合 cache=True, # 1000 张小数据集可全缓存进内存 project="runs_litter", name="exp1", )逻辑说明:yolo11n.pt是最小的 nano 权重,1000 张图用 nano 或 small 足够,上大模型只会过拟合。patience=20是早停,小数据集很容易在 30~50 轮后开始过拟合,早停能省时间。cache=True把图片缓存进内存,1000 张图完全放得下,能明显加快每轮速度。
参数说明:--device是平台开关,GPU 填0,纯 CPU 填cpu,Mac 填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 # Mac(Apple Silicon) python train.py --device mps --batch 8 --epochs 50逻辑说明:GPU 上 100 轮 nano 模型大概几十分钟到一两小时;CPU 上同样规模可能要十几小时,所以 CPU 只建议跑 20~30 轮验证流程通不通,别指望出最终模型;Mac 的 MPS 介于两者之间,适合个人开发者本地调试。三平台产出的权重格式一致,都能拿去做推理。
参数说明:CPU 和 Mac 上把workers也调小(脚本里可加workers=2),否则多进程数据加载在部分系统上会卡死。GPU 上workers=8通常没问题。
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 张以上,尽量让每个类别都有样本;训练时开deterministic=True减少随机性,但会略降速度。
4.5 图片和标签文件名对不上导致静默丢样本
现象:训练能跑,但日志里train样本数比实际图片少。原因:images/train里有图但labels/train里没有同名 txt,YOLO 直接跳过不报错。解决:写个校验脚本,遍历 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( source="test_images/", conf=0.2, # 压低门限,减少漏检 iou=0.5, # NMS 阈值,密集漂浮物可调到 0.6 imgsz=960, save=True, )逻辑说明:conf控制置信度门限,越低召回越高但误检增多;iou是 NMS 的 IoU 阈值,海面漂浮物容易挨在一起,调高能减少互相抑制导致的漏检。save=True把画框结果存下来,方便人工复核。
参数说明:best.pt是训练中验证集最优权重,别用last.pt,后者是最后一轮,往往已经过拟合。imgsz推理时和训练一致或略高,别低于训练分辨率。
血泪经验是:小数据集上,数据清洗和增强的收益远大于换模型结构。我见过太多人一上来就改 backbone、加注意力,结果不如老老实实把 50 张错标修掉。先保证标签干净、格式对齐、流程可复现,再谈涨点。这套 1000 张图 + 三格式 + 一键脚本的组合,最大的价值就是让你把「环境」和「格式」这两件破事一次性解决,把时间留给真正影响效果的地方。希望帮到你。
本文还有配套的精品资源,点击获取