首页 / 资讯中心 / 文章详情

ORCA水下物种识别:从目标检测到细粒度分类与部署实践

ORCA水下物种识别:从目标检测到细粒度分类与部署实践 ★ FEATURED ARTICLE
做水下视觉的人多半感受过这种煎熬陆地上的目标检测已经卷到飞起可一旦把模型扔进海里它连一条在镜头前游过的鱼都认不出来。我们组是某高校海洋视觉方向的一个小团队这次在WACV 2026放出的工作ORCA海洋物种目标识别与理解就是为了正面解决这件事。浑浊、低照度、偏色、悬浮颗粒、鱼群相互遮挡——每一样都在公开数据集精心喂出来的模型脸上扇耳光。ORCA的目标是在一套统一框架下同时完成水下影像中的目标检测、细粒度物种分类与生态学属性理解支撑珊瑚礁监测、渔业资源评估这类需要大面积巡航的现实任务。如果你正好在做水下视觉、生态AI或者目标检测应用这篇以方法设计和工程细节为主的总结应该能帮上忙。1. 为什么水下物种识别常年翻车成像退化、尺度跨度与数据长尾1.1 水下成像条件检测器的天然敌人做检测的朋友都清楚一个可靠的检测器依赖于目标的边缘清楚、纹理可辨、光照分布相对均匀。水下不是这么回事。水对光线的吸收有很强的选择性红光通常在几米之内就被大量吸收橙光、黄光也撑不了多远最终到达传感器的光基本只剩下蓝绿通道的信息所以水下影像普遍偏蓝绿色。更麻烦的是水中悬浮颗粒和有机碎屑造成的散射让图像对比度断崖式下跌。我经常跟人形容这相当于隔着起雾的可乐瓶看鱼检测器能看到的只是模糊轮廓。这件事带来两个直接后果。一是基于边缘和纹理的特征在水下严重失效无论是手工特征还是早期深度特征都不好用二是很多陆地场景预训练权重迁移过来时会把陆地颜色分布当成万物准则。我们做过一个很无聊但印象深刻的实验拿在通用检测数据集上训好的模型直接跑水下测试集AP掉了一半还多。这说明不是模型本身笨而是训练分布和目标域的差异实在太大靠常规微调很难拉回来。1.2 尺度跨度与目标拥挤鱼群不会排队让你数水下物种的体长跨度非常夸张同一帧画面里既可能出现几厘米的小丑鱼也可能游过一条几米长的蝠鲼。检测器需要在同一个输入分辨率里处理极端多尺度目标。鱼类又有明显的聚集行为鱼群密集时目标相互遮挡标注边界本身就是模糊的。我们在早期版本里发现模型对密集鱼群要么把三条鱼合成一个大框要么把一条鱼拦腰切成两半。后来才想明白这与其说是模型结构的问题不如说训练数据里缺少了密集遮挡这一类样本。水下数据的标注成本又高很多公开数据集的拍摄场景都相对开阔鱼群密集的真实海况反而被系统性地遗漏了。1.3 长尾分布与专家标注瓶颈生态学家关心的鱼往往最缺数据水下影像的物种分布极不均衡。巡航拍摄的大量素材里常见鱼种可能占据90%以上的目标实例而生态学上最关心的稀有物种往往只在很少的几个片段里出现。稀有鱼种恰恰是环境变化的敏感指标但到了数据层面就成了最难训好的类别。更棘手的是标注。很多近缘鱼种外观极度相似同一个科的不同物种可能只差在条纹数量、背鳍形状或体色深浅不少物种的幼年与成年、雌性与雄性看起来判若两鱼。我们组当时请了多位有分类经验的人员协同标注分歧率一度超过15%。这类分歧如果直接当成监督信号模型学到的就不是物种特征而是标注者的个人偏好。所以ORCA从一开始就明白没法沿用拿通用检测器微调一下的捷径必须在数据策略、模型结构和训练细节上同时做针对性设计。2. ORCA的任务分解与系统设计检测头、细粒度分类头与属性理解头如何协作2.1 先把任务拆清楚识别只是第一步理解才是目的ORCA用虎鲸来命名多少也是希望这套系统能像虎鲸一样在一片混沌的水体里依然精准锁定目标。但在任务层面我们把它拆成了三层第一层是通用目标检测输出所有候选目标的位置框第二层是细粒度物种分类对每一个框内目标给出物种级别的预测第三层是属性理解预测目标的像素面积、所在水深带、游动姿态、聚集状态和个体数量。为什么把属性理解做成独立模块而不是后处理因为做生态监测的人真正关心的往往不是图里有什么鱼的分类结果而是这片区域有多少条鱼、平均个头多大、主要活跃在哪个水层。如果只靠检测框的数量和大小去估算误差会很大——密集鱼群里的遮挡漏检会让计数严重偏低。ORCA单独加了一个轻量回归头直接预测聚集群的数量与平均尺寸把遮挡带来的系统误差交给模型自己学习补偿。实测下来这个头在密集鱼群上的计数误差比单纯统计检测框低了十几个百分点。2.2 主干网络与细粒度头怎么搭配主干网络的选择是一个绕不开的取舍。拿Transformer类检测器做主干精度上限确实更高尤其在小目标和密集目标上的表现明显好于纯卷积网络。但这类模型的训练更加挑剔收敛速度也更慢我们自建的小规模水域数据上前期loss下降极慢如果不先在通用检测数据上做足够长的预热效果反而不如一个调好的经典检测器。细粒度分类方面我们采用了一套局部属性引导的注意力机制。思路说白了很简单对鱼这类近缘物种判别信息往往集中在特定局部区域——条纹、斑点、鳍条形状。模型先用检测头找到目标框再用一组可学习的属性提示词条纹、斑点、流线体型、扁平体型等在框内生成注意力权重让分类头重点关注这些区域。类比一下就像辨认鸟类时先看嘴型再看翅膀而不是把整只鸟一视同仁地平均看一遍。这个模块本身参数量不大但对细粒度分类准确率的提升非常可观而且训练时也更容易收敛。2.3 数据策略半自动标注与先合并、后细分的类别路线再好的结构也扛不住脏数据。我们最终采用的标注策略是先合并、后细分把外观接近且生态功能相似的物种先合并成形态组请专家按组别标注等模型在组别上稳定收敛后再针对每组内部有代表性的样本做二次细标注。这样做有两个好处一是显著降低标注分歧二是给中间监督提供了更稳定的学习信号。数据来源我们也做了明确分工。公开的大型水下影像数据负责提供广泛的类别覆盖自建数据集中在固定机位礁区影像保证与真实部署时的光照、水温和目标尺度分布尽量一致。两者按大约6比4混合训练。有意思的是我们后来发现公开数据占比高一点模型在自建数据上的过拟合反而更轻可能是公开数据自带的噪声起到了正则化效果。这个现象在其他任务里也常见但很多人会因为公开数据脏而不敢多用其实配比得当反而是好事。3. 训练配置的五个关键细节增强、长尾损失、预热、校准与选模型3.1 水下专属数据增强而不是直接套地表增强通用检测的数据增强通常围绕随机裁剪、翻转、色彩抖动和马赛克展开。水下场景不能这么干。我们一开始直接套通用增强训练出的模型在验证集上mAP很低。原因是水下图像的真实退化模式色偏、低对比度、粒子噪声和地表数据的色彩分布完全不在同一个覆盖空间里通用增强生成的数据根本没有命中真实挑战。后来我们把几个针对水下退化的增强做成了固定组合随机深度色偏模拟不同水深下红绿通道的衰减差异随机粒子噪声扰动模拟水中悬浮物随机高斯模糊与散焦模拟运动模糊随机局部雾化遮挡模拟水底尘雾。参数上有一点要特别注意色彩增强的幅度不能过大否则模型会丢失真实的颜色判别信息——有些鱼恰恰是依赖体色区分的。我们最后把色偏强度控制在±20%以内粒子噪声密度控制在每帧随机生成0到80个斑点模糊半径不超过8像素。在这个基础上叠加常规的翻转与随机裁剪效果显著好于全盘套用通用增强。3.2 长尾分布单一技巧不够要打组合拳类别长尾问题很多文章会推荐focal loss或类平衡采样。实测下来单独用focal loss会让常见类精度明显下降单独用类平衡采样又容易让罕见类过拟合。ORCA最终用的是组合方式类平衡采样打底保证每个批次里不常见的物种都有固定比例出现损失函数中再引入logit adjustment按类别频率的对数给稀有类别的logits加一个先验偏置。这个偏置系数一般取0.5到1.5之间具体数值根据类别分布统计来调。和纯focal loss相比这套组合在我们数据上让稀有类的recall提升了大约7个百分点常见类的精度损失控制在2个百分点以内。focal loss也不是不能用但我个人的经验是它更适合放在收敛后期做短阶段微调而不是从头就作为主要损失函数——前期数据分布还没稳定时focal loss会让模型过度关注某些难例反而扰乱训练节奏。3.3 预热、批次与学习率调度的水下节奏Transformer类检测器几乎离不开预热。我们用了约5%总迭代次数作为线性预热期峰值学习率取2e-4左右配合余弦退火。有一个容易被忽略的细节是批次大小受单卡显存限制我们最初一批只放8张图模型收敛非常慢后来通过梯度累积把有效批次提升到32整体效果立刻有了可感知的改善。如果训练数据混合了多个不同水域的来源建议在做归一化时保留每个样本原始的白平衡信息而不要做全局统一均值方差。因为不同水域的颜色分布差异会被归一化层强行抹平细粒度分类所依赖的颜色线索也就白白浪费了。这是我们在跨水域测试时反复栽跟头才发现的问题。3.4 置信度校准部署前必做的一步检测器输出的置信度分数并不是真正的概率。尤其在水下这类分布外样本频出的环境里模型经常以0.9以上的置信度给出错误的物种预测让阈值调整变得很不靠谱。我们在训练完主干后会在独立验证集上用温度缩放做一遍校准让各物种的预测概率分布与实际频率对齐。在我们自己的数据上校准之前固定阈值会导致真实礁区数据漏掉约30%的目标校准后漏检率下降到12%左右。这一步对生态监测特别重要因为报告里需要的是可解释的置信度而不是一个仅供排序的分数。3.5 模型选择不能只盯着mAP最后一关是checkpoint选定。我们最初按验证集mAP最高的标准来选模型结果部署后误报率很高。后来把候选模型逐一做了逐类错误分析才发现最高mAP的模型在密集鱼群上的边界框定位是虚高的——它容易把多个目标合并成一个大框mAP看着高实际对群体计数的任务完全不友好。我们最终选中的checkpoint在mAP上只比最高点低不到1个百分点但在细粒度误报和群体计数的联合误差上显著更优。这个经验现在已经写进了我们的复盘文档指标是服务于部署场景的不是反过来让场景迁就指标。4. 部署环节更值得较真的工程问题轻量化推理、未知类拒识与误报回流4.1 轻量化与推理加速论文指标在嵌入式设备上要打折扣论文阶段用大模型刷指标部署阶段就得低头看算力。水下机器人的计算平台通常只有一块嵌入式级别显卡还要实时处理视频流。我们最终保留了一条蒸馏流程用精度最高的教师模型蒸馏出一个更小的学生检测器再导出为TensorRT int8。在单张嵌入式显卡上原始模型的吞吐大概12 FPS剪枝蒸馏加量化后提升到约25 FPSmAP下降约1.5个百分点。对生态监测来说这个精度换实时性是完全值得的。这里有两个部署阶段的常见坑。一是TensorRT对注意力模块的某些算子支持不完善部分算子会退回原生实现导致实际加速比远低于预期所以最好提前在目标平台上做算子性能普查。二是int8量化在低对比度图像上特别容易掉点不要一上来就int8先在FP16上跑稳定再逐层尝试量化。4.2 未知物种开放集场景下的拒识很关键水下影像最大的特点就是类别开放——训练集清单永远不可能覆盖真实海域里出现的所有生物。没有见过的物种模型最常见的表现是带着高置信度错误分类到某个已知类里。这对生态监测非常致命一份监测报告里出现一个虚构的类别名比单纯检测不到更有误导性。我们在部署方案里做了三层防护。第一训练时在数据里人为切出一个未知类参与训练把分布外样本作为显式负类喂给模型。第二推理时对每个目标额外计算到各类别原型中心的距离距离超过阈值就拒绝分类。第三对不同水域配置不同的拒绝率阈值宁肯标成未知也不强行归类。这套机制在我们实测数据里把未知物种的强混淆率从40%以上降到了15%左右。代价是会把一小部分已知物种误标为未知但对监测场景来说完全可接受。4.3 误报回流与增量微调真正提升长期效果的是这个闭环部署不是终点而是数据反馈的起点。ORCA的执行端在巡航过程中会自动截取低置信度目标与高置信度误判目标由后台人员通过一个极简的打标页面快速确认确认结果每个月回流一次训练集做增量微调。这个环节看上去不起眼却是整个系统性能提升最快的杠杆——第一个季度的误报率直接降了一半。如果你打算长期维护一套水下视觉系统把这些误报回收和人工确认机制做扎实可能比反复换先进模型架构更划算。5. 回顾与延伸我们踩过的坑和下阶段想做的事5.1 三个花最多时间才想明白的教训先说数据清洗。我们有过两周时间花在更复杂的注意力模块上效果提升有限后来花一周清洗错标和漏标数据F1直接涨了4个点。尤其在长尾数据里稀疏类别上的几条错误标注可能比几百条正确标注对模型的影响还大因为模型会把错误特征当成那类物种的固有模式去学。再谈骨干网络大小。水下图像本身的信息量有限更大更强的主干网络很容易把训练集里的水域色偏和噪声模式背下来而不是真正学到物种特征。我们做过多组对比从轻量骨干换到超大骨干在原始数据上mAP有小幅提升但换个水域测试反而掉点。对水下任务来说域泛化能力比单一水域上的刷点更宝贵。最后是部署约束前置。我们直到临近部署才发现延迟预算和模型结构不匹配不得不回头做蒸馏和量化很多在论文阶段顺手加的模块到部署时成了累赘。如果知道自己最终要跑在嵌入式平台上最好从选主干网络的那一刻起就把FLOPs和延迟上限定下来把这个约束当成贯穿整个项目的一条隐藏评审线。5.2 还想继续做下去的方向ORCA目前的属性理解还比较粗游动姿态、聚集程度、体型分布这些维度都只是最近才接上监督信号很多情况仍然依赖经验阈值。后续我们想引入水下多相机的时间一致性约束把同一个体的跨帧跟踪和物种识别联合起来。那样理解就不再是静态图像层面的识别而是真正能把生态行为过程记录下来。多光谱数据接入也是一个很值得投入的方向——某些发光物种在常规RGB下信号很弱但特定波段下非常清晰这类多传感器融合说不定能把细粒度识别的上限再推高一截。如果你也在做水下目标检测或者类似的细粒度长尾任务我最后只想分享一个经验项目早期就把你的模型丢到一段没有经过挑选的原始视频里让它在没有任何人工筛选的噪声和混乱中跑上几个小时然后去看它犯的错误。这个动作比任何测试集指标都更真实、更快地告诉你现实场景里到底什么才是优先要解决的主要矛盾。
阅读完成 · 觉得有帮助?
咨询建站