ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

构建水面漂浮物检测数据集:从数据采集到YOLOv8模型实战

构建水面漂浮物检测数据集:从数据采集到YOLOv8模型实战 简介本资源是面向计算机视觉初学者与环保AI应用研究者的水面漂浮物目标检测数据集聚焦于水面垃圾识别这一典型应用场景适用于YOLO、Faster R-CNN等主流目标检测模型的训练与验证。数据集共2400张图像压缩包内含2000个XML标注文件其余为对应图像全部采用labelImg工具标注类别涵盖bottle、plastic-bag、milk-box等8类常见漂浮物标注信息完整记录边界框坐标与类别标签配套提供XML转TXT/JSON格式的实用脚本便于适配不同深度学习框架。资源包大小157.8MBRAR压缩格式目录结构简洁标注文件命名规范利于批量加载与数据预处理。已有568人下载学习特别适合开展水域环境监测、智能清污系统原型开发或课程设计项目可直接用于模型训练、评估及数据增强策略验证。1. 项目概述为什么我们需要一个专门的水面漂浮物数据集在计算机视觉领域目标检测已经不是什么新鲜事了。从人脸识别到自动驾驶各种成熟的数据集和算法层出不穷。但当我真正接手一个河道巡检和水质监测的项目时才发现一个尴尬的现实想找一个能直接用的、高质量的水面漂浮物检测数据集简直比大海捞针还难。这就是我决定动手制作这个包含2400张图像的数据集的初衷。水面漂浮物检测听起来简单不就是把水面上漂着的东西框出来吗但实际操作起来挑战重重。首先场景极其复杂。水面本身不是静止的背景板它会反光、有波纹、颜色随天气和光线剧烈变化。晴天正午的波光粼粼和阴雨天的灰暗水面对算法来说几乎是两个世界。其次目标物本身千奇百怪。塑料袋、泡沫、树枝、水草、生活垃圾甚至油污形成的彩色膜它们的颜色、形状、纹理没有规律可循大小差异也极大远处的一个小瓶盖和近处的一大片垃圾堆都需要被检测。最后干扰项太多。水中的倒影、岸边的植被、飞溅的水花都很容易被误判为目标。市面上常见的通用目标检测数据集如COCO、VOC虽然包含“瓶子”、“包装袋”等类别但它们的背景多是室内、街道与复杂的水面环境相去甚远。直接用这些数据集训练的模型放到真实河道、湖泊场景中误报和漏报率会高得离谱。因此一个针对性强、场景覆盖全面的专用数据集就成了推动相关技术落地应用的关键基础设施。这个2400张的数据集就是为了填补这个空白为环境监测、智慧水务、无人船巡检等应用提供一个可靠的“练兵场”。2. 数据集构建全流程从想法到2400张标注图像2.1 数据采集策略与场景设计构建数据集的第一步也是最关键的一步就是采集什么样的图像。我给自己定下的核心原则是最大限度覆盖真实应用中的复杂性。这意味着不能只在一个晴天、一个角度、一片水域拍摄。我主要规划了四大类采集场景不同水域类型包括城市内河、公园湖泊、水库边缘、乡村沟渠。城市内河背景复杂常有桥梁、建筑倒影公园湖泊水面相对开阔但可能有游船干扰水库边缘水体较深颜色偏暗乡村沟渠则可能充满水草和淤泥颜色。不同天气与光照条件这是确保模型鲁棒性的关键。数据集必须包含晴天强光、高对比度、阴天光线均匀、色彩饱和度低、多云光线变化快以及清晨、黄昏等低光照时段的数据。特别加入了雨后场景此时水面浑浊漂浮物可能被部分遮盖。不同拍摄视角与距离模拟各种巡检方式。包括岸边固定摄像头视角、手持设备近岸拍摄、无人机高空俯拍以及无人船搭载摄像头的近水面平视角度。视角的变化会带来目标尺度、形状和遮挡关系的巨大差异。目标物多样性尽可能收集多种漂浮物。除了常见的塑料瓶、塑料袋、泡沫板、枯枝落叶我们还特意纳入了以下难例半沉浮物体如部分浸水的纸箱只有一角露出水面。透明/反光物体如薄塑料袋其轮廓与水面反光极易混淆。细小目标如远处的瓶盖、烟头在图像中可能只有几个像素。聚集目标成堆的垃圾需要模型既能检测整体又能区分个体。采集设备主要使用了高分辨率的单反相机、消费级无人机以及工业级防水摄像头确保原始图像质量。最终通过实地拍摄和部分合规的网络开源资源补充我们获得了超过3000张原始图像经过筛选剔除了模糊、重复度过高的保留了2400张最具代表性的。2.2 数据标注规范与质量控制数据标注是数据集的灵魂标注质量直接决定模型的上限。我们采用目标检测中最常用的边界框Bounding Box标注格式并制定了严格的标注规范类别定义我们没有进行过于细致的分类如区分可乐瓶和矿泉水瓶而是根据处理优先级和视觉特征定义了5个主类别plastic硬质塑料如瓶子、容器。bag软质塑料如塑料袋、包装膜。foam泡沫制品如泡沫板、快递填充物。organic自然有机物如树枝、水草、树叶。other其他难以归类的漂浮物如织物、橡胶制品等。标注细则边界框紧密度要求框体紧贴目标物边缘减少背景冗余但也不能切掉目标本身。对于半沉浮物体只标注露出水面的部分。遮挡处理被严重遮挡超过50%且无法推断完整形状的目标不予标注。部分遮挡的标注可见部分。阴影与倒影水面上物体的倒影不标注。物体自身在水面的投影如果是其连续、清晰的延伸部分资深标注员可根据情况判断是否纳入框内但原则上“宁缺毋滥”避免引入歧义。小目标处理对于图像中长边小于15像素的目标我们依然进行标注但会单独记录用于后续训练时调整模型对小目标的敏感度。质量控制流程采用“一审一校”加“抽检”的模式。初审由标注员完成初步标注。复核由另一名更有经验的标注员进行校对修正框体位置、类别错误。专家抽检我会随机抽取10%的数据进行审查重点检查难例样本的标注一致性。我们使用标注工具如LabelImg、CVAT的评论和问题跟踪功能对有争议的样本进行讨论并确定最终标准。注意标注的一致性比绝对的“正确”更重要。我们内部会维护一个“难例图库”对反复出现的边缘案例比如一片反光像不像塑料袋进行统一裁定确保所有标注员遵循同一套标准。2.3 数据集划分与预处理2400张图像不能一股脑儿扔给模型。科学的划分能有效评估模型的泛化能力。我们采用的分割比例是训练集Train Set: 验证集Validation Set: 测试集Test Set 70% : 15% : 15%。训练集1680张用于模型学习、更新权重。验证集360张在训练过程中用于调整超参数如学习率、监控模型是否过拟合以及进行模型选择不同轮次的模型。测试集360张绝对独立。只在最终模型训练完成后使用一次用于提供模型在“从未见过的数据”上的性能的无偏估计反映其真实泛化能力。关键点在于划分策略我们采用了分层抽样。不是简单随机打乱而是确保训练集、验证集和测试集中不同水域类型、不同天气条件、不同目标类别的比例大致相同。这样可以防止因为随机划分导致的某个场景如“阴天水库”全部落入某个集合从而造成评估偏差。在预处理方面我们主要做了两件事统一尺寸与格式将所有图像缩放至一个统一的尺寸如1333x800这是许多现代检测模型的推荐输入尺寸之一并转换为RGB格式存储为JPEG或PNG。生成标注文件将标注信息边界框坐标、类别标签转换为模型训练通用的格式如COCO JSON格式或YOLO的TXT格式。COCO格式结构清晰包含图像信息、标注信息、类别信息便于管理和后续扩展。至此一个结构清晰、标注规范、覆盖全面的水面漂浮物检测数据集便构建完成了。它的目录结构通常如下water_floating_debris_dataset/ ├── images/ │ ├── train/ # 1680张训练图像 │ ├── val/ # 360张验证图像 │ └── test/ # 360张测试图像通常不公开标签 ├── annotations/ │ ├── instances_train.json # COCO格式训练标注 │ └── instances_val.json # COCO格式验证标注 └── README.md # 数据集说明文档3. 基于数据集的目标检测模型实战训练有了高质量的数据集下一步就是让它“活”起来训练一个能用的模型。这里我以经典的YOLOv8模型为例展示完整的训练和评估流程。3.1 模型选择与环境配置为什么选YOLOv8因为它目前在精度和速度上有一个很好的平衡生态完善Ultralytics维护且非常易于上手。对于水面漂浮物这种需要实时或准实时检测的应用如无人机巡检视频流速度是一个重要考量。训练环境硬件至少配备一块显存8GB以上的NVIDIA GPU如RTX 3070/4060或以上。GPU训练比CPU快数十倍。软件操作系统Ubuntu 20.04/22.04 或 Windows 11WSL2环境下。Python 3.8。PyTorch 1.12 及对应的CUDA工具包。Ultralytics YOLO库pip install ultralytics3.2 数据准备与配置文件编写首先按照YOLO要求的格式组织数据。YOLO通常使用TXT格式的标注每个图像对应一个TXT文件每行表示一个目标class_id x_center y_center width height坐标是归一化后的0-1之间。我们需要创建一个数据集配置文件如water_debris.yaml这是YOLO读取数据的入口# water_debris.yaml path: /path/to/your/water_floating_debris_dataset # 数据集根目录 train: images/train # 训练集图像路径相对path val: images/val # 验证集图像路径相对path test: images/test # 测试集图像路径可选 # 类别数量与名称 nc: 5 # number of classes names: [plastic, bag, foam, organic, other]3.3 模型训练与关键参数解析训练命令非常简单但背后的参数调优才是关键yolo taskdetect modetrain modelyolov8n.pt datawater_debris.yaml epochs100 imgsz640 batch16 workers4让我拆解一下这些核心参数及其设置原因modelyolov8n.pt这里从YOLOv8 Nano最小模型开始。对于初始实验或资源受限的场景小模型更快。如果效果不佳可以升级到yolov8s.pt小、yolov8m.pt中等。epochs100迭代轮数。这是一个起点实际需要观察验证集损失曲线在损失不再明显下降时提前停止防止过拟合。imgsz640输入图像尺寸。更大的尺寸如1280可能带来精度提升但会显著增加显存消耗和训练时间。640是一个在精度和效率间较好的折中点。batch16批大小。在显存允许范围内尽可能设大可以提高训练稳定性和速度。如果出现“CUDA out of memory”错误需要降低batch或imgsz。workers4数据加载的进程数。用于加速数据从磁盘到内存的读取。通常设置为CPU核心数的2-4倍。更重要的进阶调参学习率lr0这是最重要的超参数之一。YOLOv8有自动调整学习率的功能但如果你发现训练不稳定损失NaN或收敛慢可以手动调整。例如yolo ... lr00.01。一般从默认值开始如果发散则调小如0.001如果收敛慢则调大。数据增强YOLOv8默认开启了强大的数据增强Mosaic MixUp等这对于提升模型泛化能力至关重要。对于水面场景我们可以考虑调整增强参数例如增加色彩抖动hsv_h,hsv_s,hsv_v来模拟不同光照下的水面颜色变化谨慎使用旋转degrees因为水天相接的水平线方向是固定的。权重衰减weight_decay防止过拟合的正则化手段。如果验证集精度远低于训练集精度可以尝试适当增加weight_decay值。训练过程会在runs/detect/train/目录下生成所有结果包括权重文件、损失曲线、精度召回率曲线、混淆矩阵等可视化图表。务必密切关注results.png中的验证集损失val/box_loss, val/cls_loss它是判断模型是否过拟合、是否需要早停的核心依据。3.4 模型评估与性能解读训练完成后使用独立的测试集进行最终评估yolo taskdetect modeval modelruns/detect/train/weights/best.pt datawater_debris.yaml评估报告会给出关键指标对于目标检测我们主要看mAP0.5 (Mean Average Precision)这是最核心的综合指标。它计算了在交并比IoU阈值为0.5时所有类别的平均精度AP的平均值。值越高越好。一个在通用数据集上优秀的模型如COCO上mAP0.50.5在我们这个复杂的水面数据集上初始可能只有0.3-0.4经过针对性训练后应能提升到0.6以上。mAP0.5:0.95在IoU阈值从0.5到0.95步长0.05区间内计算的平均mAP。这是一个更严格的指标要求预测框与真实框的重合度更高。它更能反映模型的定位精度。各类别的精度Precision和召回率Recall精度Precision模型预测为正的样本中真正为正的比例。高精度意味着误报把水花、倒影当成垃圾少。召回率Recall所有真实的正样本中被模型预测出来的比例。高召回率意味着漏报没检测到真正的垃圾少。在实际水务巡检中我们往往更追求高召回率宁可多报一些也不能漏掉明显的漂浮物后续可以人工复核。但精度也不能太低否则告警过多会淹没有效信息。需要根据业务需求权衡。通过分析混淆矩阵我们能发现模型的具体弱点。例如如果foam泡沫类经常被误检为bag塑料袋说明这两类在特征上容易混淆可能需要补充更多边界样本到训练集或者调整数据增强策略。4. 实际应用挑战与模型优化方向用标准流程训练出一个模型只是第一步。要把模型部署到真实的河道监控或无人船上还会遇到一系列挑战。4.1 复杂场景下的典型问题与应对水面反光与镜面反射这是最大的干扰源。强光下水面会出现高光点或大片反光区域其纹理和亮度可能与白色泡沫或塑料袋极其相似。应对策略数据层面在数据集中必须大量包含各种角度的反光样本并将其明确标注为背景负样本。可以专门采集晴天正午等强反光时段的数据。模型层面尝试使用对光照变化更鲁棒的模型结构或在模型输入端加入注意力机制让模型学会“忽略”高亮区域。后处理层面可以设定一个基于区域亮度或色彩饱和度的简单规则过滤器对模型预测出的、位于极高光区域的目标进行二次筛选但需谨慎避免误杀。小目标检测远处的漂浮物在图像中可能只有几十甚至几个像素极易漏检。应对策略数据层面确保数据集中包含足够比例的小目标如标注规范中所述并在训练时使用更小的锚框Anchor尺寸以适应小目标。模型层面选用擅长小目标检测的模型变体。YOLOv8本身的多尺度检测头FPN/PAN结构对小目标有较好支持。可以尝试将输入图像尺寸imgsz调大如从640到1280让模型看到更多细节但这会牺牲速度。技巧在推理时对大尺寸原图采用“滑动窗口”或“图像金字塔”的方式进行多尺度检测然后合并结果能有效提升小目标召回率但计算成本高。目标密集与遮挡垃圾聚集区目标相互重叠、遮挡。应对策略现代检测模型如YOLO的非极大值抑制NMS算法能处理一定程度的重叠。对于严重遮挡模型能力有限。在标注时对于被遮挡部分超过50%的独立个体可以不标将其视为一个整体“聚集垃圾”进行检测这需要调整数据集的类别定义。4.2 模型轻量化与部署考量很多水务应用场景计算资源有限如边缘计算盒子、嵌入式设备。模型选择优先使用YOLOv8nNano或YOLOv8sSmall这类轻量级模型。也可以探索更极致的轻量化网络如NanoDet、PP-PicoDet。模型压缩剪枝移除网络中不重要的连接或通道。量化将模型权重从32位浮点数FP32转换为8位整数INT8可以大幅减少模型体积和加速推理且精度损失通常很小。YOLOv8官方支持导出为INT8量化格式。部署框架根据硬件选择合适的前向推理框架。常见的有NVIDIA GPUTensorRT性能最优。Intel CPU/OpenVINOONNX Runtime OpenVINO。移动端/边缘设备TFLiteTensorFlow Lite、Core ML苹果、NCNN腾讯。ONNX作为中间格式具有很好的跨平台性先用yolo export modelbest.pt formatonnx导出再转换到目标平台。4.3 持续迭代与数据闭环一个数据集和模型绝不是一劳永逸的。在实际部署中模型会遇到前所未见的“新情况”。主动收集难例建立一个渠道将模型在线上推理时置信度低、预测错误或人工复核发现的漏检/误检样本收集起来。数据清洗与标注定期对这些难例进行清洗和标注并入原始训练集。模型迭代更新用扩充后的数据集重新训练或微调模型形成“数据收集 - 标注 - 训练 - 部署 - 收集”的闭环。这个过程能持续提升模型在实际场景中的表现。5. 常见问题排查与实战心得在构建数据集和训练模型的整个过程中我踩过不少坑也积累了一些不一定在官方文档里能找到的经验。5.1 训练过程中的常见问题损失Loss不下降或为NaN原因最常见的原因是学习率lr0设置过高。数据标注存在严重错误如坐标超出图像范围也可能导致。排查首先检查数据标注格式是否正确。然后将学习率调低一个数量级例如从默认值调到0.001重新尝试。也可以使用YOLOv8的--warmup-epochs参数让学习率从小值慢慢“热身”增加。验证集损失上升训练集损失下降过拟合原因模型记住了训练数据的噪声而非一般规律。可能因为模型太复杂如用了YOLOv8x但数据只有几千张或数据增强不够。排查观察训练曲线。如果验证集损失在某个epoch后开始反弹而训练集损失持续下降就是过拟合。解决增加数据增强的强度在YOLO配置中调整augment相关参数。使用早停Early Stopping在验证集损失最低的点保存模型。增加正则化如调高weight_decay参数。最根本的是收集更多样化的训练数据。某个特定类别如other的AP值极低原因该类别样本数量太少或样本内部差异太大模型难以学习。排查查看数据集统计确认other类别的图像数量和实例数量。检查这个类别下的标注是否一致是否把太多不相关的东西都归为other。解决如果样本少尝试对该类别的图像进行过采样复制或使用更强的类别权重class weights。如果类别定义模糊考虑重新审核标注看是否能将其拆分到已有类别或定义更清晰的子类。5.2 推理部署中的实战技巧置信度阈值conf的调优模型预测时会输出一个置信度分数。默认阈值如0.25可能不适合所有场景。高召回优先在巡检场景为了不漏检可以降低置信度阈值如0.15这样会检出更多目标包括一些可能是误报的后续再通过其他规则或人工筛选。高精度优先在自动报警或触发清理设备时需要高精度应提高置信度阈值如0.5确保每个告警都很有把握。动态调整可以根据一天中的时间光照条件或不同摄像头的位置设置不同的置信度阈值。处理视频流时的抖动问题对视频进行逐帧检测时同一个漂浮物的检测框可能在不同帧间轻微跳动。解决在检测后加入一个跟踪器如ByteTrack、Bot-SORT。跟踪器可以关联连续帧中的同一目标赋予一个稳定的ID并平滑其运动轨迹从而输出更稳定、更易处理的结果。性能与精度的权衡在边缘设备上帧率FPS和精度mAP需要取舍。技巧不是所有帧都需要检测。对于静止或慢速移动的摄像头可以每N帧如每秒2-5帧进行一次全分辨率检测中间帧使用轻量级的光流法或差分法判断是否有新目标出现再触发检测。这能大幅降低平均计算开销。构建和运用一个专业的数据集远不止是收集图片和画框。它贯穿了问题定义、场景分析、数据工程、模型训练、调优部署和持续迭代的全链路。这个2400张的水面漂浮物数据集就像一块精心打磨的磨刀石只有用它才能磨砺出真正能在复杂自然环境中“看得清、认得准”的AI利刃。整个过程下来最大的体会是数据质量决定模型上限而理解业务场景的细微之处是提升数据质量的关键。下次当你发现一个模型在测试集上表现良好但在真实场景中“翻车”时第一个要怀疑的很可能就是你的数据集是否真的覆盖了现实世界的所有“奇葩”情况。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进