ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

AI检测水下垃圾:从数据到部署的完整工程实践

AI检测水下垃圾:从数据到部署的完整工程实践 水下垃圾污染已经成为海洋生态治理中很难回避的问题。传统清理方式依赖潜水员、拖网和目视巡检效率不高也容易受天气、水流和深度影响。计算机视觉和深度学习成熟之后AI 检测水下垃圾逐渐成为替代人工巡检的重要方向。这里说的 AI 检测水下垃圾并不是让模型看一眼图片就输出“有垃圾”这么简单而是要在水下视频帧中定位出垃圾类别和像素范围输出可用于机械臂、AUV自主水下航行器或人工清理班组的坐标信息。这篇博客会围绕“AI 检测水下垃圾”的完整工程链路展开从水下成像特点、数据标注格式、模型选型、训练验证到部署常见问题和持续迭代尽量做到每一步都有可落地的代码或命令。读者如果是刚接触目标检测的开发者可以按文章顺序搭出一套最小可运行的水下垃圾检测流程如果已经在做相关项目排错和最佳实践部分可以直接拿来当检查单。1. 先理解水下垃圾检测的任务边界1.1 它不是普通目标检测水下成像质量是第一个约束陆地目标检测已经比较成熟因为图像清晰、光照稳定、类别外观相对统一。水下环境完全不同光线随深度按指数衰减水体对不同波长的光吸收程度也不一样红色和黄色最先消失图像整体偏蓝绿色对比度低。再加上水中悬浮颗粒造成的散射和反射画面会出现类似雾霾的效果远处物体边缘模糊甚至完全看不清轮廓。这些成像特性直接影响了 AI 检测水下垃圾的难度。如果直接把陆地目标检测的模型拿到水下图片上训练和推理通常会遇到两个问题一是模型学到的是“清晰物体的纹理”而不是“垃圾的轮廓和形态”二是训练数据和水下实地拍摄数据之间的颜色分布差异太大导致验证集 mAP 很高到了真实视频里却漏检频繁。所以在设计方案时不能只把 AI 检测水下垃圾看作“目标检测框架套数据”而是要把它当作一个“低对比度小目标检测 水下图像恢复/增强”的复合问题来处理。这也是后续数据增强、模型选型和训练策略都必须围绕的核心。1.2 典型垃圾类别与检测难点水下垃圾常见类别包括塑料瓶、塑料袋、渔网、金属罐、玻璃瓶、绳索、轮胎、橡胶制品等。不同类别的物理特性和沉底状态差异很大塑料瓶形状规则但容易被水流推动或部分埋入泥沙。渔网通常呈线状、网状目标长宽比极端传统锚框很难匹配。金属罐尺寸不大表面可能反光在弱光水下反而容易造成高亮斑块。玻璃瓶透明轮廓和背景重叠严重模型很难区分边界。绳索和细长物体容易被误判为水草或线缆。除此以外水下垃圾还存在严重的类内差异。同样是塑料瓶矿泉水瓶、饮料瓶、洗洁精瓶在颜色、透明度、体积上差异很大。模型的泛化能力不只是“记住类别”还要能理解“废弃物”和“自然物”之间的功能区分。这个语义层次比陆地目标检测更高也是数据标注时需要特别设计规则的原因。1.3 为什么用深度学习而不是传统图像处理传统水下垃圾识别方案一般走边缘检测、颜色空间变换、阈值分割和形态学处理路线。这种方法在处理单一场景、固定位置、光照稳定的条件下有效但遇到复杂背景、遮挡、光照突变就会失效。原因是水下图像的边缘信息受噪声干扰严重单纯靠颜色阈值很难同时兼顾多类别目标。深度学习目标检测模型通过卷积层自动学习从底层边缘到高层语义的特征表达对光照变化、尺度变化和部分遮挡有更强的鲁棒性。更关键的是目标检测模型输出的不只是类别概率还有边界框坐标这个坐标信息可以直接转成机械臂抓取点或 AUV 航点工程价值更高。对于需要实时分析水下视频的巡检场景单阶段检测器的推理速度也远优于传统滑动窗口加分类器的方式。当前常用的检测框架有两类。一类是两阶段检测器以 Faster R-CNN 为代表精度高但速度偏慢适合离线分析水下照片另一类是单阶段检测器以 YOLO 系列和 SSD 为代表速度快且部署方便适合水下视频实时处理。水下垃圾检测应用更看重实时性和部署成本因此本文的示例代码以 Ultralytics YOLOv8 为基础它同时支持检测、分类和分割任务并且有比较完整的训练与部署生态。2. 环境准备与数据组织2.1 开发环境与依赖版本在开始之前先把环境准备好。这里给出一个经过验证的组合但不代表所有环境都必须完全一致落地前要先确认自己的驱动和 CUDA 版本。软件推荐版本用途Python3.9 或 3.10运行训练和推理脚本PyTorch2.1 或 2.2深度学习框架CUDA11.8 或 12.1GPU 加速计算ultralytics8.xYOLOv8 训练与推理OpenCV4.8图像读取与预处理labelme / CVAT最新稳定版数据集标注在纯净环境中可以使用如下命令安装核心依赖python -m venv .venv source .venv/bin/activate pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python numpy matplotlib安装完成后运行一次导入检查确认环境没有发生底层库冲突python -c import torch, ultralytics; print(torch.__version__); print(ultralytics.__version__)如果输出两个正常版本号说明基础环境可用。接下来准备数据。2.2 公开数据集和自建数据集的取舍训练水下垃圾检测模型需要带标注的图片。公开数据集中TrashCan 是出现频率较高的水下垃圾标注数据集包含塑料、布料、金属、橡胶等多个类别Marine Debris Archive 则偏重于收集不同水体环境中的垃圾图像。Kaggle 上也有一些水下垃圾检测竞赛和公开图像集类别命名和标注风格各不相同。使用公开数据集的好处是起步快、标注统一缺点是数据来源往往是某个海域或某种水质环境直接用于其他水域会出现域偏差。实际项目更推荐“公开数据预训练 自建数据微调”的组合第一阶段用公开数据集训练一个能够提取“垃圾通用特征”的基线模型。第二阶段采集目标水域的视频帧挑选有代表性的样本按统一规范重新标注。第三阶段用自建数据微调模型并将公开数据中的部分样本与自建数据混合防止灾难性遗忘。如果项目预算有限也可以先不自己采集用公开数据先跑通整条流程等到已经有初步推理能力后再针对漏检样本做定向数据补充。这样能以最低成本验证技术可行性。2.3 数据目录结构与标注格式水下垃圾检测的数据组织可以参考 YOLO 的目录规范。下面是一个最小可用的结构underwater-trash/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamlYOLO 格式的标注文件是文本文件每一行代表一个目标格式为class_id x_center y_center width height其中x_center、y_center、width、height都是相对于图像宽度和高度的归一化值范围在 0 到 1 之间。例如一张 1920x1080 的图中有一个塑料瓶中心坐标是 (960, 540)宽度是 200高度是 400那么标注行是0 0.5 0.5 0.1041667 0.3703704这里width200/1920≈0.1042height400/1080≈0.3704。类别编号从 0 开始如果后续想增加“塑料瓶、渔网、金属罐、玻璃瓶”四个类别编号对应为类别编号plastic_bottle0fishing_net1metal_can2glass_bottle3如果原始标注是 COCO 格式的 JSON需要转换成 YOLO txt 格式。转换时最容易犯的错是忘记做归一化导致训练时报“box坐标越界”或者模型完全无法收敛。下面是一个简单转换脚本用于说明思路import json import os def coco_to_yolo(json_path, output_dir): with open(json_path, r, encodingutf-8) as f: data json.load(f) categories {c[id]: i for i, c in enumerate(data[categories])} for img in data[images]: img_id img[id] file_name img[file_name] img_w img[width] img_h img[height] label_lines [] for ann in data[annotations]: if ann[image_id] ! img_id: continue cat_id categories[ann[category_id]] bbox ann[bbox] # [x, y, width, height] x, y, w, h bbox cx (x w / 2) / img_w cy (y h / 2) / img_h nw w / img_w nh h / img_h # 防止浮点误差导致越界 cx min(max(cx, 0), 1) cy min(max(cy, 0), 1) nw min(max(nw, 0), 1) nh min(max(nh, 0), 1) label_lines.append(f{cat_id} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}) txt_name os.path.splitext(file_name)[0] .txt with open(os.path.join(output_dir, txt_name), w) as f: f.write(\n.join(label_lines))转换之后要检查标注框是否越界。YOLO 训练一般会忽略越界标注但越界会产生空标注文件导致该图片被跳过数据量白白流失。2.4 数据增强要模拟水下环境通用目标检测训练里翻转、缩放、旋转和 HSV 扰动是标配。水下场景光在水中的吸收和散射特性与陆地不同所以数据增强还应该包含以下策略色偏模拟随机把图像向蓝绿色调偏移模拟不同水深的颜色吸收。模糊增强使用高斯模糊模拟悬浮颗粒造成的散射。亮度抖动模拟光照突变和水面波纹造成的高亮区。低对比度增强模拟浑浊水体中的对比度下降。Cutout/随机遮挡模拟鱼群、气泡和悬浮物遮挡目标。Ultralytics YOLOv8 可以通过data.yaml和训练参数中的增强配置控制。例如在训练脚本中开启 HSV 扰动和翻转并设置合理的degrees旋转范围避免大角度旋转改变物体“沉底”的物理语义。水下目标通常是自由漂浮或躺在海底的过大的旋转不一定合理。下面的data.yaml是一个基础配置path: /data/underwater-trash train: images/train val: images/val names: 0: plastic_bottle 1: fishing_net 2: metal_can 3: glass_bottle数据校验这一步不建议跳过。在训练前先写一个脚本检查图片能否被 OpenCV 读取、标注文件是否存在、类别编号是否在合法范围内。这样可以提前暴露路径错误和数据损坏问题省下大量调试时间。import cv2 import os from pathlib import Path def validate_dataset(data_root): train_img_dir Path(data_root) / images / train train_label_dir Path(data_root) / labels / train bad_files [] for img_path in train_img_dir.glob(*.jpg): img cv2.imread(str(img_path)) if img is None: bad_files.append((str(img_path), image read failed)) continue label_path train_label_dir / (img_path.stem .txt) if not label_path.exists(): bad_files.append((str(label_path), label missing)) continue with open(label_path, r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: bad_files.append((str(label_path), bad line format)) break cls_id int(parts[0]) if cls_id 0 or cls_id 3: bad_files.append((str(label_path), finvalid class {cls_id})) break if bad_files: print(Found %d problems: % len(bad_files)) for path, reason in bad_files[:20]: print(path, reason) else: print(Dataset validation passed.) if __name__ __main__: validate_dataset(/data/underwater-trash)3. 用 PyTorch YOLOv8 搭建最小检测流程3.1 为什么选择 YOLOv8 而不是从零写网络结构水下垃圾检测项目的核心目标通常是把技术路线跑通并在真实场景中看清模型的不足。如果从零实现 Faster R-CNN 或自注意力网络会花费大量时间在数据加载、训练管线和后处理上不利于快速验证。YOLOv8 在速度和精度之间提供了一个比较平衡的默认值训练代码、预训练权重和部署工具都相对完整适合作为基线模型。如果你的项目最终需要部署到嵌入式设备YOLOv8 也支持导出 ONNX、TensorRT 和 NCNN 格式。先跑通标准流程再针对设备做剪枝、量化和算子替换是比较稳妥的路径。如果使用的是更新版本的 YOLO 系列配置方式大同小异只需根据官方文档调整参数名。3.2 训练前的数据划分与验证集训练前要把图片划分为训练集、验证集和测试集最好不要直接使用公开数据集自带的划分因为不同来源的图片可能重复或者某类目标过于集中在某段连续帧中。下面是一段基于随机种子划分数据的脚本import random from pathlib import Path import shutil random.seed(42) src_img_dir Path(/data/underwater-trash/images) src_label_dir Path(/data/underwater-trash/labels) train_ratio 0.8 val_ratio 0.1 img_files list(src_img_dir.glob(*.jpg)) list(src_img_dir.glob(*.png)) random.shuffle(img_files) train_files img_files[:int(len(img_files) * train_ratio)] val_files img_files[int(len(img_files) * train_ratio):int(len(img_files) * (train_ratio val_ratio))] test_files img_files[int(len(img_files) * (train_ratio val_ratio)):] for split, files in [(train, train_files), (val, val_files), (test, test_files)]: split_img_dir src_img_dir.parent / images / split split_label_dir src_img_dir.parent / labels / split split_img_dir.mkdir(parentsTrue, exist_okTrue) split_label_dir.mkdir(parentsTrue, exist_okTrue) for img_path in files: label_path src_label_dir / (img_path.stem .txt) if not label_path.exists(): continue shutil.copy(img_path, split_img_dir / img_path.name) shutil.copy(label_path, split_label_dir / label_path.name)这里有一个常见的坑同一个物体的连续帧必须放在同一个划分里否则训练集和验证集会非常相似验证曲线虚高真实场景一测就崩。建议在划分前对连续帧做去重或按视频 ID 分组。3.3 训练命令与关键参数数据准备好后可以用 Ultralytics 的 Python API 或命令行启动训练。下面是一个 Python 训练脚本from ultralytics import YOLO model YOLO(yolov8s.pt) model.train( data/data/underwater-trash/data.yaml, epochs100, imgsz640, batch16, device0, workers4, cos_lrTrue, lr00.001, augmentTrue, patience20 )参数说明如下参数含义调大/调小影响推荐设置imgsz训练输入尺寸调大能提升小目标检测精度但显存占用和训练时间增加640 或 1280batch每 GPU 的批大小调大加速稳定但显存不足会中断按显存决定16 或 32epochs训练轮次过小欠拟合过大没有明显收益100 到 200lr0初始学习率过大 Loss 震荡过小收敛慢0.001 左右patience早停耐心值小则过早停止大则浪费时间20 到 30cos_lr余弦退火调度让学习率平缓下降收敛更稳推荐开启训练时如果使用预训练权重yolov8s.pt模型会加载在 COCO 上学习的通用特征再迁移到水下垃圾目标上收敛速度会比随机初始化快很多。第一次训练不建议直接使用最大分辨率先用 640 跑通确认数据没有问题再提高分辨率看是否有提升。命令行训练方式更加简洁yolo detect train data/data/underwater-trash/data.yaml modelyolov8s.pt epochs100 imgsz640 batch16 device0训练结束后runs/detect/train/weights/目录下会生成best.pt和last.pt。best.pt是在验证集上表现最好的权重last.pt是最后一个 epoch 的权重一般部署时选择best.pt。3.4 推理与结果可视化训练完成后先用单张测试图片验证推理流程yolo detect predict model/data/underwater-trash/runs/detect/train/weights/best.pt source/data/underwater-trash/images/test/trash_001.jpg conf0.25如果需要在 Python 脚本中集成推理并输出检测框坐标用于后续机械臂控制可以参考下面的代码from ultralytics import YOLO model YOLO(/data/underwater-trash/runs/detect/train/weights/best.pt) results model.predict( sourceunderwater_video.mp4, conf0.25, iou0.45, streamTrue ) for frame_id, result in enumerate(results): boxes result.boxes if boxes is None: continue for box in boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) x1, y1, x2, y2 box.xyxy[0].tolist() print(frame_id, cls_id, round(conf, 3), [round(v, 1) for v in (x1, y1, x2, y2)])推理时conf0.25表示置信度阈值低于该值的框会被过滤iou0.45用于 NMS 去除重叠框。水下图像模糊、目标边缘不清晰阈值设置过高会漏检过低会造成大量误检。建议根据实际场景做小范围搜索不必拘泥于默认值。4. 验证模型是否真的能用4.1 用 mAP、Precision 和 Recall 判断模型质量训练过程中Ultralytics 会在验证集上实时计算一组指标其中最重要的是Precision预测为正例的框中有多少是真正的垃圾。Recall真实垃圾中有多少被模型找了出来。mAP50IoU 阈值为 0.5 时的平均精度均值。mAP50-95IoU 阈值从 0.5 到 0.95 的平均值指标更严格。水下垃圾检测中Recall往往比Precision更值得关注。漏检一个垃圾比误检一个石块更容易造成清理遗漏。但也不能无限提高 Recall否则系统会对鱼、珊瑚、水草产生大量误报影响自动化设备决策。评估时不要只看平均值要按类别查看单类指标。很多项目整体 mAP 不错但渔网、绳索等细长物体类别的 AP 非常低。出现这种情况时需要专门为这些类别增加训练样本或调整锚框策略。4.2 离线评估和真实视频验证为什么不等价离线评估使用静态图片测试集反映的是模型在“单帧清晰图像”上的能力。真实水下巡检通常是视频流模型要面对连续帧的动态变化、相机运动模糊、悬浮物遮挡和水流造成的目标形变。因此只报告测试集 mAP 不够还需要在真实视频或模拟水下环境中做一次端到端验证。验证步骤建议按照以下顺序挑选一段包含多个垃圾类别的水下视频提取 300 到 500 帧。用训练好的模型逐帧推理统计检出数量、误检数量和丢帧情况。人工抽查置信度在 0.3 到 0.6 之间的检测框分析是漏检还是误检。记录常见失败场景例如“绿色渔网在绿色水草背景中被漏检”“透明玻璃瓶被背景吸收”。这一步得到的结果比 mAP 更接近真实业务价值也为后续数据补充指明了方向。4.3 保存错误样本建立难例池第一次训练很难直接达到可用状态。更高效的方式是建立难例池将验证和实测中的漏检图片保存到hard_examples/目录。将误检图片保存到false_positive/目录。定期人工复核难例池修正错误标注后补充到训练集。难例池的价值在于它让后续迭代不是盲目增加数据而是针对当前模型最薄弱的环节定向补数据。这个做法在真实项目中比反复调超参数有效得多。5. 水下垃圾检测落地的常见问题与排查链路5.1 训练 Loss 不下降或震荡现象训练刚开始 Loss 很大训练多轮后 Loss 仍然没有明显下降或者验证集 Loss 出现剧烈震荡。可能原因学习率设置过大或过小。数据集存在大量错误标注。标注文件类别 ID 和data.yaml不一致。图片尺寸和标注框不匹配导致边界框始终是错误位置。训练集和验证集划分不均匀验证集包含过多难样本。检查方式python validate_dataset.py先确认数据校验脚本通过再查看训练日志中box_loss和cls_loss的变化。如果box_loss不下降重点检查标注框如果cls_loss不下降重点检查类别定义和类别比例。处理建议先用小规模数据跑 20 个 epoch 做冒烟测试确认 Loss 能下降再启动完整训练同时把初始学习率降到 0.0005 左右观察是否更稳定。5.2 小目标和遮挡目标严重漏检现象塑料瓶等小型垃圾在近距离视频中能检出但在远景帧或目标被水草部分遮挡时完全漏掉。可能原因输入分辨率过小小目标在特征图上只占几个像素。锚框设计不适合水下小目标。NMS 阈值设置不当把相邻目标合并。训练数据中缺少小目标样本。处理建议将imgsz从 640 提升到 1280但要注意显存占用和推理耗时。在训练数据中增加“裁剪放大”增强模拟靠近目标的状态。对检测结果做分块推理例如把 1920x1080 图像切分成多个重叠 patch分别检测后再聚合。如果模型结构允许调整检测头的 anchor 尺寸或使用解耦头使小目标更容易匹配。这类问题不是一天能解决的最好的路径是建立一套“小目标测试集”每次改动后都能快速比较基线模型和新模型的召回率。5.3 训练集和真实环境差异过大现象离线测试 mAP 很高但在目标海域的真实视频上出现大面积漏检或误检。可能原因训练数据来自公开数据集成像水质和研究海域差异大。光照、季节、水深、悬浮物浓度变化导致颜色分布偏移。模型学到的是“数据集特有纹理”而不是“垃圾通用语义”。处理建议采集目标海域的视频帧作为微调数据。在数据增强中加入更随机的水下颜色变换。使用域适应方法例如将源域和目标域图片在特征空间对齐但这也增加了实现复杂度。先用少量目标域数据做测试人工观察明显漏检再决定是否需要从头训还是微调。实际项目中最有效的仍是“数据回灌”把真实场景拍摄的视频加入到训练集反复做几轮迭代。模型对特定水质的适应能力会明显提升。5.4 显存不足、训练中断和依赖版本冲突显存不足通常是 batch 或 imgsz 设置过大可以按顺序降低batch、imgsz或使用梯度累积模拟更大 batch。训练中断则优先检查本地磁盘空间、GPU 温度和日志输出。依赖版本冲突多见于torch和ultralytics的版本组合不匹配简单做法是在虚拟环境中固定版本重新安装不要直接覆盖全局环境。下面整理一份常见问题速查表问题现象常见原因检查方式处理建议训练 Loss 一直不降标注错误、类别 ID 错乱数据校验脚本修复标注启用余弦退火验证 mAP 高但实测漏检训练集分布偏差真实验证集评测补充目标域数据微调小目标漏检输入分辨率低、锚框不匹配查看小目标类别 AP提高 imgsz使用分块推理推理时误检大量水草背景和目标外观相近查看误检样本增加负样本降低置信度阈值GPU 内存溢出batch 或 imgsz 过大nvidia-smi降低 batch开启梯度累积训练中途停止磁盘满、进程被杀查看日志清理空间使用 nohup 或 tmux 运行6. 从实验到生产部署、监控和迭代6.1 模型导出与推理加速实验环境跑通后下一步是把模型部署到巡检设备或后端服务。YOLOv8 支持多种导出格式yolo export model/data/underwater-trash/runs/detect/train/weights/best.pt formatonnx dynamicTrue导出 ONNX 后可以继续转成 TensorRT 引擎需要 NVIDIA 设备以提升推理速度在边缘设备上也可以转成 NCNN 或 OpenVINO。转换过程中要注意输入尺寸是否固定动态尺寸虽然灵活但在某些推理引擎中性能会打折扣。部署时不要直接使用 PyTorch 模型加载方式除非是离线分析任务。生产环境中优先使用 TensorRT、ONNX Runtime 或专门推理框架它们的内存峰值更低单帧延迟也更稳定。6.2 监控模型推理质量上线后模型会遇到训练时没见过的场景。需要建立基础的监控机制记录每帧检测到的类别、数量、置信度分布。定时抽取一定比例的检测结果人工复核。将置信度大于阈值但实际是误检的样本以及置信度低于阈值但实际是目标的样本回流到难例池。当某个类别检出数量突然剧烈变化时触发告警并检查是否出现水质变化或模型退化。这些监控不一定要做得很复杂但至少要让模型输出“可追溯”。如果检测结果只是在屏幕上闪一下没有日志后续想定位问题会非常困难。6.3 持续迭代的检查清单水下垃圾检测项目不会只有一次训练。下面是一份可以直接复用的检查清单每次新增数据或调整模型时都可以按清单走检查图片是否能正常读取图像分辨率是否统一。检查标注文件是否存在、类别编号是否合法、框坐标是否越界。划分训练集、验证集、测试集时按视频 ID 分组避免泄漏。使用预训练权重初始化观察前 20 个 epoch 的 Loss 走势。比较best.pt和last.pt在固定测试集上的 mAP。在真实视频上做逐帧验证记录漏检和误检样本。将错误样本人工复核后加入难例池再进入下一轮训练。部署前导出 ONNX 或 TensorRT确认推理时间和显存占用在可接受范围内。部署后保留每个版本的模型备份和参数配置方便回滚。这个清单看起来简单但很多项目在数据路径、类别定义和验证集划分上反复出问题提前固化流程能节省大量沟通成本。7. 从检测结果到业务价值清理决策与后续方向7.1 让检测结果辅助清理决策检测模型输出的是“哪里有垃圾、是什么垃圾、置信度多少”但真正的业务目标是“如何高效清理”。这一步需要把检测结果和空间信息结合起来。例如对 AUV 巡检测得的每一帧结果做时间戳和 GPS 位置同步得到垃圾分布热力图。清理团队可以按热力图优先处理高密度区域。对于机械臂抓取检测框的中心点可以转换到机械臂坐标系但要注意水下折射和目标移动的影响最终抓取时往往还需要结合深度相机做二次定位。检测结果还可以用于长时间趋势分析某个海域的塑料垃圾数量是否在上升哪些季节漂浮垃圾增多这些统计信息对环境保护和市政决策更有价值。模型输出的边界框和类别是基础数据后续分析都是在这些原始结果之上叠加的。7.2 可扩展的方向从目标检测出发可以沿几个方向扩展语义分割把“垃圾区域”按像素分割出来适合渔网、大面积薄膜等不规则目标。视频检测用时间上下文消除单帧误检连续多帧稳定出现的物体才判定为垃圾。多光谱融合结合水下可见光和声呐数据提高浑浊水域的检测能力。轻量化部署用剪枝、量化和知识蒸馏压缩模型跑在低功耗水下机器人上。主动学习让模型选择最不确定的样本交给人工标注降低标注成本。这些方向不是同时都要做而是根据项目实际瓶颈来选择。如果当前最大问题是小目标漏检优先做高分辨率输入和分块推理如果是连续帧误报太多再引入时序滤波。回到最开始的问题AI 检测水下垃圾之所以有工程价值不是因为模型能“认出”一张图片里有瓶子而是因为它能把不完整的、复杂的水下视觉信息转化为可执行的位置和类别数据支撑后续的清理、统计和监测工作。对开发者来说先跑通一条最小流程再把真实场景的失败样本持续回灌比追求某一个指标更高更有意义。扎实做好数据校验、指标分析和难例迭代这个方向才能真正从实验室走向海洋。
返回列表