☰
YOLO26水下生物检测系统实战:从数据清洗到边缘部署的全流程解析
2026/10/18 17:56:57 网站建设 项目流程

水下目标检测这个方向,看起来就是把成熟的目标检测框架换个数据环境,真正入坑以后才发现,水下场景带来的问题比陆地场景复杂得多。我手上的这个项目,核心是用YOLO26深度学习框架做水下生物检测系统,目标是对水下机器人采集到的画面实时识别鱼、虾、蟹、海星等生物。整个算法研究和实现过程,涵盖了数据清洗、网络改造、训练调参、模型压缩到最后边缘端部署,一个环节踩一个坑。这篇文章就把我完整的技术路线和关键实现方法整理出来,重点讲那些论文和官方文档里不会细说的细节,同样在搞水下视觉的朋友可以直接把这套思路拿去参考。

1. 项目概述与核心难点拆解

1.1 水下生物检测到底难在哪

水下生物检测不是“把YOLO套上水下数据”就能跑通的。水下图像本身就有很强的特殊性:光线进入水体以后,不同波长的衰减速度不一样,红光最先被吸收,蓝绿光穿透力强,所以水下拍出来的画面普遍偏蓝绿色;加上水中悬浮颗粒和浮游生物的后向散射,画面就像隔了一层雾,对比度和清晰度都很差。更麻烦的是,水下机器人只能依靠电池供电,算力资源和功耗都受严格限制,这意味着模型既要准又要快,没有太多端到端堆算力的余地。

目标尺度也是个绕不开的问题。水下的鱼、虾并不总是充满整个画面,很多时候它们离相机远,在画面里只有几十个像素,属于典型的小目标。而YOLO26这套深度学习框架在特征提取和尺度融合上相对前代做了明显改进,具体体现为特征金字塔的跨尺度信息融合更充分,检测头对微小目标的敏感度也更好。选择它作为基础框架,就是看中它在“实时性”和“小目标召回率”之间更容易取得平衡,而不是一味牺牲帧率去换检测精度。

1.2 算法方案的总体思路

整个系统按“数据管线—网络结构—训练策略—部署优化”四个层面展开。数据管线负责把原始水下视频经过抽帧、清洗、颜色还原、数据增强变成能用的训练集;网络结构以YOLO26为基础,针对水下小目标和遮挡严重的现象做局部改造;训练策略上采用迁移学习加多阶段增强,尽量用有限数据逼出模型潜力;部署优化阶段则通过剪枝、量化和转换引擎,把模型压到能在边缘端实时运行的程度。四个层面单独看都算不上特别前沿,难点在于它们要互相配合,哪一个环节拖后腿,最终精度都会掉下来。

我在这个项目里最直观的感受是:网络结构决定上限,数据和调参决定你离上限有多近。很多研究者把精力全放在改网络结构上,忽略了水下场景本身的数据问题,结果模型在测试集上漂亮,换到真实水下视频就全线崩溃。所以下面我按完整实现顺序,把每一步的关键细节逐一展开。

2. 数据集构建与预处理策略

2.1 原始数据收集与清洗

水下生物检测没有像通用目标检测那样丰富的现成数据集可用,这是项目第一个卡脖子环节。我的做法是混合思路:一部分来自公开的海洋生态监测图像,一部分是自己录制的水族箱视频和模拟水下环境的拍摄视频,还有一部分是通过对公开视频做抽帧得到的画面。三者混合可以在一定程度上弥补数据量不足,也避免模型只认某一种特定水质。

拿到原始素材后,清洗工作比重比想象中大。水下视频大量时段是对着空地或者近景泥沙,这些帧要么没有目标,要么严重模糊,直接进入训练集只会增加无效计算和误检风险。清洗时我用两个筛选标准:一是画面里是否有清晰可辨的目标生物,二是图像退化程度是否在人工增强后仍然具备标注价值。模糊到人眼都分不清物种的帧,直接删掉,不要指望模型能学会。

2.2 图像增强的两条路线

水下图像增强是一个分歧很大的话题,有的人主张在训练前把所有图片都做深度去雾和白平衡,让模型看到一个“干净”的世界;我实测下来的结论是:不要在推理端做重度增强,要把退化模拟放进训练端的数据增强里。原因很简单,实际部署时机器人的计算资源有限,跑深度去雾算法会吃掉大量帧时间,而且真实水下光学条件千差万别,靠单一增强算法很难保证不会引入色偏伪影。

所以训练端我做了一套复合增强策略:

  • 基础几何增强:随机翻转、随机旋转、随机缩放、随机平移,模拟机器人在不同视角下的拍摄效果。
  • 光学退化模拟:随机调整亮度、对比度、饱和度,模拟不同深度和光照条件;叠加高斯噪声和模拟悬浮颗粒的模糊核,让模型学会穿透视觉噪声识别目标。
  • 颜色域扰动:对蓝绿通道做随机增益和衰减,把不同水质下的色偏情况都覆盖到。
  • 高级拼接增强:Mosaic和MixUp,直接把多张图拼接或混合,增加单张图里的目标数量和背景多样性,对小目标检测尤其有效。

推理端我只保留了一招轻量CLAHE对比度增强,也就是限制对比度自适应直方图均衡化,它在边缘设备上几乎不增加耗时,又能把暗部细节稍微拉出来,对检测效果有正面帮助。至于更重的Retinex类算法,我留着在论文对比实验里用,实际部署不碰。

2.3 标注规范和格式转换

标注工具我用的是常见的图形化标注工具,内部椭圆框、矩形框用的比较多。水下生物很多是细长形或者团状的,矩形框会比多边形标注更快,YOLO系列本身就只要求矩形框,除非目标极度不规则并且重叠严重,否则多边形带来的标签复杂度反而会让训练不稳。标注的坐标最终要转成归一化格式,即每个目标的类别id + 中心点x、y + 框宽高w、h,所有数值都除以图像宽高,存储成txt文件。

这里有一个非常容易踩的坑:标注框不要留太大背景。水下目标周围往往有光晕和暗角,经验不足的标注员会把背景包进框里,导致模型学到很多“背景特征”,推理时对着石头也发框。我的标准是框必须紧贴生物主体轮廓,鱼鳍、触手等伸出部分宁可漏掉一点也别把多余背景框进去,因为漏掉一部分比框进大量背景带来的损失小。标注完成后还要做一次全量校验,通常是抽20%的框逐个检查,发现问题就退回重标,这个流程看着繁琐,但对最终精度影响非常大。

3. YOLO26网络结构解析与算法选型

3.1 主干结构的变化

YOLO26延续了YOLO系列经典的CSP结构思路,也就是跨阶段局部连接,它的核心价值在于把梯度流拆成两路,一路走主干做特征提取,一路走旁路做特征复用,在控制计算量的同时保证了特征多样性。这一代在此基础上,把注意力机制嵌得更深,不再只是给特征图乘个权重,而是在多尺度特征融合时就开始做注意力引导,让网络更关注小目标区域和水下掩膜下的低对比度区域。

从工程角度看,这个设计对水下场景非常友好。水下目标的边缘很模糊,颜色信息又不可靠,传统卷积靠局部纹理做识别很容易被干扰,而注意力机制让网络能跨区域综合判断“这块暗色区域周围有鱼群的轮廓”,明显减少误检。但也要提醒一句,注意力模块不是越重越好。我在对比实验里看到过,有人为了刷精度在主干里堆了双倍的自注意力模块,参数量直接翻倍,训练速度慢不说,最后精度还掉了一个多点,原因就是水下数据集本来就小,过强的模型容量很快就把样本里的噪声记住了。

3.2 检测头和特征融合的针对性调整

检测头方面,YOLO26默认使用解耦头,把分类和回归分开输出。这个设计对水下识别很有价值,因为分类任务更看重“这东西长什么样”,回归任务更看重“这东西在哪、有多大”,两者关注的侧重点不同,共用一层特征时容易互相干扰。分开之后,分类分支可以专注于全局轮廓,回归分支专注于边界细节。

针对水下小目标,我在Neck部分加了一个更高分辨率的检测层。原本Neck里的特征金字塔会把浅层的高分辨率特征逐步融合到深层语义特征里,但对特别小的目标来说,在最终输出层保留的浅层信息还是不够细致。我的做法是,在P3特征图之前再加一个P2尺度的检测层,让网络直接在原图1/4分辨率上检测小目标。带来两个代价:计算量增加约20%,容易把一些悬浮颗粒错当目标。经过反复实验,这个额外的检测层是否保留,取决于应用是偏重召回还是偏重精确。如果项目主要盯着大型底栖生物,没必要上P2;如果目标是小鱼小虾,那P2层几乎是必须的。

3.3 损失函数与标签分配策略

训练一个检测器,光知道网络长什么样不够,损失函数和标签分配直接影响收敛速度。YOLO26默认采用动态标签分配,也就是不是所有落在目标框内的锚点都参与训练,而是根据预测质量动态挑选正样本。这个设计对水下目标的意义在于,鱼群密集、个体互相遮挡时,每个目标周围的候选点很多,如果强行让所有候选点都“负责”检测,会逼迫模型输出大量低置信度的重叠框。动态分配让模型只对质量最高的候选点负责,收敛更快,输出也更干净。

损失函数上,分类损失用BCE,边界框回归损失我用的是CIoU的变体。CIoU会把框的重叠面积、中心点距离和宽高比都考虑进去,比单纯的IoU损失训练更稳。瞄准水下细长生物时,宽高比惩罚特别重要,否则模型会倾向于检测出“胖胖”的框,把细长鱼体拉宽。分享一下我的实验记录:在不改损失函数的情况下,细长鱼类的框宽高比经常偏移20%以上,换成CIoU并加上宽高比调节项之后,宽高比回归稳定了很多。

4. 训练配置与调参经验

4.1 迁移学习与超参数初始化

训练流程不是从零开始训练。YOLO26在通用目标检测数据集上的预训练权重,已经学到了通用的纹理、边缘和形状特征。我直接加载预训练权重,冻结前若干层,只训练新增的检测层和部分高层网络,等基础loss稳定后再解冻全部层做微调。这样做最大的好处是节约训练时间,更重要的是,在水下数据量不足的前提下,预训练权重相当于给了模型一个“通用视觉常识”,避免它一上来就被水下图像的奇怪分布带偏。

超参数方面,我给一个可以参考的配置:

超参数我使用的值说明
输入分辨率640×640,小目标严重要求高可尝试1280分辨率高对小目标更友好,但训练和推理成本上升
Batch Size32(配合梯度累积)显存不足时用累积等效扩大批次
初始学习率0.001微调阶段用较小学习率,防止破坏预训练特征
学习率调度CosineAnnealing长周期训练下比Step衰减更稳
训练轮数300 epoch前50轮冻结主干训练检测头,后面全量微调
数据增强策略Mosaic在前150轮开启,后期关闭后期关闭是为了让模型适应真实分布

Batch Size的取值不是随便拍的。理论上梯度下降的期望值不随batch变化,但实际中batch太小时梯度噪声大,训练不稳;batch太大接近收敛时容易震荡。32这个值是我在单卡训练下的折中,如果你的显存只有16G,可以用8加梯度累积4,等效batch保持32,实际显存占用就小很多。混合精度AMP是必开的,训练速度提升明显,且在大多数情况下精度不降,FP16梯度溢出问题在YOLO26里已经被内置的loss缩放机制处理得比较完善了。

4.2 训练过程的监控和止损策略

训练不是一键启动然后等着出结果,过程中要时刻盯几个指标:训练loss、验证集上的mAP@0.5和mAP@0.5:0.95、Precision和Recall。我最看重的是验证集mAP@0.5:0.95,因为它对框的精确度和目标的召回都有要求,不像mAP@0.5那样只要框大致对上就给高分。中期实验里,mAP@0.5已经到70%了,但mAP@0.5:0.95只有42%,说明网络的框质量还是偏差,后来通过调整回归损失权重才拉上去。

训练过程中我会定期把验证集图片的预测结果可视化出来,直接看模型在真实画面上画出的框。这一步比看指标更直观:如果框普遍偏大或者偏小,往往是anchor设置或者回归损失的问题;如果某个类别完全没框,可能是类别样本太少导致分类头没有学到有效特征。一般每10个epoch做一次可视化检查,发现问题及时反馈到数据或超参数上,而不是等300个epoch跑完才傻眼。

4.3 类别不平衡和难样本挖掘

水下数据还有一个显著特点:某些常见鱼种样本充足,稀有生物样本寥寥无几。刚开始第一版实验,模型对常见鱼种mAP已经超过75%,但对稀有海星只有15%。我前面提到过过采样和类别加权,这里补一个更有效的手段:难样本挖掘。具体操作是,先用当前模型跑一遍所有训练图像,把预测结果和标签做比对,找出那些预测置信度极低或者完全检测不出的样本,单独挑出来做一次额外训练。这个流程每完成一轮就用新模型重新跑一遍,几轮下来,原本“学不动”的稀有类会明显改善。代价是要多花时间做推理,但相比重新收集海量数据,已经是性价比极高的方案了。

5. 工程落地的部署方案

5.1 从PyTorch权重到推理引擎

训练完的权重不能直接拿到嵌入式设备上用,必须走一趟格式转换和优化。我的标准流程是:先把PyTorch模型导出为ONNX,固定输入尺寸和batch,然后借助深度神经网络推理引擎做进一步优化,把FP32权重转为FP16甚至INT8,并完成算子融合和内存复用。转换之后要进行逐层精度对比,如果发现某个算子在转换前后输出差异很大,就针对性地把这个算子留在FP32精度,避免整体量化带来的精度损失。

核心的导出思路是:设置模型为eval模式,构造一个固定尺寸的示例输入,通过torch.onnx.export导出;转换完成后用ONNX Runtime做一致性校验,比对模型输出的坐标和置信度,误差在毫厘级别才算合格。常见坑是动态batch和动态shape在导出时没固定好,部署端一旦遇到其他尺寸的输入就直接报错,所以我干脆在预处理阶段强制把所有输入图像resize到固定尺寸。

5.2 边缘设备的资源优化

水下机器人主控板上通常用的是类似嵌入式GPU的设备,算力远不如训练服务器。为了让模型跑在实时帧率,我做了两个层次的优化:第一个层次是模型轻量化,对不重要的通道做稀疏化剪枝,把计算量压下来不少,精度损失控制在0.5个点以内;第二个层次是推理流程优化,把视频帧的预处理和后处理放到GPU上并行处理,避免CPU和GPU之间反复拷贝数据。大家要注意,预处理如果只用CPU跑resize和归一化,在边缘设备上可能占总耗时的一半,迁移到GPU之后整体延迟会明显下降。

如果追求极致吞吐,可以把多路视频流打包成一个batch同时推理,吞吐量能提升不少。但要记住,批量推理会增加单帧延迟,对实时性要求高的单路场景未必合适。实测下来,在典型边缘设备上,640×640输入、FP16精度、不开batch时单帧推理耗时在十几毫秒级,配合摄像头采集和预处理管线,跑25到30FPS没有问题。

6. 常见问题与排查技巧实录

6.1 小目标漏检严重怎么办

这是我被问得最多的问题。先要区分“漏检”是训练阶段就不识别,还是部署时才漏。如果是训练阶段验证集上就漏,优先检查输入分辨率和小目标检测层。我之前在一个版本里没加P2层,转头图里的小鱼几乎全漏,加了之后召回率立刻上去了。如果是部署阶段漏,多半是输入被resize缩水,或者量化精度把小目标的微弱特征破坏了。还有一招:推理时对原图做切片,把大图分成几块重叠区域分别检测,再把结果拼回来,适合目标稀疏但需要高清细节的场景。

6.2 误检率和虚警怎么压下来

水下环境最容易出现的误检是把石头、海草和阴影当成目标。典型原因是训练集中背景样片太少,模型没见过足够多的“不是目标”的画面。解决思路是增加负样本或者使用难例挖掘,也就是把之前误检的图片收集起来,标注成背景类放进训练集里重新训练。另外可以在后处理里加一个基于置信度阈值的过滤,但不建议把阈值调得太高,否则会牺牲大量真实召回。我通常先用不同阈值跑一遍测试集,画出一条Precision-Recall曲线,然后在曲线上找平衡点,而不是拍脑袋定0.5还是0.7。

6.3 数据不够和类别不平衡的处理

水下生物类别天然不平衡,某个鱼种可能有三万张图,另一个稀有物种可能只有两百张。我的处理方案有三层:第一层简单粗暴但有效,对少数类做过采样,让它们每个epoch出现的次数多一些;第二层使用数据增强,把少数类样本做重度增强,生成更多变体;第三层是给少数类设置更高的损失权重,逼迫分类器在学到多数类的同时不能放弃少数类。三层配合下来,我在稀有物种上的召回率从不到50%提到了接近80%,代价是多数类略有下降,整体还是划算的。

补充一个数据增强的坑:对少数类做CutOut或者遮挡增强时,别把目标主体全挡住,否则类别特征彻底丢失,等于白标了。

6.4 水下摄像头图像偏色严重时的适配

不同单位会使用不同型号的水下摄像头,新设备的颜色分布可能和训练集差异很大,导致精度骤降。我的建议是在部署阶段加入一个轻量的颜色风格对齐模块,用一小段新设备的无标注视频做低成本的统计色偏估计,在预处理阶段把新图像的色偏大致拉到和训练集接近的状态。这个方法不需要重新训练模型,实现简单,实测可以让换相机后的mAP下降幅度显著缩小。如果允许离线微调数据,那么在模型层面做域适应会更彻底,工程上会更重,但上限也更高。

我完整把YOLO26水下生物检测系统跑下来以后,最大的感受是这个项目真正的分水岭不在网络结构,而在数据策略和工程细节。同样的模型代码,有人跑出60%的mAP,有人能调到80%,差距往往来自对数据的理解和对问题的持续追踪。如果你也正在调自己的水下检测模型,我建议先别急着改进网络,把训练数据质量、预处理流程和标签准确性这三件事做到极致,往往收益比换模型大得多。后续如果要继续扩展这个方向,大概率会从自动化标注这边入手,用现有模型出一版粗标注,人工批修,把数据集规模再翻几倍,然后尝试更高输入分辨率下的检测,那可能是进一步提升小目标召回率的有效路径。

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

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

立即咨询