摘要 : 本文将详细介绍如何利用当前先进的深度学习目标检测算法 YOLOv11,结合强大的计算机视觉库 OpenCV,构建一个高效、准确的水面垃圾检测系统。我们将从环境搭建、数据准备、模型训练到最终的检测应用,手把手带你完成整个流程,为河流、湖泊、港口、近海等水域的智能环保监测、无人船巡检、生态治理提供实用的技术支撑。
关键词: YOLOv11, OpenCV, 水面垃圾检测, 深度学习, 目标检测, Python
1. 引言
随着城市化与工业发展,水体污染问题日益严峻,其中水面漂浮垃圾(如塑料瓶、泡沫、废弃渔网、生活垃圾等)不仅破坏生态环境,还影响航运安全与城市形象。传统人工巡查方式效率低、覆盖范围有限,难以满足大范围、高频次的监测需求。借助人工智能技术实现水面垃圾的自动识别与定位,已成为智慧环保与河湖长制数字化的重要方向。
YOLO(You Only Look Once)系列算法以其高速度和高精度在目标检测领域独树一帜。最新的 YOLOv11在继承前代优点的同时,进一步优化了架构和训练策略,性能更上一层楼 ,尤其适合处理水面场景中尺度多变、反光干扰、背景复杂的漂浮物目标。OpenCV 作为最流行的开源计算机视觉库,提供了丰富的图像处理功能。本文将结合 YOLOv11 和 OpenCV,实现对 水面垃圾 (gabbage)这一单一类别的高精度检测。

2. 环境准备
2.1 软件依赖
首先,确保你的开发环境满足以下要求:
- Python: 推荐使用 Python 3.8 或更高版本。
- PyTorch: YOLOv11 基于 PyTorch 框架,需安装相应版本。
- YOLOv12 : 通过
ultralytics包安装。 - OpenCV: 用于图像处理和可视化。
- PyQT: 可视化UI(可选)。
安装命令:
bash
# 安装 PyTorch (根据你的CUDA版本选择)
pip install torch torchvision torchaudio
# 安装 YOLOv11
pip install ultralytics
# 安装 OpenCV
pip install opencv-python
3. 数据集准备与标注
高质量的数据集是模型成功的关键。
3.1 数据收集
收集大量水面图像或视频帧,涵盖:
- 不同水域类型(河流、湖泊、水库、海洋、港口)
- 不同天气与光照(晴天、阴天、逆光、水面反光)
- 不同垃圾类型(塑料瓶、塑料袋、泡沫箱、树枝、废弃轮胎等)
- 不同尺度与密度(单个垃圾 vs 垃圾聚集区)
- 不同视角(岸基摄像头、无人机航拍、无人船搭载相机)
数据可来源于:
- 自主采集(无人机/无人船)
- 公开数据集(如 TACO、SeaShips、Water Surface Trash Dataset)
- 合作环保部门或水务集团
3.2 数据标注
使用标注工具(如 LabelImg, CVAT, Roboflow 等)对图像中的每一片水面垃圾区域进行标注:
- 框出垃圾边界(Bounding Box)
- 所有垃圾统一赋予类别标签:
gabbage
标注格式 :YOLO 使用 .txt 文件存储标注信息,格式为:
txt
<class_id> <x_center> <y_center> <width> <height>
所有坐标值都是相对于图像宽高的归一化值(0-1)。
由于只有 1 个类别 ,class_id 恒为 0。
3.3 数据集划分
将数据集划分为训练集(train)、验证集(val)和测试集(test),通常比例为 7:2:1 或 8:1:1。
3.4 数据集配置文件
创建一个 YAML 配置文件(如 water_waste.yaml),定义数据集路径和类别信息:
yaml
train: /path/to/dataset/images/train
val: /path/to/dataset/images/val
test: /path/to/dataset/images/test
# 类别数量
nc: 1
# 类别名称
names: ['gabbage']
4. 模型训练
4.1 选择 YOLOv11模型
YOLOv11 提供了多个预训练模型(yolov11n.pt, yolov11s.pt, yolov11m.pt, yolov11l.pt, yolov11x.pt)。对于水面垃圾检测(目标小、易受波纹干扰),推荐使用 yolov11s.pt 或 yolov11m.pt,在速度与精度间取得良好平衡。
4.2 开始训练
使用 ultralytics 提供的命令行工具或 Python API 进行训练。
命令行方式:
bash
yolo train data=water_waste.yaml model=yolov11s.pt epochs=100 imgsz=640
Python API 方式:
python
from ultralytics import YOLO
# 加载预训练模型
model = YOLO('yolov11s.pt') # ✅ 关键:使用 yolov12s.pt
# 训练模型
results = model.train(data='water_waste.yaml', epochs=100, imgsz=640)
# 评估模型
results = model.val()
训练过程中,可以监控损失函数、mAP(mean Average Precision)等指标,判断模型收敛情况。

5. 水面垃圾检测实现
训练完成后,使用训练好的模型进行检测。
5.1 加载模型
python
from ultralytics import YOLO
import cv2
# 加载训练好的模型
model = YOLO('runs/detect/train/weights/best.pt') # 替换为你的最佳权重路径
5.2 图像检测
python
# 读取图像
img_path = 'river_scene.jpg'
img = cv2.imread(img_path)
# 使用模型进行预测
results = model(img)
# 解析结果
for result in results:
boxes = result.boxes # 获取边界框
for box in boxes:
# 提取坐标和置信度
x1, y1, x2, y2 = box.xyxy[0].cpu().numpy().astype(int)
conf = box.conf.cpu().numpy()[0]
cls = int(box.cls.cpu().numpy()[0])
label = model.names[cls] # 始终为 'floating_waste'
# 在图像上绘制边界框和标签(统一用红色)
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.putText(img, f'{label} {conf:.2f}', (x1, y1 - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
# 显示结果
cv2.imshow('Floating Waste Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.3 视频流/无人机实时检测
可将上述逻辑应用于无人机视频流或无人船摄像头,实现动态水域监控:
python
cap = cv2.VideoCapture(0) # 或视频文件路径
while True:
ret, frame = cap.read()
if not ret:
break
results = model(frame)
# ... (同上,处理结果并绘制)
cv2.imshow('Live Waste Detection', frame)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
6. 结果与分析
- 精度 : 在包含多样垃圾类型的高质量数据集上,YOLOv11 通常能达到较高的 mAP@0.5(>0.80),尤其对中大型漂浮物识别效果优异。
- 速度: YOLOv11 推理速度快,在边缘设备(如 Jetson Orin)上也能实现实时检测(>15 FPS)。
- 鲁棒性: 模型对水面波纹、反光、部分遮挡具有一定适应能力。
挑战:
- 小目标检测: 远距离或小型垃圾(如烟头、小塑料片)易漏检。
- 背景干扰: 白色浪花、水草、倒影可能被误检为垃圾。
- 密集遮挡: 垃圾堆叠导致边界模糊。
优化方向:
- 使用 Mosaic 、Copy-Paste 数据增强提升小目标和密集场景性能。
- 尝试更大的输入尺寸(如
imgsz=1280)以捕获更多细节。 - 结合 实例分割(YOLOv11-Seg)获取垃圾精确轮廓,辅助体积估算。
- 引入 时序信息(视频帧跟踪)减少闪烁,提升稳定性。
7. 总结
本文详细介绍了基于 YOLOv11 和 OpenCV 实现水面垃圾检测的完整流程。通过单类别目标检测框架,我们能够高效、准确地定位各类漂浮废弃物,为水域清洁、生态评估、智能环卫提供可靠的技术手段。该系统可轻松部署于无人机、无人船、岸基摄像头等平台,助力"美丽中国"与"无废城市"建设,在智慧环保、河湖治理、海洋保护等领域具有广阔的应用前景。
🌍 社会价值:自动化垃圾监测不仅能降低人力成本,更能为污染溯源、治理成效评估提供数据支持,推动环境治理从"被动响应"向"主动预防"转变。