基于 YOLO11 的海底垃圾视觉巡检系统:水下 ROV + Streamlit 全流程实战

简介: 本项目基于YOLO11n轻量模型(6MB),构建面向15类海底垃圾的实时视觉巡检系统,支持图片/视频/摄像头/批量检测;集成Streamlit打造离线可部署的海洋治理可视化平台,适配浑浊水体与ROV作业场景,助力高效、量化、可追溯的海底垃圾识别与清污决策。(239字)

基于 YOLO11 的海底垃圾视觉巡检系统:水下 ROV + Streamlit 全流程实战

关键词:YOLO11、海底垃圾、水下视觉、海洋治理、Streamlit、目标检测

一、背景

1.1 行业痛点

近海与离岸海域的底质环境正在被持续侵扰:废弃口罩、易拉罐、玻璃瓶、塑料瓶、渔网、废旧轮胎……这些垃圾长期沉积在海底,会缠绕海洋生物、释放微塑料、破坏珊瑚礁与海草床生态,对海洋牧场、近海渔业与潜水旅游业的影响是全链路的。

传统的海底垃圾排查依赖潜水员目视巡查或 ROV 视频后处理:

  1. 效率低:一个潜水员单次下潜作业时长 30~45 min,一次只能覆盖几百平米;
  2. 人眼疲劳:浑浊水体下颜色失真、对比度低,潜水员长时间盯着回放视频极易漏检;
  3. 数据无法量化:拍了一堆视频,但具体哪个区域有多少口罩 / 渔网,缺乏可统计的结构化结果,给后续清污作业排程造成困难。

把 YOLO11 这类轻量级 目标检测模型 接到 ROV、拖曳成像系统或潜水员手持相机的视频流后端,可以把"看视频找垃圾"这件事变成"模型逐帧自动标注 + 人工复核疑难",效率提升一个数量级,并且每一次推理都能沉淀为结构化的统计数据,直接喂给海洋治理调度平台。

本文介绍的项目就是这条路线下的一个完整落点:面向 15 类典型海底垃圾的 YOLO11 检测模型 + 一个开箱即用的 Streamlit 可视化界面。

视频演示与源码 下载

https://www.bilibili.com/video/BV1KKH76UEPS/

在这里插入图片描述

包含: 📦完整项目源码 📦 预训练 模型权重

🗂️数据集

1.2 项目运行效果

在这里插入图片描述

在这里插入图片描述

1.3 项目介绍

核心创新点:

维度 设计
类目覆盖 15 类典型海底垃圾,覆盖塑料 / 金属 / 玻璃 / 医疗废弃 / 渔具等
模型选型 YOLO11n,6 MB 权重,CPU 实时、Apple Silicon MPS / NVIDIA CUDA 可选加速
部署形态 Streamlit 单页应用 + 本地 best.pt,零数据库,便于离线部署在科考船 / ROV 控制台
输入兼容 图片 / 批量图片 / 视频 / 摄像头四种输入,全部走同一推理引擎
适配场景 浑浊低光海底、绿色调畸变水体、沉积泥沙背景下仍能稳定出框

在这里插入图片描述

功能概览:

  • 🖼️ 单图检测:上传海底拍摄的图片 → 实时返回带框图 + 类别 / 置信度明细
  • 📚 批量检测:单次最多 200 张,输出汇总表 + 类别分布柱状图 + 检测结果 zip 下载
  • 🎬 视频检测:mp4 / avi / mov / mkv 通通可读,逐帧推理后落盘新视频
  • 📷 摄像头实时检测:可对接 ROV 直出视频流,做现场作业辅助

15 个识别类别:口罩、易拉罐、手机、电子垃圾、玻璃瓶、手套、金属杂物、杂项垃圾、渔网、塑料袋、塑料瓶、塑料杂物、杆状物、太阳镜、废旧轮胎。

技术栈:

层 选型
模型框架 Ultralytics 8.3 + PyTorch
视觉算法 YOLO11n(Anchor-Free,C2f Backbone,Decoupled Head + DFL)
Web 前端 Streamlit 1.35 + 自定义 HTML 主题(海洋蓝 + 警戒黄)
视频 / 图像 OpenCV、imageio-ffmpeg
数据可视化 Plotly / Streamlit 原生 chart
配置管理 单一 configs/project.yaml,行业话术 / UI / 推理阈值统一收口

在这里插入图片描述

二、设计框架

2.1 系统 架构

            ┌──────────────────────────────────────────┐
            │      Streamlit Web 前端(单页 SPA)       │
            │  · 海底巡检台 / 单图 / 批量 / 视频 / 摄像头 │
            │  · 侧栏 · 阈值 · 类别筛选 · 模型缓存       │
            └────────────────────┬─────────────────────┘
                                 │ Python 调用
                                 ▼
            ┌──────────────────────────────────────────┐
            │   推理服务层(infer_image_path 等)       │
            │  · bytes / Path / frame → tensor          │
            │  · 推理结果 → 标注图 + DataFrame          │
            └────────────────────┬─────────────────────┘
                                 │
                                 ▼
            ┌──────────────────────────────────────────┐
            │    YOLO11n 推理引擎(model/best.pt)      │
            │  Backbone (C2f+SPPF) → Neck (FPN/PAN)     │
            │   → Decoupled Head(DFL + cls)           │
            └──────────────────────────────────────────┘

2.2 YOLO11 网络结构

输入 640×640×3
   │
   ▼
[Backbone]
  Conv → C2f → Conv → C2f → Conv → C2f → Conv → C2f → SPPF
        多尺度卷积 + 跨阶段特征融合
   │
   ▼
[Neck]   FPN 上采样 + PAN 下采样:P3 / P4 / P5 三级金字塔
   │
   ▼
[Head]  Decoupled Head(cls 头 / reg 头解耦)
        回归头采用 DFL(Distribution Focal Loss)
        Anchor-Free,输出 (cx, cy, w, h, cls × 15)
   │
   ▼
[NMS]    iou=0.7, conf=0.25  → 最终检测框

2.3 检测流程

水下图像 / ROV 视频帧
        │
        ▼
   Letterbox 640×640 + RGB
        │
        ▼
    YOLO11n forward
        │
        ▼
   Detect Head 输出
        │
        ▼
   conf 过滤 + NMS
        │
        ▼
result.plot() 画框 + DataFrame 列出明细
        │
        ▼
Streamlit 双列展示 + 表格 + 类别分布图

三、代码结构(核心 50 行 + 解析)

项目目录:

海底垃圾视觉巡检/
├── app/streamlit_app.py        # Web 入口
├── configs/project.yaml         # 行业话术 / UI / 训练 / 推理参数
├── model/best.pt                # 训练好的 YOLO11n 权重
├── scripts/                     # train / validate / export 等
├── data/dataset/                # 训练 / 验证 / 测试集
└── 15类海底垃圾检测数据集/        # 原始数据集(含数据集描述.txt)

最核心的 50 行——模型加载 + 单图推理 + Streamlit 单图 Tab:

# === 1. 模型加载(带 streamlit 资源缓存,避免每次刷新重载)=============
@st.cache_resource(show_spinner=False)
def load_model(model_path: str) -> YOLO:
    return YOLO(model_path)

# === 2. 单图推理:路径 → 标注图 + 检测明细 DataFrame ===================
def infer_image_path(model: YOLO, image_path: Path, conf: float):
    result = model.predict(str(image_path), conf=conf, verbose=False)[0]
    annotated = result.plot()                         # BGR ndarray,已画框
    rows = []
    if result.boxes is not None:
        for box in result.boxes:
            cls_id = int(box.cls.item())
            x1, y1, x2, y2 = [float(v) for v in box.xyxy[0].tolist()]
            rows.append({
   
                "class_id": cls_id,
                "class_name": result.names[cls_id],
                "confidence": round(float(box.conf.item()), 4),
                "x1": round(x1, 1), "y1": round(y1, 1),
                "x2": round(x2, 1), "y2": round(y2, 1),
            })
    # BGR → RGB 给 Streamlit;rows 转 DataFrame 给表格组件
    return annotated[:, :, ::-1], pd.DataFrame(rows)

# === 3. bytes → 临时文件 → 复用同一函数 ================================
def run_image_inference(model: YOLO, image_bytes: bytes, conf: float, suffix=".jpg"):
    with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as f:
        f.write(image_bytes); tmp = Path(f.name)
    try:
        return infer_image_path(model, tmp, conf)
    finally:
        tmp.unlink(missing_ok=True)

# === 4. Streamlit 单图 Tab:上传 → 推理 → 双列展示 =====================
model = load_model(str(MODEL_PATH))
uploaded = st.file_uploader("上传水下图片", type=IMAGE_UPLOAD_TYPES)
conf = st.sidebar.slider("置信度阈值", 0.05, 0.95, DEFAULT_CONF, 0.01)

if uploaded is not None:
    annotated, df = run_image_inference(model, uploaded.getvalue(), conf,
                                        suffix=Path(uploaded.name).suffix)
    col1, col2 = st.columns(2)
    col1.image(uploaded, caption="原图")
    col2.image(annotated, caption="检测结果")
    st.dataframe(detections_to_display(df))
    render_detection_analysis(df)

5 段解析:

  1. @st.cache_resource 把 YOLO(model_path) 的耗时(首次约 2~3 s)锁在第一次访问,之后所有 session 共享同一份模型实例,避免每次切换 Tab 都重载。
  2. result.plot() 直接返回带颜色框 + 类别 + 置信度的 BGR ndarray,省去手写 cv2.rectangle 的繁琐。
  3. 把每个 box 的 cls / conf / xyxy 拍成 dict,再拼成 DataFrame——后续表格、CSV 下载、分类柱状图全部复用同一份结构。
  4. run_image_inference 走临时文件而非 numpy 数组,是为了让 Ultralytics 内部的 EXIF / orientation 处理逻辑生效,对水下相机、运动相机的旋转图片更稳;finally 删除临时文件避免磁盘泄漏。
  5. Streamlit 的 cache_resource + file_uploader + dataframe 组合,让一个产品级海底巡检页面只需 11 行代码——这就是用 Streamlit 做 AI 应用能快速出活的关键。

四、训练效果

模型在 15 类海底垃圾数据集上完成训练并保存 best.pt,在测试集上检测效果良好,可稳定识别口罩、易拉罐、玻璃瓶、塑料瓶、渔网、废旧轮胎等典型海底垃圾,已能满足海洋牧场清污辅助、港口底质排查、环保科考等场景的初筛感知使用需要。

从单图检测样例(上文「项目运行效果」中的截图)可以看到:在浑浊绿色调水体、低对比度沉积背景下,模型仍能稳定圈出口罩、塑料袋等目标,并给出较高的置信度,在批量分析模块中可以汇总成可统计的"类别 → 数量"分布,直接对接清污作业排程。

五、项目总结

做对了什么:

  • 用一份 project.yaml 把"行业话术 / UI 主题色 / 训练超参 / 推理阈值"全部收口,迁移到其他水下场景(如河道漂浮物、港口浮油)只需改这一个文件;
  • 单图、批量、视频、摄像头四种输入复用同一个 infer_image_path,后期接 ROV 直出视频流时只需把"摄像头帧"喂进来即可;
  • 选择 YOLO11n 而非 v8s/v8m,模型 6 MB、CPU 单图 100 ms 内完成,在科考船的工控机或边缘盒子上都可以离线跑。

还能怎么做:

  • 接入 ROV 的 RTSP 视频流,把检测结果(坐标 + 时间戳 + 经纬度)直接写入海洋治理 GIS 平台;
  • 增加"垃圾密度热力图"模块,按经纬度网格聚合检测结果,反向指导清污潜水员的下潜路径规划;
  • 在数据集层面持续补充深水低光、悬浮颗粒、生物附着等更复杂的场景,进一步提升模型在极端水体下的鲁棒性。
相关文章
|
6天前
|
云安全 人工智能 运维
当攻击全面Agent化,你的安全防御能否跟上AI Speed?
多起客户侧AK泄露事件应急的真实观察
1303 6
|
5天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
|
10天前
|
存储 人工智能 安全
千问办公官网入口网页版登录:qwenwork.cn 注册送2000积分、登录送100积分
阿里云千问办公(QwenWork)是AI智能工作平台,支持一句话生成PPT、表格、网页、视频及数据分析。个人免费版送2000积分+每日登录赠100分,含1GB存储、5个发布页;企业版198元/席/月起。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
|
29天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9928 33
|
5天前
|
人工智能 开发者
Qoder CN 大使计划正式开启|无限创造,等你一起
全年免费积分、优先内测、活动支持与更多共创机会,邀请用 Qoder 把想法变成现实的你。
497 0
|
16天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
7天前
|
Web App开发 人工智能 JavaScript
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
REA(Reverse Engineer Anything)是近期爆火的开源AI逆向工具,4月发布,1个月内斩获15万+ Star。它让AI Agent无需源码即可分析二进制、APK、JS/Electron、HAR包等17类目标,自动反编译、生成可运行代码,并强制返回带证据与局限的结论。全本地执行,MIT协议,支持Hopper/Ghidra/IDA等引擎,一行命令即可上手。
729 2
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
|
14天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
1052 1