基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的火焰检测系统(Python+PySide6界面+训练代码)

news2024/11/27 0:40:49

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

文章目录

  • 前言
  • 1. 数据集介绍
  • 2. 系统界面效果
  • 3. YOLOv8算法原理
  • 4. 代码简介
    • 4.1 模型预测
    • 4.2 模型训练
    • 4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
    • 4.4 代码实现
  • 5. 火焰检测系统实现
    • 5.1 系统设计思路
    • 5.2 登录与账户管理
  • 下载链接
  • 6. 总结与展望
  • 结束语

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

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


前言

        在当今社会,随着工业化和城市化进程的加速,火灾安全成为了一个不容忽视的问题。火焰检测系统作为预防和应对火灾的重要手段之一,其研究和发展受到了全球安全领域研究者的广泛关注。传统的火焰检测方法,如烟雾探测和温度监测,虽然在一定程度上有效,但在快速识别和准确定位火源方面存在局限性。近年来,随着人工智能和计算机视觉技术的快速发展,基于深度学习的火焰检测技术成为研究的热点。

在这里插入图片描述

        在深度学习领域,YOLO1(You Only Look Once)算法因其高效的目标检测能力而广受关注。自从YOLOv1的提出以来,该算法已经经历了多次迭代更新,每一个版本都在检测速度和准确性上有所提升。特别是近期发布的YOLOv82,它在保持高速度检测的同时,进一步提高了对小目标的识别能力和在复杂背景下的鲁棒性,使其成为火焰检测等实时性要求高的应用场景中的首选算法。

        研究表明,通过对YOLO算法的持续优化和改进,结合火焰特有的色彩、形态和动态特征,可以显著提高火焰检测的准确率和响应速度。例如,一些研究通过引入注意力机制和多尺度检测策略,有效提升了模型对复杂环境中火焰的识别能力。此外,随着数据集的不断丰富和更新,模型训练的效果也得到了显著提升。公开的火焰检测数据集,如FFD(Fire Flame Dataset),为研究人员提供了大量的火焰图像和视频,有助于训练更为准确和鲁棒的检测模型。

        随着Transformer模型在图像处理领域的广泛应用,一些最新的研究开始探索将其用于火焰检测。这些研究通过利用Transformer的自注意力机制来捕获图像中的全局依赖关系,以提高火焰检测的准确性。相比于传统的CNN模型,基于Transformer的火焰检测模型在处理大场景下的火焰检测时,展现出更好的性能。

        由于高质量火焰图像数据集的稀缺,一些研究采用生成对抗网络(GANs)进行数据增强,以生成逼真的火焰图像。这些生成的图像被用于训练深度学习模型,有助于提升模型的泛化能力和检测性能。通过这种方法,研究者成功地解决了数据不足的问题,并在多个火焰检测任务中取得了优异的结果。

        然而,尽管基于YOLO的火焰检测技术已取得显著进展,但仍面临着一些技术挑战,如在极端光照条件下的检测准确性、跨场景的泛化能力、以及实时性与准确性的平衡等问题。为了应对这些挑战,研究者们正在探索更为先进的深度学习模型,如Transformer和GANs(生成对抗网络),以进一步提升火焰检测的性能。

        本博客所做的工作是基于YOLOv8算法构建一个火焰检测系统,展示系统的界面效果,详细阐述其算法原理,提供代码实现,以及分享该系统的实现过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:

  1. 采用最先进的YOLOv8算法进行火焰检测:本文不仅介绍了基于YOLOv8算法的火焰检测系统的构建过程,而且还详细比较了YOLOv73、YOLOv64、YOLOv55等早期版本的性能差异。这不仅展示了YOLOv8在火焰检测方面的卓越性能,也为研究者和从业者提供了新的研究方向和实践方法。
  2. 利用PySide6实现用户友好的火焰检测系统:本文利用Python的PySide6库开发了一个用户友好的火焰检测系统界面,使用户能够以更直观和便捷的方式进行火焰检测。这一贡献不仅推动了YOLOv8算法的实际应用,也促进了火焰检测技术的普及和实用化。
  3. 集成登录管理功能,提升系统安全性:通过设计登录管理功能,本系统增强了使用的安全性,并为将来集成更多个性化功能铺垫了基础。这一创新不仅提升了系统的专业性和实用性,也体现了对用户体验的深入考量。
  4. 对YOLOv8模型进行深入研究和性能评估:本文对YOLOv8算法的性能进行了全面的研究,包括精确度、召回率等关键性能指标的评估,以及在不同环境和条件下的表现分析。这些研究成果为深入理解YOLOv8算法的性能特点和应用潜力提供了坚实的理论基础。
  5. 提供完整的数据集和代码资源包:为了便于读者更好地理解和应用YOLOv8及其前版本在火焰检测中的实践操作,本文提供了一套完整的数据集和代码资源包。这些资源不仅使读者能够直接复现文中的实验结果,也为进一步的研究和开发奠定了基础。

1. 数据集介绍

        在本篇博客中,我们将深入探讨我们为火焰检测任务精心准备的数据集。这个数据集是模型训练的基石,决定了火焰检测系统的性能和可靠性。我们的数据集包含了3893张图像,其中2725张用于训练,780张用于验证,以及388张用于测试。这样的划分确保了模型在学习阶段有足够的数据量来把握火焰的各种特征,并且在验证和测试阶段能够公正地评估模型性能。

在这里插入图片描述

        数据集中的图像不仅场景多样,包括室内外各种环境,而且在光照条件、火焰大小和形状上也展现出多样性。每张图像中的火焰都被精确地用红色边界框标注,这对于训练模型识别火焰的位置和尺寸至关重要。图像的这些特点使得我们的数据集能够支持模型学习并适应真实世界的复杂性和不可预测性。

        在数据预处理方面,我们实施了一系列标准化步骤,以确保模型接收到的输入具有一致性。我们自动校正了图像的方向,并去除了EXIF方向信息,这避免了因不同设备而导致的图像方向不一致的问题。同时,所有的图像都被重新调整为640x640像素的尺寸,采用拉伸方式以适配模型的输入要求,尽管这可能会改变某些图像的宽高比,但为了保持输入尺寸的统一性,这一步骤是必要的。

在这里插入图片描述

        通过分析数据集中目标的分布情况,我们发现了一些关键的特征。边界框主要集中在图像的中心区域,表明火焰通常出现在中心位置。这提醒我们,在设计目标检测模型时,应特别关注图像的中心区域。同时,边界框的宽高比分布表明火焰的形态多种多样,提示我们模型需要能够检测到各种尺寸的火焰。博主使用的类别代码如下:

Chinese_name = {'fire': "火焰"}

        此外,我们的数据集的设计考虑到了模型的实际应用需求。由于火焰检测系统通常用于实时监控,因此数据集中包含的多样化场景可以帮助模型适应不同的监控环境。无论是家庭、办公室还是野外,我们的模型都能够准确检测并发出火灾警报。

        综上所述,我们的数据集不仅在数量上充足,更在质量上经过了精心筹备。从自动校正图像方向到调整图像尺寸,每一步都旨在优化模型的训练效果。通过这样的数据集,我们为火焰检测模型提供了一个全面的学习平台,确保了它能够在各种环境下都能准确地识别火焰,使我们的火焰检测系统在实际应用中表现出卓越的性能和高度的可靠性。

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 = "FireDatasets"
data_path = abs_path(f'datasets/{data_name}/{data_name}.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、以及dfI_loss。这些损失函数分别代表了定位损失、分类损失和置信度损失。从图中可以看出,所有损失函数的值都随着训练周期数的增加而减少,这表明模型在学习如何更准确地识别和定位火焰。box_loss衡量的是模型预测的边界框与真实边界框之间的差异。我们观察到训练集和验证集的box_loss都呈下降趋势,并且随着训练的进行,下降速度变得平稳。这意味着模型在定位火焰方面的能力正在逐渐提高,并且在训练后期保持了稳定性。

        cls_loss指的是模型在分类任务上的损失。火焰检测任务可能只包含一个类别“火焰”,但cls_loss的下降表明模型在区分火焰和非火焰图像方面变得越来越准确。我们可以看到cls_loss在训练集上的下降趋势较为显著,这表明模型在训练数据上的分类能力得到了显著提升。

        dfI_loss是关于模型置信度预测的损失,它反映了模型对自己预测的确定性。从图表上可以看出,随着训练的进行,dfI_loss也逐步降低,表明模型在确定检测到的火焰存在的置信度上越来越高。

在这里插入图片描述

        精确度指的是模型预测为火焰并且实际上也是火焰的比例,而召回率是指模型正确识别的火焰与实际火焰总数的比例。mAP(mean Average Precision)则是衡量模型整体性能的综合指标,mAP50指的是在IoU(交并比)为0.5时的平均精确度,而mAP50-95则是在IoU从0.5到0.95的不同阈值下的平均精确度。从曲线图中可以看到,精确度和召回率在经历初期波动后都趋于稳定,并在一个较高的水平上收敛。这表明模型能够以高精度检测出火焰,并且能够检测出大部分的火焰实例。对于mAP50和mAP50-95,两者都表现出了稳步的提升,最终达到了较高的水平,这说明模型在各个IoU阈值下都具有良好的检测性能。

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

在这里插入图片描述

         从曲线图中可以看出,模型的精确度(Precision)随着召回率(Recall)增加而逐渐降低。这是因为随着召回率的提高,模型将更多的实例识别为火焰,包括一些错误的识别,因此精确度有所下降。然而,值得注意的是,该模型在召回率非常高时依然保持了相对较高的精确度,这表明模型具有较好的分类能力和对火焰目标的高检出率。

         图中显示的“fire 0.867”表明在单一火焰类别下的平均精确度为86.7%,而“all classes 0.867 mAP@0.5”则表示所有类别(在本例中可能仅为火焰一类)在IoU阈值为0.5时的平均精确度也是86.7%。这个数值说明模型在辨识火焰目标时表现出了很高的准确性,且在检测过程中保持了较低的误报率。

         PR曲线图中的平滑曲线也显示出模型的稳定性。在PR曲线中,一个理想的模型将有一个向右上方延伸、然后向下弯曲的曲线,这意味着模型在保持较高召回率的同时也能保持较高精确度。我们可以观察到,该曲线在召回率低时精确度接近1,随着召回率增加,精确度缓慢下降,直到接近完全召回时快速下降。这种表现可能意味着模型在大多数情况下能够非常准确地检测到火焰,但在极端情况下,可能会将一些非火焰目标错误地识别为火焰。从实际应用的角度来看,这样的性能表现已经非常出色,因为在火灾检测等关键应用中,较高的召回率意味着能够最大程度地减少漏报,确保安全。

         总结来说,YOLOv8模型在火焰检测任务上展示了优秀的性能。高精确度和高召回率表明模型能够有效地识别出火焰,并且具有较低的误报率。这使得该模型非常适合用于安全监控和火灾预警系统,能够为用户提供及时准确的火灾检测服务。

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.8670.8670.8340.867
F1-Score0.820.840.810.82

(3)实验结果分析

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

        首先观察mAP值,它反映了模型在不同置信度阈值下检测准确性的平均水平。YOLOv5nu、YOLOv6n和YOLOv8n在这一指标上均获得了0.867的相同分数,这表明这三个模型在检测准确性上表现相近,都达到了较高的水平。相比之下,YOLOv7-tiny的mAP得分为0.834,略低于其他三个模型。这可能是因为YOLOv7-tiny作为一个“轻量化”版本,在模型复杂度和检测能力上可能做了妥协。

在这里插入图片描述

        在F1-Score的角度,这个指标结合了精确度和召回率的信息,是衡量模型整体性能的重要标准。从结果来看,YOLOv6n以0.84的得分略高于其他模型,显示出其在平衡检测准确性和全面性方面的微小优势。YOLOv5nu和YOLOv8n的F1-Score均为0.82,表现稳定。YOLOv7-tiny的F1-Score为0.81,与mAP的结果一致,表明其整体性能略逊于其他版本。

        综合考虑这两个指标,我们可以得出结论,YOLOv6n在我们的实验中表现略优,尤其是在保持检测准确性和覆盖度方面达到了较好的平衡。而YOLOv5nu和YOLOv8n的表现也非常接近,都展示了出色的检测性能。尽管YOLOv7-tiny在这些测试中表现稍弱,但作为一个轻量级版本,它仍然是资源受限环境下的一个可行选择。

        这些对比结果对于实际应用中模型的选择提供了有力的参考。在选择模型时,除了考虑性能指标之外,还应考虑模型的运行速度、资源消耗和部署环境。例如,在对响应时间要求极高的实时火焰检测系统中,即使是微小的性能提升也可能非常关键。而在资源有限的设备上,一个稍微性能低一些但更轻量的模型可能更加合适。总之,选择合适的模型需要根据具体的应用场景和性能需求来综合决策。

4.4 代码实现

        在这一节中,我们将深入探讨如何实现一个基于YOLOv8的火焰和烟雾检测系统。这个系统不仅需要准确地识别图像中的火焰和烟雾,还要在用户界面(UI)上实时展示检测结果。为此,我们需要一个强大的后端模型来处理图像数据,同时也需要一个直观的前端界面来显示结果。我们的代码正是为了解决这一需求而编写的。下面,我们将逐一介绍代码的每个组成部分以及它们各自的作用。

(1)引入必要的库
        首先,我们需要一些基础库来支持我们的系统。sys库允许我们与Python解释器进行交互,而time库让我们能够记录处理图像所需的时间。cv2即OpenCV库,是处理图像和视频的强大工具。此外,为了构建用户界面,我们使用了QtWidgets和QtCore模块。YOLOv8Detector类将被用来实现火焰和烟雾的检测。

import sys  # 导入sys模块,用于处理Python运行时环境的一些操作
import time  # 导入time模块,用于处理时间相关的操作
import cv2  # 导入OpenCV库,用于处理图像和视频
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from QtFusion.widgets import QMainWindow  # 从QtFusion库中导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler  # 从QtFusion库中导入MediaHandler类,用于处理媒体数据
from QtFusion.utils import drawRectBox  # 从QtFusion库中导入drawRectBox函数,用于在图像上绘制矩形框
from QtFusion.utils import get_cls_color  # 从QtFusion库中导入get_cls_color函数,用于获取类别颜色
from PySide6 import QtWidgets, QtCore  # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI和处理Qt的核心功能
from YOLOv8Model import YOLOv8Detector  # 从YOLOv8Model模块中导入YOLOv8Detector类,用于进行YOLOv8物体检测
from datasets.FireDatasets.label_name import Label_list

QF_Config.set_verbose(False)

(2)设置主窗口
        构建用户界面(UI)是实现系统的重要一步。我们定义了一个MainWindow类,它继承自Qt的QMainWindow。在这个类中,我们设置了窗口的大小并初始化了一个QLabel,它将用于在UI中显示视频帧。此外,我们还定义了一个事件处理函数,当用户按下’Q’键时,程序将关闭窗口。

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

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

(3)图像帧处理与火焰检测
        接着我们定义了frame_process函数,它的目的是处理由摄像头或视频文件捕获的每一帧图像。这个函数首先将图像大小调整为适合UI显示的尺寸,然后将其传递给预处理函数,接着使用YOLOv8Detector模型进行预测,并计算这一过程所需的时间。我们将这一段时间打印出来,以便用户了解后端处理的效率。之后,我们检查模型的预测结果,并在图像上绘制由模型返回的边界框和标签。

def frame_process(image):  # 定义帧处理函数,用于处理每一帧图像
    image = cv2.resize(image, (640, 640))  # 将图像的大小调整为850x500
    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)初始化检测模型和设备

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

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对象

filename = abs_path("test_media/火焰与烟雾检测.mp4", path_type="current")  # 定义视频文件的路径
videoHandler = MediaHandler(fps=30)  # 创建MediaHandler对象,设置帧率为30fps
videoHandler.frameReady.connect(frame_process)  # 当有新的帧准备好时,调用frame_process函数进行处理
videoHandler.setDevice(filename)  # 设置视频源
videoHandler.startMedia()  # 开始处理媒体

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

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


5. 火焰检测系统实现

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

5.1 系统设计思路

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

在这里插入图片描述

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

  • 处理层(Processing Layer):处理层是系统的核心,由YOLOv8Detector类构成,它包含了预训练的深度学习模型及其相关的图像处理方法。这一层负责接收图像输入,运用先进的算法进行火焰检测,并输出检测结果。我们的模型不仅可以准确识别出火焰,还能够处理各种复杂的背景和环境条件,确保系统的鲁棒性和可靠性。
  • 界面层(UI Layer):界面层是用户与系统交互的前端界面,由Ui_MainWindow类构建而成。它包含了各种交互元素,如实时视频显示窗口、状态指示器、控制按钮等。该层的设计注重用户体验,确保用户可以轻松理解系统状态,便捷地执行操作如启动或停止检测等。
  • 控制层(Control Layer):控制层则是连接界面层和处理层的桥梁,由MainWindow类中的方法和槽函数实现。它响应界面层的用户交互,如按钮点击事件,并据此控制媒体处理器的行为,如开始处理视频流。同时,控制层也会将处理层的检测结果反馈到界面层,使用户能够实时看到检测结果。

        此外,我们的系统设计还巧妙地运用了信号和槽机制,这是Qt框架提供的一种强大的通信方式。它允许系统的不同组件之间进行松耦合的交互和数据传递。例如,当检测到新的火焰时,处理层会发出信号,控制层的槽函数便会被触发,进而在界面层更新显示结果。这种设计大大增强了系统的灵活性和扩展性。

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

  1. 我们的火焰检测系统不仅仅是一个高效能的工具,它还具备了完善的用户账户管理功能。基于PySide6的强大GUI能力和SQLite的轻量级数据库特性,我们为用户提供了一个直观易用的登录界面,这个界面不仅仅包含了账户的注册和登录功能,还包括密码修改、头像设置、账户注销等一系列的个性化设置选项。我们理解每个用户的需求都是独一无二的,因此我们让用户能在各自的账户中保存个人的设置和检测历史记录。
  2. 当用户首次使用我们的系统时,他们会被引导进行简单的注册流程,创建个人账户。账户创建后,用户可以自定义头像,修改密码,甚至在需要时注销账户。这些细节虽小,但极大地增强了用户对系统的掌控感。用户的所有个性化设置和检测结果都会被安全地存储在SQLite数据库中,只有在用户成功登录后才能访问,这保证了用户数据的私密性和安全性。
  3. 一旦完成登录,用户便可以进入主界面进行火焰检测任务。我们的系统支持多种输入方式,包括图片、视频流、实时摄像头捕获以及批量文件处理。无论用户是希望监控实时视频流,还是需要对已有的图像或视频文件进行分析,系统都能提供满意的解决方案。在主界面中,用户不仅能看到实时的检测框和置信度,还能查看每个识别对象的类别。所有这些信息都会实时更新,并可根据用户的需要进行记录和回顾。
  4. 此外,我们的系统设计考虑了扩展性。随着深度学习领域的不断发展,新的模型和算法层出不穷。我们的系统架构允许灵活地导入不同的深度学习模型,以适应未来可能的需求变化。通过不断地更新和升级,我们的火焰检测系统旨在为用户提供长期可靠的服务。

在这里插入图片描述

        总的来说,我们的火焰检测系统集先进的目标检测技术、个性化的用户体验以及高度的安全性与一体。通过这些特性,我们的系统不仅能满足专业用户在实时目标检测场景下的需求,也为普通用户提供了一个易于上手、安全可靠的检测工具。

5.2 登录与账户管理

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

在这里插入图片描述

        我们的火焰检测系统不仅仅是一个高效能的工具,它还具备了完善的用户账户管理功能。基于PySide6的强大GUI能力和SQLite的轻量级数据库特性,我们为用户提供了一个直观易用的登录界面,这个界面不仅仅包含了账户的注册和登录功能,还包括密码修改、头像设置、账户注销等一系列的个性化设置选项。我们理解每个用户的需求都是独一无二的,因此我们让用户能在各自的账户中保存个人的设置和检测历史记录。

        当用户首次使用我们的系统时,他们会被引导进行简单的注册流程,创建个人账户。账户创建后,用户可以自定义头像,修改密码,甚至在需要时注销账户。这些细节虽小,但极大地增强了用户对系统的掌控感。用户的所有个性化设置和检测结果都会被安全地存储在SQLite数据库中,只有在用户成功登录后才能访问,这保证了用户数据的私密性和安全性。

在这里插入图片描述

        一旦完成登录,用户便可以进入主界面进行火焰检测任务。我们的系统支持多种输入方式,包括图片、视频流、实时摄像头捕获以及批量文件处理。无论用户是希望监控实时视频流,还是需要对已有的图像或视频文件进行分析,系统都能提供满意的解决方案。在主界面中,用户不仅能看到实时的检测框和置信度,还能查看每个识别对象的类别。所有这些信息都会实时更新,并可根据用户的需要进行记录和回顾。

        此外,我们的系统设计考虑了扩展性。随着深度学习领域的不断发展,新的模型和算法层出不穷。我们的系统架构允许灵活地导入不同的深度学习模型,以适应未来可能的需求变化。通过不断地更新和升级,我们的火焰检测系统旨在为用户提供长期可靠的服务。

        总的来说,我们的火焰检测系统集先进的目标检测技术、个性化的用户体验以及高度的安全性与一体。通过这些特性,我们的系统不仅能满足专业用户在实时目标检测场景下的需求,也为普通用户提供了一个易于上手、安全可靠的检测工具。这个系统的设计和实现体现了我们对用户需求的深刻理解和对技术创新的持续追求。

下载链接

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

在这里插入图片描述

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

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

在这里插入图片描述

    在文件夹下的资源显示如下,下面的链接中也给出了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. Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1511491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯真题讲解:子矩阵(二维滑动窗口)

蓝桥杯真题讲解&#xff1a;子矩阵&#xff08;二维滑动窗口&#xff09; 一、视频讲解二、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;子矩阵&#xff08;二维滑动窗口&#xff09; 二、正解代码 //二维单调队列 #include<bits/stdc.h> #define endl \n #def…

Midjourney绘图欣赏系列(十一)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

(二)运行自己的stable-diffusion

前面的步骤如https://datawhaler.feishu.cn/docx/BwjzdQPJRonFh8xeiSOcRUI3n8b所示 拷贝、解压文件后&#xff0c;进入到stable-diffusion-webui的文件夹中&#xff0c;文件如下&#xff1a; 启动&#xff1a; 运行效果&#xff1a; 由于生成了好几个图&#xff0c;所以…

布隆过滤器(做筛选器索引)

什么是布隆过滤器 布隆过滤器&#xff08;Bloom Filter&#xff09;是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。 它的优点是空间效率和查询时间都比一般的算法要好的多&#xff0c;缺点是…

学习vue3第四节(ref以及ref相关api)

主要记录以下api&#xff1a;ref()、isRef()、unref()、 shallowRef()、triggerRef()、customRef() 1、ref() 定义 接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value&#xff0c;.value属性用于追踪并且存…

I2C驱动AT24C02

文章目录 一、硬件电路设备地址 二、使用步骤字节写:页写入:任意写:任意读: 一、硬件电路 设备地址 设备需要一个8位的设备地址字&#xff0c;后面跟着一个启动条件&#xff0c;以使芯片能够进行读或写操作 设备地址字由一个强制的1,0序列的前四个最有效的位&#xff0c;如所示…

简单使用国产数据库—达梦

达梦数据库是一款由中国的达梦软件公司开发的关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它在业界以其高性能、可扩展性和安全性而著称。该系统广泛应用于各种应用程序的数据存储和管理&#xff0c;满足用户对于数据处理和管理的多样化需求。 安装好的达梦数…

容联云孙昌勋:聚焦“营销服”数智化转型,构筑金融业增长引擎

在每日经济新闻2024全国两会特别报道中&#xff0c;容联云创始人兼CEO孙昌勋针对“人工智能”在具体行业如何开展时表示&#xff1a;“随着泛金融行业用户渠道与体验发生变化&#xff0c;金融业对营销、销售、服务等场景的数智化改造有巨大的需求&#xff0c;人工智能等科技投入…

Qt/QML编程之路:openglwidget和倒车影像的切换(43)

关于如何实现一个基于OpenGL的3d 图形,这个有很多专门的介绍,我在开发中遇到了这么一个问题: 如何实现一个倒车影像的video显示与一个3D物体显示的切换,因为开窗在同样的一个位置,如果车子倒车启动,则需要将原本显示3D的地方切换为视频图像的显示。 class testOpenGl : …

docker容器镜像管理+compose容器编排(持续更新中)

目录 一、 Docker的基本组成 二、 容器和镜像的关系 2.1 面向对象角度 2.2 从镜像容器角度 三、 容器命令 3.1 使用Ubuntu 3.1.1 下载镜像 3.1.2 新建和启动容器 run 3.1.3交互式 compose编排与部署 1. docker-compose部署 2. docker-compose.yml模板 …

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PluginComponent)

提供外部应用组件嵌入式显示功能&#xff0c;即外部应用提供的UI可在本应用内显示。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。本组件为系统接口。 子组件 无 接口 PluginComponent(value:…

2.4 关系代数 数据库系统概论

目录 2.4.1 传统的集合运算 &#xff08;二目运算&#xff09; &#xff08;1&#xff09; 并&#xff08;Union&#xff09; &#xff08;2&#xff09;差&#xff08;Except&#xff09; &#xff08;3&#xff09; 交&#xff08;Intersection&#xff09; &#xff08…

wait 和 notify方法

目录 1.1 wait()方法 wait 做的事情: wait 结束等待的条件: 1.2 notify()方法 1.3notifyAll方法 1.4wait()和sleep()对比 由于线程之间是抢占式执行的, 因此线程之间执行的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序. 完成这个协调…

工具-百度云盘服务-身份认证

目标 通过百度网盘API的方式去获取网盘中的文件&#xff0c;要实现这的第一步就是需要获取网盘的权限。资料(参考) 如果期望应用访问用户的网盘文件&#xff0c;则需要经过用户同意&#xff0c;这个流程被称为“授权”。百度网盘开放平台基于 OAuth2.0 接入授权。OAuth2.0 是…

Promise图解,Pass

10-优化代码_哔哩哔哩_bilibili

STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹

STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹前言第1章 添加文件夹第2章 添加文件路径2.1 相对路径方法2.2 绝对路径方法 总结 前言 在编程的过程中&#xff0c;如果需要在原有的工程基础上新增其它的…

【Java从入门到精通】Java数组

数组对于每一门编程语言来说都是重要的数据结构之一&#xff0c;当然不同语言对数组的实现及处理也不尽相同。 Java 语言中提供的数组是用来存储固定大小的同类型元素。 你可以声明一个数组变量&#xff0c;如 numbers[100] 来代替直接声明 100 个独立变量 number0&#xff0…

数据结构和算法:复杂度分析

算法效率评估 时间效率&#xff1a;算法运行速度的快慢。 空间效率&#xff1a;算法占用内存空间的大小。 效率评估方法主要分为两种&#xff1a;实际测试、理论估算 实际测试问题&#xff1a; 1.难以排除测试环境的干扰因素。 硬件配置会影响算法的性能。需要在各种机器上进…

第五十六回 徐宁教使钩镰枪 宋江大破连环马-飞桨图像分类套件PaddleClas初探

宋江等人学会了钩镰枪&#xff0c;大胜呼延灼。呼延灼损失了很多人马&#xff0c;不敢回京&#xff0c;一个人去青州找慕容知府。一天在路上住店&#xff0c;马被桃花山的人偷走了&#xff0c;于是到了青州&#xff0c;带领官兵去打莲花山。 莲花山的周通打不过呼延灼&#xf…

vivado 使用Design Runs窗口、

使用Design Runs窗口 “设计运行”窗口显示在项目中创建的所有合成和实现运行。它包括用于配置、管理和启动运行的命令。 打开Design Run窗口 选择窗口 →  Design Runs打开“Design Runs”窗口。 设计运行窗口功能 •每个实现运行都缩进显示在其子级的合成运行下面。 …