0
点赞
收藏
分享

微信扫一扫

【Python 48小时速成 3】输入与输出

摘要:本研究详述了一种采用深度学习技术的水下目标检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别水下目标检测。文章深入阐述了YOLOv8算法的机理,并附带了Python语言的实现代码、所需训练数据集,以及基于PySide6框架构建的用户界面(UI)。此外,系统还融合了SQLite数据库的用户管理功能,实现了一键切换YOLOv5/v6/v7/v8模型的便捷操作,以及提供了界面的自定义修改选项。本文目的是为水下目标检测领域的研究人员以及深度学习初学者提供实用指导和资源。完整的代码库和数据集可通过文末提供的链接进行下载。本文结构如下:

文章目录

➷点击跳转至文末所有涉及的完整代码文件下载页☇

基于深度学习的水下目标检测系统演示与介绍(YOLOv8/v7/v6/v5模型+PySide6界面+训练数据集)


前言

        在探索海洋的深邃蓝色之中,水下目标检测系统成为了人类理解这片未知世界的重要技术之一。海洋覆盖了地球表面的70%以上,蕴含着丰富的自然资源和巨大的科研价值。然而,水下环境的复杂性,包括但不限于光线衰减、水质浑浊、以及水流的不稳定性等,都极大地增加了探索海洋的难度。正是出于对海洋深处奥秘的探索以及对水下资源的开发利用,水下目标检测技术应运而生,它不仅能够辅助人类进行海洋生态监测、资源勘探、遗迹考古,还能在海洋灾难预防和军事防御中发挥关键作用。

在这里插入图片描述

        随着深度学习技术的快速发展和海洋资源的日益重要性,水下目标检测成为了计算机视觉领域的一个研究热点。水下环境的复杂性,如光线衰减、水体散射和漂浮物,对目标检测算法提出了更高的要求。近年来,基于YOLO(You Only Look Once)系列的算法因其高效率和准确性在水下目标检测中受到广泛关注。

        最新的研究表明,YOLOv8等深度学习模型通过引入注意力机制、多尺度训练和自适应锚框技术,显著提升了在复杂水下环境中的检测性能1。此外,针对水下图像的特殊性,研究者们提出了多种数据增强策略,如模拟水下光学特性的图像预处理和基于生成对抗网络(GAN)的数据增强,以提高模型的泛化能力2

        在算法改进方面,除了YOLO系列,还有研究团队探索了基于Transformer的检测模型,如ViT-Det3,该模型通过全局注意力机制捕获图像中的长距离依赖,展现出对于水下目标的高度敏感性和准确识别能力。尽管Transformer模型在参数量和计算成本上较高,但其出色的性能表明,通过模型压缩和优化,这类模型有望在实时水下目标检测系统中得到应用。

        数据集的构建和更新也是近期研究的焦点之一。鉴于现有公开水下数据集的限制,如类别单一、样本数量不足,新的研究提出了更为丰富和多元化的水下目标检测数据集,这些数据集包括了更多种类的水下生物、人造物体以及不同水质条件下的图像,极大地促进了模型训练的深度和广度4。同时,一些研究通过无人潜水器(AUV)和遥控潜水器(ROV)采集的实时数据,进一步增强了数据集的实用性和挑战性5

        总的来说,水下目标检测领域正处于快速发展之中,新的技术和方法不断涌现。尽管面临种种挑战,如算法的实时性、鲁棒性以及数据集的多样性和质量,但通过不断的研究和探索,我们有理由相信,未来水下目标检测的准确性和效率将得到显著提升。

        本博客的主要贡献可以归纳为以下几个方面,旨在为水下目标检测领域提供全面且深入的研究和实践指南:

  1. 采用最先进的YOLOv8算法进行水下目标检测,并进行算法比较:我们详细介绍了如何使用YOLOv8,这是目前最先进的目标检测算法,来进行水下目标检测。此外,我们还比较了YOLOv8与其前版本YOLOv7、YOLOv6、YOLOv5的性能,展现了YOLOv8在处理速度、准确性和鲁棒性方面的显著优势。这一部分为研究者和技术从业者提供了关于如何选择和应用最合适的算法进行水下目标检测的宝贵见解。
  2. 利用PySide6实现友好的水下目标检测系统界面:通过Python的PySide6库,我们开发了一个具有良好用户体验的水下目标检测系统。该系统不仅易于操作,还能有效地展示YOLOv8算法的检测结果,进一步促进了先进目标检测技术在实际应用中的普及和应用。
  3. 集成登录管理功能,提升系统安全性和可扩展性:系统设计包括了用户登录管理功能,旨在增强系统的安全性,同时为将来添加更多个性化功能和用户管理提供了可能,增强了系统的实用性和灵活性。
  4. 深入研究YOLOv8模型的性能:本文不仅介绍了YOLOv8算法的应用,还深入探讨了该模型的性能表现,包括精度、召回率等关键性能指标的评估,以及在不同环境条件下的表现分析。这些研究成果为理解和优化YOLOv8算法提供了坚实的理论和实践基础。
  5. 提供完整的数据集和代码资源包:为了帮助读者更好地理解和实践YOLOv8及其前版本在水下目标检测中的应用,我们提供了一套完整的数据集和代码资源包。这些资源不仅便于读者复现我们的实验结果,也为进一步的研究和开发工作提供了有力支持。

1. 数据集介绍

        在探索深海的神秘之旅中,我们的水下目标检测系统扮演着关键角色。本文所依赖的数据集是该系统的基石,包含了14674张图像,覆盖了从浅海到深海不同深度和环境的多样化水下场景。具体来说,数据集由11739张训练图像、1468张测试图像和1467张验证图像组成,这一划分确保了模型可以在广泛的数据上训练,并能在未知数据上进行有效的测试和验证。

在这里插入图片描述

        本数据集的构建融合了实用性与挑战性。在预处理阶段,每张图像都经过了尺寸调整、格式标准化和像素值归一化,以满足深度学习模型输入的要求。为了增强模型对多变水下条件的适应性,我们引入了数据增强技术,如随机旋转、翻转、缩放、剪裁和色彩调整,以模拟不同的光照、视角和水质条件。
        从我们的数据集分布图可以看出,螃蟹和鱼类的实例数量占据了主导地位,这反映了它们在海洋生态系统中的丰富性和检测系统中的重要性。尽管水母、虾、小鱼和海星的样本数量较少,但它们的存在为系统提供了必要的多样性,以识别和分类较为罕见的水下生物。
        通过观察目标在图像中的位置分布热力图,我们发现大多数目标集中在图像的中心区域。这种分布模式对于训练阶段是有利的,因为它减少了模型在预测时需要搜索的区域,提高了训练效率。此外,目标的长宽比分布散点图显示了在数据集中,大多数目标尺寸较小,这提示我们在设计检测模型时需特别注意对小尺寸目标的识别能力。

在这里插入图片描述

        我们的目标检测数据集不仅量化了各类目标的分布,还提供了目标尺寸和位置分布的直观视图。这一独特视角使我们能够深入分析和理解水下目标检测的复杂性,为我们在此领域的研究和应用奠定了坚实的基础。通过这些数据,我们可以训练出能够适应不同水下环境条件、具有高准确性和强鲁棒性的目标检测模型,进而为深海探索提供强有力的技术支撑。博主使用的类别代码如下:

Chinese_name = {"crab": "螃蟹", "fish": "鱼", "jellyfish": "水母", "shrimp": "虾", "small_fish": "小鱼", "starfish": "海星"}

        总的来说,通过对数据集的分析,我们可以了解到数据集的多样性以及可能面临的挑战。这些信息对于后续模型的训练、优化和评估至关重要。理解数据集的特性有助于我们采取适当的数据增强策略,改进模型结构,以及调整训练过程中的参数,从而提高水下目标检测的准确性和鲁棒性。

2. 系统界面效果

        系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。

(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。

在这里插入图片描述

(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行水下目标检测的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。

在这里插入图片描述

(3)此外,系统还提供了一键更换YOLOv8模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。

在这里插入图片描述

(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。

在这里插入图片描述


3. YOLOv8算法原理

        在目标检测的世界中,YOLOv8代表了技术的最新进展。它是在YOLO(You Only Look Once)系列算法发展中的又一重要里程碑。作为一个高效的目标检测模型,YOLOv8继承了YOLO系列算法的核心思想,即在单次前向传播中同时预测多个目标的类别和位置,实现了检测的实时性和准确性的平衡。

        YOLOv8的架构包含了三个主要部分:Backbone、Neck和Head。Backbone是模型的主干网络,负责提取图像的特征。YOLOv8的Backbone在结构上进行了重要的优化,比如引入了CSP(Cross Stage Partial networks)设计,它通过部分连接多个网络阶段,减少了计算量的同时保持了特征的丰富性。此外,YOLOv8的Backbone可能还整合了SPP(Spatial Pyramid Pooling)和C2F(Coarse-to-Fine)结构,使模型能够捕获从粗到细的多尺度特征。

在这里插入图片描述

        Neck部分的作用是连接Backbone和Head,它在特征传递过程中起到增强和过滤的作用。YOLOv8可能采用了PANet(Path Aggregation Network)或者BiFPN(Bidirectional Feature Pyramid Network)这样的结构,以促进不同尺度的特征图之间的信息流动,强化了检测器对于不同尺寸目标的检测能力。

        Head部分是模型的预测器,负责最终的目标检测任务。它通常包含多个并行的卷积层,用于预测边界框的位置、尺寸和目标的类别。YOLOv8的Head可能通过改进的anchor机制来预测边界框,该机制能够更精准地匹配目标的形状和大小,从而提高了检测的精度。

        除了架构上的创新,YOLOv8在算法的训练和优化方面也做了诸多改进。例如,利用AutoML技术自动调整网络结构,或者采用了更先进的损失函数来优化模型的性能。这些技术的应用,使得YOLOv8在各种复杂场景下的水下目标检测任务中都表现出色,无论是在精确度、速度还是鲁棒性方面。

        YOLOv8还采用了最新的训练技巧,例如自适应标签分配(adaptive label assignment),这使得模型在训练过程中能够更智能地分配标签,以适应不同目标的特性。此外,YOLOv8还引入了一种新的损失函数,用于平衡检测任务中的多个目标,如定位精度和类别准确性,这有助于模型在多个评价指标上都取得良好表现。

        总的来说,YOLOv8在继承了YOLO系列算法速度与准确度优势的基础上,通过架构和算法的创新,进一步提升了目标检测性能,尤其在水下目标检测等需要高精度和快速响应的应用场景中,表现出了非凡的能力。

4. 代码简介

        在本节中,我们将详细介绍如何使用YOLOv8进行水下目标检测的代码实现。代码主要分为两部分:模型预测和模型训练。

4.1 模型预测

        在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。

import cv2  
from ultralytics import YOLO  

        接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。

model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))

        然后,使用OpenCV读取了一个图像文件,这个图像文件作为要进行目标检测的图像输入。

img_path = abs_path("test_media/t1.jpg")
image = cv_imread(img_path)

        在读取了图像文件之后,将图像大小调整为850x500,并对图像进行预处理,就可以使用模型进行预测了。

image = cv2.resize(image, (850, 500))
pre_img = model.preprocess(image) 
pred, superimposed_img = model.predict(pre_img) 

在这里插入图片描述

4.2 模型训练

        在构建一个高效的水下目标检测系统时,选择合适的模型和进行精确的训练是成功的关键。本博客章节将深入探讨如何搭建一个水下目标检测系统,它不仅能够辅助人类进行海洋生态监测、资源勘探、遗迹考古,还能在海洋灾难预防和军事防御中发挥关键作用。

        我们的代码首先导入我们在训练过程中需要使用的模块。这里,torch是PyTorch框架的核心库,它提供了构建和训练深度学习模型所需的所有功能。yaml用于处理YAML文件,这在读取和写入模型的配置文件时非常有用。ultralytics.YOLO是一个封装好的YOLO模型类,它简化了模型加载和训练的过程。QtFusion.path中的abs_path函数用于生成文件的绝对路径,这在不同操作系统或文件目录结构可能变化的情况下尤其重要。device变量的设置确保了我们可以在GPU上训练我们的模型,这是现代深度学习训练中提高速度的关键。

import os

import torch
import yaml
from ultralytics import YOLO  # 导入YOLO模型
from QtFusion.path import abs_path
device = "cuda:0" if torch.cuda.is_available() else "cpu"

        workers和batch定义了数据加载过程中的工作进程数和每批处理的图像数量。这些参数直接影响到数据加载的效率和训练过程中的内存消耗。data_path通过abs_path函数获取数据集配置文件的绝对路径,这是训练前必要的步骤,因为YOLO模型需要知道数据集的位置。接着,unix_style_path确保了路径格式在不同操作系统间的兼容性。然后,通过读取和修改YAML文件,我们更新了数据集配置,这保证了模型能够正确地找到训练数据。

workers = 1
batch = 8

data_name = "Underwater"
data_path = abs_path('datasets/Underwater/underwater.yaml', path_type='current')  # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')

# 获取目录路径
directory_path = os.path.dirname(unix_style_path)')

        随后,我们读取YAML配置文件,并在必要时更新其中的路径信息,以确保模型能够访问到正确的数据集文件。这里使用了yaml库来加载配置文件,FullLoader用于加载YAML文件中的全部数据。

# 读取YAML文件,保持原有顺序
with open(data_path, 'r') as file:
    data = yaml.load(file, Loader=yaml.FullLoader)
# 修改path项
if 'path' in data:
    data['path'] = directory_path
    # 将修改后的数据写回YAML文件
    with open(data_path, 'w') as file:
        yaml.safe_dump(data, file, sort_keys=False)

        在模型加载部分,我们通过YOLO类来加载预训练的YOLOv8模型,这是进行有效训练的基础。预训练的模型包含了在大量数据上训练得到的权重,这可以大大加速我们训练过程中的收敛速度,并提高模型的最终性能。最后,是模型训练的部分。我们调用train方法,传入数据路径、设备信息和其他训练参数,如工作进程数、图像尺寸、训练周期和批次大小。

model = YOLO(abs_path('./weights/yolov5nu.pt', path_type='current'), task='detect')  # 加载预训练的YOLOv8模型
# model = YOLO('./weights/yolov5.yaml', task='detect').load('./weights/yolov5nu.pt')  # 加载预训练的YOLOv8模型
# Training.
results = model.train(  # 开始训练模型
    data=data_path,  # 指定训练数据的配置文件路径
    device=device,  # 自动选择进行训练
    workers=workers,  # 指定使用2个工作进程加载数据
    imgsz=640,  # 指定输入图像的大小为640x640
    epochs=120,  # 指定训练100个epoch
    batch=batch,  # 指定每个批次的大小为8
    name='train_v5_' + data_name  # 指定训练任务的名称
)

model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect')  # 加载预训练的YOLOv8模型
results2 = model.train(  # 开始训练模型
    data=data_path,  # 指定训练数据的配置文件路径
    device=device,  # 自动选择进行训练
    workers=workers,  # 指定使用2个工作进程加载数据
    imgsz=640,  # 指定输入图像的大小为640x640
    epochs=120,  # 指定训练100个epoch
    batch=batch,  # 指定每个批次的大小为8
    name='train_v8_' + data_name  # 指定训练任务的名称
)

        在水下目标检测领域,对训练过程的损失函数进行分析是至关重要的。它不仅反映了模型学习的状况,还指示了模型的性能可能存在的问题。本次使用YOLOv8模型进行训练的结果显示出了一些关键的特征。

        首先,我们观察到训练和验证集上的边界框损失(box_loss)随着训练轮次的增加而持续下降,这表明模型在识别目标的位置和大小方面的性能正逐步提高。在经过初期的快速下降之后,损失曲线趋于平缓,显示出收敛的迹象。这一趋势在分类损失(cls_loss)和方向损失(dfl_loss)上也有所体现,损失函数的下降和平稳说明模型在识别目标类别和方向方面也取得了相应的进展。

        当我们转向模型的精确度(precision)和召回率(recall)指标时,可以看到在训练过程中两者都表现出积极的增长趋势。精确度表明模型预测正类的能力,而召回率则是模型找到所有正类样本的能力。这两个指标的提高直接指向了模型预测质量的改善,特别是在最初的训练阶段,它们迅速上升至较高水平,这表明模型学习得非常快。

在这里插入图片描述

        最后,我们考察平均精度均值(mAP)的两个标准——mAP@0.5和mAP@0.5-0.95。mAP@0.5是在IoU(交并比)阈值为0.5时的平均精度均值,它是检测任务中常用的性能指标,而mAP@0.5-0.95则考虑了从0.5到0.95的不同IoU阈值,是一个更为严格的评估标准。两者都随训练轮次增加而显著提高,尤其是mAP@0.5-0.95,其稳步上升表明模型对目标检测的准确性在不断提高,即使在更为严格的IoU阈值下也能保持较高的性能。

        精确度-召回率(Precision-Recall,简称PR)曲线是评估分类模型性能的重要工具,尤其是在数据集类别分布不平衡的情况下。PR曲线上的每一点对应一个阈值,该阈值决定了模型预测正样本的条件,从而影响到精确度和召回率的值。通常情况下,精确度高意味着较少的假阳性,召回率高意味着较少的假阴性。

在这里插入图片描述

         首先,每个类别的PR曲线都接近右上角,这表明了模型在各个类别上都达到了极高的精确度和召回率。在机器学习领域,精确度衡量的是模型识别为正样本的实例中实际为正样本的比例,而召回率衡量的是所有正样本中被模型正确识别的比例。图中标注的数值显示,无论是螃蟹、鱼类、水母、虾、小鱼还是海星,精确度都在0.990以上,这一成果非常令人印象深刻。特别是,虾和海星的精确度达到了0.995,显示了模型在这些类别上的卓越性能。

         更值得注意的是,所有类别的平均精确度(mAP)在0.5的IoU阈值下达到了0.987,这是一个非常高的分数,表明了模型具有极好的检测能力。在目标检测任务中,IoU(交并比)是衡量预测的边界框和真实边界框重叠程度的指标,0.5的阈值意味着模型的预测必须与真实标签至少有一半的重叠才算正确。

         从PR曲线的形状来看,我们可以观察到,当召回率非常高时,精确度仍然保持在较高水平,这意味着即使在试图检测大多数正样本的情况下,模型也能保持较低的误检率。这对于水下目标检测尤其重要,因为在实际应用中,如海洋生态监测或潜水器导航,漏检或误检的成本可能非常高。

         综上所述,这些PR曲线及其相关的精确度和召回率数值为我们提供了强有力的证据,证明了我们的水下目标检测系统在多个类别上都实现了高精度的检测结果。这种高效能的检测系统不仅可以在海洋生物研究中提供强大的支持,也可以在水下机器人和自动监测系统中发挥关键作用。通过这些先进的技术,我们将能够更好地理解和保护我们的海洋生态系统。

4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比

(1)实验设计
在这里插入图片描述

        本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在水下目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。

模型图像大小 (像素)mAPval 50-95CPU ONNX 速度 (毫秒)A100 TensorRT 速度 (毫秒)参数数量 (百万)FLOPs (十亿)
YOLOv5nu64034.373.61.062.67.7
YOLOv8n64037.380.40.993.28.7
YOLOv6N64037.5--4.711.4
YOLOv7-tiny64037.4--6.0113.1

(2)度量指标

  • F1-Score:F1-Score是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
  • mAP(Mean Average Precision):mAP是衡量模型在多个类别上平均检测准确度的指标。它计算了模型在所有类别上的平均精度,是目标检测领域中常用的性能度量。
名称YOLOv5nuYOLOv6nYOLOv7-tinyYOLOv8n
mAP0.9870.9880.9790.987
F1-Score0.970.980.960.97

(3)实验结果分析

        在深度学习领域,持续的算法迭代和更新是提升模型性能的关键途径。我们通过在相同的数据集上实施一系列实验,旨在比较和评估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在水下目标检测任务上的性能。实验的设计和目的是为了明确各版本模型在准确性和检测效率上的差异,以便为实际应用提供更具指导性的见解。

        通过图形展示,我们可以观察到YOLOv6n在mAP值上略高于其他版本,达到了0.988,而YOLOv5nu和YOLOv8n则紧随其后,均为0.987。YOLOv7-tiny的mAP表现稍低,为0.979。在实际应用中,即使是这样微小的差异也可能对系统的整体性能产生重要影响,特别是在那些要求极高准确性的水下目标检测任务中。

在这里插入图片描述

        在F1-Score方面,YOLOv6n同样表现出色,达到了0.98,这意味着它在精确度和召回率之间取得了最佳的平衡。YOLOv5nu和YOLOv8n的F1-Score均为0.97,而YOLOv7-tiny稍低,为0.96。F1-Score作为精确度和召回率的调和平均数,是评价模型稳健性的重要指标,较高的F1-Score表明模型在检测水下目标时既准确又可靠。

        整体来看,YOLOv6n在这两个指标上表现最为突出,而YOLOv5nu和YOLOv8n也展现了相当强的竞争力。尽管YOLOv7-tiny在这些指标上略显逊色,但考虑到其“tiny”版本可能更适用于计算资源有限的场景,其性能仍然是可观的。

        我们的分析显示,在选择适合特定水下目标检测应用的算法时,不仅要考虑精确度和召回率,还需要综合考虑其他因素,如模型大小、速度和资源消耗。这些图表为我们提供了一个清晰的视图,帮助我们根据具体需求做出更明智的选择。

4.4 代码实现

        在这一节中,我们将深入探讨一段使用PySide6和OpenCV构建的水下目标检测系统的代码。代码的核心思路是利用预训练的YOLOv8模型来实时处理和分析通过摄像头捕获的视频流。整个系统是通过一个基于Qt的图形用户界面(GUI)来展示的,它能够实时显示检测到的目标,并在目标周围绘制边界框,并显示类别和置信度。

(1)引入必要的库
        首先,引入必要的模块,sys模块用于访问Python解释器的一些变量和与系统相关的函数,time模块用于测量模型预测所需的时间。cv2是OpenCV库的一部分,用于处理视频流中的每一帧图像。QtWidgets和QtCore是PySide6库中的模块,用于创建图形用户界面。

import sys  # 导入sys模块,用于访问与Python解释器相关的变量和函数
import time  # 导入time模块,用于获取当前时间

import cv2  # 导入OpenCV库,用于图像处理
from QtFusion.widgets import QMainWindow  # 从QtFusion库导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler  # 从QtFusion库导入MediaHandler类,用于处理媒体流
from QtFusion.utils import drawRectBox, get_cls_color  # 从QtFusion库导入drawRectBox函数,用于在图像上绘制矩形框
from PySide6 import QtWidgets, QtCore  # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from YOLOv8Model import YOLOv8Detector  # 从YOLOv8Model模块导入YOLOv8Detector类,用于物体检测

QF_Config.set_verbose(False)

(2)设置主窗口
        MainWindow类继承自Qt的QMainWindow,定义了一个窗口,其中包含一个标签QLabel用于显示图像。此外,该类还重写了keyPressEvent方法,允许用户通过按下’Q’键来退出应用程序。

class MainWindow(QMainWindow):  # 定义MainWindow类,继承自FBaseWindow类
    def __init__(self):  # 定义构造函数
        super().__init__()  # 调用父类的构造函数
        self.resize(850, 500)  # 设置窗口的大小
        self.label = QtWidgets.QLabel(self)  # 创建一个QLabel对象,用于显示图像
        self.label.setGeometry(0, 0, 850, 500)  # 设置QLabel对象的几何形状

    def keyPressEvent(self, event):  # 定义keyPressEvent函数,用于处理键盘事件
        if event.key() == QtCore.Qt.Key.Key_Q:  # 如果按下的键是Q键
            self.close()  # 关闭窗口

(3)图像帧处理与水下目标检测
        在处理视频流的frame_process函数中,首先调整摄像头捕获的图像大小,然后调用模型的preprocess方法进行预处理。接下来,记录模型预测的开始时间,执行预测,并记录结束时间,以此计算出模型推理的时间。如果预测结果非空,则对其进行后处理,提取目标的名称、边界框、置信度和类别ID,并使用drawRectBox函数在图像上绘制相应的边界框和标签。

def frame_process(image):  # 定义frame_process函数,用于处理每一帧图像
    image = cv2.resize(image, (850, 500))  # 调整图像的大小
    pre_img = model.preprocess(image)  # 对图像进行预处理

    t1 = time.time()  # 获取当前时间
    pred = model.predict(pre_img)  # 使用模型进行预测
    t2 = time.time()  # 获取当前时间
    use_time = t2 - t1  # 计算预测所用的时间

    print("推理时间: %.2f" % use_time)  # 打印预测所用的时间
    det = pred[0]  # 获取预测结果
    # 如果有检测信息则进入
    if det is not None and len(det):
        det_info = model.postprocess(pred)  # 对预测结果进行后处理
        for info in det_info:  # 遍历检测信息
            name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info[
                'class_id']  # 获取类名、边界框、置信度和类别ID
            label = '%s %.0f%%' % (name, conf * 100)  # 创建标签,包含类名和置信度
            # 画出检测到的目标物
            image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id])  # 在图像上绘制矩形框,并添加标签和颜色

    window.dispImage(window.label, image)  # 在窗口的label控件上显示图像

(4)初始化检测模型和设备

        为了将我们的系统运行起来,我们首先需要加载训练好的模型并准备好颜色标签,这些颜色标签将用于在UI上标识不同类别的检测目标。然后,我们创建了QApplication和MainWindow实例,设置了视频源,并连接了处理函数和媒体处理器。最后,我们启动了媒体处理并显示了主窗口。这意味着一旦程序运行,用户将看到实时视频,并且检测结果会即时显示在UI上。

cls_name = ["螃蟹", "鱼", "水母", "虾", "小鱼", "海星"]  # 定义类名列表

model = YOLOv8Detector()  # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/underwater-yolov8n.pt", path_type="current"))  # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names)  # 获取类别颜色

app = QtWidgets.QApplication(sys.argv)  # 创建QApplication对象
window = MainWindow()  # 创建MainWindow对象

videoHandler = MediaHandler(fps=30)  # 创建MediaHandler对象,设置帧率为30
videoHandler.frameReady.connect(frame_process)  # 当有新的帧准备好时,调用frame_process函数
videoHandler.setDevice(device=0)  # 设置设备为0,即默认的摄像头
videoHandler.startMedia()  # 开始处理媒体流

# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())

        整体而言,这段代码通过结合最先进的目标检测算法和高效的图像处理技术,展示了一个完整的水下目标检测系统的实现。它不仅能够满足实时监控的需求,也为进一步开发更为复杂的图像处理应用打下了坚实的基础。


5. 水下目标检测系统实现

        在实现一款实时水下目标检测系统时,这个系统不仅需要实时准确地检测火焰,而且要提供直观的反馈和操作界面给用户。为此,我们采纳了一个综合性的设计方法,将用户界面、媒体处理及深度学习模型紧密集成在一起,以提供一个无缝的用户体验。

5.1 系统设计思路

        MainWindow类的主要目标是提供一个用户友好的交互式水下目标检测系统。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。通过对象组合的方式,将不同的处理器和模型组织在一起,让每个功能模块都能独立进行,同时,还利用信号和槽机制来进行模块间的交互和数据传递。

在这里插入图片描述

架构设计
        我们的系统设计思路以三层架构为核心:处理层、界面层和控制层。这种分层的设计使得系统的各个部分既可以独立运行,又能高效协同工作。

  • 处理层(Processing Layer):这是系统的后端,由YOLOv8Detector类构成。该类是基于YOLOv8算法的深度学习模型,它负责执行图像中目标的实时检测和识别任务。通过加载预训练的模型权重,该处理器能够识别并分类各种水下生物和物体。
  • 界面层(UI Layer):前端用户界面是通过PySide6框架构建的,它包含了图像显示标签、状态条以及其他可能的交互控件,为用户提供直观的操作和实时的反馈。界面的设计注重用户体验,旨在让用户即便在没有深入技术背景的情况下也能轻松地使用系统。
  • 控制层(Control Layer):作为链接处理层和界面层的桥梁,控制层由MainWindow类中的方法实现,它响应用户交互,调度媒体流的捕获和处理,并将检测结果反馈到界面层。控制层的设计充分利用了PySide6的信号与槽机制,实现了模块间的高效通信。

        我们的系统设计不仅依赖于这些层次分明的结构,还体现在对每个组件功能的精心规划。通过调用MediaHandler处理媒体流,利用drawRectBox和get_cls_color工具函数进行图像绘制,以及将YOLOv8的深度学习能力集成进来,我们确保了系统在处理复杂的水下图像时的高效率和高准确性。此外,系统还具备登录管理功能,不仅增强了安全性,也为将来添加更多个性化功能提供了基础。

        综上所述,我们的系统设计思路是以用户为中心,强调功能的模块化,注重界面的直观性,并且确保了强大的后端处理能力。这样的设计不仅优化了用户的操作体验,也为未来可能的扩展提供了方便。通过这种方式,我们能够提供一个既强大又易于使用的水下目标检测系统,旨在推动海洋科学研究,以及在实际应用中的广泛使用。

系统流程
        在当前的数字化时代,个性化和安全性是任何软件系统的重要组成部分。我们的水下目标检测系统在这两方面都进行了精心设计,以确保用户能够在一个安全的环境中使用该系统,同时也能享受到个性化的体验。以下是水下目标检测系统的工作流程:

  1. 首先,当用户启动应用程序时,系统会立即创建一个MainWindow类的实例。这是系统的核心,负责初始化用户界面和设置程序运行所需的各项参数。这个主窗口不仅为用户提供了一个操作平台,而且还是程序运行的控制中心。
  2. 随后,用户将面对一个直观、易于操作的界面,可以通过该界面轻松选择输入源。输入源的选择多样化,可以是实时捕捉的摄像头图像流,也可以是预录制的视频文件,甚至是单个静态图片文件。这为用户提供了灵活性,可以根据实际需求和情况选择最合适的输入方式。
  3. 确定输入源之后,系统通过内置的媒体处理器开始读取和配置数据流。如果用户选择了摄像头作为输入源,系统会自动配置摄像头并开始捕捉图像;如果选择了视频文件或静态图片,则会进行相应的加载处理。
  4. 一旦媒体输入源准备就绪,系统进入到连续帧处理的循环阶段。在预处理阶段,系统会对每一帧图像进行一系列的标准化处理,以确保图像数据满足YOLO模型的输入要求。这通常包括调整图像大小、转换色彩空间和归一化像素值等操作。
  5. 接下来,在检测与识别阶段,预处理后的图像被送入训练有素的YOLOv8模型。模型快速地分析图像,检测其中的目标,并以边界框标记出它们的位置。模型同样能识别并分类目标的类别,例如不同种类的海洋生物。随着检测结果的生成,界面将实时更新,向用户展示检测到的目标和它们的类别标签。这些信息可能以图形界面中的边界框、标签甚至是统计图表的形式呈现,为用户提供即时反馈。
  6. 此外,用户界面还提供了交互操作的功能,用户可以执行诸如保存检测结果、查询程序信息以及利用界面工具进行结果筛选和深入分析的操作。这些功能极大地提高了系统的用户交互性和使用便利性。
  7. 最后,系统还允许用户控制媒体流的播放状态,例如启动或停止摄像头捕捉、视频播放或是静止图像的分析。这为用户提供了对检测过程的完全控制,可以根据需要随时开始或暂停检测任务。

在这里插入图片描述

        整个系统设计旨在提供一个高效率、高准确度的水下目标检测工具,以支持海洋科学研究和相关领域的应用。通过将先进的目标检测技术与用户友好的交互界面相结合,我们的系统为用户提供了一个强大且易于使用的平台,以探索和保护我们蓝色星球的海洋生物多样性。

5.2 登录与账户管理

        在当前的数字化时代,个性化和安全性是任何软件系统的重要组成部分。我们的水下目标检测系统在这两方面都进行了精心设计,以确保用户能够在一个安全的环境中使用该系统,同时也能享受到个性化的体验。

在这里插入图片描述

        在我们的交互式水下目标检测系统中,安全性和用户体验同等重要。为了满足这些需求,系统集成了一个完整的用户登录和账户管理功能,它基于PySide6构建界面,利用SQLite数据库进行数据管理,这提供了一个稳定而可靠的用户数据存储方案。我们的目标是为每个用户提供一个私密且个性化的使用环境,让用户能够在自己的账户中安全地保存、管理检测结果,并调整系统设置以符合个人偏好。

        账户管理系统的设计考虑了用户的不同需求。首先,新用户可以通过简单的注册流程创建自己的账户,过程中可设置用户名、密码以及上传个人头像。为现有用户提供的功能包括密码更新和头像更换,这些都是通过用户友好的界面轻松完成的。如果用户希望注销账户,系统也提供了简单的注销流程。所有这些功能都强调了安全性和简便性,确保用户在使用水下目标检测系统时,其个人信息和结果数据的私密性。

在这里插入图片描述

        登录系统不仅为用户提供了进入主界面的钥匙,而且还是用户开始使用水下目标检测功能的起点。登录后,用户将被引导至主界面,在那里他们可以开始对水下图像进行实时检测。检测过程中,用户可以看到包括边界框、类别标签和置信度在内的实时检测信息。

        此外,系统的多功能性让用户在多种输入模式中选择最适合的一种进行目标检测:支持静态图片、视频文件、实时摄像头捕获,甚至是批量文件输入,这些都可以在主界面中轻松设置和启动。用户的检测结果和记录将被安全地保存在个人账户中,可以随时进行查看和管理。

        综上所述,我们的系统旨在提供一个全面的解决方案,不仅在技术上实现了高效的多物体检测,还在用户服务上提供了全方位的支持。登录和账户管理功能是我们对用户体验重视的体现,它确保用户能够在享受先进水下目标检测技术的同时,拥有一个安全、便捷和个性化的操作环境。通过这些设计,我们期待用户能够更加顺畅和自信地探索海洋世界的奥秘。

下载链接

    若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:

在这里插入图片描述

完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷

演示与介绍视频:https://www.bilibili.com/video/BV1dZ42187Bb/

在这里插入图片描述

    在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,另外有详细安装教程:(1)Pycharm软件安装教程;(2)Anaconda软件安装教程;(3)Python环境配置教程;

离线依赖安装教程:https://www.bilibili.com/video/BV1hv421C7g8/
离线依赖库下载链接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取码:33z5)

6. 总结与展望

        在本博客中,我们详细介绍了一个基于YOLOv8模型的实时水下目标检测系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的水下目标检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。

        该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。


结束语

        由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。


  1. Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎

  2. Li C, Li L, Jiang H, et al. YOLOv6: A single-stage object detection framework for industrial applications[J]. arXiv preprint arXiv:2209.02976, 2022. ↩︎

  3. Wang C Y, Bochkovskiy A, Liao H Y M. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 7464-7475. ↩︎

  4. Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎

  5. Wu W, Liu H, Li L, et al. Application of local fully Convolutional Neural Network combined with YOLO v5 algorithm in small target detection of remote sensing image[J]. PloS one, 2021, 16(10): e0259283. ↩︎

举报

相关推荐

0 条评论