1. 河道巡检为什么非得用无人机加图像识别
我最早接触河道垃圾巡检这个场景,是跟着一个做水利信息化的朋友去现场。那天我们沿着一条城乡结合部的河道走了三公里,两个工人拿着长柄网兜捞漂浮物,岸上还有人拿本子记录位置。一上午下来,捞了不到两百米,人已经累得不行,而且很多垃圾在河中央,根本够不着。朋友当时就说,这活儿要是能靠无人机拍一圈、后台自动标出来哪里有垃圾,效率能翻好几倍。
这个需求其实非常典型。河道垃圾有两个特点:一是分布散,今天这片有,明天可能就漂到下游去了;二是位置偏,很多河段两岸根本没有路,人走不过去,船也不一定开得进去。传统的人工巡检方式,受限于地形和人力,覆盖范围小、周期长、成本高,而且记录全靠人眼和手工,数据很难沉淀下来做趋势分析。无人机加图像识别这套组合,解决的正是“看得见、看得全、看得快”这三个核心问题。
具体来说,这套方案能做的事情包括:按预设航线自动飞行拍摄河面,把图像实时或离线传回来,用训练好的模型自动识别出塑料瓶、编织袋、泡沫块、枯枝等常见漂浮物,输出垃圾的位置、类别和大致数量,最后汇总成一张“垃圾分布热力图”。适合谁来参考呢?如果你是做环保信息化的开发人员、水利水务单位的技术负责人,或者是一个想用无人机做点实际项目的爱好者,这套东西都能直接借鉴。它不需要你从零造无人机,也不需要你是深度学习专家,核心是把几个成熟模块串起来,调通就行。
我下面会从整体架构怎么设计、关键环节怎么落地、实际跑起来会遇到什么问题这几个角度,把整个项目拆开讲。里面涉及的工具选型和参数,有些是我自己试过的,有些是同行踩坑后总结的,你按自己的场景取用就好。
2. 整体架构怎么搭:从飞行到出结果的完整链路
2.1 先想清楚数据流,再谈选型
很多人一上来就问“用什么模型”“买哪款无人机”,我觉得顺序反了。你应该先把数据从产生到消费的链路画出来,再倒推每一环需要什么。河道垃圾识别这条链路,我习惯分成四段:采集端、传输端、计算端、展示端。
采集端就是无人机加相机,负责把河面拍清楚。传输端负责把图像从天上弄到地上,可以是实时图传,也可以是降落后拷贝存储卡。计算端是跑识别模型的地方,可以在机载边缘设备上跑,也可以在地面服务器或云端跑。展示端是把识别结果呈现给业务人员,通常是一张地图加一个列表。
这四段里,最容易出问题的是采集端和计算端的衔接。因为河面反光、水波、阴影这些干扰,拍出来的图跟你在实验室里用的数据集差别很大,模型直接拿公开数据集训练,落地效果往往很差。所以架构设计时,必须给“数据回流”留位置——也就是把实际飞行拍到的图,定期拿回来重新标注、重新训练,让模型逐步适应你这条河。
2.2 边缘计算还是云端计算,怎么选
这是架构里第一个要拍板的决策。两种方式我都跑过,各有适用场景。
边缘计算是把识别模型直接部署在无人机挂载的计算模块上,比如机载的AI盒子或者带NPU的开发板。好处是响应快,拍完立刻出结果,不依赖网络,适合河道偏远、信号差的场景。坏处是算力有限,模型得压缩,精度会打折扣,而且机载设备增加重量,影响续航。
云端计算是把图像传回地面站或服务器再跑模型。好处是算力充足,可以用大模型,精度高,模型更新也方便。坏处是依赖传输链路,实时性差一些,如果做实时图传,带宽压力不小。
我的建议是分阶段来。前期验证阶段用云端,因为你要反复调模型、换参数,云端迭代快。等模型稳定了,如果业务要求实时性,再考虑往边缘迁移。迁移的时候用模型量化、剪枝这些手段把模型压小,精度损失控制在可接受范围内。
| 对比维度 | 边缘计算 | 云端计算 |
|---|---|---|
| 响应延迟 | 低,拍完即出 | 较高,依赖传输 |
| 模型精度 | 受算力限制,需压缩 | 可用大模型,精度高 |
| 网络依赖 | 弱 | 强 |
| 设备重量 | 增加,影响续航 | 无额外负担 |
| 迭代便利性 | 差,需重新部署 | 好,服务端更新即可 |
| 适用阶段 | 稳定后的生产环境 | 前期验证与调优 |
2.3 飞行平台的选择逻辑
无人机这块,我不建议一上来就买最贵的。河道巡检的飞行任务有几个特点:航线相对固定、飞行高度不高、速度不快、对悬停稳定性有要求。基于这些,选型时重点看三件事:续航、载荷、飞控开放性。
续航决定了单架次能覆盖多长的河道。一般消费级四轴无人机续航在30分钟左右,实际有效作业时间打个七折。如果河道很长,要么多备电池轮换,要么选续航更长的机型。载荷决定了你能挂什么相机和计算设备,普通可见光相机够用,但如果要做夜间或雾天巡检,就得考虑其他传感器。飞控开放性决定了你能不能做自动航线规划和定点悬停拍摄,大疆的MSDK、PX4这些生态都比较成熟,二次开发资料多。
我自己的经验是,前期用一台成熟的消费级或行业级四轴无人机做验证就够了,别急着上倾转旋翼那种复杂构型。等业务跑通了,再根据实际覆盖需求决定要不要升级平台。另外,起降平台这个事,如果河道附近有硬化地面,手抛或垂直起降都行;如果全是软泥地,就得考虑加装起降垫或者选垂直起降机型。
3. 图像识别模型怎么选、怎么训、怎么调
3.1 检测还是分割,先明确输出要什么
图像识别这个大类下面,跟河道垃圾相关的任务主要有两种:目标检测和语义分割。目标检测是给每个垃圾画个框,告诉你“这里有个塑料瓶”;语义分割是逐像素分类,告诉你“这些像素是垃圾,那些是水”。
选哪个取决于你的业务需求。如果只是想知道哪里有垃圾、大概多少,目标检测就够了,标注成本低,模型也轻。如果要精确计算垃圾覆盖面积,或者垃圾和水面颜色接近、框不准,那就得上分割。我做过一个对比,同样一批河道图,检测模型标注一张图大概两分钟,分割模型要十分钟以上,但分割出来的面积统计确实更准。
实际项目里,我倾向于先用检测跑通流程,因为标注快、训练快、部署简单。等业务方提出更精细的需求,再考虑加分割分支。现在很多模型支持多任务输出,检测和分割可以共享主干网络,这个后面讲模型选型时再说。
3.2 数据集从哪来,怎么标才不白干
河道垃圾没有现成的大规模公开数据集,这是最头疼的地方。我试过几个办法:一是自己飞几趟,拍个几百张图,人工标;二是找公开的垃圾检测数据集做预训练,再用自己的数据微调;三是用数据增强把少量样本扩增。
自己拍图的时候,要注意覆盖不同光照、不同天气、不同河段。我一开始只在一个晴天上午飞了一次,标了三百张,模型训出来在阴天和傍晚的图上几乎全瞎。后来补了阴天、逆光、水面有波纹的样本,效果才稳下来。标注工具用LabelImg或者CVAT都行,类别不用分太细,先分“塑料类”“织物类”“其他”三大类,后面有需要再细分。
提示:标注时一定要标“难例”,比如半沉半浮的垃圾、被水草缠住的垃圾、远处的小目标。这些样本对模型提升最大,别嫌麻烦跳过。
数据增强这块,常用的翻转、旋转、亮度调整、加噪声都要上。河道场景特别适合加“水面反光”和“波纹”的模拟增强,能让模型对水面干扰更鲁棒。我一般把增强后的数据量做到原始的三到五倍,再按8:1:1切训练、验证、测试集。
3.3 模型选型:轻量化和精度怎么平衡
模型这块,我的原则是先看部署环境,再定模型大小。如果最终要上边缘设备,那YOLO系列的小模型(比如YOLOv8n、YOLOv5s)是首选,速度快、生态好、部署工具链成熟。如果只在云端跑,可以用更大的模型,比如YOLOv8x或者基于Transformer的检测器,精度更高但推理慢。
我实测过YOLOv8s在河道垃圾检测上的表现,输入640×640,在RTX 3060上大概15毫秒一帧,mAP能到0.75左右(三类垃圾平均)。换成YOLOv8n,速度翻倍,mAP掉到0.68。这个差距在业务上能不能接受,取决于你对漏检和误检的容忍度。如果垃圾漂过去没检出来,后面清理就漏了,那还是用大一点的模型。
还有一个思路是用预训练加微调。先在COCO或者公开垃圾数据集上预训练,再用自己的河道数据微调。这样收敛快,小样本也能出效果。我试过只用五百张自标数据从零训,mAP只有0.5出头;加上预训练权重后,同样数据能到0.7以上。
3.4 训练过程中的参数调优经验
训练参数这块,我踩过的坑主要在学习率和批次大小上。河道垃圾图像背景复杂,学习率太大会震荡,太小收敛慢。我一般用余弦退火调度,初始学习率设0.01,配合warmup跑几个epoch。批次大小看显存,能大就大,BatchNorm对批次大小敏感,太小了统计量不准。
还有一个容易被忽略的是锚框尺寸。YOLO默认的锚框是基于COCO数据集的,河道垃圾的尺寸分布跟COCO差别很大——远处的垃圾可能只有十几个像素,近处的能占半张图。我建议用自己的数据跑一遍k-means聚类,重新生成锚框,这个操作对召回率提升很明显,我做过对比,重新聚类后小目标召回率涨了将近十个百分点。
训练轮数不用太多,有预训练权重的话,五十到一百个epoch基本收敛。要盯着验证集的loss,如果连续多个epoch不降就早停,防止过拟合。过拟合的典型表现是训练集mAP很高,验证集上不去,这时候加数据增强或者加正则化。
4. 从飞行到出结果的实操流程
4.1 航线规划与拍摄参数设置
航线规划的目标是用最少的飞行时间覆盖最多的河面。我一般用网格航线,沿着河道走向铺“之”字形,相邻航线的旁向重叠率设60%到70%,航向重叠率设70%到80%。重叠率高一点,后面拼接和识别都有好处,但飞行时间会增加,这个要权衡。
飞行高度决定了地面分辨率。假设相机焦距是24毫米,传感器像素尺寸是2.4微米,飞行高度100米时,地面分辨率大概是1厘米每像素。这个精度下,一个矿泉水瓶大概占几十个像素,检测模型能识别。如果飞太高,垃圾变成几个像素,模型就无能为力了。我一般把飞行高度控制在80到120米之间,具体看河道宽度和垃圾大小。
拍摄参数上,快门速度要快,避免运动模糊,我一般设1/1000秒以上。ISO尽量低,减少噪点。如果光线变化大,用自动曝光也行,但后期要做亮度归一化。还有一点,尽量在太阳高度角适中的时候飞,正午顶光水面反光严重,清晨傍晚光线又太暗,上午九点到十一点、下午两点到四点比较合适。
4.2 图像预处理与拼接
拍回来的图不能直接喂给模型,得先做预处理。第一步是去畸变,相机镜头有畸变,尤其是边缘区域,不去畸变的话垃圾位置会偏。第二步是拼接,如果做的是整条河道的垃圾分布图,需要把多张图拼成正射影像。拼接用OpenCV的Stitcher或者专业的摄影测量软件都行。
拼接完之后,图像尺寸会很大,直接送模型推理不现实。我的做法是切图,把大图切成有重叠的小块,比如1024×1024,重叠128像素,逐块推理,再把结果映射回大图坐标。重叠是为了避免垃圾正好在切缝上被切掉。切图推理还有个好处是可以并行,多进程跑起来速度快很多。
预处理里还有一个细节是水面区域掩膜。河道图像里有很多岸边的树、建筑、道路,这些区域不会有漂浮垃圾,但模型可能会误检。我一般先用一个轻量的分割模型或者颜色阈值把水面区域抠出来,只在水面区域里做检测,误检率能降不少。
4.3 推理与后处理
推理这块,如果用Python,Ultralytics的YOLO库封装得很好,几行代码就能跑。加载模型、读图、推理、拿结果,核心逻辑不复杂。关键是后处理:**非极大值抑制(NMS)**的阈值要调,太高了重叠的框去不掉,太低了相邻的垃圾会被合并。我一般设0.45到0.5之间,根据实际效果微调。
还有一个后处理是按面积过滤。模型可能会检出一些特别小的框,这些多半是水面波纹或者噪点。我设一个最小面积阈值,比如20个像素,小于这个的框直接丢掉。这个阈值不能设太大,否则远处的垃圾也被滤掉了,得根据你的地面分辨率来算。
结果输出我一般存成JSON,每条记录包含:图像编号、垃圾类别、置信度、边界框坐标(映射回原图坐标)、以及对应的经纬度(如果有POS数据)。经纬度这块,如果无人机有RTK定位,可以直接从图像元数据里读;如果没有,就得靠拼接时的地理配准来推算,精度会差一些。
4.4 结果可视化与业务对接
识别结果最终要给人看,可视化做得好不好,直接影响业务方愿不愿意用。我一般做两层展示:一层是地图上的点,把每个垃圾的经纬度打到地图上,用不同颜色区分类别,点的大小表示置信度;另一层是原图上的框,点开某个点能看到对应的图像和标注框,方便人工复核。
如果业务方要统计报表,可以按河段、按时间段汇总垃圾数量和类别分布,导出成Excel或者对接他们的业务系统。我做过一个简单的热力图,把垃圾密度按网格聚合,颜色越深表示垃圾越多,业务方一眼就能看出哪段河道需要重点清理。
注意:可视化时置信度低的检测结果要用不同样式标出来,提醒人工复核。模型不是万能的,把不确定的结果直接当结论用,容易出问题。
5. 实际跑起来才会遇到的坑与排查方法
5.1 水面反光导致的误检怎么破
水面反光是我遇到的最大的干扰源。阳光照在水面上,形成一片亮斑,模型很容易把它当成白色泡沫或者塑料瓶。我试过几种办法:一是在训练数据里大量加入反光样本,让模型学会区分;二是在预处理阶段做高光抑制,用颜色空间转换把过亮的区域压下来;三是后处理时结合位置信息,反光通常是大片连续区域,而垃圾是离散的小目标,可以用连通域分析过滤掉大块检测。
实测下来,训练数据加反光样本是最根本的办法,但需要标不少数据。高光抑制见效快,但可能把真正的白色垃圾也压暗了,要调参数。我一般两个一起用,先抑制再检测,效果比较稳。
5.2 小目标漏检的排查思路
远处的小垃圾漏检,原因通常有三个:模型输入分辨率不够、锚框尺寸不匹配、训练样本里小目标太少。排查的时候,我先把输入分辨率调大,比如从640调到1280,看漏检有没有改善。如果有改善,说明是分辨率问题,可以考虑用切图推理或者换更高分辨率的模型。如果没改善,检查锚框,用k-means重新聚类。如果还不行,那就是训练数据的问题,得补小目标的标注样本。
还有一个技巧是多尺度推理,把同一张图缩放到不同尺寸分别推理,再融合结果。这个对小目标提升明显,但推理时间成倍增加,适合对精度要求高、对速度不敏感的场景。
5.3 模型在不同河段表现不一致怎么办
这个问题很常见。你在A河段训的模型,拿到B河段效果就掉。原因是两条河的水质、两岸环境、光照条件不一样,数据分布有差异。解决办法有两个方向:一是扩充训练数据,把不同河段的图都加进去,让模型见过更多变化;二是域适应,用少量目标河段的标注数据做微调,或者用无监督域适应方法对齐特征分布。
我一般先用扩充数据的办法,因为简单直接。如果目标河段数据实在拿不到,就用域适应。实际项目里,我建议每换一条河,至少飞一趟、标几十张图做微调,这个投入产出比很高。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决思路 |
|---|---|---|---|
| 水面反光被误检为垃圾 | 训练数据缺反光样本 | 查看误检图是否有高光 | 补反光样本,加高光抑制 |
| 远处小垃圾漏检 | 分辨率不足或锚框不匹配 | 调大输入分辨率看是否改善 | 切图推理,重聚类锚框 |
| 换河段后精度下降 | 数据分布差异 | 对比两河段图像差异 | 扩充数据,域适应微调 |
| 推理速度太慢 | 模型太大或未优化 | 测单帧耗时 | 换小模型,量化,TensorRT加速 |
| 拼接后图像有缝 | 重叠率不够 | 检查拼接结果 | 提高重叠率,换拼接算法 |
| 检测框位置偏移 | 相机畸变未校正 | 对比原图和检测框 | 做去畸变处理 |
5.5 几个我踩过的坑
第一个坑是电池管理。河道巡检往往在偏远地方,我带了三块电池以为够了,结果实际飞下来,一块电池有效作业时间只有二十分钟出头,三块电池跑不完一条三公里的河。后来我改成带五块,并且规划航线时按电池续航倒推单架次覆盖范围,留足返航余量。
第二个坑是存储卡速度。拍高分辨率图,如果存储卡写入速度不够,会丢帧或者卡顿。我一开始用普通卡,拍出来的图有几张是坏的。后来换成高速卡,问题解决。这个细节很容易被忽略,但实际影响很大。
第三个坑是模型版本管理。我调模型的时候,改一版训一版,时间长了分不清哪个模型对应哪版数据。后来我养成习惯,每次训练都记录:数据版本、超参数、评估指标,模型文件按日期加版本号命名。这个习惯在后期排查问题时帮了大忙。
6. 后续可以怎么扩展
这套东西跑通之后,能扩展的方向不少。一个是多光谱或热成像,可见光在夜间和雾天效果差,加其他传感器能提升全天候能力。另一个是实时边缘部署,把模型压到机载设备上,拍完即出结果,适合应急场景。还有就是垃圾溯源,结合水流模型和垃圾分布,反推垃圾可能的来源区域,这个对治理更有价值。
我个人在实际操作中的体会是,河道垃圾识别这个项目,技术本身不是最难的,难的是数据和场景的匹配。模型再先进,没见过你那条河的图,照样不好使。所以别指望一次训练就一劳永逸,把数据回流和迭代机制建起来,比选什么模型重要得多。另外,跟业务方沟通清楚精度预期也很关键,模型不可能百分之百准,能帮他们把巡检效率提升几倍、把漏检率降下来,这个价值就已经很大了。