基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的海洋动物检测系统(Python+PySide6界面+训练代码)

摘要:开发海洋动物检测系统对于海洋生态环境监控具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个海洋动物检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7YOLOv6YOLOv5,展示了不同模型间的性能指标,如mAPF1 Score等。文章深入解释了YOLOv8的原理,提供了相应的Python代码训练数据集,并集成了一个基于PySide6的界面。

系统能够精准检测和分类海洋动物,支持通过图片图片文件夹视频文件摄像头进行检测,包含柱状图分析标记框类别类别统计、可调ConfIOU参数结果可视化等功能。还设计了基于SQLite的用户管理界面,支持模型切换UI自定义。本文旨在为深度学习初学者提供实用指导,代码和数据集见文末。本文结构如下:

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


演示与介绍视频:https://www.bilibili.com/video/BV1dj421Z7s1/
YOLOv8/v7/v6/v5项目合集https://mbd.pub/o/bread/ZZyUmppw
YOLOv8/v5项目完整资源https://mbd.pub/o/bread/ZZuclJ9t
YOLOv7项目完整资源https://mbd.pub/o/bread/ZZucm5tq
YOLOv6项目完整资源https://mbd.pub/o/bread/ZZyUlpdy


前言

        在当今世界,海洋生态系统的健康与平衡对全球生物多样性和人类社会具有极其重要的意义。海洋生物,尤其是海洋动物,是维持海洋生态系统平衡的关键因素,它们不仅促进了海洋资源的循环和更新,也是人类食物链中不可或缺的一部分。然而,由于人类活动的影响和自然环境的变化,海洋生物面临着前所未有的威胁,包括生态环境的破坏、物种数量的减少等问题,这些问题的存在严重阻碍了海洋生态系统的健康发展和可持续性。

        在这样的背景下,海洋动物检测系统的研究和开发显得尤为重要。通过高效准确地监测和识别海洋动物种类和数量,可以为生物多样性保护、海洋生态环境监控、可持续渔业管理等提供科学依据和技术支持。随着人工智能和计算机视觉技术的飞速发展,尤其是深度学习算法的应用,基于YOLO(You Only Look Once)系列模型的海洋动物检测技术已成为研究的热点。YOLO[1]模型以其高效的检测速度和较高的准确率,在实时图像识别和视频流分析中表现出色,特别是最新的YOLOv8[2]、YOLOv7[3]、YOLOv6[4]以及YOLOv5[5]等版本,通过算法优化和结构改进,进一步提升了检测性能和泛化能力。

        Mask R-CNN作为一种实例分割框架,也被成功应用于海洋动物的精确检测和分割中。通过在Faster R-CNN的基础上增加一个并行的分割分支,Mask R-CNN不仅能够识别图像中的海洋动物,还能为每个检测到的实例生成高质量的分割掩码。这对于进一步的生物量估计和种群分析特别有价值。研究表明,Mask R-CNN在多个海洋动物数据集上都实现了优异的检测和分割性能。

        在探索新架构方面,一些研究提出了基于图卷积网络(GCN)的方法,用于识别和分类图像中的海洋动物社群。这种方法通过建模动物之间的关系,有效地提升了对群体行为的识别能力。这对于理解海洋动物的社交行为和迁徙模式具有重要意义。

        尽管如此,当前海洋动物检测系统在面对复杂多变的海洋环境时仍面临着巨大挑战,如水下光照变化大、视线受阻、动物种类多样性高等问题,这些都对检测系统的准确性和泛化能力提出了更高要求。此外,数据集的获取和标注难度、算法的计算效率和资源消耗等,也是亟待解决的技术难题。

        本博客的核心工作在于基于最先进的YOLOv8算法构建了一个先进的海洋动物检测系统。通过细致地介绍算法原理、展示系统界面、提供代码实现,并分享开发过程,本文旨在为读者提供一份全面的指南,以促进海洋动物检测技术的研究和应用。本文的主要贡献总结如下:

  1. 采用先进的YOLOv8算法:我们不仅采用了最新的YOLOv8算法来构建海洋动物检测系统,还详细比较了YOLOv8与其前身YOLOv7[3:1]、YOLOv6[4:1]、YOLOv5等算法在效率和精准度方面的性能。本文展示了YOLOv8在处理复杂海洋环境中的优势,为海洋动物检测提供了一种更高效、更准确的技术方案。
  2. 利用PySide6实现友好的用户界面:通过使用Python的PySide6库,本文开发了一个界面友好、操作便捷的海洋动物检测系统。该系统不仅易于使用,还提升了用户与算法交互的效率,有效促进了YOLOv8算法在实际应用中的普及和应用。
  3. 包含登录管理功能:引入登录管理功能,增强了系统的安全性和可管理性。这一设计不仅保护了用户和数据的安全,还为将来引入更多个性化和高级功能奠定了基础。
  4. 对YOLOv8模型进行深入研究:本文不仅介绍了YOLOv8算法的应用,还深入探讨了其性能,包括精确度、召回率等关键指标的评估,以及模型在不同环境和条件下的表现分析。这为进一步优化和改进YOLOv8算法提供了宝贵的数据和见解。
  5. 提供完整的数据集和代码资源包:为了便于读者理解、学习和应用YOLOv8算法,本文提供了一套完整的数据集和代码资源包。这些资源使得读者可以直接复现研究结果,并在此基础上进行自己的研究和开发,大大降低了研究的门槛,并促进了技术的传播和应用。

1.数据集介绍

        在本博客中,我们将深入探讨本研究使用的海洋动物检测数据集。这一数据集由4670张图像组成,具体而言,包括4480张用于训练的图像,127张用于验证的图像,以及63张用于测试的图像。这个数据集为基于YOLOv8算法的海洋动物检测系统提供了一个全面的训练和评估平台。

        数据集的图像涵盖了多种海洋生物,如鱼类、水母、企鹅、海豚、鲨鱼、海星和黄貂鱼,每一类别的实例都被精确标注以确保训练过程的准确性。图像中的海洋动物被标记以边界框的形式,其中每个边界框都与其对应的类别标签相关联。这些标签不仅对于监督学习算法来说至关重要,而且它们的准确性直接影响到模型在实际应用中的表现。

        然而,数据集的类别分布并不均匀。从数据集的类别分布图可以看出,'鱼类'的样本数量占据绝对优势,而其他类别如'海星'和'黄貂鱼'的样本相对较少。这种分布倾斜可能导致模型训练时的偏差,使得模型对数量较多的类别过于敏感,而忽略了那些较少见的类别。为了解决这一问题,可能需要采取数据层面的策略,比如重新采样或是利用成本敏感的学习方法,以确保所有类别在模型训练中得到公平对待。

        在数据预处理和增强阶段,我们采取了一系列措施以提高模型的泛化能力。图像在送入模型前被统一调整至640x640像素的分辨率,采用了拉伸的方式。此外,为了增加数据的多样性和模型的鲁棒性,我们对图像进行了50%概率的水平翻转和随机旋转(-15到+15度)。这些步骤的目的是模拟真实世界中动物可能出现的各种情况,包括不同的方向和姿态。

        对于目标的空间分布,大多数标注的目标集中在图像的中央区域。这一点对于训练过程至关重要,因为它意味着模型可能在检测图像边缘区域的目标时性能不佳。因此,在模型设计时,我们可能需要特别注意这一点,以确保模型在整个图像域内都具有良好的检测能力。

        目标大小的分布也显示了数据集的另一个特点。大部分目标尺寸较小,这对目标检测算法来说是一大挑战。小目标的检测通常需要模型能够从有限的像素中提取足够的信息,这要求算法具有高度的精细化能力。这也提醒我们在设计模型时需要关注小目标检测的性能,可能需要通过特定的网络架构或是损失函数来提升模型对小目标的识别能力。此外,博主使用的类别代码如下:

Chinese_name = {'fish': '鱼', 'jellyfish': '水母', 'penguin': '企鹅', 'puffin': '海雀', 'shark': '鲨鱼', 
'starfish': '海星', 'stingray': '黄貂鱼'}

        综上所述,本研究提供的数据集不仅丰富了海洋动物检测的数据资源,也为如何构建和评估一个高效的海洋动物检测系统提供了实际的案例和有力的证据。

2. 系统界面效果

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

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

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

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

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


3. YOLOv8算法原理

        YOLOv8代表着YOLO系列目标检测算法的最新进展,它融合了一系列创新的技术改进,旨在提升目标检测的准确性、速度与可靠性。YOLOv8延续了YOLO系列的设计哲学,即在单次网络前向传播中完成目标的检测,确保了检测速度的同时,也提升了检测的准确性。

        在架构上,YOLOv8对模型的骨干网进行了改进,采用了名为CSP(Cross Stage Partial networks)的结构与Darknet53网络结构相结合。CSP结构通过部分跨阶段连接来提高网络学习能力同时减少计算量,而Darknet53则被用于提升特征提取的能力。这种结构的设计优化了特征传递,减少了计算复杂度,同时保留了网络的深度和复杂性,以便更好地从图像中提取有用的特征。

        YOLOv8引入了一种新的损失函数——Distribution Focal Loss,它旨在解决目标检测中的类别不平衡问题。通过调整对不同类别检测难度的惩罚力度,Distribution Focal Loss能够使模型在训练过程中对少数类别给予更多关注。这种损失函数不仅提高了对小样本类别的检测准确率,还减轻了模型在面对不同大小物体时的偏差,提高了检测的鲁棒性。

        在训练过程中,YOLOv8的一个关键技术是引入了TaskAlignedAssigner,这是一种负责为每个预测框分配最合适的真实标签的机制。这一机制的引入,使得YOLOv8能够更加精确地匹配预测框和真实标签,从而降低了模型在训练过程中的学习难度,提高了训练的效率。此外,YOLOv8还采用了一种名为"SimOTA"的标签分配策略,进一步优化了模型在面对不同尺寸物体时的检测性能,提高了整体的检测精度。

        YOLOv8的另一个重要特性是其自适应的锚框策略。传统的YOLO模型需要人为设定锚框的尺寸,这在一定程度上限制了模型的通用性。YOLOv8则通过自适应锚框机制,使模型能够根据数据集自动优化锚框的大小和比例。这意味着YOLOv8能够更好地适应不同的数据集,从而提高模型在各种场景下的检测效果。

        通过这些技术创新,YOLOv8在目标检测的准确性、速度和鲁棒性上均实现了显著的提升。这些改进不仅使YOLOv8在处理复杂场景和多样化目标时表现出色,还为未来的算法迭代和优化奠定了坚实的基础。


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/test.png")
image = cv_imread(img_path) 

        在读取了图像文件之后,就可以使用加载的模型对图像进行预测了。下图为预测结果。

pred, superimposed_img = model.predict(pre_img)

4.2 模型训练

        这里我们开始训练和测试自己的数据集,在cmd终端或pycharm中运行run_train_model.py进行训练,以下是训练过程中的结果截图。YOLOv8的损失函数是其性能的关键部分,它指导模型学习如何准确地检测和分类对象。以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:

超参数 设置 说明
学习率(lr0 0.01 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。
学习率衰减(lrf 0.01 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。
动量(momentum 0.937 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。
权重衰减(weight_decay 0.0005 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。
热身训练周期(warmup_epochs 3.0 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。
批量大小(batch 16 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。
输入图像大小(imgsz 640 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。

        在本部分博客中,我们将探讨如何使用Python编程语言,结合PyTorch框架和Ultralytics YOLO库,来训练一个深度学习模型,专门用于海洋动物的检测任务。我们的目标是创建一个能够准确识别和定位图像中海洋生物的模型。这个过程涉及到数据预处理、模型加载、参数设置和模型训练等多个步骤。

        我们首先导入操作系统模块、PyTorch深度学习框架以及YAML文件处理模块。ultralytics是YOLO模型的Python实现库,QtFusion是用于处理文件路径的工具库。abs_path函数用于获取文件的绝对路径,确保无论代码运行在任何目录下都能正确找到数据集和权重文件。接着,我们设置训练运行的设备,自动检测是否有可用的CUDA设备,如果没有,则使用CPU。

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"

        然后,我们构造数据集配置文件的路径,使用abs_path函数将相对路径转换为绝对路径。这样做可以避免因当前工作目录不同而导致的路径错误。同时,将路径转换为UNIX风格,这是因为不同操作系统中的文件路径分隔符可能不同,UNIX风格的路径具有更好的兼容性。

workers = 1
batch = 8

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

        紧接着,我们打开了YAML配置文件,这个文件描述了数据集的结构,包括训练和验证图像的路径、类别等信息。yaml.load函数负责解析这个文件。

# 获取目录路径
directory_path = os.path.dirname(unix_style_path)
# 读取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模型,准备用于检测任务。YOLO类是Ultralytics库提供的,它封装了模型的加载和训练等复杂操作。.pt文件是PyTorch模型的权重文件。

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模型进行深度学习训练,特别是在海洋动物检测这一实际应用领域。

        在深度学习模型的训练过程中,损失函数和评价指标的分析是至关重要的。通过观察这些图像,我们可以了解模型在训练过程中的表现及其对数据的学习效果。下面,我们将对YOLOv8模型在训练时的损失函数图像进行详细分析。

        训练损失和验证损失的曲线表明,随着训练的进行,所有类型的损失都稳定下降,这表明模型在逐渐改进其对海洋动物检测的预测能力。理想情况下,我们希望这些损失值随着时间的推移趋于零,但实际上,由于模型复杂性和数据的限制,损失将在某个点收敛到一个非零值。

        具体来看,框损失(box_loss)代表模型对目标定位的准确性,训练和验证的框损失都呈现出了稳定的下降趋势,显示出模型在识别目标位置方面的持续改进。分类损失(cls_loss)反映了模型对不同海洋生物类别的识别能力,这个指标的下降表明模型在区分不同海洋生物方面越来越精准。目标损失(dfI_loss)是一个综合的指标,它结合了检测任务中目标存在与否的判断准确性,这个值的下降意味着模型在判断图像中是否存在目标对象方面的性能提升。

        准确率表示检测到的正类别中实际为正类别的比例,而召回率表示实际为正类别中被检测到的比例。从图中可以看出,训练过程中这两个指标在波动中缓慢提高,说明模型在避免错误检测和漏检方面都有所进步。特别是,mAP(尤其是mAP50和mAP50-95)是衡量检测模型性能的重要指标,它们考虑了不同置信度阈值下的准确率和召回率。mAP的提高显示了模型整体检测性能的增强,尤其是在mAP50-95,即更严格的IoU(交并比)阈值下,模型也展示了良好的检测效果。

        F1分数是准确率和召回率的调和平均值,它在统计模型的精确性和健壮性方面提供了一个平衡的视角。通过观察模型在各个置信度阈值下的F1分数,我们能够更全面地理解模型的性能。

         从图中我们可以看到,曲线图上展示了多个类别,包括鱼类、水母、企鹅、海豚、鲨鱼、海星和黄貂鱼,以及所有类别的综合F1分数。F1分数的最大值给出了模型在特定置信度阈值下的最优性能表现,而整个曲线的走势则揭示了模型在不同阈值下的稳定性和可靠性。

         进一步观察,不同的类别在不同的置信度阈值下有着不同的F1分数表现。例如,对于鱼类和水母,模型表现出相对较高的F1分数,意味着模型在这些类别上具有较好的识别精度和召回能力。相反,一些类别如企鹅和海豚的F1分数则相对较低,这可能是由于这些类别的样本数量较少。

         整体F1分数曲线在置信度阈值约0.5时达到0.75的高点,这表示当模型输出的置信度超过50%时,模型对于所有类别的整体检测效果是较为优秀的。然而,随着置信度阈值的增加,F1分数总体呈下降趋势,这是因为更高的阈值意味着更严格的预测标准,导致召回率下降。通过分析这些曲线,我们可以得出结论,模型在多数类别上都表现出了较好的性能,尤其是在中等置信度阈值下。但对于一些特定类别,可能需要进一步调整模型,或者采取针对性的数据增强策略来提高其F1分数。

4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比

(1)实验设计

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

模型 图像大小 (像素) mAPval 50-95 CPU ONNX 速度 (毫秒) A100 TensorRT 速度 (毫秒) 参数数量 (百万) FLOPs (十亿)
YOLOv5nu 640 34.3 73.6 1.06 2.6 7.7
YOLOv8n 640 37.3 80.4 0.99 3.2 8.7
YOLOv6N 640 37.5 - - 4.7 11.4
YOLOv7-tiny 640 37.4 - - 6.01 13.1

(2)度量指标

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

(3)实验结果分析

        在本次对比分析中,我们关注的是在相同数据集上,YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n这四个版本的性能对比。通过对两个关键性能指标——mAP和F1-Score的观察,我们可以获得每个版本在海洋动物检测任务上的性能表现。

        从实验结果来看,YOLOv6n在mAP上达到了0.779,显示出四种算法中最优的性能。紧随其后的是YOLOv8n,其mAP为0.765,略高于YOLOv5nu的0.756。YOLOv7-tiny的mAP为0.719,是四者中最低的。mAP作为目标检测模型性能的综合评估指标,反映了模型在不同置信度阈值下的平均准确率。YOLOv6n的领先表明,在检测任务中,该版本的模型能够更加精准地定位并分类海洋动物,提供了更可靠的预测。

        在F1分数方面,YOLOv6n同样表现最好,达到了0.77,紧随其后的是YOLOv8n,达到了0.75。YOLOv5nu的F1分数为0.74,而YOLOv7-tiny则是0.71。F1分数是准确率和召回率的调和平均,它提供了关于模型性能的平衡视角。较高的F1分数意味着模型在保持较高召回率的同时也具有较高的准确性,这对于实际应用尤其重要。在这一指标上,YOLOv6n和YOLOv8n的表现更为均衡,能够在减少误检的同时,尽可能多地捕获正确的目标。

        综合这两个指标,我们可以看到YOLOv6n在我们的实验中总体上具有最强的性能,YOLOv8n紧随其后,而YOLOv5nu和YOLOv7-tiny略显逊色。值得注意的是,虽然YOLOv7-tiny在这两个指标上表现最差,但作为一种轻量级模型,它在需要较小模型大小和较快速度的场景下仍然有其应用价值。

        通过这些数据的对比分析,我们可以得出结论,尽管每个YOLO版本都有其独特的特点和适用场景,但在海洋动物检测任务上,YOLOv6n和YOLOv8n提供了更为优越的性能。这样的对比不仅帮助我们理解了不同版本YOLO算法的能力,也为选择合适的模型提供了数据支持。在未来的工作中,我们可以根据具体应用需求,选择合适的YOLO版本,以实现最佳的检测效果。

4.4 代码实现

        在本篇博客文章中,我们将探讨如何使用YOLOv8模型和QtFusion框架来构建一个实时的海洋动物检测系统。这个系统能够通过摄像头捕捉图像,并使用深度学习模型识别图像中的海洋生物。我们将详细介绍如何从设置项目环境到实时处理和显示检测结果的每一步。

(1)导入必要的模块和配置
       首先,我们需要导入一系列模块和库来构建我们的应用程序。sys模块使我们能够与Python解释器进行交互,time模块用于记录操作时间,cv2即OpenCV库,是进行图像处理的强大工具。通过QtWidgets和QtCore模块,我们能够使用PySide6创建图形用户界面。我们还引入了YOLOv8Detector类,它是我们用于检测图像中对象的主要工具。QtFusion相关的导入项则是为了构建GUI和处理媒体流。

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类,用于物体检测
from datasets.MarineDataset.label_name import Label_list

QF_Config.set_verbose(False)

(2)创建主窗口
        这段代码中定义了MainWindow类,它继承自QtFusion的QMainWindow。在初始化方法中,我们设定了窗口的大小,并创建了一个标签来显示视频流。同时,我们还定义了一个键盘事件处理函数,当按下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函数,它是实时处理每帧图像的核心。在这个函数中,我们首先调整图像大小,然后使用预加载的YOLOv8模型进行物体检测。该函数还负责测量处理时间并打印,以及使用drawRectBox函数绘制检测到的对象。

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

    t1 = time.time()  # 获取当前时间
    pred, superimposed_img = 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)海洋动物检测

        在这部分代码中,我们初始化了YOLOv8检测器,并加载了训练好的权重。这些权重文件包含了模型训练的结果,它是模型识别新图像的基础。我们还为每个可能检测到的类别定义了颜色,以便在最终的输出中以直观的方式展示检测结果。最后,我们创建了一个Qt应用程序实例并设置了主窗口。MediaHandler对象用于控制视频流,我们设置它以每秒30帧的速率捕获视频帧,并将每帧送入frame_process函数进行处理。程序执行后,视频流将在主窗口的标签上实时显示,用户可以通过按下Q键退出程序。

cls_name = Label_list   # 定义类名列表

model = YOLOv8Detector()  # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-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 系统设计思路

        我们的系统设计采用了三层架构模式,以确保各个组件的高内聚性和低耦合性。在这个模型中,每一层都有其独特的职责和作用,协同工作以提供一个完整的解决方案。
(1)架构设计
        处理层主要负责后端的计算任务,包括图像的预处理、模型的推理和后处理。通过使用YOLOv8Detector类,我们可以利用先进的深度学习模型来分析视频流或图像,并识别出其中的海洋动物。这一层的设计考虑了计算效率和准确性,以确保系统能够快速响应并提供可靠的检测结果。

        界面层则关注于用户交互,我们通过设计清晰直观的用户界面来简化用户操作。界面中嵌入了实时视频显示窗口、检测结果展示区域,以及必要的控制按钮,如开始、暂停检测等。用户可以通过这些界面元素与系统互动,实时观看检测结果,并对检测过程进行控制。这一层的目的是降低用户的使用难度,提供愉悦的用户体验。

        控制层作为桥梁,负责协调界面层和处理层的交互。MainWindow类的槽函数和其他方法响应用户的输入,控制视频流的处理和视觉结果的更新。这一层确保了用户操作的直接响应,并且将用户的指令转化为对模型和媒体处理器的控制命令。

        综上所述,我们的系统设计着重于功能的整合与用户体验的优化。通过这种层次分明、各司其职的架构,我们的海洋动物检测系统不仅能够以高精度识别海洋生物,而且提供了易于操作的用户界面,使得科研工作者和爱好者都能轻松地进行海洋生物的观察和研究。这种设计思路的实施,使得我们的系统既能满足专业的研究需求,也能为广大用户提供教育和科普的价值。

(2)系统流程

        在本博客中,我们将详细探讨交互式海洋动物检测系统的整体工作流程和用户交互体验。该系统以MainWindow类为核心,通过精心设计的用户界面和背后强大的图像处理及机器学习模型,提供了一种创新的海洋动物监测方案。

  1. 用户首先启动应用程序,随即系统会实例化MainWindow类,这个类是整个应用程序的核心,它初始化用户界面并设置了操作的起始环境。用户在启动界面中会看到一个干净、直观的布局,其中包含了选择输入源的选项,无论是实时视频流、已录制的视频文件还是静态图像文件,用户都能轻松选择并加载。

  2. 选择并确认输入源后,系统激活媒体处理器,开始对输入数据进行处理。这一步骤对于不同的媒体类型有着不同的处理方式,比如摄像头输入需要配置捕捉参数,视频文件则需要按帧读取,静态图像则直接加载到内存中。处理器配置完成后,应用程序进入一个连续的循环,对每一帧图像进行处理。

  3. 这一连续帧处理循环是系统核心功能的体现,它由几个关键步骤组成。在预处理阶段,系统对输入的每一帧图像进行调整和标准化,以满足深度学习模型的输入需求。这确保了图像数据能够被模型正确解读。随后,这些经过预处理的图像被送入我们的YOLOv8模型,模型快速准确地检测出图像中的海洋生物,并识别出它们的类别。

  4. 模型的检测结果不仅实时地在界面上以检测框的形式展示出来,还以标注信息呈现,例如具体的海洋生物类别。此外,应用程序的界面会同步更新,展示相关的统计数据和图表,增强用户对检测结果的理解和分析能力。

  5. 用户界面的交互设计让用户能够实施一系列操作,如保存当前的检测情况,查阅帮助信息,或是通过筛选工具专注于特定类别的生物。同时,媒体控制功能允许用户根据需要开始或暂停媒体流,这为用户提供了更多的灵活性和控制权。

        整体来看,我们的系统设计旨在提供一个强大而直观的工具,让用户能够在一个友好的环境中探索海洋生物的世界,并利用最新的深度学习技术获得高质量的检测结果。这样的设计不仅适用于专业的研究环境,也适合教育和公众科普,提供一个互动、教育和科研并重的平台。

5.2 登录与账户管理

        在我们开发的海洋动物检测系统中,我们充分考虑了用户管理和个性化体验的重要性。因此,我们不仅仅是提供了一个高效的生物识别平台,还为用户提供了一套完整的账户管理系统。这个系统基于功能强大的PySide6框架和稳定可靠的SQLite数据库构建,旨在为用户提供一个安全和私密的操作环境。

        从首次接触系统开始,用户就会遇到一个设计精良的登录界面。在这里,新用户可以注册账户,而已注册的用户可以通过输入用户名和密码登录。账户注册过程简单直观,用户可以自定义头像,设置个人密码,从而创建一个属于自己的账户空间。一旦登录成功,用户便可以访问主界面,开始使用海洋动物检测功能。此外,我们深知用户隐私和安全的重要性,因此,系统还允许用户随时修改密码,以确保账户安全。

        用户个性化的设置不仅限于登录时的头像和密码。在使用海洋动物检测系统时,用户能够保存和管理自己的检测结果,这包括检测框、类别标签和置信度评分等。系统设计了直观的用户界面,使得用户可以轻松导入和操作图像、视频文件,甚至是实时摄像头的输入流。无论是进行单张图片的检测,还是处理视频文件和摄像头捕获的连续帧,用户都能够获得实时的识别反馈,并能够将这些信息保存下来,供后续的分析和研究使用。

        此外,我们系统的另一个亮点是,用户在需要暂时离开时,可以选择注销账户,保护自己的操作隐私。而当再次返回系统时,可以通过重新登录恢复到自己的个人设置和历史记录。这些细节上的考量,使得我们的系统不仅能够满足用户在实时目标检测场景下的技术需求,同时也提供了良好的个性化体验和数据管理功能。

        总的来说,我们的海洋动物检测系统是一个技术与用户体验并重的解决方案。通过集成的用户账户管理功能,我们为用户提供了一个个性化、安全且高效的工作环境,使他们能够更专注于海洋生物的研究和观察。这种全面的设计思考,不仅极大地提升了用户的使用满意度,也为系统的广泛应用和推广打下了坚实的基础。

下载链接

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

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

演示与介绍视频:https://www.bilibili.com/video/BV1dj421Z7s1/
YOLOv8/v7/v6/v5项目合集https://mbd.pub/o/bread/ZZyUmppw
YOLOv8/v5项目完整资源https://mbd.pub/o/bread/ZZuclJ9t
YOLOv7项目完整资源https://mbd.pub/o/bread/ZZucm5tq
YOLOv6项目完整资源https://mbd.pub/o/bread/ZZyUlpdy

    在文件夹下的资源显示如下,下面的链接中也给出了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模型的海洋动物检测系统,还实验了YOLOv7、YOLOv6、YOLOv5等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的海洋动物检测结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。

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


结束语

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


  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. Talaat F M, ZainEldin H. An improved fire detection approach based on YOLO-v8 for smart cities[J]. Neural Computing and Applications, 2023, 35(28): 20939-20954. ↩︎

  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. . 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. ↩︎ ↩︎

  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. ↩︎

posted @ 2024-03-15 21:13  思绪无限  阅读(172)  评论(0编辑  收藏  举报