
AI 检测水下垃圾这个话题听起来像是一个环保 Demo 项目但真正做起来你会发现它其实是“目标检测 水下光学成像 边缘部署”三件事叠在一起。大多数人接到这类任务第一反应是找模型、跑训练结果往往不是模型不准而是数据、标注、验证和部署里的坑没有提前排掉。我会按做这类项目的顺序来讲先搞清楚问题边界再把小样本跑通最后才讨论批量、部署和自动化。适合三类人想入门水下计算机视觉的学生做海洋环保数字化方案的产品或开发以及手上已经有水下巡检视频但不知道如何自动分析的工程团队。最值得关注的不是某个模型跑多快而是你能不能稳定地重复得到可用的检测结果。如果按 AI 工程实践的视角看这个方向最大的门槛从来不是算法而是从数据到部署全链路的管理。1. 水下垃圾检测为什么比普通目标检测更麻烦1.1 解决的不是“找垃圾”而是“在恶劣视觉条件下找小目标”普通的目标检测在自然光、清晰图像上已经很成熟。我们日常见到的行人检测、车牌识别、商品检测输入图像质量相对稳定背景也相对可控。水下场景完全不一样。水下图像最常见的问题有这么几个光在水里衰减非常快超过一定深度后颜色会偏蓝绿色。悬浮颗粒物会造成散射让画面像蒙了一层雾。水体浑浊时对比度极低目标的边缘和背景融为一体。垃圾目标往往不大比如一个塑料瓶、一小片渔网、一个玻璃瓶在视频里可能只占几十个像素。目标还经常被泥沙、水草、鱼群遮挡出现局部不可见。所以这个任务的核心不是“模型不认识垃圾”而是“模型从已经严重退化的图像里识别出垃圾”。很多模型在陆地上表现不错一到水下精度就下降不是模型突然变笨而是输入特征少了很多。我们需要在模型训练和数据预处理上都做针对水下的适配才能把检测能力补回来。1.2 与传统潜水员、拖网采样相比AI 检测的价值在哪传统的水下垃圾调查主要有三种方式潜水员下潜目测记录垃圾类型和大致数量。拖网采样把海底的垃圾捞上来称重、分类。有人坐在岸边或者船上看水下视频录像人工标记可疑目标。这些方式都有实际价值但也很受限制。潜水员下潜有时间限制无法长时间大面积覆盖拖网采样对海底生态有一定扰动而且只能覆盖拖网经过的区域人工看视频很耗时长时间盯屏幕也容易出现漏看。因为成本高很多水域的垃圾调查只能做到抽样很难形成连续的空间分布数据。AI 检测的价值不是“替代人工”而是让有限的人力去看高概率区域。先用目标检测模型自动处理视频把置信度高的目标标记出来再由人工复检和清理。整个过程可重复、可量化、可回溯。比如同一段巡检测视频今天跑一遍和明天跑一遍模型输出应该是基本一致的这比人工肉眼判断更容易形成长期记录。1.3 这类项目的真正工作量分配很多人以为做水下垃圾检测就是把公开数据集下载下来训练一个模型然后直接部署工作量主要集中在模型训练。实际做下来不是这样。我一般会把工作量按三块拆数据收集、清洗、标注大概占 40% 到 50%。模型训练、调参、验证大概占 25% 到 35%。部署、测试、排查、和业务对接大概占 25% 到 30%。如果项目排期只剩两周千万不要把时间全压在“把模型调得更准”上。更稳妥的做法是先跑通一个最小闭环用少量数据完成训练、推理、输出报表再根据结果决定是否需要扩大数据。否则很容易出现训练了几天最后发现标注格式有问题或者跟部署设备的输入格式不匹配。2. 从 0 开始做一个水下垃圾检测小项目先准备什么2.1 数据来源公开数据集、已有巡检视频、自采样本做这个项目第一件事不是选模型而是盘数据。没有数据后面的训练和部署都无从谈起。数据来源常见的就三条路公开数据集。网上有一些水下垃圾检测相关数据集也有海洋生物数据集可以作为补充。但要注意公开数据集往往来自特定海域、特定采集设备、特定光照条件直接用到你的项目里不一定合适。它会给你一个很好的预训练基础但直接作为测试依据有风险。已有巡检视频。很多环保单位、养殖企业、水务部门手里已经有水下摄像头拍过的视频素材。这些是最接近真实场景的数据但通常没有标注需要加工。自采样本。如果条件允许可以带着水下相机或小型遥控潜航器去目标水域拍一段。起步阶段不要求数量多能有几十到几百个有效目标实例就足够验证项目能不能跑通。我的建议是先用已有视频里的几百帧做一个小数据集把训练、推理流程跑通。不要一开始就去外面买数据或者大规模标注等流程验证完再扩大范围。2.2 软硬件条件训练端和推理端分开考虑做 AI 应用开发最容易犯的错就是把开发机的配置当成部署环境的配置。训练端普通消费级显卡就可以跑小模型和中型模型。显存 8GB 到 16GB 比较稳妥显存不够的时候可以降低 batch size、缩小输入分辨率或者用预训练权重冻结主干网络。不要一开始就想着跑几十亿参数的大模型水下目标检测这类任务用轻量模型可能更合适。推理端要看实际使用场景。如果是在岸边用台式机处理离线视频算力压力不大只要确保处理速度能跟上视频时长就行。如果是要放到水下机器人、无人船或者边缘盒子上面做实时检测就要反过来选模型。优先考虑轻量模型、量化部署、低分辨率推理。这时候开发机上的精度和速度没有直接参考价值必须拿目标设备实跑。2.3 任务定义先分清要检测什么再谈模型拿到需求后先问清楚几个问题是检测“所有垃圾”还是只检测“塑料瓶、渔网、金属、玻璃”中的某几类是需要实时检测还是录像后离线分析输出只要类别和坐标还是需要按时间统计数量、生成报表误报和漏检哪个更不可接受这些问题没有想清楚后面一定返工。举个例子。如果需求写的是“检测水下垃圾”模型很难训练因为“垃圾”这个词太宽泛。塑料瓶和废渔网在视觉上差别很大生锈的铁罐和石头又很像。要先把类目收敛成可标注、可学习的视觉类别。我一般建议起步用粗粒度比如“塑料类”“渔网渔具类”“金属/玻璃类”“其他”等数据量大了再细分。3. 数据与标注决定模型上限的关键环节3.1 图像预处理水下颜色衰减、光照不均、雾化模糊水下视频直接拿来做训练效果往往不好因为图像太糊、颜色太偏。常见的预处理手段包括颜色校正、对比度增强、去雾、直方图均衡等。但这里有个容易踩的坑预处理不是越重越好。过度增强会让图像失去原来的纹理信息模型学到的可能是人为处理后的颜色模式而不是垃圾本身的特征。我一般会保留原始图和增强图训练时按一定比例混合。这样模型既能见到原始水下图像的噪声也能借助增强图学到更清晰的目标特征。3.2 标注规范和类别设计类别越细标注分歧越大标注质量直接决定模型上限。如果标注乱损失曲线再漂亮最后推理结果也是乱的。标注时有几条实际经验类目尽量少先用粗粒度。类别越细标注分歧越大模型越难收敛。目标特别小或者严重模糊时宁可不标也不要硬标。硬标出来的框模型学不到有效特征反而会把噪声带进来。边界框要紧贴目标的可见区域不要根据想象把被遮挡的部分也框进去。同一批数据的标注人要保持统一标准。比如“贴着瓶身标”还是“把周围光晕也标进去”必须定死。如果团队里多个人标注可以先让两个人各标 20 张对比差异统一标准后再大规模标注。3.3 数据增强的“水下化”改造常规目标检测训练里常用翻转、旋转、缩放、亮度变化、HSV 扰动这些增强。水下场景还要额外做几个操作随机颜色偏移模拟不同水深和水质下的色偏。添加模拟模糊贴近浑浊水体里的目标成像。降低对比度模拟雾化情况。添加一些模拟悬浮颗粒的噪声。这些增强能让模型在面对真实水下视频时更鲁棒。但注意强度不要过高。增强的初衷是让模型学习目标在变化条件下的不变特征如果增强后训练图像都看不清了模型学的就不是目标而是噪声。3.4 样本量与验证集设计最小实验阶段每个类别有 20 到 50 个目标实例就可以验证“流程能不能走通”。正式实验阶段每个类别建议几百到几千个实例具体数量取决于目标多样性和场景复杂度。验证集的设计很容易被忽略。很多人直接把图片随机切分成训练集和验证集结果验证效果虚高。原因在于这些图可能来自同一段视频的相邻帧内容高度相似模型相当于见过答案。正确做法是按视频片段切分也就是同一段视频参与训练就不能再进入验证集。这样才能验证模型在新场景上的泛化能力。4. 模型选型与训练先小样本跑通再谈参数拉满4.1 轻量目标检测模型是起点常见开源目标检测模型里YOLO 系列因为部署生态成熟、推理速度快很多水下视觉项目会把它作为起点。也有基于 DETR 或 Transformer 的检测模型但训练资源和部署成本相对高。如果你的目标是先验证一个试点项目我建议先用轻量模型把流程跑通而不是把精力放在精度竞赛上。模型的选型不只看精度还要看推理设备兼容性、模型文件大小、训练显存占用。一般我会先固定一个模型跑通全流程再考虑是否需要换更大的模型。直接上大模型训练时间长部署困难而且在小数据集上未必比轻量模型效果好。4.2 训练流程的最小闭环我在新项目里从来不会上来就在全量数据上训练。顺序是这样的准备 5 到 10 张带标注图片先过一遍训练到推理的完整流程。确认标注格式、类别映射、数据加载没有问题。只用小样本训练少量轮次看损失是否下降。推理一张训练过的图片看检测框和类别是否合理。确认一切正常后再做正式训练。这一步看起来很慢实际上能帮你省下大量时间。标注格式错误、类别 ID 错位、图像路径问题都是在早期就能暴露出来的而且修复成本最低。下面是一个流程示例具体代码要结合你用的框架版本# 1. 读取小样本数据集 # 2. 加载预训练权重 # 3. 冻结主干只训练检测头 # 4. 使用小学习率训练少量轮次 # 5. 保存验证集上表现最好的权重这不算一个完整的训练代码但核心是让你理解顺序先小后大先跑通再优化。4.3 关键训练参数怎么理解训练参数不需要一开始就全部调优但几个关键参数要心里有数。参数含义建议输入分辨率检测图像缩放后的尺寸先 640小目标检不出来再升到 960 或 1280batch size单次训练使用的图片数量受显存限制小模型可用 8 到 16学习率参数更新步长先用默认或按 batch size 缩放冻结主干前若干层不参与训练数据少时有效可以防过拟合训练轮次完整遍历训练集次数小样本不要硬跑几百轮结合验证集早停不要一上来就把分辨率拉满、把 batch 拉满。分辨率越高显存和推理时间增长越明显但精度不一定会成比例提升。训练时先保持默认参数观察损失曲线再逐步调整。给足训练时间但也要有早停意识。如果验证集指标连续很多轮不升就停下来不要盲目等它自己变好。4.4 大模型和水下检测的关系别被“AI 幻觉”带偏现在很多人会想到用多模态大模型来做图像识别。大模型确实能描述出“画面里有一张渔网”这可以用于报告生成、语义描述、人工复检辅助。但在水下小目标检测场景里大模型有一个明显问题它可能一本正经地描述出画面里并不存在的东西也就是 AI 幻觉。尤其是模糊的目标、颜色偏色的图像大模型很容易根据上下文联想出“塑料瓶”或“渔网”但给出的坐标和数量往往不可靠。正式检测结果必须来自目标检测模型用边界框和置信度来量化大模型更适合做检测后的文本总结、任务提醒和分析报告。两者结合起来才是更稳妥的方案。5. 推理与部署从单张图片到无人机、ROV 实时检测5.1 推理验证先看单张图再看视频流训练完模型后不要直接拿整段视频去跑。正确的顺序是先做单张图推理再做短序列验证。单张图推理要看几个点检测框是否紧贴目标。类别是否准确。置信度是否合理。有没有大量误检比如把石头当铁罐、把鱼当塑料瓶。单张图没问题后再跑一段连续 50 帧到 100 帧的视频。这时重点看时间稳定性。如果目标明明一直存在检测框却时有时无或者类别反复横跳就需要调整置信度阈值和 NMS 阈值。先解决稳定性再考虑全视频批量跑。5.2 边缘设备部署的瓶颈水下部署的场景通常是在 ROV、水下机器人或者无人船上这类设备的计算能力往往比手机还弱。部署时要提前想清楚几个约束模型大小要控制。轻量模型可能只有几十 MB大模型可能几个 GB差距会影响加载时间和推理延迟。输入分辨率要控制。边缘设备上跑 1280 分辨率速度可能比 640 慢好几倍。浮点模型和量化模型的差别。int8 量化能明显提升速度但可能掉精度必须先做对比。断连场景。水下设备网络不稳定推理最好放在设备端检测结果再回传不要依赖云端推理。如果设备端的算力确实很低可以考虑离线分析。视频录下来回到岸上再批量处理也是一种有效方式。实时检测和离线检测要分开规划不要混在一起。5.3 从检测结果到报告记录坐标、时间和置信度模型输出不能只是一张画了框的图片要结构化。工程化时至少要记录这些字段时间戳或视频帧号。图片编号或视频编号。检测类别。置信度。中心点坐标。边界框宽高。场景位置信息比如经纬度或巡检点编号。下面是一个输出 JSON 的字段示例{ video_id: site_a_20250101, frame_index: 1200, objects: [ { class: plastic, confidence: 0.87, bbox: [120, 80, 160, 140] }, { class: net, confidence: 0.72, bbox: [320, 150, 200, 210] } ] }字段固定后才能做后续统计。比如计算某个区域每小时的塑料瓶检测数量或者按巡检日期生成一张垃圾密度分布表。6. 用“AI Agent”思路把检测流程工程化6.1 一个最小 Agent 管什么检测模型训练完不应该只在笔记本上手动跑图片。一个真正的项目需要一个可重复执行的流程。用 AI Agent 的思路可以把这个流程自动化。最小 Agent 可以做这些事情扫描指定目录发现新视频。按固定间隔抽帧或直接处理视频流。调用检测模型识别水下垃圾。把结果写入数据库或 JSON 文件。根据置信度阈值生成报表。发现高置信度目标时触发告警或通知人工复核。这个 Agent 不一定要复杂一个 Python 脚本加定时调度就能实现。关键是让“检测”从一次性实验变成可持续运行的服务。6.2 批量任务、队列、失败重试批量跑视频时最怕任务跑到一半卡住。原因可能是某个视频编码异常、某帧解码失败、显存不足或者磁盘写满。如果没有任务管理机制一个错误可能让整个批次报废。工程化时要注意几点输入列表和输出目录分开每个输入对应唯一的输出文件。失败任务单独记录重试时只处理失败项而不是全部重跑。给单段视频设置超时时间。如果超过预期时长还没结束主动终止并记录原因。日志里记录每段视频的开始时间、结束时间、成功帧数、失败帧数。这里最核心的是“失败可重试、结果可对比”。否则每跑一次批量任务都可能产生新问题而且出了问题很难定位。6.3 输出一致性与日志管理输出格式要固定。今天想加一个字段明天想改一个字段会直接导致历史数据没法对比下游报表也会出问题。先定一个 schema版本稳定后再扩展每次改动都要做兼容。日志管理同样重要。没有日志的结果基本不可信。比如模型跑完一段视频发现有 100 个目标但如果不知道这段视频是从哪个文件、哪个模型版本、哪个阈值下产生的这个数字就没有意义。建议至少记录模型版本、权重文件路径、置信度阈值、输入视频路径、输出文件路径。7. 测试结果怎么看指标不是越多越好7.1 先看混淆矩阵再看 mAP 和召回率很多人训练完只看一个 mAP感觉数字还行就认为完事了。但在水下垃圾检测里这样做很容易漏掉问题。一个典型的例子模型对塑料瓶检测很好但渔网完全漏检。整体 mAP 看起来可能还不错因为塑料瓶在数据集里占比高拉高了平均值。我更建议先看混淆矩阵重点关注哪些类别互相混淆。渔网和绳索、塑料瓶和鱼、生锈铁罐和石头都是常见的混淆对。如果发现某一类检测效果特别差不要盲目调全局参数先分析这一类的问题往往是样本数量不够或类别本身区分度低。7.2 置信度阈值该调多高置信度阈值直接决定召回率和误报率。阈值低一点模型会把更多不确定的区域判为目标召回率高但误报多。阈值高一点误报少但会漏掉很多模糊目标。水下场景里没有固定的“最优阈值”。更大范围的筛查任务可以接受低阈值然后由人工复核高置信区域如果是自动统计和自动告警阈值要调高一些避免频繁误报消耗人工注意力。实际项目里我会先跑验证集画出召回率和误报率随阈值变化的曲线再根据业务需求选一个落点。不要拍脑袋定 0.5 或 0.6。7.3 误检和漏检的取舍误检和漏检的取舍本质上是业务风险的取舍。如果是环保监管、垃圾清理漏检更严重。漏掉一个塑料瓶可能让评估结果偏低后续清理计划也会受影响。如果是违法行为倒垃圾监测误报更严重。频繁误报会让工作人员对系统失去信任最后整个工具被弃用。先想清楚这个项目主要解决谁的问题再决定置信度阈值、模型复杂度和人工复核流程。不要追求“所有垃圾都能检测出来”这种情况在真实水下场景里很难做到。7.4 在水下场景里什么叫“效果可用”对一个试点项目来说“效果可用”不是一个很高的精度数字而是满足三个条件能在真实拍摄的视频里稳定发现值得人工去看的目标。能把人工需要看的视频时长明显缩短。结果可以复现同一段视频重跑结果基本一致。如果这三条都满足模型精度再低一点也有交付价值。反过来如果模型在验证集上分数很高但一到实际现场就频繁漏检、误检那这个分数没有意义。做工程交付比的是完整可用不是单点指标领先。8. 常见翻车现场与排查顺序8.1 检测效果差先别急着换模型水下垃圾检测效果差第一反应都是换模型、调参数。但大多数情况下问题不在模型本身。我一般会按这个顺序排查先看输入图像质量。画面是不是过暗、过模糊、颜色严重失真。检查标注。类别是否统一边框是否紧贴目标有没有大量漏标或错标。检查训练集和验证集是否同源。如果来自同一段视频验证结果会虚高。检查输入尺寸。分辨率太小时小目标可能只占几个像素模型根本看不出来。调整置信度阈值和 NMS 阈值而不是改模型结构。这个顺序下来很多“模型不准”的问题都能解决。8.2 部分类别完全检不出来如果模型其他类都正常只有某一类完全检不出来优先查这几个原因该类别在训练集中的实例数量是不是太少。类别名称或 ID 是否在标注和训练配置里对不上。该类别是否被其他类别覆盖比如把“瓶盖”都归到“塑料瓶”。增强策略是否让该类别的样本变得过度模糊或过暗。解决方式通常是补充该类别的样本或者降低类别粒度。比如“渔网”“绳索”“织物”区分度太低可以合并成“渔网渔具类”。8.3 部署后速度慢、卡顿部署后速度慢不要只盯着模型推理时间。先做一次耗时拆分视频解码占多少时间。图像缩放、颜色转换占多少时间。模型推理占多少时间。结果后处理和写日志占多少时间。我见过不少项目模型本身很快但视频解码用的是软件解码或者每帧都做大规模图像缩放导致整体延迟极高。把耗时拆开才能定位瓶颈。8.4 输出结果不稳定同一张图片多次推理结果差异很大的话先检查是否在测试阶段开启了训练模式或随机增强。很多框架里训练和测试模式要显式切换忘记切换会导致推理时也做随机操作。如果是批量任务之间结果不一致可能跟数据加载顺序、输出文件命名、路径拼接有关。任务卡住或输出为空时先看日志再看输出目录最后看资源占用。不要反复修改模型参数那是最后一步才做的事。以后再做类似项目我的顺序基本固定先盘数据和任务定义再跑最小样本然后小批量验证最后才上部署和自动化。踩过几次坑以后会发现很多问题不是模型能力不够而是输入图像质量、标注一致性和部署链路没理顺。如果你刚拿到一个水下垃圾检测项目可以先找一段几十秒的巡检测视频把“能不能稳定检测、能不能跑到够快、结果能不能复现”这三件事做出来。这三件事通了项目才能真正往前推。