基于yolov11的水下目标检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】

基于YOLOv11的水下目标检测系统是一种利用深度学习技术实现的高效系统,特别适用于识别水下环境中的多种目标。该系统支持识别的目标种类包括fish(鱼)、jellyfish(水母)、penguin(企鹅)、puffin(海雀)、shark(鲨鱼)、starfish(海星)以及stingray(魟鱼)等。

YOLOv11作为YOLO系列的最新版本,具有强大的特征提取能力和高效的推理速度。这使得它能够在复杂的水下环境中快速、准确地检测出上述目标,并标注出其种类和位置。在构建该系统时,首先需要准备一个包含各种水下生物图像的数据集,并对这些图像进行标注,包括生物的位置和类别信息。然后,使用这些数据对YOLOv11模型进行训练,使其学习到水下生物的特征。

训练完成后,系统就可以对输入的水下图像进行实时检测,并输出检测结果。该系统可以广泛应用于水下机器人、海洋探测、环境监测以及水下资源勘探等领域,为科研人员提供准确、实时的数据支持,有助于更好地了解水下生物的分布和数量,为生态保护提供科学依据。

【效果展示】

 

【测试环境】

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

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

 ["fish","jellyfish","penguin","puffin","shark","starfish","stingray"]

【训练数据集介绍】

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

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

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

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

标注类别数:7

标注类别名称(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准):["fish","jellyfish","penguin","puffin","shark","starfish","stingray"]

每个类别标注的框数:

fish 框数 = 5425

jellyfish 框数 = 1280

penguin 框数 = 894

puffin 框数 = 494

shark 框数 = 693

starfish 框数 = 192

stingray 框数 = 367

总框数:9345

使用标注工具:labelImg

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

重要说明:暂无

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

图片预览:

基于yolov11的水下目标检测系统python源码+onnx模型+评估指标曲线+精美GUI界面_第1张图片

标注例子:

基于yolov11的水下目标检测系统python源码+onnx模型+评估指标曲线+精美GUI界面_第2张图片

    【训练信息】

    参数
    训练集图片数 447
    验证集图片数 127
    训练map 77.4%
    训练精度(Precision) 82.4%
    训练召回率(Recall) 72.2%

     验证集测试精度信息

    类别

    map0.5

    all

    77

    fish

    80

    jellyfish

    93

    penguin

    67

    puffin

    56

    shark

    74

    starfish

    83

    stingray

    88

     【界面设计】

    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文件夹下面)

    注意提供数据集

    你可能感兴趣的:(深度学习,YOLO,目标检测,python)