☰
无人机河道漂浮检测数据集构建实战:五类目标识别全流程解析
2026/10/20 8:19:43 网站建设 项目流程

做无人机河道巡查的朋友应该都有同感:跑完几十公里航线,导出的素材动辄几十个G,熬夜看完视频,发现真正需要上报的漂浮物没几处,而水面上最扎眼的往往是乱七八糟的枯枝、白色垃圾、废旧船只。单纯靠人眼去盯,效率太低,漏检率也高得吓人。这两年我一直在折腾"无人机河道漂浮检测数据集"这件事,目标很明确:把废弃船、捕鱼养殖设施、水污染区域、漂浮物这些目标用目标检测模型自动框出来,让河道巡查从"看视频找问题"变成"算法直接给坐标"。这套东西做下来,踩过的坑能写满一条船,今天把思路、流程和实际经验一次性梳理清楚。

很多开发者拿到一个数据集就开始标注、训练,结果模型一上无人机就翻车。问题大多出在源头:类别定义模糊、采集环境单一、标注边界不统一。所以这篇文章不打算只给你一个数据集下载地址,而是把整个项目从需求拆解、数据采集、标注规范、模型训练到落地部署的完整链路讲透。适合正在做智慧水利、河湖监管、环保巡检相关项目的算法工程师,也适合刚入行、想用公开数据集练手的学生。就算你只是负责河道管理的业务人员,看完也能理解为什么算法会漏检、为什么有的垃圾被识别成船。

1. 做这个数据集之前,先想清楚要检测什么

1.1 五类目标的定义与边界

项目标题里列出的五类目标——废弃物、废弃船、捕鱼养殖、水污染、漂浮物——乍看都是水面上待检测的东西,但真到标注环节,这五类之间的边界很容易打架。我最初做第一版标注时,标注员把一块白色泡沫当成"废弃物",同时另一个标注员把它标成"漂浮物",同一个物体出现两个标签,模型直接学懵了。

所以第一步是给每类目标下严格定义,最好写成一页纸的标注手册。我这里按照实际项目经验,给出一套相对成熟的定义:

类别定义典型特征明确排除
废弃物人为丢弃到河道中的固态垃圾白色塑料、玻璃瓶、废弃衣物、泡沫块等自然枯枝落叶不属于此类
废弃船长期停靠或搁浅、失去动力和用途的船只船体锈蚀、半沉状态、舱面破损正常行驶或停泊的可使用船只
捕鱼养殖河道内的渔业生产设施渔网、网箱、浮球、围栏、插杆岸边固定的合法养殖设施另算
水污染水体出现异常颜色或油膜的区域油光带、乳白浊水、蓝绿藻聚集、褐色发臭水体正常泥沙翻涌造成的黄浊
漂浮物漂浮在水面上、随水流移动的物体位置不固定、形态不规则的杂物已明确归入废弃物的固态垃圾

你会发现"废弃物"和"漂浮物"天然存在重叠:一个塑料袋既属于人为垃圾,又会随风漂动。我给的处理原则是:如果是人为制造的特质明显物体,优先标为废弃物;如果是混合杂物、辨识不出具体来源、或正在顺流漂移的团块,标为漂浮物。标注口径统一,比模型调参重要得多。

1.2 为什么要单独区分"漂浮物"和"废弃物"

有朋友问过:既然模型最终要做的是"哪里有垃圾",为什么不合并成一类?答案是:河道管理部门要的不仅仅是"有垃圾"这个结论,还要知道垃圾的成因和清理责任归属。

废弃物通常来自岸上居民倾倒或游客丢弃,需要安排岸线巡查和宣传治理;废弃船涉及船主责任认定,需要协调海事和渔政部门处置;捕鱼养殖设施可能涉及非法养殖清退;水污染则需要环保部门介入水质采样。如果模型只输出"漂浮物"一个框,后端业务系统就没法做自动工单分类。

从算法角度看,类别分得细还有一个好处:模型在学特征时会更专注。废弃船有清晰的几何轮廓,水污染有特殊的纹理和色度,捕鱼养殖设施有规律排列的浮球和渔网结构。混合成一类会让特征空间互相干扰,最终mAP反而不如细分类。实测下来,五类模型的整体mAP比三分类(废弃物、漂浮物、其他)能高5到8个百分点,尤其是废弃船的召回率提升非常明显。

2. 数据采集是决定效果的第一道关

2.1 飞行参数与相机配置

采集阶段我踩过最大的坑,是拿航测建模的飞行参数去拍河道。航测要求正摄、高重叠率,相机垂直朝下,但河道漂浮物在水面上是三维的,白色垃圾在阳光直射下从正上方看反光强烈,很容易过曝。后来改成云台俯仰角控制在-45度到-90度之间,兼顾侧视纹理和垂直定位精度,效果好很多。

飞行高度建议在30到80米之间。30米以下,一个小塑料瓶能占几百个像素,标注和检测都轻松,但单架次覆盖河道太短,效率低;80米以上覆盖范围大了,可漂浮物目标本身可能只有十几厘米,在画面里就十几个像素,模型根本认不出来。我常用的方案是:主干河道用50米高度,速度控制在8米/秒以内;支流和窄河道用30米,速度降到5米/秒。这样单张影像的地面分辨率大约在1到2厘米,足够看清大多数漂浮物。

相机参数方面,别迷信动不动就上亿像素的中画幅。消费级或行业级四轴无人机搭载的2000万像素CMOS已经够用,关键是电子快门速度要快。河道上无人机一直在动,水面目标又在飘,快门速度低于1/1000秒很容易拍糊。光线好的白天,ISO压到100,光圈收缩到f/5.6左右,保证景深覆盖整个水面。另外一定要开启连拍模式,每1到2秒拍一张,给后续筛选留足余量。

2.2 水文和光照条件的采样策略

只在大晴天中午去拍,数据集就废了一半。不同天气和光照下,水面目标的视觉特征差异非常大。阴天时白色垃圾和灰色塑料瓶对比度低,很容易和背景融为一体;傍晚逆光时整个河面都是银色反光,除非拉高阴影,否则什么都看不清。所以采集计划要刻意覆盖三个维度:

  • 光照:晴天上午、正午、傍晚各拍一组;阴天、小雨后各拍一组;雾天如果条件允许也拍。
  • 水面状态:静水、缓流、风浪三类。风浪大时漂浮物会忽隐忽现,适合训练模型的鲁棒性。
  • 背景环境:城市河段、郊区自然河段、工业区河段。城市河段背景杂乱,岸线护栏、建筑边缘容易误检;自然河段有大量植被倒影干扰。

我统计过自己的数据分布,晴天数据占65%、阴天占25%、其他占10%。模型在阴天场景下的表现会明显下降,所以如果条件允许,尽量补充阴天数据。实在缺数据时,可以用图像处理做天气风格迁移,但效果不如真实数据,只能作为应急手段。

2.3 样本平衡与难例挖掘

河道漂浮物的真实分布极端不均衡。我在某条城市河道采集了4个架次,总共1200多张影像里,有废弃船的只有几张,水污染区域几乎没有,而漂浮物和废弃物占了大头。如果直接拿去训练,模型会严重偏向多数学类别,废弃船的召回率可能连20%都不到。

解决思路有两个:一是采集时主动寻找目标密集区。废弃船通常在码头角落、废弃渡口附近;捕鱼养殖设施多出现在非主航道的静水湾;水污染则要盯住排污口下游。别只沿着主河道中线飞,贴着岸边飞才能找到这些"冷门"类别。二是靠后续的样本重采样和增强来补偿。我这里采用的做法是:对少数类别做复制粘贴增强——把废弃船的实例裁剪出来,随机粘贴到不同背景的河道图上,再配合亮度、对比度、轻微旋转扰动。这种方法虽然粗暴,但对小样本类别特别有效,废弃船的AP从0.32提到了0.61。

难例挖掘也必须在采集阶段就做。水面上真正难检测的不是大目标,而是被遮挡半个身子的目标、半沉在水下的目标、还有与枯枝混在一起的杂色目标。采集时遇到这一类场景,别嫌难看,多拍多存。模型能不能在实战中顶住,很大程度就看这些难例覆盖够不够。

3. 标注规范与工具链

3.1 标注工具选择与流程

标注方面,试过几款工具后固定下来一套组合:初级筛选用开源工具快速框选,复杂场景再用多边形精细标注。常用的开源工具有LabelImg和X-AnyLabeling,前者适合矩形框快速标注,后者支持多边形分割和半自动模型辅助,能省不少力气。我们最终使用的是X-AnyLabeling,原因是它自带YOLOv5预训练模型,可以先用模型预标注一遍,人工只需修正错框和补漏框。这条流程能让标注效率提升3倍以上。

标注流程建议这样组织:

  1. 数据预处理:把无人机原始影像按架次归档,剔除模糊、过曝、重复率过高的图像。
  2. 预标注:用已有模型或公开预训练模型跑一遍,生成初版标签文件。
  3. 人工修正:标注员逐图检查,修正类别错误、边界偏移、漏框。
  4. 交叉审核:同一张图由两位标注员独立审一遍,不一致的地方由项目负责人仲裁。
  5. 格式转换:统一输出为COCO格式或YOLO格式,便于后续训练。

这里特别强调一点:标注框的边界不能贴着目标边缘,得留约2%的边距。水面目标的边缘充满锯齿状波纹,如果框太紧,模型会去学习那些波纹纹理,反而降低泛化能力。留一点余量,让模型把精力放在目标主体特征上。

3.2 类间重叠和遮挡的处理规则

实际标注时,废弃船旁边经常漂浮着一圈垃圾,渔网浮球下面也有青苔和水草,这些重叠情况怎么处理,非常考验标注规则。

我的规则是:

  • 如果两个不同类别的目标在画面上有重叠,但各自的轮廓依然可辨认,就分别标框,不用强行切分。
  • 如果一个目标被另一个目标遮挡超过60%,则只标可见部分作为当前类别;完全看不见的部分不标注。
  • 同一目标在连续多帧中出现,每一帧都需要标注,不能只在第一帧标完后面偷懒。
  • 捕鱼养殖设施中的每个浮球如果单独出现且间距较大,可以分开标注;如果密集连片,标成一个整体的"设施区"。

这些规则看着琐碎,但对训练结果影响巨大。一开始我没规定遮挡超过多少算不可标注,结果标注员有的标、有的不标,模型一会儿学"完整目标"一会儿学"残缺目标",预测框忽大忽小。规则写完后再没出过这种问题。

3.3 质量校验的实操方法

标注完成后千万别急着训练。我用一套"三层校验法"来控制质量:

第一层是格式校验。写脚本检查每张图对应的标签文件是否存在、坐标是否超出图像边界、类别编号是否在合法范围内。这些低级错误不筛掉,训练时会莫名报错。

第二层是可视化校验。把标注框绘制回原图,生成一张张带框预览图,人工快速翻看。重点检查大头小框、小头大框、类别错标这三类情况。水污染区域的特征是边界模糊,标注员容易把正常河面也圈进去,画预览图时一眼就能看出来。

第三层是统计校验。按类别统计目标数量和尺寸分布,检查是否有类别缺失或异常尺寸。比如某一天标注的废弃船全部是"长条形"大框,说明标注员可能把正常行驶的船也误标进来了,需要复查。

我做过粗标后直接训练,mAP只有0.45;走完三层校验再训练,同样数据量mAP升到0.62。所以别觉得校验是浪费时间,它是在给模型省麻烦。

4. 模型训练与调优

4.1 预训练选择与数据增强

算法选型上,我试过两阶段检测器也试过单阶段,最后固定用YOLOv8系列。理由很简单:河道巡检最终要部署到机载边缘计算盒子上,帧率必须拉满,单阶段更适合。模型规模方面,用YOLOv8s作为基础,不要一上来就上x模型。x模型精度是高,但在边缘设备上推理速度可能只有不到15帧每秒,跟巡检需求严重不匹配。

加载预训练权重时注意一点:不要直接用COCO预训练权重在河道数据集上练几十个epoch就完事。COCO数据集里有船、有瓶子,但河道背景、视角、光照和COCO完全不同。更好做法是先在类似的无人机航拍数据集上做一层中间预训练,或者用原权重先冻结backbone训练10个epoch,让模型适应新的数据分布,再解冻微调。我用这个策略后,训练收敛速度快了一倍,早期震荡也小很多。

数据增强方面,除了常规的mosaic、随机翻转、色彩抖动之外,强烈建议加入模拟水雾和反光的增强。我用的是随机在图像上叠加高斯噪声块和亮度渐变带,模拟水面反光。这样增强出来的样本,让模型在真实强反光的河道画面上表现稳定不少。注意增强不要太狠,mosaic比例调到0.5左右就好,全图mosaic容易让漂浮物目标变得太小失真。

4.2 评估指标和验证集划分

河道漂浮检测这份工作,光看mAP是不够的。mAP是整体平均,但实际业务里"漏检"和"误检"的代价完全不同。漏掉一艘废弃船,可能影响清障工作安排;误报一处水污染,则会让环保人员白跑一趟。所以评估时我一般拆分指标看:

  • 各类别的AP和AR(平均召回率),重点盯少数类别。
  • 不同距离段的检测率:把标注框按像素面积分成大、中、小三类,分别统计AP。小目标AP低于0.3的话,说明飞行高度或增强策略需要调整。
  • 误检率:统计没有与任何真值匹配的预测框,这部分过高会造成工单系统被垃圾消息淹没。

验证集划分也有讲究。普通数据集随机划分就行,河道数据不行——同一架次连续拍摄的图像之间高度相似,如果训练集和验证集混在一起,验证指标会虚高。正确做法是按架次或按河段划分,保证验证集里出现的场景和训练集没有重叠。实践结果:随机划分验证集mAP是0.70,按架次严格划分后变成0.58,后者才是模型在真实新场景上的真实水平。

4.3 在边缘设备上部署的取舍

训练之后就是部署。河道巡检无人机目前常见的边缘设备是NVIDIA Jetson Orin系列,也有用华为Atlas的,但平民玩法还是Jetson。在Orin上先尝试TensorRT FP16推理,精度几乎不掉,速度比PyTorch原生快4倍左右。我实际测试YOLOv8s在Orin Nano上的TensorRT推理,输入640分辨率,大约35到40帧每秒,完全够用。

部署时要做的几个压缩动作:

  • 输入尺寸从640降到512甚至416,河道目标大多较大,不需要极高分辨率就能检出,换来明显速度提升。
  • 类别数只有5个,最后一层卷积通道数可以裁掉一部分,模型体积能减小10%左右。
  • 非极大值抑制的置信度阈值调到0.25,IOU阈值调到0.45,这是适合水面目标的经验参数。

但别光顾着压缩,巡检场景中最关键的是要保留"连续帧关联"逻辑。模型每帧输出结果后,需要一个跟踪算法把同一个目标在多帧中关联起来,避免同一漂浮物在连续视频帧里反复上报。我这里用的是ByteTrack,轻量且对遮挡场景友好。部署时把检测和跟踪封装成同一个服务,输出直接写进JSON消息队列,后端平台就能自动生成工单。

5. 真实场景落地中的常见问题

5.1 水花反光和倒影误检

落地测试中最让人头疼的是倒影。岸边的树、桥、建筑在水里的倒影,纹路复杂,模型经常把它们当成漂浮物。尤其是波纹扰动后,倒影碎成一团一团,和白色垃圾在特征上极为相似。

我踩过这个坑后总结了几条对策:

  • 训练数据里主动标注倒影区域作为"背景"参与训练,让模型见过足够的倒影样本。
  • 推理阶段对画面顶部区域做掩膜处理:无人机正射视角下,靠近岸边的倒影区域通常集中在上部,算法上可以降低这些区域的置信度。
  • 适当降低检测阈值,配合跟踪器做时间平滑。倒影会因为水面波动而不断变化,跟踪轨迹不稳定;而真实漂浮物是持续存在的,轨迹稳定。这样可以滤掉大量倒影虚警。

5.2 小目标漏检问题

尽管采集时尽量飞低一些,但实际巡检为了覆盖整个河段,飞行高度常常在60米往上,瓶盖大小的垃圾在画面里只有几个像素。这种小目标是最容易漏检的。

除了前面说的提高采集分辨率、增加小目标样本增强,推理阶段还有一个技巧:切片推理。把一张大图切成四个区域分别送进模型,再融合结果。虽然推理耗时变成4倍,但小目标的检出率提升明显。如果设备算力允许,把切片推理和跟踪器结合,小目标漏检率能下降三到四成。

5.3 类别混淆的典型案例

最后一个常见问题就是类别之间互相混淆。最常见的是"废弃船"和"捕鱼养殖"之间打架:一条报废的小木船横在水面上,旁边漂着渔网浮球,模型有时会把船体加渔网整体识别成捕鱼养殖设施。原因在于两者都有"木结构+绳索+浮球"的组合特征。

我调优时的做法是:增加大量包含半沉船体与渔网共存的样本,并在标注时把与废弃船直接相连的渔网归入废弃船类别,只圈出虾笼、浮球等独立设施为捕鱼养殖。这样模型学到的特征区分度更清晰。还有一类是"废弃物"和"水污染"的混淆——大面积碎白色垃圾在低分辨率下呈现灰白色调,和乳浊水污染很像。这种只能靠纹理特征区分,垃圾有颗粒感边界,污染是连续弥散的。模型层面,把输入分辨率提高一些,同时在标注阶段对水污染边界画得更宽松,对废弃物边界画得更紧凑,能在一定程度上缓解。

5.4 常见问题速查表

问题现象可能原因解决动作
倒影误检严重训练集缺倒影负样本补充倒影样本或做区域掩膜
小目标召回低飞行高度过高、增强让小目标失真降低高度、切片推理、补充小目标增强
废弃船与渔具混淆两者特征组合相似增加共存样本、精细标注规则
水污染和废弃物混淆分辨率不足、边界划分不一提高输入尺寸、统一边界标注规范
同一条河道不同河段效果差距大训练集背景单一按河段采集更多元数据、硬负样本挖掘
连续帧重复上报缺少跟踪模块接入ByteTrack等轻量多目标跟踪

数据集的构建不是一锤子买卖。我个人体会最深的,是"算力模型再强,也补不上数据定义的窟窿"。五类目标看上去是五个名字,背后是五套完全不同的业务逻辑和视觉特征。把类别边界划清楚、把采集干扰源覆盖全、把标注规则落实严格,模型效果自然就出来了。如果你正准备做类似方向,别急着到处找公开数据集——先带着无人机去自己要巡检的真实河道飞两趟,看看水面到底有什么,再回头定标注方案,你会回来感谢我的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询