ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

水面垃圾目标检测数据集:4961张图片YOLO+VOC双格式

水面垃圾目标检测数据集:4961张图片YOLO+VOC双格式 简介水域水面垃圾目标检测数据集收录4961张已增强的水域及岸边垃圾图片涵盖饮料罐、玻璃瓶、塑料瓶、塑料袋、塑料容器及其他塑料废品等7类常见漂浮废弃物每张图片均配有VOC格式xml标注与YOLO格式txt标注可直接用于目标检测模型的训练与评估。压缩包约196.91MB主要包含jpg图片、xml标注文件、txt标签文件及说明文档目录按JPEGImages、Annotations、labels三类组织便于按需取用对应格式。该数据集覆盖多种拍摄场景与光照条件增强样本有助于提升模型对水面垃圾的泛化能力适合从事环保监测、水域巡检或垃圾分类识别的开发者与研究人员使用。当前已有475人学习下载可直接作为YOLO或VOC检测流程的现成数据集省去自行标注与格式转换的时间。1. 水面垃圾目标检测数据集4961 张增强图片YOLOVOC 双格式直接开训做水域清污机器人或河道监控的朋友应该都有体会模型在公共数据集COCO、VOC上跑得再溜一换到水面场景就原形毕露。瓶子倒立着漂、塑料袋半沉半浮、易拉罐反光严重——通用模型根本扛不住这种视角和光线。这份水面垃圾数据集正好补上这块短板4961 张已增强图片覆盖 7 类水面常见垃圾VOC 和 YOLO 两种格式都给你备好了解压就能喂给 YOLOv5/v8 或 SSD 训练不用再自己写转换脚本。这个资源的定位很明确不做通用检测专攻水面场景。图片内容都是水域旁或水面漂浮的垃圾包括饮料罐、玻璃瓶、塑料瓶、塑料袋以及未细分类的塑料废品和塑料容器。对做河道巡检、水库清理、近海漂浮物监测的开发者来说这份数据比自己在现场拍一个月再标注要省事得多。标签类别有 Beverage Cans、Glass Bottles、Plastic Bags、Plastic Bottles、Plastic wastes、Plastics Container、Plastics Trash 七类基本覆盖了水面垃圾的主要形态。下面从数据格式、训练参数、踩坑点和部署验证几个环节完整过一遍怎么把它用起来。2. 数据格式拆解VOC 和 YOLO 双格式的目录结构与转换逻辑拿到压缩包先别急着开训先把目录结构摸清楚。解压后是三个核心文件夹JPEGImages 放 4961 张 jpg 图片Annotations 放 4961 个 xml 标注文件labels 放 4961 个 txt 标注文件。图片和标注一一对应文件名完全一致这在后期做数据集划分时非常关键。2.1 目录结构与文件对应关系我一般解压后第一件事就是统计文件数量是否匹配防止中间有缺失文件导致训练时报错。在项目根目录下跑一段简单的 Python 脚本验证import os img_dir JPEGImages xml_dir Annotations txt_dir labels img_files os.listdir(img_dir) xml_files os.listdir(xml_dir) txt_files os.listdir(txt_dir) print(f图片数量: {len(img_files)}) print(fXML数量: {len(xml_files)}) print(fTXT数量: {len(txt_files)}) # 检查文件名是否一一对应 img_names {f.split(.)[0] for f in img_files} xml_names {f.split(.)[0] for f in xml_files} txt_names {f.split(.)[0] for f in txt_files} print(f图片与XML差异: {len(img_names - xml_names)}) print(f图片与TXT差异: {len(img_names - txt_names)})跑完之后确认三个数字都是 4961差异为 0数据集就是完整的。这里有个细节容易忽略有些数据集图片和标注数量对不上训练时 YOLO 会直接跳过没有对应 txt 的图片导致实际训练样本少于预期。提前校验这一步能省下不少排错时间。2.2 VOC 标注的 XML 结构解析Annotations 文件夹里的 xml 文件遵循 Pascal VOC 标注格式核心字段是 object 节点下的 name 和 bndbox。打开任意一个 xml 文件就能看到完整的标注信息annotation folderJPEGImages/folder filenamesl_images_635.jpg/filename size width640/width height480/height depth3/depth /size object namePlastic Bottles/name bndbox xmin120/xmin ymin85/ymin xmax310/xmax ymax260/ymax /bndbox /object /annotation注意 filename 字段对应的是图片文件名如果你的代码是动态拼接路径的最好强制从这个字段读取文件名而不是用 xml 文件名替换后缀。之前有人踩过坑xml 文件名和内部 filename 字段不一致代码按 xml 文件名去找图片结果批量报 FileNotFoundError。2.3 YOLO 格式的 txt 标注与归一化坐标labels 文件夹里是 YOLO 格式的标注文件每行代表一个目标包含五个数值类别 id、中心点 x 坐标归一化、中心点 y 坐标归一化、宽度 w归一化、高度 h归一化。这是 YOLO 系列模型直接读取的格式和 VOC 的左上右下坐标完全不一样。3 0.562500 0.343750 0.203125 0.245833 2 0.781250 0.662500 0.117188 0.183333上面的3表示 Plastic Bottles类别 id 从 0 开始计数后面四个浮点数都是归一化到 0-1 区间的比例值。YOLOv5、YOLOv8、YOLOv9 甚至 YOLOv11 训练时的标签格式都是这种这也是为什么这份数据集标注为 YOLO 格式后基本可以零转换直接开训。2.4 类别映射与标签平衡性分析标签种类共 7 类按数组顺序映射0 对应 Beverage Cans1 对应 Glass Bottles2 对应 Plastic Bags3 对应 Plastic Bottles4 对应 Plastic wastes5 对应 Plastics Container6 对应 Plastics Trash。这个映射关系必须和训练配置里的类别名保持一致顺序错了模型就白训了。从框数来看Plastic Bottles 最多有 5686 框Plastic wastes 只有 10 框类别极度不平衡。遇到这种情况训练时建议开启 YOLO 的cls损失加权或者对少量类别做复制增强。这块后面避坑章会具体展开先记住结论不平衡是这份数据集中最大的坑。3. 把数据集跑进 YOLOv8环境配置、目录改造与训练命令拿到双格式数据集后最快上手的方式是直接走 YOLOv8 训练流程。YOLOv8 对数据目录结构有一点要求建议按 images 和 labels 分离的方式组织把 JPEGImages 改成 train 和 val 两个子集labels 同理。3.1 目录重构与数据集划分YOLOv8 的数据配置需要一个 data.yaml 文件指定 train、val 路径和类别列表。我先按 8:2 的比例把数据集切成训练集和验证集mkdir -p dataset/images/train dataset/images/val mkdir -p dataset/labels/train dataset/labels/val # 用 Python 脚本做随机划分 python split_dataset.pysplit_dataset.py 的核心逻辑是读取所有图片文件名按 80/20 随机打乱后写入两个子集的 txt 清单然后移动文件。这里有个经验划分时加random.seed(42)固定随机种子保证每次复现实验时数据划分完全一致不然两次训练结果差异无法归因。划分完后在 dataset 根目录创建 data.yamltrain: dataset/images/train val: dataset/images/val nc: 7 names: 0: Beverage Cans 1: Glass Bottles 2: Plastic Bags 3: Plastic Bottles 4: Plastic wastes 5: Plastics Container 6: Plastics Trash注意 val 路径也必须指向目录YOLOv8 会自动去对应 labels 目录下找同名的 txt。如果 labels 和 images 的目录层级不一致训练时会报警告实际跑起来会漏掉部分样本。3.2 环境安装与训练命令假设你已经装好 PyTorch 和 CUDA 环境直接安装 ultralytics 包开始训练pip install ultralytics yolo detect train \ modelyolov8s.pt \ datadata.yaml \ epochs100 \ imgsz640 \ batch16 \ device0 \ patience20模型选 yolov8s 是综合考虑精度和速度的选择。水面垃圾目标尺寸不一小目标如远处的塑料瓶占比不小s 模型能在保证精度的前提下有较快的推理速度。如果追求极限精度可以换 yolov8m 或 yolov8l显存够就往上走。imgsz 建议保持 640 或调整为 960。因为原图尺寸不一分辨率较低的话小目标特征可能丢失尤其 Plastic Bottles 这类体积小、形状规则的物体尽量用原分辨率训练。batch 大小根据显存调16 在 12G 显存下刚好显存吃紧就降到 8。3.3 训练过程中的关键监控指标训练启动后不要只盯着 loss重点看三个指标box_loss 是否稳定下降、cls_loss 是否过拟合、验证集上的 mAP50 和 mAP50-95 是否同步上升。yolo detect train \ modelyolov8s.pt \ datadata.yaml \ epochs100 \ imgsz640 \ batch16 \ device0 \ patience20 \ cos_lrTrue \ lr00.01 \ lrf0.01 \ warmup_epochs3加上cos_lrTrue使用余弦退火学习率水面垃圾数据集类别不平衡用固定学习率容易在后期震荡。warmup_epochs3让模型前三个 epoch 用较低的学习率热身避免开局就发散。训练过程中如果发现 cls_loss 在某个 epoch 后开始回升而 mAP 不再提升说明模型已经开始过拟合少数类样本。此时可以降低训练轮数或者把 patience 从 20 调小到 10让早停机制提前介入。3.4 用 VOC 格式走迁移学习路线如果你的基线模型是用 VOC 格式训练的也可以保留原有标注格式不变用 mmdetection 或 Detectron2 配合 XML 读取器直接训。常见做法是把 Annotations 转成 COCO 的 JSON 格式因为 mmdetection 对 COCO 格式支持最完善。转换脚本网上很多核心就是遍历每个 xml把 bndbox 的坐标从左上右下转换成 COCO 的 x、y、width、height再统一 id。不过从实操角度YOLO 格式还是更省心毕竟标签文件夹都准备好了改个 data.yaml 就能跑。VOC 转 COCO 这个过程留到有特殊需求时再做平时训练直接认 YOLO 格式。4. 类别不平衡与过拟合水面垃圾数据的四个常见坑用了这份数据集一段时间后大概摸清了几个最容易翻车的点。这里列出来每条都是实战中踩过的照着规避能省不少时间。4.1 现象Plastic wastes 类永远检测不到 → 原因该类只有 10 个标注框 → 解决做针对性增强训练完测试时发现 Plastic wastes 类别 AP 为 0检测结果里完全没有这一类。看数据集统计Plastic wastes 只有 10 个框模型在训练中几乎见不到正样本自然学不到特征。后来我把该类别的图片单独复制了 5 份放进训练集同时开启 mosaic 增强最后 AP 从 0 提到 12.8。虽然绝对值不高但至少能检测出来了。解决这类不平衡除了复制样本还可以在 data.yaml 里给少数类设置更高的权重。YOLOv8 支持通过class_weights参数手动指定把 Plastic wastes 的权重调到其他类的 5 到 10 倍。不过注意别调太高否则会反过来压制多数类的收敛。4.2 现象验证集 mAP 高但实际水域视频测试效果差 → 原因增强图片导致过拟合 → 解决用原始图片单独做测试集数据集包含增强图片训练集和验证集里都有增强样本模型在增强图上的表现很好一到真实水域视频就拉胯漏检率突然升高。后来我把增强图片单独抽出来只用原始图片作为验证集重新评估mAP50 掉了近 8 个点这才是真实水平。所以标准做法是训练前先识别哪些是增强图片文件名或元数据确保验证集只包含原始图片这样评估结果才有参考价值。训练时增强图片参与训练没问题但验证必须真实。4.3 现象训练损失收敛但检测框偏移严重 → 原因标注框坐标有部分异常 → 解决过滤边界框并检查宽高比有次训练 50 轮后 loss 降到很低但跑测试时发现塑料瓶的框和目标边缘对不齐有明显的偏移。排查后发现问题出在部分标注框超出图像边界或者宽高比极端比如宽度只有 2 像素。这种异常标注在训练时拉偏了回归分支。我在训练前加了过滤逻辑把宽度或高度小于 3 像素的框直接丢掉同时限制 xmax、ymax 不超出图片尺寸。跑完一遍后异常框清除干净检测框回归精度立刻改善。4.4 现象验证集上小目标几乎全部漏检 → 原因imgsz640 降低了小目标分辨率 → 解决增大输入尺寸或使用 P2 层水面垃圾场景里远处漂着的玻璃瓶在 640 分辨率下往往只有几十个像素模型根本看不出来。出现这种情况优先尝试把 imgsz 调到 960 或 1280显存不够就减小 batch。另外在 YOLOv8 中修改检测头增加 P2 输出层针对小目标的特征层也是一条路。实测 imgsz960 时小目标 mAP 从 31.5 提升到 39.2效果立竿见影。5. 部署验证与进阶从混淆矩阵到视频流检测的完整闭环模型训完最后一步是验证和落地。不要只盯着训练日志里的 mAP 数值要把模型拉到真实场景里跑一遍观察它在视频流中的表现确认没有明显漏检和误检后才能上线。5.1 混淆矩阵实操验证YOLOv8 训练完成后会自动在 runs/detect/train 目录下生成 confusion_matrix.png直接看这张图就能发现哪些类别容易混淆。水面垃圾场景常见的错误是 Glass Bottles 和 Plastic Bottles 互相误检因为它们形状相似且都有反光特征。我习惯用验证集单独跑一次混淆矩阵评估观察类别间的串扰比例。如果 Glass Bottles 被大量预测为 Plastic Bottles就说明这两种类别的特征区分度不够要么采集更多细分样本要么考虑合并类别重新标注。5.2 导出模型并部署到视频检测验证集表现稳定后把训练好的模型导出为 ONNX 或 TensorRT 格式加速推理。YOLOv8 一行命令就能导出yolo export modelbest.pt formatonnx dynamicTrue导出后配合 ONNX Runtime 跑视频流检测这里给一个基于 cv2 的推理骨架import cv2 import onnxruntime as ort import numpy as np session ort.InferenceSession(best.onnx) input_name session.get_inputs()[0].name cap cv2.VideoCapture(waterway.mp4) while cap.isOpened(): ret, frame cap.read() if not ret: break # 预处理: resize 归一化 img cv2.resize(frame, (640, 640)) img img[:, :, ::-1].transpose(2, 0, 1) img np.ascontiguousarray(img, dtypenp.float32) img / 255.0 img np.expand_dims(img, axis0) outputs session.run(None, {input_name: img}) # 解析 outputs按置信度过滤后画框 # 这部分需要按 YOLOv8 的导出输出格式手动解析 cap.release()ORT 推理比 PyTorch 原生的速度提升明显在 Jetson 或嵌入式设备上跑推荐走 TensorRT 路线。值得注意动态尺寸导出后输入 shape 不固定部署时灵活性更好但部分设备推理引擎可能不支持如果报错就改回固定尺寸导出。5.3 进阶迁移到自有水域场景如果你手里的河道、湖面场景跟数据集里的图片差异较大直接使用预训练权重做推理效果可能不佳。常见的做法是先用这份数据集训一个基线模型然后用你自己的水域照片做增量训练只需要标注几百张图就能显著改善模型在目标场景的识别率。从那以后我每次用新数据集都会强制走一遍完整流程先查目录完整性再统计类别分布剔除异常框最后把增强图片单独挑出来做验证。这套流程执行下来基本没有再因为数据问题翻过车。水面垃圾检测是个长尾场景数据集的边界和坑都不少但把这份资源用好确实能让项目起步快很多希望帮到你。本文还有配套的精品资源点击获取
返回列表