【算法介绍】

基于YOLOv11的水下垃圾检测系统是一项创新技术,专为提升水下环境清洁度与保护海洋生态而设计。该系统利用YOLOv11(You Only Look Once version 11)这一先进的实时目标检测算法,实现了对水下多种垃圾类型的高效识别与定位。

该系统能够精准识别包括口罩(Mask)、罐头盒(Can)、手机(Cellphone)、电子产品(Electronics)、玻璃瓶(Gbottle)、手套(Glove)、金属制品(Metal)、杂物(Misc)、渔网(Net)、塑料袋(Pbag)、塑料瓶(Pbottle)、塑料垃圾(Plastic)、棍棒(Rod)、太阳镜(Sunglasses)以及轮胎(Tire)在内的多种垃圾类型。这些类别的广泛覆盖,使得系统能够全面应对水下复杂的垃圾场景。

通过高精度的目标检测与实时处理能力,该系统不仅提升了垃圾清理的效率,还为海洋生态保护提供了有力的技术支撑。无论是在科研调查、环保监测还是潜水清理作业中,该系统都能发挥重要作用,助力我们共同守护蔚蓝海洋。

【效果展示】

 

【测试环境】

windows10
anaconda3+python3.8
torch==2.3.0
ultralytics==8.3.81
onnxruntime==1.16.3

【模型可以检测出15类别】

 口罩(Mask)、罐头盒(Can)、手机(Cellphone)、电子产品(Electronics)、玻璃瓶(Gbottle)、手套(Glove)、金属制品(Metal)、杂物(Misc)、渔网(Net)、塑料袋(Pbag)、塑料瓶(Pbottle)、塑料垃圾(Plastic)、棍棒(Rod)、太阳镜(Sunglasses)以及轮胎(Tire)

【训练数据集介绍】

数据集中有很多拼接增强图片

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)

图片数量(jpg文件个数):5127

标注数量(xml文件个数):5127

标注数量(txt文件个数):5127

标注类别数:15

标注类别名称(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准):["Mask","can","cellphone","electronics","gbottle","glove","metal","misc","net","pbag","pbottle","plastic","rod","sunglasses","tire"]

每个类别标注的框数:

Mask 框数 = 1572

can 框数 = 163

cellphone 框数 = 385

electronics 框数 = 196

gbottle 框数 = 484

glove 框数 = 1261

metal 框数 = 83

misc 框数 = 257

net 框数 = 744

pbag 框数 = 1631

pbottle 框数 = 1342

plastic 框数 = 275

rod 框数 = 37

sunglasses 框数 = 18

tire 框数 = 3211

总框数:11659

使用标注工具:labelImg

标注规则:对类别进行画矩形框

重要说明:暂无

特别声明:本数据集不对训练的模型或者权重文件精度作任何保证,数据集只提供准确且合理标注

图片预览:

标注例子:

    【训练信息】

    参数
    训练集图片数 5074
    验证集图片数 1025
    训练map 86.1%
    训练精度(Precision) 89.0%
    训练召回率(Recall) 81.4%

     验证集测试精度信息

    类别

    map0.5

    all

    86

    Mask

    95

    can

    74

    cellphone

    99

    electronics

    95

    gbottle

    87

    glove

    97

    metal

    100

    misc

    93

    net

    98

    pbag

    99

    pbottle

    93

    plastic

    74

    rod

    56

    sunglasses

    53

    tire

    81

    【界面设计】

    import os
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtCore import QThread, pyqtSignal
    from PyQt5.QtGui import QImage, QPixmap
    from PyQt5.QtWidgets import QFileDialog, QLabel, QApplication
    import image_rc
    import threading
    import cv2
    import numpy as np
    import time
    from Yolo11Detector import *
     
     
    class Ui_MainWindow(QtWidgets.QMainWindow):
        signal = QtCore.pyqtSignal(str, str)
     
        def setupUi(self):
            self.setObjectName("MainWindow")
            self.resize(1280, 728)
            self.centralwidget = QtWidgets.QWidget(self)
            self.centralwidget.setObjectName("centralwidget")
            self.detector=None
            self.weights_dir = './weights'
     
            self.picture = QtWidgets.QLabel(self.centralwidget)
            self.picture.setGeometry(QtCore.QRect(260, 10, 1010, 630))
            self.picture.setStyleSheet("background:black")
            self.picture.setObjectName("picture")
            self.picture.setScaledContents(True)
            self.label_2 = QtWidgets.QLabel(self.centralwidget)
            self.label_2.setGeometry(QtCore.QRect(10, 10, 81, 21))
            self.label_2.setObjectName("label_2")
            self.cb_weights = QtWidgets.QComboBox(self.centralwidget)
            self.cb_weights.setGeometry(QtCore.QRect(10, 40, 241, 21))
            self.cb_weights.setObjectName("cb_weights")
            self.cb_weights.currentIndexChanged.connect(self.cb_weights_changed)
     
            self.label_3 = QtWidgets.QLabel(self.centralwidget)
            self.label_3.setGeometry(QtCore.QRect(10, 70, 72, 21))
            self.label_3.setObjectName("label_3")
            self.hs_conf = QtWidgets.QSlider(self.centralwidget)
            self.hs_conf.setGeometry(QtCore.QRect(10, 100, 181, 22))
            self.hs_conf.setProperty("value", 25)
            self.hs_conf.setOrientation(QtCore.Qt.Horizontal)
            self.hs_conf.setObjectName("hs_conf")
            self.hs_conf.valueChanged.connect(self.conf_change)
            self.dsb_conf = QtWidgets.QDoubleSpinBox(self.centralwidget)
            self.dsb_conf.setGeometry(QtCore.QRect(200, 100, 51, 22))
            self.dsb_conf.setMaximum(1.0)
            self.dsb_conf.setSingleStep(0.01)
            self.dsb_conf.setProperty("value", 0.3)
            self.dsb_conf.setObjectName("dsb_conf")
            self.dsb_conf.valueChanged.connect(self.dsb_conf_change)
            self.dsb_iou = QtWidgets.QDoubleSpinBox(self.centralwidget)
            self.dsb_iou.setGeometry(QtCore.QRect(200, 160, 51, 22))
            self.dsb_iou.setMaximum(1.0)
            self.dsb_iou.setSingleStep(0.01)
            self.dsb_iou.setProperty("value", 0.45)
            self.dsb_iou.setObjectName("dsb_iou")
            self.dsb_iou.valueChanged.connect(self.dsb_iou_change)
            self.hs_iou = QtWidgets.QSlider(self.centralwidget)
            self.hs_iou.setGeometry(QtCore.QRect(10, 160, 181, 22))
            self.hs_iou.setProperty("value", 45)
            self.hs_iou.setOrientation(QtCore.Qt.Horizontal)
            self.hs_iou.setObjectName("hs_iou")
            self.hs_iou.valueChanged.connect(self.iou_change)
            self.label_4 = QtWidgets.QLabel(self.centralwidget)
            self.label_4.setGeometry(QtCore.QRect(10, 130, 72, 21))
            self.label_4.setObjectName("label_4")
            self.label_5 = QtWidgets.QLabel(self.centralwidget)
            self.label_5.setGeometry(QtCore.QRect(10, 210, 72, 21))
            self.label_5.setObjectName("label_5")
            self.le_res = QtWidgets.QTextEdit(self.centralwidget)
            self.le_res.setGeometry(QtCore.QRect(10, 240, 241, 400))
            self.le_res.setObjectName("le_res")
            self.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(self)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 1110, 30))
            self.menubar.setObjectName("menubar")
            self.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(self)
            self.statusbar.setObjectName("statusbar")
            self.setStatusBar(self.statusbar)
            self.toolBar = QtWidgets.QToolBar(self)
            self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
            self.toolBar.setObjectName("toolBar")
            self.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
            self.actionopenpic = QtWidgets.QAction(self)
            icon = QtGui.QIcon()
            icon.addPixmap(QtGui.QPixmap(":/images/1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actionopenpic.setIcon(icon)
            self.actionopenpic.setObjectName("actionopenpic")
            self.actionopenpic.triggered.connect(self.open_image)
            self.action = QtWidgets.QAction(self)
            icon1 = QtGui.QIcon()
            icon1.addPixmap(QtGui.QPixmap(":/images/2.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.action.setIcon(icon1)
            self.action.setObjectName("action")
            self.action.triggered.connect(self.open_video)
            self.action_2 = QtWidgets.QAction(self)
            icon2 = QtGui.QIcon()
            icon2.addPixmap(QtGui.QPixmap(":/images/3.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.action_2.setIcon(icon2)
            self.action_2.setObjectName("action_2")
            self.action_2.triggered.connect(self.open_camera)
     
            self.actionexit = QtWidgets.QAction(self)
            icon3 = QtGui.QIcon()
            icon3.addPixmap(QtGui.QPixmap(":/images/4.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actionexit.setIcon(icon3)
            self.actionexit.setObjectName("actionexit")
            self.actionexit.triggered.connect(self.exit)
     
            self.toolBar.addAction(self.actionopenpic)
            self.toolBar.addAction(self.action)
            self.toolBar.addAction(self.action_2)
            self.toolBar.addAction(self.actionexit)
     
            self.retranslateUi()
            QtCore.QMetaObject.connectSlotsByName(self)
            self.init_all()

    【常用评估参数介绍】

    在目标检测任务中,评估模型的性能是至关重要的。你提到的几个术语是评估模型性能的常用指标。下面是对这些术语的详细解释:

    1. Class
      • 这通常指的是模型被设计用来检测的目标类别。例如,一个模型可能被训练来检测车辆、行人或动物等不同类别的对象。
    2. Images
      • 表示验证集中的图片数量。验证集是用来评估模型性能的数据集,与训练集分开,以确保评估结果的公正性。
    3. Instances
      • 在所有图片中目标对象的总数。这包括了所有类别对象的总和,例如,如果验证集包含100张图片,每张图片平均有5个目标对象,则Instances为500。
    4. P(精确度Precision)
      • 精确度是模型预测为正样本的实例中,真正为正样本的比例。计算公式为:Precision = TP / (TP + FP),其中TP表示真正例(True Positives),FP表示假正例(False Positives)。
    5. R(召回率Recall)
      • 召回率是所有真正的正样本中被模型正确预测为正样本的比例。计算公式为:Recall = TP / (TP + FN),其中FN表示假负例(False Negatives)。
    6. mAP50
      • 表示在IoU(交并比)阈值为0.5时的平均精度(mean Average Precision)。IoU是衡量预测框和真实框重叠程度的指标。mAP是一个综合指标,考虑了精确度和召回率,用于评估模型在不同召回率水平上的性能。在IoU=0.5时,如果预测框与真实框的重叠程度达到或超过50%,则认为该预测是正确的。
    7. mAP50-95
      • 表示在IoU从0.5到0.95(间隔0.05)的范围内,模型的平均精度。这是一个更严格的评估标准,要求预测框与真实框的重叠程度更高。在目标检测任务中,更高的IoU阈值意味着模型需要更准确地定位目标对象。mAP50-95的计算考虑了从宽松到严格的多个IoU阈值,因此能够更全面地评估模型的性能。

    这些指标共同构成了评估目标检测模型性能的重要框架。通过比较不同模型在这些指标上的表现,可以判断哪个模型在实际应用中可能更有效。

    【使用步骤】

    使用步骤:
    (1)首先根据官方框架ultralytics安装教程安装好yolov11环境,并安装好pyqt5
    (2)切换到自己安装的yolo11环境后,并切换到源码目录,执行python main.py即可运行启动界面,进行相应的操作即可

    【提供文件】

    python源码
    yolo11n.onnx模型(不提供pytorch模型)
    训练的map,P,R曲线图(在weights\results.png)
    测试图片(在test_img文件夹下面)

    注意提供数据集

    Logo

    火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

    更多推荐