AI视觉实战:基于YOLOv8的水下垃圾检测完整教程 📅 发布时间:2026/8/27 7:23:14 👁 浏览次数: 当海洋环保团队需要清理由洋流和人类活动带来的水下垃圾时最理想的方式并不是让潜水员逐块排查而是先通过摄像设备自动发现垃圾的位置再引导清理力量精准作业。这个“自动发现”的动作正在被 AI 视觉技术逐步落地。水下垃圾检测并不是一个可有可无的实验室课题它关系到近海养殖、港口航道、珊瑚礁生态和海底管线的安全。本文会从技术原理、数据准备、模型训练、推理部署和排错思路五个方面完整拆解“AI 如何检测海洋水下垃圾”这一实战项目。不管你是刚接触目标检测的初学者还是想把模型落地到边缘设备上的工程开发者这篇文章都能提供一套可执行的参考路径。1. 背景为什么需要 AI 来检测水下垃圾1.1 水下垃圾问题的真实场景海洋垃圾是一个持续多年的全球性环境问题。每年有大量塑料、渔网、金属制品、玻璃瓶和废弃装备进入海洋其中一部分漂浮在表层另一部分会逐渐沉降到海底或者在近岸水域随潮流移动。水下垃圾的分布往往非常分散有些区域能见度差水质浑浊依靠人工潜水排查不仅成本高、效率低还存在一定的安全风险。在实际环保和工程作业中团队通常使用水下机器人ROV、拖曳式水下摄像系统、潜水员手持相机等设备获取海底画面。这些画面数量大单段视频可能长达数小时如果完全依靠人工盯着屏幕寻找垃圾容易出现视觉疲劳导致的漏检而且不同审核人员对“是否是垃圾”的主观判断不一致进一步降低了统计数据的可靠性。AI 视觉检测恰好能解决这些问题它可以在几秒内遍历大量图像输出带置信度的检测结果并支持对特定类别如塑料瓶、渔网、金属罐进行精细化统计。1.2 AI 检测的核心价值AI 检测水下垃圾本质上是把计算机视觉中的目标检测技术应用到水下环境。目标检测要完成两件事第一找出图像中感兴趣的物体第二判断这些物体是什么类别并且用边界框标出具体位置。与普通陆地场景相比水下环境有两个显著差别一是光照衰减严重红色光在水下很快被吸收导致画面整体偏蓝偏绿二是悬浮颗粒会造成散射让图像模糊、对比度低。这些差异意味着直接使用陆地场景训练好的检测模型往往效果不理想需要针对水下图像特点做专门的数据增强和模型调优。从工程价值来看AI 检测系统可以输出垃圾的位置坐标、类别和置信度。清理船可以据此规划打捞路线环保机构可以量化某个海域的垃圾密度甚至还可以把检测结果叠加到水下地图上形成“垃圾热力图”。如果再配合机械臂、水下机器人检测模型还能引导机械臂完成自动抓取形成“发现—定位—打捞”的闭环。1.3 本文的实战范围本文是一篇端到端教程读者会沿着下面这条主线操作一遍理解水下垃圾检测的技术选型和难点搭建目标检测训练环境准备水下垃圾数据集并完成标注和划分基于 YOLOv8 训练一个水下垃圾检测模型使用训练好的模型完成图片、视频和摄像头实时推理导出 ONNX 模型为部署到边缘设备做铺垫梳理常见报错和调优思路以及工程化落地的注意事项。整个项目以 YOLOv8 为主要实现框架因为它的训练流程简单、推理速度快、社区资料丰富同时它也支持模型导出到 ONNX、TensorRT 等格式。如果你之前用的是 YOLOv5、YOLOv9 或 YOLO11核心思路也基本一致只需要根据官方接口调整参数写法即可。2. 水下目标检测的核心概念与技术选型2.1 从“图像分类”到“目标检测”在进入代码之前有必要先把概念理清。图像分类解决的是“这张图里有没有垃圾”的问题它只输出一个类别标签目标检测则更进一步输出“哪里有什么垃圾”通常表现为一个边界框坐标和类别信息。如果还要区分每个实例的边缘轮廓那就属于实例分割的范畴。水下垃圾检测项目最常用的是目标检测因为清理作业只需要知道垃圾的大致位置和类别不需要精确到每个像素的轮廓而且目标检测的数据标注成本也比实例分割低很多。2.2 主流检测方案对比目前做目标检测的技术路线可以归为两大类两阶段检测器和单阶段检测器。两阶段检测器以 Faster R-CNN 为代表先生成候选区域再对候选区域分类和回归精度通常较高但速度偏慢。单阶段检测器以 YOLO 系列、SSD 为代表直接在特征图上预测边界框和类别速度优势明显适合实时场景。在水下垃圾检测任务中模型通常部署在船只、ROV 或者岸边边缘设备上对实时性有一定要求因此单阶段检测器更常见。其中 YOLOv8 是目前社区生态最成熟的方案之一它的 ultralytics 库封装了训练、验证、推理和导出流程代码量非常少非常适合快速验证业务可行性。表格如下方案优势劣势适用场景Faster R-CNN精度高、理论成熟推理速度较慢、显存占用高离线分析、对实时要求低的场景YOLOv8速度快、生态完善、训练简单小目标检测需要额外调优实时检测、边缘部署、快速原型SSD结构简单、速度不错小目标召回率偏低早期项目、轻量场景Transformer 类DETR端到端、无锚框设计训练收敛慢、部署复杂度高研究型项目、大型设备集群本文选择 YOLOv8 作为教学实现因为它足够平衡训练代码短、推理速度快、支持 CPU 和 GPU 训练并且导出格式丰富。如果你后续对精度有更高要求完全可以在同样的数据基础上换成 YOLO11 或引入注意力机制模块这也是项目迭代的一部分。2.3 水下图像的难点为什么会影响检测水下垃圾检测效果不好的原因多数不在于模型结构而在于图像质量与数据分布。红色光在水下会迅速衰减所以水体深的地方拍到的画面偏蓝绿垃圾的颜色信息被压扁悬浮颗粒还会造成后向散射让画面像蒙了一层雾。模型在这种图像上要学到的不是陆地常见的色彩纹理而是形状、轮廓、材质反光等更鲁棒的特征。为了缓解这个问题常用的做法包括使用水下白平衡算法恢复颜色对图像做直方图均衡化增强对比度在训练阶段引入亮度、色温、模糊等数据增强让模型见过更多变化或者在输入端接入图像增强模型。这些处理方式会在本文的数据准备和训练环节中体现。3. 环境准备与版本说明3.1 硬件与系统要求水下垃圾检测的训练阶段既支持 GPU也支持 CPU。如果你只是验证流程、跑少量图片推理CPU 环境完全可以完成如果你要训练一个能实际使用的模型建议准备一块显存不低于 6GB 的 NVIDIA GPU例如 RTX 3060 及以上型号。显存大小会直接决定训练时的 batch size 和输入图像分辨率显存不足时优先调小 batch size而不是直接降低图像尺寸。操作系统方面Windows、Linux、macOS 都支持。Linux 在 GPU 驱动和 Docker 部署方面会更顺畅生产环境推荐 Ubuntu 22.04 或更新版本。macOS 也可以训练小模型但 GPU 加速需视芯片和框架版本而定。3.2 Python 与核心依赖本文示例以 Python 3.10 为基准环境。建议使用虚拟环境管理依赖避免与系统环境冲突。核心库包括ultralyticsYOLOv8 训练和推理的官方封装PyTorch深度学习后端ultralytics 依赖它运行OpenCV图像读取和视频处理pandas、matplotlib结果统计与可视化labelimg 或 labelme数据标注工具通用图像标注。版本需要根据你的项目实际情况调整不必死板照抄。安装 PyTorch 时建议先到 PyTorch 官网确认与 CUDA 版本匹配的命令再安装 torch 和 torchvision。下面是一个常见环境安装示例# 创建虚拟环境 python -m venv underwater_env source underwater_env/bin/activate # Windows 上使用 underwater_env\Scripts\activate # 安装 PyTorch具体命令以官网页面生成的命令为准 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 YOLOv8 及相关工具 pip install ultralytics opencv-python pandas matplotlib labelimg安装完成后可以用下面这条命令验证导入是否正常python -c from ultralytics import YOLO; print(YOLO)如果输出没有报错说明环境已经就绪。实际安装时要注意 PyTorch 版本与 CUDA 版本的匹配尤其是使用显卡训练的开发者建议先用nvidia-smi查看本机支持的 CUDA 版本上限再选择对应的 PyTorch 安装命令。3.3 项目目录规划为了后续操作方便建议按下面的目录结构组织项目文件underwater_waste_project/ ├── dataset/ │ ├── images/ │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ ├── labels/ │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ └── data.yaml ├── models/ ├── runs/ ├── scripts/ │ ├── split_dataset.py │ ├── train.py │ └── infer.py └── requirements.txt这个结构并不神秘它的核心目的是把原始图片、标注文件、训练脚本和模型产物分离清楚。runs目录由 ultralytics 自动生成保存每次训练和推理的日志、曲线和结果图片。models目录用于保存自己训练出的权重文件。4. 数据集准备从原始图片到可训练样本4.1 数据从哪来训练一个水下垃圾检测模型首先要解决数据来源问题。目前常见的数据来源有三个方向公开数据集像 TrashCan、AquaTrash、MARIDA 这几类海洋相关数据集中包含了水下垃圾的图片和标注。它们适合做预训练和可行性验证但具体类别体系和你的业务可能不完全一致。自采数据使用水下相机、ROV 拍摄目标海域的视频再抽取关键帧进行标注。自采数据最贴近真实场景但需要投入采集和清洗成本。网络爬取与人工筛选从公开渠道收集水下垃圾图片优点是成本低缺点是图片质量参差不齐、涉及版权和数据合规问题需要谨慎处理。本文不绑定某个具体数据集你可以根据自己所在团队掌握的数据资源灵活选择。只要最终形成“图片 对应标注文件”的格式就能接入下面的训练流程。4.2 数据标注格式YOLOv8 使用的标注格式是每个图像对应一个同名的.txt文件。比如img_001.jpg对应img_001.txt文件中的每一行表示一个目标格式如下类别编号 中心点x归一化坐标 中心点y归一化坐标 归一化宽度 归一化高度归一化是指坐标值除以图片的宽和高结果是 0 到 1 之间的浮点数。例如一张宽 640、高 480 的图片中某个目标中心点在像素坐标 (320, 240)宽 100高 80那么对应的一行是0 0.500 0.500 0.156 0.167其中前一个 0 是类别编号。如果数据集里有多个类别比如 0 表示塑料瓶、1 表示渔网、2 表示金属罐那就分别用 0、1、2 区分。使用 LabelImg 或 labelme 标注时如果标注工具导出的是 Pascal VOC 的 XML 格式或 COCO 的 JSON 格式需要转换成 YOLO 格式。ultralytics 官方文档提供了转换脚本思路核心就是解析 XML 或 JSON再按上述公式归一化写入 txt 文件。4.3 数据集划分训练集、验证集、测试集的划分需要保证比例合理。常见做法是 8:1:1 或 7:2:1。其中验证集用于调节超参数和选模型测试集用于最终评估模型泛化能力。划分时要注意避免同一场景的连续帧同时出现在训练集和验证集中否则会出现“泄漏”导致评估结果虚高。下面给出一段 Python 脚本用于把 images 目录中的图片随机划分到训练集和验证集并生成对应的 labels 目录结构# 文件路径scripts/split_dataset.py import os import random import shutil random.seed(42) source_images dataset/images/all # 原始图片目录 source_labels dataset/labels/all # 原始标注目录 target_base dataset # 目标根目录 val_ratio 0.2 image_files [f for f in os.listdir(source_images) if f.endswith((.jpg, .png, .jpeg))] random.shuffle(image_files) val_count int(len(image_files) * val_ratio) val_files image_files[:val_count] train_files image_files[val_count:] for split, files in [(train, train_files), (val, val_files)]: os.makedirs(f{target_base}/images/{split}, exist_okTrue) os.makedirs(f{target_base}/labels/{split}, exist_okTrue) for f in files: shutil.copy(os.path.join(source_images, f), f{target_base}/images/{split}/{f}) label_file f.replace(.jpg, .txt).replace(.png, .txt).replace(.jpeg, .txt) if os.path.exists(os.path.join(source_labels, label_file)): shutil.copy(os.path.join(source_labels, label_file), f{target_base}/labels/{split}/{label_file}) print(f训练集图片数: {len(train_files)}) print(f验证集图片数: {len(val_files)})这段脚本的价值在于减少人工复制的失误实际项目中你也可以直接在磁盘上手动整理只要满足 YOLO 的目录规则即可。4.4 数据增强策略水下图像的颜色失真和模糊问题最好在训练前就用增强手段模拟出来。YOLOv8 自带数据增强配置包括 Mosaic、随机翻转、色域变换、平移和缩放等。对于水下场景我们还可以额外增强色温变化和模糊程度让模型学习更稳定的形状特征。在训练脚本中可以通过 ultralytics 的Augmenter配置项调整也可以通过自定义预处理在训练前统一处理。对初学者来说先使用默认增强即可如果后续发现模型在低光、浑浊水体的测试集上表现较差再针对性增加亮度扰动和模糊增强。数据增强不是越复杂越好核心原则是模拟真实部署中可能遇到的图像变化而不是为了增强而增强。5. 基于 YOLOv8 的水下垃圾检测模型训练5.1 编写 data.yamlYOLO 训练需要一份数据配置文件指定训练集、验证集路径和类别名称。下面是一个示例# 文件路径dataset/data.yaml train: dataset/images/train val: dataset/images/val nc: 3 names: 0: plastic_bottle 1: fishing_net 2: metal_can字段说明train和val训练集与验证集图片所在目录建议使用相对路径或绝对路径相对路径的基准是运行训练命令时的当前目录。nc类别总数。names类别名称列表下标从 0 开始。如果你的项目只有一个类别也就是只关心“是不是垃圾”那么nc写 1names写0: waste即可。多类别检测需要标注阶段就区分好类别编号否则训练出的模型无法输出有意义的分类结果。5.2 编写训练脚本YOLOv8 的训练入口非常简洁。下面是一个完整的训练脚本# 文件路径scripts/train.py from ultralytics import YOLO if __name__ __main__: # 加载预训练权重yolov8n 是轻量版本适合快速实验和 CPU 环境 model YOLO(yolov8n.pt) # 开始训练 model.train( datadataset/data.yaml, epochs50, imgsz640, batch8, device0, # 如果使用 CPU改为 devicecpu workers2, nameunderwater_waste, pretrainedTrue, verboseTrue, ) # 训练结束后在验证集上评估 metrics model.val() print(fmAP50: {metrics.box.map50:.4f}) print(fmAP50-95: {metrics.box.map:.4f})关键参数说明epochs训练轮数起步可以从 50 轮开始观察验证集指标是否继续上升再决定是否增加。imgsz输入图像尺寸640 是 YOLOv8 的默认值。显存不足时可以降低到 416 或 512。batch批大小显存越小batch 设置越小。GPU 显存不足时会报 CUDA out of memory此时优先调小 batch。device指定 GPU 编号或 CPU。单卡环境写0或0。name本次训练的名称结果会保存到runs/detect/underwater_waste目录下。训练过程中终端会实时显示 loss、精度、召回率、mAP 等指标。如果 loss 持续下降、mAP 稳步上升说明训练状态正常如果 loss 震荡剧烈可以尝试调低学习率或增大 batch。5.3 训练预期结果训练完成后runs/detect/underwater_waste/weights目录下会生成best.pt和last.pt两个权重文件。best.pt是在验证集上指标最优的权重之后推理和部署都使用它last.pt是最后一个 epoch 的权重通常用于断点续训。同时runs/detect/underwater_waste目录下还会有results.png、confusion_matrix.png、val_batch*.jpg等可视化文件方便你判断模型学到了什么。训练的好坏不能只看 loss更关键的是验证集上的 mAP50 和 mAP50-95。mAP50 表示预测框与真实框的 IoU 阈值在 0.5 时的平均精度适合快速判断模型是否有效mAP50-95 更严格更能反映定位精度。对于水下垃圾检测项目如果 mAP50 能达到 0.7 以上基本可以认为模型具备了一定的可用性具体数值会受数据质量、类别数量和难易程度影响不要盲目跟别人对比。5.4 训练时显存不足的应对思路如果训练时遇到 CUDA out of memory通常不是算法问题而是显存配置问题。你可以采用以下几步递进调整把batch从 16 降到 8再到 4把imgsz从 640 降到 512使用yolov8n这样的小模型替代yolov8s或更大的模型设置workers0减少数据加载对显存的额外占用。上述策略可以组合使用。需要说明的是减小输入图像尺寸会降低小目标检测能力因此在显存允许的范围内优先调小 batch而不是一味调低分辨率。6. 模型推理与部署从图片到边缘设备6.1 单张图片推理训练完成后可以用下面脚本对一张水下图片进行推理# 文件路径scripts/infer.py from ultralytics import YOLO model YOLO(runs/detect/underwater_waste/weights/best.pt) results model.predict( sourcetest_images/underwater_sample.jpg, conf0.25, saveTrue, projectruns/predict, namesample ) for result in results: boxes result.boxes if boxes is not None: for box in boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) xyxy box.xyxy[0].tolist() print(f类别: {model.names[cls_id]}, 置信度: {conf:.2f}, 坐标: {xyxy})conf0.25是置信度阈值低于这个阈值的检测框会被过滤掉。在实际部署中这个值需要根据误报率和召回率的平衡点调整。如果垃圾类别被漏掉可以适当调低阈值如果误检太多可以调高阈值。6.2 视频推理水下机器人或拖曳相机通常输出视频流所以视频推理更贴近真实业务。下面的脚本读取一段水下视频逐帧检测并保存成带标注框的结果视频# 文件路径scripts/infer_video.py from ultralytics import YOLO model YOLO(runs/detect/underwater_waste/weights/best.pt) results model.predict( sourcetest_videos/underwater_clip.mp4, conf0.25, saveTrue, projectruns/predict, namevideo_result ) print(视频推理完成结果保存在 runs/predict/video_result 目录)ultralytics 支持直接传入视频文件路径推理时会自动逐帧处理并输出标注后的视频。如果你的视频帧率较高可以在预测完成后用 OpenCV 读取输出视频进一步压缩或转码方便后续人工复核和存档。6.3 摄像头实时推理如果以后要部署到船载设备上使用 USB 摄像头或水下相机通过 USB 接入计算设备时可以使用下面的实时推理方式# 文件路径scripts/infer_webcam.py from ultralytics import YOLO model YOLO(runs/detect/underwater_waste/weights/best.pt) model.predict(source0, showTrue, conf0.25)source0表示读取编号为 0 的摄像头设备。运行后程序会打开一个实时窗口叠加显示检测框和类别标签。按键盘上的q可以退出窗口。实际部署时建议在嵌入式设备上先测试推理延迟如果帧率不满足要求再考虑模型轻量化或 TensorRT 加速。6.4 导出 ONNX 模型训练好的 PyTorch 权重不能直接用于所有边缘设备通常需要先导出为通用格式。ONNXOpen Neural Network Exchange是一种跨框架的模型表示格式可以转换成 TensorRT、OpenVINO、CoreML 等平台需要的格式。导出命令如下# 文件路径scripts/export_onnx.py from ultralytics import YOLO model YOLO(runs/detect/underwater_waste/weights/best.pt) model.export(formatonnx, imgsz640, dynamicTrue)导出后的best.onnx文件可以加载到 ONNX Runtime 或 TensorRT 中进行推理。需要注意的是导出时的imgsz应该与训练时的尺寸保持一致否则模型输入尺寸变化可能带来精度损失。dynamicTrue表示允许动态输入尺寸但会增加部分推理框架的复杂度如果部署平台固定输入尺寸可以把它设置为dynamicFalse。6.5 Docker 部署思路跨设备复现环境时Docker 是一个好选择。下面是一个简单的 Dockerfile 示例思路是在基础镜像中安装 Python 和依赖并把权重文件和推理脚本拷贝进去# 文件路径Dockerfile FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY scripts/infer.py . COPY runs/detect/underwater_waste/weights/best.pt ./model/best.pt CMD [python, infer.py, --source, /data/input, --output, /data/output]生产环境部署时建议不要直接使用 CPU 版本的 PyTorch 镜像而是根据目标硬件平台选择合适的运行时镜像。Docker 的最大作用是隔离依赖让你在本地运行成功过的代码在服务器或边缘设备上也能保持一致。7. 常见问题与排查思路在水下垃圾检测项目中初学者容易遇到下面几类问题这里整理成表格方便查阅。问题现象常见原因解决思路训练时 CUDA out of memorybatch 过大或输入分辨率过高调小 batch必要时降低 imgsz 或换成轻量模型训练的模型什么都检测不到置信度阈值过高、训练轮数不足、数据太少调低 conf增加 epochs扩充数据集水下目标漏检严重小目标多、图像模糊、颜色失真提高输入分辨率增强图像对比度增加小目标数据塑料瓶和白色石头经常混淆类别特征不明确、标注不一致统一标注规范补充边界案例数据验证集 mAP 高但实际视频效果差训练集与测试环境差异大数据泄漏检查数据划分是否泄漏增加真实场景测试集视频推理卡顿模型太大、计算设备性能不足替换轻量模型导出 TensorRT降低输入分辨率训练速度非常慢CPU 训练或 GPU 未正常使用检查 device 参数确认 CUDA 可用7.1 模型检测不到目标怎么排查如果你训练端到端流程都跑通了但推理时模型几乎没有输出最有效的排查顺序是先降低置信度阈值把conf从 0.25 调到 0.05确认模型是否有弱响应查看runs/detect/underwater_waste目录下的验证集预测图看模型在训练时的验证集上是否正常检查测试图片与训练图片的分布差异比如训练集是明亮浅水区测试集却是浑浊深水区用model.val()查看验证集指标如果 mAP 也很低说明训练数据或训练参数有问题而不是推理阶段的问题。很多情况下模型表现差并不是算法原理问题而是数据没有覆盖真实场景。建议优先收集异常样本再调整模型结构。7.2 误检太多怎么优化误检多的原因通常有两类一是非垃圾物体被识别成垃圾例如岩石、珊瑚、鱼群被误判二是标注数据中类别边界不清晰模型学到了错误的特征。优化方向包括增加“负样本”图片也就是不含垃圾但容易混淆的水下场景图片让模型学会分辨统一标注标准比如规定“只标注人工制品不标注自然物体”提高置信度阈值减少低置信度输出对混淆严重的类别进行合并或拆分重新设计类别体系。7.3 小目标漏检怎么办水下垃圾往往是小目标比如一个塑料瓶盖在 640x640 的图像中可能只占几十个像素。YOLOv8 默认的 P3、P4、P5 特征层对小目标有覆盖但效果受限于训练数据的标注质量和输入分辨率。缓解思路有三个提高输入分辨率、增加小目标样本数量、使用专门针对小目标的模型改进方案。对初学者来说提高输入分辨率是最直接、最容易上手的方法代价是显存占用增加。8. 最佳实践与工程建议8.1 数据层面的工程建议数据是水下垃圾检测项目最重要的资产。标注阶段就要明确类别定义和边界规则避免不同标注员对同一物体给出不同标签。建议建立一个标注规范文档包含每种类别的示例图片和易混淆样例。数据采集时尽量覆盖不同水深、不同水质、不同光照条件而不是只采集同一片海域的干净画面。数据划分时要防止时间相关的连续性泄漏。实际工程中水下摄像视频的相邻帧非常相似如果随机划分同一段视频的画面可能同时出现在训练集和验证集导致验证集指标虚高。更好的做法是按视频片段划分把整段视频放入训练集或验证集。8.2 模型与训练层面的建议训练时不要一开始就上大模型。先用轻量模型如 YOLOv8n跑通流程确认数据和代码没问题后再根据性能需求尝试 YOLOv8s 或更大模型。训练轮数也不是越多越好观察验证集 mAP 的收敛趋势连续若干轮没有提升就该停止避免过拟合。学习率、batch、图像尺寸这三个参数互相影响。如果 loss 出现明显震荡优先调低学习率如果显存不足先调低 batch再考虑图像尺寸。所有参数修改都要记录在实验文档中保证每次实验可以复现。8.3 部署与运维层面的建议模型部署到真实环境前一定要先定义好输入源和输出协议。比如水下相机输出 RTSP 视频流那么推理程序需要支持 RTSP 拉流输出结果要写入数据库还是 MQTT 消息队列也要提前设计。日志记录非常关键。每次推理至少记录时间戳、图片帧编号、检测类别、置信度和坐标这样后续做统计分析时才有数据可查。部署到船上或边缘设备时还要考虑断电恢复、模型文件热更新、网络断线重连等工程问题。云端与边缘协同的常见方案是边缘设备跑轻量模型实时检测遇到可疑目标时上传关键帧到服务器做二次确认。8.4 安全与合规的建议水下垃圾检测项目涉及的数据可能来自海洋保护区、港口水域等敏感区域采集数据和发布成果时要注意合法合规。使用公开数据集前要确认数据集的许可协议避免把不明确版权来源的数据用于商业项目。涉及个人或单位专属水域的视频数据更要做好隐私保护最小化数据传播范围。8.5 从 Demo 到落地的四个关键提醒很多开发者止步于“模型在测试集上跑通了一张图”但真实项目远不止于此。这里分享四个最容易踩坑的提醒第一模型精度不等于业务效果。mAP 是离线评价指标但真实场景中清理船更关心的是“每个垃圾框对应的物体是否能被机械臂抓到”。建议在真实环境中抽测 100 个检测结果人工统计误检率和漏检率比只看 mAP 更有说服力。第二推理延迟评估要早做。如果你计划部署到 Jetson 等边缘设备一定要在设备上提前测试推理耗时。PyTorch 环境下的推理速度与 TensorRT 加速后的速度差别很大不要等到现场部署时才验证。第三模型版本管理要纳入项目流程。每次训练产生的权重文件、data.yaml、训练参数和评估结果建议同步保存到 Git 仓库或模型管理平台方便回溯“为什么这个版本效果好”。当前标签变化很快采用固定随机种子和明确的数据集版本号能减少很多环节的无效对比。第四容器化和环境锁版本要同步。项目的 requirements.txt 应该锁定可复现的版本范围至少记录主要框架的大版本避免换一台机器后依赖冲突导致无法运行。9. 总结与下一步学习方向9.1 本文要点回顾整个水下垃圾检测项目本质上是把通用目标检测模型适配到水下环境。你已经沿着“数据准备—训练—推理—部署”的主线完成了一个最小可用的 AI 检测系统掌握水下图像的特点理解 YOLOv8 的基本用法能处理自己的数据集能训练模型并导出 ONNX也了解了常见报错的排查方法。9.2 下一步可以做什么如果你想把项目继续做深可以沿着以下方向扩展从目标检测升级到实例分割使用 YOLOv8-seg 模型输出垃圾的精确轮廓辅助机械臂抓取在模型中引入水下图像增强网络作为检测前处理模块提升低能见度条件下的检测效果把检测结果与定位系统结合输出垃圾的 GPS 坐标生成海域垃圾分布地图尝试模型量化与 TensorRT 加速把推理延迟压到实时级别使用多相机拼接方案扩大单次扫描覆盖面积。9.3 学习资源与项目沉淀建议学习目标检测不必从零重造轮子。优先阅读 ultralytics 官方文档跑通官方提供的预训练模型示例再针对自己的数据做迁移学习最后才是修改模型结构和训练策略。每次实验都记录一句话结论比如“加了水下白平衡后 mAP50 提升 3%”这些经验沉淀下来比收藏一堆教程更有价值。如果你的目标是学术研究可以进一步阅读水下目标检测相关论文关注水下色彩恢复和域自适应方向如果你的目标是工程落地建议在数据采集、结果可视化和边缘部署三个环节多投入时间因为它们往往决定了项目能否真正交付。现在就可以打开数据集标注一批图片跑通第一版训练脚本眼见为实。