恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
水下机器人环境感知与障碍物识别:基于YOLO13-C3k2-WDBB的实战解析
首页
资讯中心
/
水下机器人环境感知与障碍物识别:基于YOLO13-C3k2-WDBB的实战解析
水下机器人环境感知与障碍物识别:基于YOLO13-C3k2-WDBB的实战解析
发布时间:2026/10/22 8:45:31
做水下机器人环境感知的朋友最近应该都有同样的感受海下垃圾清理这个赛道越来越热但真正落地时才发现实验室里跑得飞快的检测模型一到浑浊、偏色、光影乱跳的水下环境就全线崩盘。我这段时间一直在打磨一个面向水下垃圾清理机器人的环境感知与障碍物识别系统项目代号就叫“YOLO13-C3k2-WDBB”。这套系统的核心思路是把目标检测这个成熟技术往水下场景里硬生生掰正解决了低照度、低对比度下识别塑料瓶、渔网、金属件同时还要躲开礁石、珊瑚、海草这些障碍物的问题。整套东西做完最深的体会是真正难的不是模型本身而是怎么让模型在水下“看得稳”。这篇文章会把项目从需求拆解、模型选型、数据构建到训练调参、边缘端部署以及我踩过的坑全部摊开讲。适合正在做水下机器人视觉、海洋装备开发或者对YOLO改进感兴趣的开发者参考。1. 项目从哪来海下垃圾清理为什么需要专用的感知系统1.1 水下视觉环境的四座大山水下不是“光线暗一点”那么简单至少四重问题叠加第一是光衰减。水对红光吸收最严重蓝绿光穿透相对好所以水下图像天然偏蓝绿色红色目标像塑料袋、易拉罐的色相会严重失真。第二是散射。悬浮颗粒和浮游生物会把光线打散图像整体像蒙了一层雾对比度急剧下降。第三是运动模糊。机器人自身有推进器机械臂也在动曝光时间稍微长一点画面就糊成一片。第四是非均匀光照。阳光在水面波动下会产生“光斑泳动”同一个目标的不同部位亮度差异极大。这四座大山叠加导致常规的检测模型训练集一般是自然光地面图片在水下性能衰减非常厉害。早期我直接拿通用COCO预训练权重去跑水下视频mAP掉到不到一半而且大量把礁石上的藤壶认成垃圾。所以必须做专用系统。1.2 垃圾识别和障碍物识别必须同时做很多人以为海下机器人只需要识别垃圾。实际不是。机器人在海底行进旁边可能有陡峭岩壁、珊瑚群落、废弃渔船的残骸甚至还有海龟这类保护生物。如果你只输出垃圾目标机器臂一伸过去就撞上石头或者推进器卷进海草整个任务直接失败。所以本项目的感知输出有两类垃圾目标包括塑料瓶、瓶盖、塑料袋、渔网、金属罐、玻璃碎片等可清理对象。障碍物目标包括礁石、珊瑚、海藻、沉船结构、缆绳等需要避让的对象。两种目标的处理策略也不同垃圾目标输出中心点坐标和掩膜区域供机械臂规划抓取障碍物只输出边界框和类别供运动规划模块生成避让路径。检测模型必须同时输出这两类不能拆成两个模型因为水下机器人算力有限而且要保证两组结果在时间上对齐。1.3 为什么选“检测”而不是“分割”其实水下垃圾的抓取理想情况是实例分割因为垃圾形状不规则。但现实是机器人主控板的GPU资源紧张分割模型推理时间是检测模型的3到5倍机械臂等待响应超过200毫秒水流一冲目标就跑了。所以本项目采用“检测为主、分割辅助”的策略检测模型跑帧级识别给出班底框和置信度当机械臂靠近目标时再用一个小型的掩膜分支做精细定位。这样既保证了实时性又不损失抓取精度。2. 模型方案选型YOLO13、C3k2与WDBB的由来2.1 “YOLO13”到底是什么先澄清一点这不是某个公开的官方版本。YOLO系列迭代很快业内习惯把基于YOLO框架自己魔改的版本也按代数编号。我们团队内部从YOLOv5起步一路换过v6、v7、v8的结构在这个项目里定型的是基于YOLOv8框架改进的第13版实验配置所以我们内部叫它“YOLO13”。核心改动有三处把backbone改成C3k2结构在neck阶段插入WDBB模块同时调整了anchor-free的解耦头。整体思路是保持YOLO系列“单阶段、anchor-free、CSP结构”的优点针对水下低对比度场景强化特征提取和跨尺度融合。为什么不用更前沿的Transformer类检测器因为水下机器人要控制智能电池负载没有大功率GPUTransformer的算力开销完全扛不住。YOLO这种卷积为主的结构配合C3k2的轻量瓶颈设计最适合边缘部署。2.2 C3k2主干轻量级瓶颈结构如何提高特征利用效率C3k2这个名字熟悉YOLOv8的人不会陌生它本质是CSP结构的改进版。CSP的意思是把特征图沿通道维度拆成两支一支直接映射另一支经过若干个瓶颈块最后再拼接这样能减少梯度重复计算同时保持信息流丰富。C3k2特别的地方在于它把传统Bottleneck里的3x3卷积换成了两个可分离卷积的组合并且用了一个较短路径的残差连接。这样做的收益有两方面参数量下降比同深度的传统残差块少约30%。因为水下目标的纹理信息弱短路径能把低阶特征边缘、色块更快传递到高阶语义层不让网络只顾着抽象忽略了细微轮廓。我在项目里把backbone的C3k2数量做了调整浅层P2、P3用较浅的C3k2保持细节深层P5用更宽的C3k2提升语义表达能力。实测下来水下瓶子的边缘响应明显更清晰了。2.3 WDBB模块加权双分支瓶颈如何增强水下目标边界响应WDBB是本项目自己设计的一个模块全称是Weighted Dual-Branch Bottleneck加权双分支瓶颈。设计动机很直接水下图像对比度低目标与背景的边界往往是模糊的普通卷积很难在边界处产生强响应。WDBB模块在瓶颈结构中并排放了两个分支卷积分支使用3x3空洞卷积扩大感受野捕捉目标周围的上下文信息。边界感知分支使用Sobel算子先验初始化的卷积核显式提取水平与垂直方向的梯度特征。两个分支的输出经过可学习的加权系数融合再通过残差路径加到输入上。这个加权系数是训练时自动学习的不需要额外标注边界。实验里把WDBB放在neck部分尤其是P3和P4层对渔网、海草这类细长目标的召回率提升非常明显。为什么叫“双分支瓶颈”因为它本质是一个可选插入的模块类似注意力模块的位置。我们做了消融实验不插WDBB的基线模型在自建水下测试集上的mAP50是82.4%插入WDBB之后涨到88.7%推理时间只增加了1.2毫秒。这个代价完全可接受。2.4 完整网络结构与参数配置下表是项目的最终模型配置以输入640x640为例模块位置输出通道说明Focus/Stem输入层32将640x640下采样至320x320C3k2-1Backbone Stage164基础特征C3k2-2Backbone Stage2128下采样至160x160C3k2-3Backbone Stage3256下采样至80x80C3k2-4Backbone Stage4512下采样至40x40SPPFNeck输入512池化特征融合WDBBNeck P3层128边界增强WDBBNeck P4层256边界增强解耦检测头Neck输出类别数*锚框输出40x40/80x80/160x160三个尺度最终模型的参数量约11.2MFLOPs在640分辨率下约24.6G。对于一艘搭载嵌入式GPU的水下机器人来说这个体量非常友好。3. 数据集是命根子水下垃圾数据的获取、标注与增广3.1 数据从哪里来水下数据集比想象中难搞。公开的水下目标检测数据集不少但大多面向鱼类、珊瑚礁生态监测垃圾样本很少。我的做法是“三源合并”第一公开水下常见目标数据集提取其中包含人造废弃物的样本比如部分海洋垃圾数据库中的塑料、金属类图片。第二自采数据用防水相机在水池和近海浅水区拍摄模拟垃圾包括矿泉水瓶、易拉罐、渔网碎片。第三合成数据用渲染引擎生成不同水质、不同光照下的垃圾模型图用来补充极端状况。三个来源比例大约为3:4:3。自采数据最重要因为只有真实的水下退化特征才是最终考验。3.2 标注策略垃圾类别、障碍物类别还有一个特殊类类别设计上我一开始分了12类后来精简到6类垃圾、4类障碍物垃圾类塑料瓶、瓶盖、塑料袋、渔网、金属罐、玻璃碎片。障碍物类礁石、珊瑚、海草、硬质废弃结构物。这里有个容易出错的点渔网。它摊开时是一个大片揉团时又是一个小团单纯画矩形框会把很多背景框进来。后来我规定渔网标注时用最小外接矩形并且如果目标被其他物体遮挡超过30%就标为“被遮挡样本”专门用来训练模型的鲁棒性。另外还加了一个特殊类——生物误判类。水下很多生物长得像垃圾比如海鞘像塑料管水母像塑料袋。如果机器人把水母当塑料袋抓起来会对生态造成二次伤害。所以单独建了一个“海洋生物”类别在推理时一旦检测到立刻屏蔽抓取动作。3.3 图像增强与退化模拟水下图像的退化有规律可循。我在训练前对每张图做了随机增强颜色偏移在RGB通道上随机乘以不同系数模拟不同深度的色偏。雾化模拟基于大气散射模型随机生成深度图并叠加散射。噪声与模糊加入高斯噪声、运动模糊核模糊核长度随机2到7像素。这些增强不是锦上添花而是强雷打不动。因为真实水下环境千变万化如果不做退化模拟模型在飞溅区、混浊河口会完全失去判断力。3.4 评估指标的选择不要只看mAP。水下机器人的核心指标是“漏检率”和“误抓率”。一个瓶子漏检顶多少清理一个但如果把礁石误判成障碍物机器人绕道会浪费时间如果把垃圾误判成障碍物机械臂就不敢抓了。所以项目里同时监控三个指标mAP50/50-95衡量整体检测精度。F1置信度阈值曲线用于找最佳置信度阈值减少漏检。每类召回率尤其是渔网、塑料袋这类非刚性目标。我在实验中发现置信度阈值设在0.35时F1最高如果阈值提到0.6虽然误检少了但渔网召回率从87%掉到64%。所以最终定在0.35宁可多一点误报也要保证安全。4. 训练、调参与落地部署从代码到实机4.1 训练环境与超参数速查训练在单张中高端GPU上完成batch size 16输入分辨率640x640。冻结backbone前10层只训练neck和head等loss稳定后再解冻全部层。优化器用SGDmomentum 0.937weight decay 0.0005。初始学习率0.01采用Cosine Annealing衰减到0.0001。前3个epoch用warmup。多尺度训练开着每10个batch随机缩放0.8到1.2。最终在自建数据集上训练120轮验证集mAP50达到88.7%。如果你自己复现建议先用默认超参数跑通再动学习率。水下数据方差大学习率稍微高一点loss就会震荡。4.2 迁移学习与两阶段微调技巧直接从头训练不可取。我是这样做的第一阶段用YOLOv8在COCO上的预训练权重冻结backbone只训练neck和head让检测头适应水下目标类别。这一步不需要大量数据重点让模型学会“新类别对应对旧特征图中的哪些响应”。第二阶段解冻backbone但把学习率设为第一阶段的十分之一微调全局。这时候C3k2浅层细节特征会对水下边界进行精细调整。第三阶段用难例挖掘思想从上一轮测试中挑出所有误检和漏检图片单独训练3到5轮。这一步对渔网的召回率提升特别明显。4.3 剪枝量化与边缘端推理加速水下机器人主控板算力有限我的目标是将模型压到能实时跑30帧以上。先做通道剪枝对C3k2中影响最小的通道按BN层gamma值排序剪掉尾部20%的通道。剪完之后精度只掉了0.4个点推理速度提升了约1.6倍。然后做INT8量化。量化校准集用了500张覆盖不同水质的水下图。这里有个关键坑如果用普通量化校准模型在蓝色海水里正常到绿色浑浊水域就输出一堆低置信度框。原因是校准集里颜色分布单面积不够。后来把校准集按照“蓝、绿、深蓝、浑浊”四类均匀抽取量化后精度损失控制在了0.7%以内。量化后的模型部署到嵌入式GPU板卡配合通用的推理加速框架640x640分辨率下实测推理时间约18毫秒加上前后处理整体帧率稳定在30帧左右。这个速度已经足够让机器人在行进中保持连续环境感知。4.4 感知系统如何与机械臂/避障模块联动检测模型输出不是终点还要接入机器人控制逻辑。我的做法是写了一个感知中间层订阅检测结果后按优先级处理如果画面中有“海洋生物”高置信度目标直接发送给屏避指令机械臂锁定推进器绕行。如果有垃圾目标且中心点位于抓取半径内把像素坐标换算成机器人基座标系下的三维坐标送入运动规划模块。如果有障碍物目标将边界框映射到占据栅格地图更新局部路径规划。这套联动逻辑看着简单但真正的坑在于时序。检测帧和机器人状态帧可能差几个毫秒如果不做时间戳同步机械臂会抓空。我最后的方案是让感知线程和运动控制线程共享一个时间基准检测结果带上机器人当前姿态角再交给控制模块做滤波。5. 常见问题与排查实录5.1 偏色导致检测漂移BN层统计失效训练时模型见过蓝绿色偏但实际下潜时海水的色温会随着深度不断变化。到了水下15米红通道几乎为零模型把所有红色类目标都当作噪声滤掉了。排查时看到loss正常但输出框全在画面角落乱跑。解决方案是加一层颜色校正预处理进入网络前用灰度世界算法对图像做白平衡。注意这里不能直接套OpenCV的标准白平衡因为水下红通道缺失严重强行拉伸会产生紫色伪影。我改用限制性灰度世界只允许通道增益在0.5到2.0之间效果最稳。5.2 瓶子底部阴影被当成目标水下机器人的灯光是正前方照射目标底下会拖一条长黑影。模型一开始把黑影当成铁罐后来把阴影框进去导致中心点偏离机械臂抓不到。排查时发现训练数据里阴影样本太少。解决办法是数据增广时对目标区域下方随机粘贴一个半透明黑色渐变矩形模拟灯光阴影。同时给模型加了WDBB的边界分支后它学会了用颜色和纹理区分真实目标与阴影边界。5.3 强运动模糊下漏检率高机器人转弯或机械臂快速动作时图像运动模糊非常严重检测框不抖但置信度骤降。试过把曝光时间调短但画面太黑。后来采用“双帧候选融合”把相邻两帧的检测结果做IoU匹配如果前一帧高置信度后一帧低置信度且位置接近则保留前一帧类别并在后一帧位置更新。这样漏检率下降了约40%。5.4 常见问题速查表问题现象排查方向我的解决方案偏色漂移输出框乱跳置信度低BN统计失效限制性灰度世界预处理阴影误检把黑影当成目标训练数据缺阴影增广时加阴影渐变运动模糊漏检模糊帧置信度骤降单帧无法恢复双帧候选融合小目标漏检瓶盖、碎片看不见深层特征丢失细节增加P2层检测分支生物误判水母、海鞘被识别垃圾类别定义不清单独设生物类动作屏蔽6. 最后分享一点个人体会做这个项目最大的教训是不要迷信网络结构本身的先进性。我最初试过把backbone换成更大规模的变体结果mAP确实高了1个点但推理时间从20毫秒涨到45毫秒机械臂的抓取成功率反而下降了。后来回归到轻量主干加WDBB速度和精度平衡点反而最好。另外水下数据集的“质”远比“量”重要。我一开始疯狂扩数据塞进去五六千张图片但很多是从同一段视频截出来的场景重复度极高模型泛化能力反而变差。后来严格按不同海况、光照、深度来分层抽样只用三千张左右效果提升了6个点。如果你也要做类似的系统建议先花两周时间把现场采集的数据仔细看完把“机器人在真实海底会看到什么”这件事搞清楚再动手调模型。传感器校准、数据同步、控制闭环这些工程问题每个都比模型参数量更值得投入。毕竟水下机器人面对的从来不是排行榜上的数据集而是那片复杂多变的海。