基于 YOLO11 的海底垃圾视觉巡检系统水下 ROV Streamlit 全流程实战关键词YOLO11、海底垃圾、水下视觉、海洋治理、Streamlit、目标检测一、背景1.1 行业痛点近海与离岸海域的底质环境正在被持续侵扰废弃口罩、易拉罐、玻璃瓶、塑料瓶、渔网、废旧轮胎……这些垃圾长期沉积在海底会缠绕海洋生物、释放微塑料、破坏珊瑚礁与海草床生态对海洋牧场、近海渔业与潜水旅游业的影响是全链路的。传统的海底垃圾排查依赖潜水员目视巡查或 ROV 视频后处理效率低一个潜水员单次下潜作业时长 30~45 min一次只能覆盖几百平米人眼疲劳浑浊水体下颜色失真、对比度低潜水员长时间盯着回放视频极易漏检数据无法量化拍了一堆视频但具体哪个区域有多少口罩 / 渔网缺乏可统计的结构化结果给后续清污作业排程造成困难。把 YOLO11 这类轻量级目标检测模型接到 ROV、拖曳成像系统或潜水员手持相机的视频流后端可以把看视频找垃圾这件事变成模型逐帧自动标注 人工复核疑难效率提升一个数量级并且每一次推理都能沉淀为结构化的统计数据直接喂给海洋治理调度平台。本文介绍的项目就是这条路线下的一个完整落点面向 15 类典型海底垃圾的 YOLO11 检测模型 一个开箱即用的 Streamlit 可视化界面。视频演示与源码下载https://www.bilibili.com/video/BV1KKH76UEPS/包含完整项目源码预训练模型权重️数据集1.2 项目运行效果1.3 项目介绍核心创新点维度设计类目覆盖15 类典型海底垃圾覆盖塑料 / 金属 / 玻璃 / 医疗废弃 / 渔具等模型选型YOLO11n6 MB 权重CPU 实时、Apple Silicon MPS / NVIDIA CUDA 可选加速部署形态Streamlit 单页应用 本地 best.pt零数据库便于离线部署在科考船 / ROV 控制台输入兼容图片 / 批量图片 / 视频 / 摄像头四种输入全部走同一推理引擎适配场景浑浊低光海底、绿色调畸变水体、沉积泥沙背景下仍能稳定出框功能概览️单图检测上传海底拍摄的图片 → 实时返回带框图 类别 / 置信度明细批量检测单次最多 200 张输出汇总表 类别分布柱状图 检测结果 zip 下载视频检测mp4 / avi / mov / mkv 通通可读逐帧推理后落盘新视频摄像头实时检测可对接 ROV 直出视频流做现场作业辅助15 个识别类别口罩、易拉罐、手机、电子垃圾、玻璃瓶、手套、金属杂物、杂项垃圾、渔网、塑料袋、塑料瓶、塑料杂物、杆状物、太阳镜、废旧轮胎。技术栈层选型模型框架Ultralytics 8.3 PyTorch视觉算法YOLO11nAnchor-FreeC2f BackboneDecoupled Head DFLWeb 前端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 (C2fSPPF) → Neck (FPN/PAN) │ │ → Decoupled HeadDFL 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 Headcls 头 / reg 头解耦 回归头采用 DFLDistribution Focal Loss Anchor-Free输出 (cx, cy, w, h, cls × 15) │ ▼ [NMS] iou0.7, conf0.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_spinnerFalse)defload_model(model_path:str)-YOLO:returnYOLO(model_path)# 2. 单图推理路径 → 标注图 检测明细 DataFrame definfer_image_path(model:YOLO,image_path:Path,conf:float):resultmodel.predict(str(image_path),confconf,verboseFalse)[0]annotatedresult.plot()# BGR ndarray已画框rows[]ifresult.boxesisnotNone:forboxinresult.boxes:cls_idint(box.cls.item())x1,y1,x2,y2[float(v)forvinbox.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 给 Streamlitrows 转 DataFrame 给表格组件returnannotated[:,:,::-1],pd.DataFrame(rows)# 3. bytes → 临时文件 → 复用同一函数 defrun_image_inference(model:YOLO,image_bytes:bytes,conf:float,suffix.jpg):withtempfile.NamedTemporaryFile(deleteFalse,suffixsuffix)asf:f.write(image_bytes);tmpPath(f.name)try:returninfer_image_path(model,tmp,conf)finally:tmp.unlink(missing_okTrue)# 4. Streamlit 单图 Tab上传 → 推理 → 双列展示 modelload_model(str(MODEL_PATH))uploadedst.file_uploader(上传水下图片,typeIMAGE_UPLOAD_TYPES)confst.sidebar.slider(置信度阈值,0.05,0.95,DEFAULT_CONF,0.01)ifuploadedisnotNone:annotated,dfrun_image_inference(model,uploaded.getvalue(),conf,suffixPath(uploaded.name).suffix)col1,col2st.columns(2)col1.image(uploaded,caption原图)col2.image(annotated,caption检测结果)st.dataframe(detections_to_display(df))render_detection_analysis(df)5 段解析st.cache_resource把YOLO(model_path)的耗时首次约 2~3 s锁在第一次访问之后所有 session 共享同一份模型实例避免每次切换 Tab 都重载。result.plot()直接返回带颜色框 类别 置信度的BGR ndarray省去手写 cv2.rectangle 的繁琐。把每个box的cls / conf / xyxy拍成dict再拼成DataFrame——后续表格、CSV 下载、分类柱状图全部复用同一份结构。run_image_inference走临时文件而非 numpy 数组是为了让 Ultralytics 内部的 EXIF / orientation 处理逻辑生效对水下相机、运动相机的旋转图片更稳finally删除临时文件避免磁盘泄漏。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 平台增加垃圾密度热力图模块按经纬度网格聚合检测结果反向指导清污潜水员的下潜路径规划在数据集层面持续补充深水低光、悬浮颗粒、生物附着等更复杂的场景进一步提升模型在极端水体下的鲁棒性。 SEO 优化官网定制响应式建站教育培训建站