1. 这篇文章真正要解决的问题
如果你在 CSDN 上搜过“水下目标检测”,大概率会看到两类内容:一类是学术论文的复现笔记,模型跑在公开数据集上,mAP 报得一个比一个好看;另一类是“AI + 环保”的宏大叙事,说 AI 能自动发现海底垃圾、保护海洋生态。但真到想下手做一个系统时,你会发现中间缺了很大一块:水下这个环境,和陆地目标检测根本不是一回事。
陆地目标检测,摄像头是干净的,光线是稳定的,目标形态是相对规整的。你可以轻松找来几万张标注好的图像,直接丢进 YOLO 训练。水下环境完全不同:光线被水吸收,颜色随深度漂移,水体浑浊导致对比度极低,悬浮颗粒制造大量噪声。更头疼的是,垃圾这个类别本身就没有固定形态——一个塑料袋在水里可能蜷成一团,也可能展开像一片水母;一个渔网可能缠绕在礁石上,也可能悬浮在水中,和被冲下来的海草混在一起。
这篇文章要解决的核心问题,不是教你“跑通一个 YOLO 训练脚本”,而是带你理清:从“AI 能识别水下垃圾”这件事,到一个可落地的水下垃圾检测系统,中间需要跨越哪些技术鸿沟。
我会从图像退化原理讲起,说明为什么水下目标检测不能照搬陆地方案;然后给出一条实用的技术路线,包括数据预处理、模型选型、训练配置、推理验证;最后补充工程落地时的常见坑和最佳实践。读完这篇文章,你应该能对自己的项目做出判断:数据够不够、模型选哪类、部署在什么硬件上、效果怎么评估。
2. 水下目标检测的基础概念与核心原理
2.1 先拆清楚“水下垃圾检测”到底是个什么任务
从计算机视觉的角度看,水下垃圾检测本质上是一个**目标检测(Object Detection)**任务:给定一张水下图像,算法需要输出图像中出现的垃圾目标的类别和位置边界框。
但它和通用的目标检测有一个关键差异:图像质量退化严重。水对光的吸收和散射会显著降低图像质量,目标往往模糊、颜色失真、对比度低。这意味着,哪怕你用的模型架构再强,直接把原始图像喂进去,效果也会大打折扣。
业界通常把水下目标检测系统的技术栈拆成四层:
| 层级 | 主要工作 | 典型技术/工具 |
|---|---|---|
| 图像采集层 | 水下相机、光源、ROV/水下机器人 | 水下摄像头、LED 补光、声纳 |
| 图像增强层 | 颜色校正、去雾、对比度增强 | 灰度世界算法、暗通道先验、深度学习增强模型 |
| 检测识别层 | 目标定位与分类 | YOLO系列、RT-DETR、Faster R-CNN |
| 部署决策层 | 端侧推理、结果后处理、告警 | TensorRT、ONNX Runtime、边缘计算设备 |
很多入门者把精力全部押在第三层“检测识别层”,调模型调得昏天黑地,但忽略了前面两个层级。真实项目里,前面两层往往决定了检测效果的最终上限。
2.2 核心原理:水对成像的影响
要理解水下视觉为什么难,先要理解水怎么“破坏”图像。水对光的衰减遵循一个基本规律:不同波长的光在水中的衰减速度不同。红光衰减最快,蓝绿光衰减最慢。这就是为什么水下照片普遍偏蓝绿色,而红色物体会迅速“消失”成灰黑色。
此外,水中悬浮的微小颗粒会对光线产生散射,形成类似雾天的效果,叫做“水下雾化”。这会导致图像对比度下降,远处细节完全丢失。
因此,水下图像增强的任务本质上是两件事:色彩补偿(把被水吸收的颜色恢复回来)和对比度恢复(把散射造成的模糊去掉)。处理完这两步,再把图像交给检测模型,模型才能看到更接近目标真实样貌的特征。
2.3 容易混淆的概念:图像增强与图像复原
写代码前一定要分清楚两个概念:
- 图像增强(Image Enhancement):不关心图像退化的物理模型,直接通过灰度变换、直方图均衡、滤波等手段让图像“看起来更好”。优点是快、通用,缺点是可能过度拉伸噪声。
- 图像复原(Image Restoration):建立光的传播模型,估计水的散射系数,试图反演出清晰的原始图像。效果好,但计算量大,模型泛化性差。
实际项目中,二者经常结合使用。本文采用轻量增强策略,因为部署在嵌入式设备上时,计算开销是硬约束。
3. 环境准备与前置条件
水下垃圾检测项目的开发环境与普通深度学习项目类似,但有特殊性:你不仅需要 Python 和 PyTorch,还需要考虑图像处理库、数据标注工具,以及后续部署到边缘设备的工具链。
3.1 开发环境清单
以下环境配置以通用深度学习开发为例,具体版本请以实际项目安装时为准,这里重点演示整体思路:
| 组件 | 建议 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 20.04/22.04 或 Windows 10/11 | Linux 环境对后续 TensorRT 部署更友好 |
| Python | 3.8 及以上 | 深度学习框架普遍要求 |
| CUDA 与 cuDNN | 按 GPU 驱动版本安装 | 训练阶段需要 |
| PyTorch | 2.x | 主力训练框架 |
| 图像处理库 | OpenCV、Albumentations | 预处理、数据增强 |
| 目标检测框架 | Ultralytics YOLOv8 或 YOLOv5 | 轻量、生态成熟 |
| 数据标注工具 | LabelImg 或 X-AnyLabeling | 矩形框标注即可 |
3.2 安装依赖示例
# 创建虚拟环境(推荐) python -m venv underwater_det_env source underwater_det_env/bin/activate # 安装 PyTorch(以 CUDA 11.8 为例,按官方文档选择对应版本) pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 Ultralytics pip install ultralytics # 安装图像处理与数据增强库 pip install opencv-python albumentations numpy如果你只有 CPU 环境,也可以跑通完整流程,只是训练速度会慢很多。建议先用小数据集验证逻辑,再上 GPU 训练。
3.3 数据准备:从哪里获取水下垃圾图像
这是整个项目最容易被低估的环节。水下垃圾数据集比陆地上的要稀缺得多,公开数据集中能被直接拿来用的主要有几类:
- 水下目标检测通用数据集:比如 Aquarium 数据集、DeepTrash 数据集,包含部分水下垃圾图像,但数量和标注质量参差不齐。
- 海洋生物数据集:不能直接用于检测垃圾,但可以作为数据增强或领域适应的辅助材料。
- 自采数据:如果你能接触到水箱、养殖池、水下机器人,自采后人工标注是更可靠的做法。
不要一上来就追求“数据多”。水下数据更看重场景覆盖度:浑浊度、深度、光线条件、物体形态的多样性,远重要于单纯的数量。宁可要 500 张高质量、覆盖多种场景的标注图,也不要 5000 张都是同一种蓝绿色浑浊水体、目标全部居中高亮的图。
4. 核心流程拆解:从原始图像到检测输出
一个完整的水下垃圾检测项目,开发流程可以拆成五个关键环节。下面按顺序梳理,每一步说明“做什么、为什么做、做错了会怎样”。
4.1 数据采集与标注
用 ROV(遥控水下机器人)或水下相机采集视频,然后抽帧得到图像。抽帧时要注意避免连续帧高度相似,否则会造成数据冗余和过拟合。
标注采用 COCO 格式或 YOLO 格式都可以。对水下垃圾这个任务,建议首先定义清晰的类别体系,例如:
0: plastic_bag # 塑料袋/塑料膜 1: fishing_net # 渔网/渔线 2: bottle # 瓶子(塑料/玻璃) 3: metal # 金属物件 4: rubber # 橡胶/轮胎类 5: other_waste # 其他垃圾类别不要定得太多太细。水下图像本来就模糊,如果类间差异太小(比如“塑料瓶”和“玻璃瓶”),标注人员都难判断,模型更学不会。
这个环节最常见的错误是:标注者对“垃圾”的定义不统一。比如一块在水中漂动的海草,要不要标?一个贝壳和一片碎瓷片,怎么区分?建议在标注前形成一份“标注规范文档”,把边界情况写清楚,并让团队所有人按同一标准工作。
4.2 图像预处理
水下图像预处理是在喂给模型之前,先对原始图像做修复和增强。这一步的价值,我举个例子你就能感受到:一张水下 10 米深处拍摄的塑料袋照片,整体色调偏蓝绿,袋子本身可能是白色的,但在图像里几乎和背景融为一体。如果不做颜色校正,检测模型很可能直接把塑料袋漏掉。
后面第 5 节会给出完整代码示例。
4.3 模型训练
选定检测模型后,加载预训练权重(比如 YOLOv8 在 COCO 上的权重),用你的水下数据集做微调(fine-tuning)。因为水下图像与自然图像的分布差异很大,微调时通常需要把前面若干层也放开训练,而不是只训练最后的分类头。
4.4 模型评估
训练完成后,不能只看 loss 下降了多少。目标检测的评估指标主要有 mAP(mean Average Precision)、Precision(精确率)、Recall(召回率)。对于水下垃圾检测,召回率比精确率更重要。漏掉一个垃圾(漏检)的代价是很大的——它意味着垃圾会继续留在海里;而误报(把石头误判为垃圾)只是多一条人工复核记录。因此在实际调参时,可以适当降低置信度阈值,优先保证“能找到”,再用人工审核过滤误报。
4.5 部署与实时检测
最终系统要跑在什么设备上,直接决定你选什么模型、用什么推理引擎。
| 部署场景 | 硬件建议 | 常见推理方案 |
|---|---|---|
| 近实时视频分析 | 岸边工作站 + GPU | PyTorch / TensorRT |
| ROV/水下机器人端侧 | NVIDIA Jetson 系列、算力较高的嵌入式平台 | TensorRT / ONNX Runtime |
| 轻量离线分析 | CPU 服务器 | ONNX Runtime / OpenVINO |
如果是部署在 Jetson 这类嵌入式平台上,模型轻量化就是刚需,需要用 TensorRT 做 INT8 量化,甚至考虑蒸馏一个小模型。
5. 完整示例与代码实现
下面我会用一个最小可运行的方案,把整个流程串起来。这个方案基于 YOLOv8 + 水下图像增强,目标是在真实项目里可以当作基线(baseline)来跑。
5.1 水下图像色彩增强示例
先写一个水下图像增强模块。这里用“灰度世界假设”做颜色校正:认为图像中 RGB 通道的平均值应该相等,沿通道方向做比例补偿。这是工程上最简单、最稳的水下图像预处理手段。
# 文件路径:preprocess/color_correction.py import cv2 import numpy as np def gray_world_color_correction(img): """ 灰度世界假设的颜色校正,用于补偿水下图像的偏色。 :param img: BGR 格式图像,uint8 :return: 校正后的 BGR 图像 """ if img is None: raise ValueError("输入图像为空") result = img.astype(np.float32) avg_b = np.mean(result[:, :, 0]) avg_g = np.mean(result[:, :, 1]) avg_r = np.mean(result[:, :, 2]) avg_gray = (avg_b + avg_g + avg_r) / 3.0 # 各通道按比例补偿到平均灰度 result[:, :, 0] = np.minimum(result[:, :, 0] * (avg_gray / (avg_b + 1e-6)), 255.0) result[:, :, 1] = np.minimum(result[:, :, 1] * (avg_gray / (avg_g + 1e-6)), 255.0) result[:, :, 2] = np.minimum(result[:, :, 2] * (avg_gray / (avg_r + 1e-6)), 255.0) return result.astype(np.uint8) def adaptive_contrast_enhancement(img): """ 自适应直方图均衡化(CLAHE),增强局部对比度。 对水下模糊图像尤其有效。 """ lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) l_channel, a_channel, b_channel = cv2.split(lab) clahe = cv2.createCLAHE(clipLimit=2.5, tileGridSize=(8, 8)) l_clahe = clahe.apply(l_channel) merged = cv2.merge((l_clahe, a_channel, b_channel)) return cv2.cvtColor(merged, cv2.COLOR_LAB2BGR) def underwater_preprocess(img): """两步增强:先颜色校正,再对比度增强。""" color_corrected = gray_world_color_correction(img) enhanced = adaptive_contrast_enhancement(color_corrected) return enhanced这段代码的核心逻辑很清晰:gray_world_color_correction负责把偏蓝偏绿的颜色拉到正常范围,adaptive_contrast_enhancement负责提高局部对比度,让淹没在模糊背景里的目标轮廓更明显。
你可能会问:直接让模型看到原始水下图像不行吗?从实践看,很多情况下模型也能“学会”,但需要更多数据去覆盖各种水体条件下的颜色变化。预处理之后再训练,数据分布的方差会小很多,训练效率和最终指标通常都更好。
5.2 用 YOLOv8 训练水下垃圾检测模型
在准备好标注数据和增强脚本后,可以开始训练。推荐先用 YOLOv8n 或 YOLOv8s 这种小模型验证数据有效性,之后再根据需求升级到更大的模型。
数据集目录结构建议如下:
underwater_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml其中data.yaml是训练配置文件:
# 文件路径:underwater_dataset/data.yaml train: underwater_dataset/images/train val: underwater_dataset/images/val nc: 6 names: 0: plastic_bag 1: fishing_net 2: bottle 3: metal 4: rubber 5: other_waste训练命令:
yolo detect train \ model=yolov8n.pt \ data=underwater_dataset/data.yaml \ epochs=100 \ imgsz=640 \ batch=16 \ device=0 \ project=runs \ name=underwater_yolov8n参数说明:
model=yolov8n.pt:使用 YOLOv8 Nano 预训练权重。Nano 模型最小,适合先跑通流程。imgsz=640:输入图像尺寸。水下小目标多,不建议用 320 或更低。epochs=100:数据集小可以先按这个数字来,配合早停机制观察。batch:根据 GPU 显存调整,一般 16 或 32 即可。
训练过程中观察两个关键指标:train/loss是否稳定下降、val/mAP50是否持续上升。如果 loss 下降但 mAP 不动,先检查数据标注是否有错、类别是否过于不均衡。
一个常见的误区是把数据增强开到很大。水下图像已经很差了,如果训练时再叠加大量随机裁剪、旋转、颜色扰动,会让模型更难学到稳定特征。推荐从小幅增强开始。
5.3 推理与检测结果可视化
训练完成后,写一个推理脚本,加载最优权重,对单张图像或视频帧做检测。
# 文件路径:infer.py from ultralytics import YOLO import cv2 model = YOLO("runs/underwater_yolov8n/weights/best.pt") # 读取并增强水下图像 image = cv2.imread("test_underwater.jpg") image = underwater_preprocess(image) # 推理。conf 阈值设低一些,优先保证召回 results = model.predict(image, conf=0.15, iou=0.5, verbose=False) # 保存可视化结果 annotated = results[0].plot() cv2.imwrite("test_underwater_result.jpg", annotated) # 打印检测结果 for box in results[0].boxes: cls_id = int(box.cls[0]) conf = float(box.conf[0]) class_name = model.names[cls_id] xyxy = box.xyxy[0].tolist() print(f"检测到 {class_name}, 置信度: {conf:.2f}, 坐标: {xyxy}")这里把置信度阈值设成 0.15,是一个故意的选择。水下检测的误检可以通过后续人工审核或时域过滤(多帧确认同一目标)来消化,但漏检几乎是不可逆的。在工程上这叫做“在 Precision 和 Recall 之间做取舍”,对水下垃圾场景,优先保 Recall 更合理。
5.4 数据增强管线示例
水下数据稀缺,除了预处理外,训练阶段的数据增强也很关键。推荐用 Albumentations 库构建专用增强管线。
# 文件路径:preprocess/augmentations.py import albumentations as A from albumentations.pytorch import ToTensorV2 def get_underwater_augmentations(): """ 为水下目标检测场景定制的数据增强。 注意:增强不能过度,否则会让本已模糊的水下图像更难学习。 """ return A.Compose([ A.HorizontalFlip(p=0.5), A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.15, p=0.5), A.HueSaturationValue(hue_shift_limit=0, sat_shift_limit=0.1, val_shift_limit=0, p=0.3), A.RandomScale(scale_limit=0.15, p=0.5), A.PadIfNeeded(min_height=640, min_width=640, border_mode=0), A.RandomCrop(width=640, height=640, p=0.5), ToTensorV2(), ], bbox_params=A.BboxParams(format="yolo", min_visibility=0.3))这个增强管线的思路是:小幅扰动空间位置和亮度对比度,不做大幅颜色变换。原因是水下图像的全局颜色特征本身就是识别背景与目标的重要线索,过度颜色变换会破坏这个线索。
6. 运行结果与效果验证
6.1 训练输出验证
训练正常结束后,YOLO 会在runs/underwater_yolov8n/目录下生成完整训练日志,包括:
weights/best.pt:验证集上表现最好的权重。weights/last.pt:最后一个 epoch 的权重。results.png:训练过程中的 loss 曲线和 mAP 曲线。confusion_matrix.png:混淆矩阵。
请务必打开results.png查看。最理想的状态是val/box_loss和val/cls_loss都逐步下降,metrics/mAP50和metrics/mAP50-95持续上升并趋于平稳。如果val/box_loss在训练中期突然反弹,说明可能过拟合或学习率过大,可以先降低学习率、增加数据增强,或者减少 epoch。
6.2 单张图片验证
用前面的infer.py脚本跑一张测试图,预期输出类似:
检测到 plastic_bag, 置信度: 0.73, 坐标: [142.5, 89.3, 386.1, 452.0] 检测到 bottle, 置信度: 0.58, 坐标: [510.2, 220.0, 701.8, 501.4]同时生成可视化图片test_underwater_result.jpg,检测框会直接画在原图上。
成功标准不是“检测出来了就是好”。你需要问自己几个问题:
- 目标没有被框住?还是框的位置偏差很大?
- 目标类别正确吗?塑料瓶是不是被识别成了金属?
- 置信度是否在合理区间?如果一个塑料袋识别置信度只有 0.15,在真实场景里很可能被漏掉。
6.3 视频流验证
如果要部署到 ROV 上,建议用视频流做测试,观察模型的时域稳定性。一个常见现象是:单帧检测正常,但连续帧里同一个目标一会儿被检测出来、一会儿又消失。这时可以在后处理层加入时序平滑逻辑:同一位置目标连续出现 N 帧以上才判定为有效检测。
7. 常见问题与排查思路
水下目标检测的排查链路和陆地目标检测有很大不同。下面是实践中出现频率较高的问题及解决方案:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 模型在真实水下图像上检测效果差 | 训练数据与真实场景分布差异大 | 对比训练集和测试集的颜色、模糊程度、目标尺度 | 增加真实场景数据;用目标场景域数据进行微调;加入更贴合的水下图像增强 |
| 瓶子和塑料袋这类目标频繁漏检 | 目标本身与背景对比度低,预处理不足或模型容量不够 | 检查增强后的图像,目标是否仍“看不清”;查看 PR 曲线中低置信度区间的表现 | 加强颜色补偿、调低置信度阈值、换更大模型、增加此类样本数量 |
| 误报极高,把礁石、水草都识别为垃圾 | 负样本缺失;类别定义不清晰;阈值过低 | 统计误报目标,看它们集中的类别和位置 | 增加“干扰物”类别或负样本;提高置信度阈值;在标注规范中明确边界情况 |
| 训练 loss 不下降 | 数据集太小、标注错乱、学习率设置不合适 | 先在小批量上过拟合测试;查看标签是否有越界坐标 | 用 10 张到 20 张图跑一遍过拟合验证;用yolo detect train的默认学习率起步 |
| 边缘设备推理速度不达标 | 模型过大、没有用 TensorRT/ONNX 优化 | 测量每帧推理耗时;对比在不同输入尺寸下的耗时 | 改用更小的模型(YOLOv8n→YOLOv8n 量化)、降低输入分辨率、用 TensorRT INT8 量化 |
| 颜色增强后图像反而更暗或偏色严重 | 灰度世界算法在单一颜色场景下失效 | 打印各通道均值,检查图像颜色直方图 | 给灰度世界算法加一个范围限制,或改用其他颜色校正方法(如基于深度估计的校正) |
| 目标尺寸太小,检不出来 | 水下小目标本来就难;下采样丢失细节 | 检查原图中目标的像素尺寸 | 提高输入分辨率,使用 tiling(切图拼接推理),在模型 Neck 部分增加小目标检测头 |
值得单独说一句的是:如果你的图像增强步骤做过头了,问题比不做增强更难排查。因为模型学到的可能是“增强后图像的视觉特征”,而不是“水下目标本身的视觉特征”。每次调整预处理之后,最好同时保留不配增强的模型作为对照,用同一组测试集评估。
8. 最佳实践与工程建议
8.1 数据层面:主动学习闭环
水下垃圾数据采集成本高,每一次出海或 ROV 下潜的拍摄都很贵。因此,不要只做一次“人工标注 → 训练 → 结束”的线性流程。更高效的做法是建立主动学习闭环:
- 用当前模型对未标注图像做预测。
- 筛选出模型“低置信度”或“高不确定性”的图像。
- 把这些图像交给标注人员优先标注。
- 增量训练,重复这个循环。
这样能用最少的标注成本,换取最大的模型性能提升。
8.2 模型层面:基线优先,逐步升级
我强烈建议从 YOLOv8n 或 YOLOv5s 这类轻量模型开始,跑通端到端流程,把数据问题、预处理问题和评估体系先建立起来。不必一开始就追求 SOTA 模型。等你确认数据质量没问题、评估指标能真实反映模型表现之后,再尝试大模型或者最新的检测架构。
在水下场景中,模型容量的边际收益被图像质量严重制约。如果预处理做得不好,用再大的模型也无济于事。
8.3 部署层面:目标检测只是算法模块
真正要部署到生产环境的系统,不只是有一个目标检测算法就够了。你需要考虑:
- 数据链路:水下摄像头视频如何传输?是 ROV 实时传回还是离线拷回?
- 告警逻辑:检测到垃圾后,是自动触发机械臂抓取,还是只生成标记供人工确认?
- 性能监控:模型的推理延迟、检测置信度分布、误报率指标,都需要持续监控。
- 模型更新机制:模型在哪个环节打版本,如何做 A/B 测试,如何回滚。
这些工程问题,往往比训练模型本身更耗时,也更容易被低估。如果看这类项目的话,我觉得可以把它当作一个带约束的视觉检测系统来设计,而不是把它看作一个 AI 算法演示。
8.4 安全与合法合规提醒
水下作业涉及海洋生态和地理信息,务必在合法授权和监管允许的范围内开展数据采集与系统部署,避免在不允许的区域进行拍摄或作业。涉及 ROV 硬件操作时,要遵守设备使用规范,评估水流、深度和设备安全边界,做好应急预案。
9. 光学图像 + 声纳融合:下一个值得关注的方向
现在再回看“AI 检测水下垃圾”这个话题。只靠摄像头,其实是有上限的。原因很简单:在浑浊水体和低光环境下,光学图像的能见度可能只有几米甚至更短。在这种条件下,哪怕检测算法再先进,输入图像里根本看不到目标信息。
业界正在尝试的一个方向是把光学相机和声纳(声学成像)结合。声纳不受浊度影响,但分辨率低,不能像图像一样富含纹理细节;光学相机分辨率高,但受水质限制大。两者融合的目标是:用声纳做远距离候选区域筛选,再用光学相机对候选区域做精细识别。这是一种非常典型的“粗定位 + 精识别”两阶段思路。
如果你对这个方向感兴趣,可以关注侧扫声纳、前视声纳与水下视频目标检测结合的相关论文,以及水下机器人的自主巡检领域。这类研究距离产品化更近,也更考验工程整合能力。
10. 总结与后续学习建议
写到这里,你应该能理解文章最开始的那个判断了:水下垃圾检测的核心难点,并不在于目标检测算法本身,而在于水下图像退化、训练数据稀缺、部署条件受限这三座大山。
我建议你按下面的路径继续实践:
- 先跑通最小闭环:用一个开源数据集或自采小数据集,完成“图像增强 + YOLOv8n 训练 + 单帧推理”的完整流程,不要一开始就把目标定在“要做到生产级”。
- 建立评估体系:用 mAP、召回率、误报率三个指标记录每次实验的变化。没有评估体系,后续优化都是盲目的。
- 在预处理上下功夫:对比“不增强”“灰度世界增强”“灰度世界 + CLAHE”三种条件下训练出的模型在真实测试集上的表现差异。
- 再做部署优化:确定了基线和评估体系后,再考虑用 TensorRT 做推理加速、模型量化、边缘设备适配。
- 保持方向敏感:关注水下成像硬件的发展、开源数据集的新增、以及声学与光学融合方向的技术进展。
技术上的路径大致如此。真正决定项目成败的,往往不是某个模型的 mAP 提升零点几,而是你有没有把数据、评估、部署这些环节串起来。希望这篇文章能帮你少走一些弯路,尤其是别再直接从“把 YOLO 丢进水里”开始了。