摘要:本研究详细介绍了一种集成了最新YOLOv8算法 的烟雾检测系统 ,并与YOLOv7 、YOLOv6 、YOLOv5 等早期算法进行性能评估对比。该系统能够在包括图像、视频文件、实时视频流及批量文件中准确识别烟雾。文章深入探讨了YOLOv8算法 的原理,提供了Python实现代码 、训练数据集 ,以及基于PySide6 的用户界面(UI)。系统还整合了SQLite数据库的用户管理功能,支持一键切换不同版本的YOLO模型,并提供了界面自定义修改选项。旨在为烟雾检测研究和深度学习初学者提供实用的指导和资源。完整的代码库和数据集通过文末链接可下载。本文结构如下:
文章目录
- 前言
- [1. 数据集介绍](#1. 数据集介绍)
- [2. 系统界面效果](#2. 系统界面效果)
- [3. YOLOv8算法原理](#3. YOLOv8算法原理)
- [4. 代码简介](#4. 代码简介)
-
- [4.1 模型预测](#4.1 模型预测)
- [4.2 模型训练](#4.2 模型训练)
- [4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比](#4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比)
- [4.4 代码实现](#4.4 代码实现)
- [5. 烟雾检测系统实现](#5. 烟雾检测系统实现)
-
- [5.1 系统设计思路](#5.1 系统设计思路)
- [5.2 登录与账户管理](#5.2 登录与账户管理)
- 下载链接
- [6. 总结与展望](#6. 总结与展望)
- 结束语
基于深度学习的火焰与烟雾检测系统演示与介绍(YOLOv8/v7/v6/v5模型+PySide6界面+训练数据集)
前言
在当今社会,火灾安全已经成为全球关注的重大问题,每年因火灾造成的生命财产损失不可估量。随着科技的发展,火焰检测技术在防灾减灾体系中扮演着越来越重要的角色。传统的火焰检测方法,如烟雾探测器和温度传感器,虽然在一定程度上能够实现早期火灾的检测,但在处理大规模或开放空间的火灾检测时,存在诸多局限性,如反应时间慢、易受环境因素干扰、检测范围有限等。这些限制促使研究者探索更高效、更智能的火焰检测解决方案。
YOLO^1^系列,作为实时目标检测的代表算法,从YOLOv5到YOLOv8,每一次迭代都在性能、速度和准确度上取得了显著的改进。YOLOv8,作为最新的版本,通过更深更复杂的网络结构和改进的训练技巧,进一步提升了检测的准确性和速度,尤其在处理动态视频流中的火焰检测任务时,表现出了优异的性能。这些改进使得YOLO系列在火焰检测领域的应用更加广泛,能够更好地满足实时性和准确性的双重需求。
除了YOLO系列,其他深度学习算法,如Faster R-CNN、SSD以及基于Transformer的DETR等,也在火焰检测领域得到应用。这些算法各有优势,如Faster R-CNN在检测精度上表现出色,而SSD在速度上有明显优势。最新的研究不断探索这些算法的改进版本,以期在速度和准确性之间找到更好的平衡点。
Transformer在视觉任务中的应用也引起了广泛关注,特别是视觉Transformer(ViT)。ViT通过引入自注意力机制,能够捕捉图像中的长距离依赖,这对于理解复杂的火焰形态和背景之间的关系尤为重要。相较于传统的卷积神经网络(CNN),ViT在处理图像的全局信息方面表现更佳,为火焰检测提供了新的解决思路。
注意力机制,作为Transformer的核心,已被广泛应用于各种深度学习模型中,包括火焰检测。它通过赋予模型对图像特定部分的"关注"能力,改善了模型的识别性能,尤其是在背景复杂或火焰形态多变的情况下。这种机制使得模型能够更加精准地定位并识别火焰,即使在干扰信息较多的环境中也能保持较高的检测准确率。
当前,火焰检测技术正面临着多种挑战,包括提高检测的实时性、准确性以及在多变环境下的适应性。为了应对这些挑战,研究人员正不断探索新的算法和技术,如通过深度学习模型的轻量化,提高算法的运行效率,以及利用新的数据增强技术和自适应学习方法,提升模型的泛化能力和鲁棒性。
本博客所做的工作是基于YOLOv8算法构建一个烟雾检测系统,展示系统的界面效果,详细阐述其算法原理,提供代码实现,以及分享该系统的实现过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:
- 采用最先进的YOLOv8算法进行烟雾检测:本文不仅介绍了基于YOLOv8算法的烟雾检测系统的构建过程,而且还详细比较了YOLOv7^2^、YOLOv6^3^、YOLOv5^4^等早期版本的性能差异。这一比较研究为烟雾检测技术的选择提供了有力的参考依据,特别是YOLOv8算法在效率和精准度方面的显著优势,为烟雾检测提供了更高效、更准确的技术路径。
- 利用PySide6实现友好的用户界面:通过Python的PySide6库开发的烟雾检测系统,不仅具备高效的检测能力,还提供了直观便捷的用户操作界面。这种设计使得烟雾检测更加用户友好,有助于推广YOLOv8算法的应用,同时也促进了烟雾检测技术的普及和实用化。
- 集成登录管理功能,提升系统安全性:系统设计中包含的登录管理功能,增强了系统的安全性,为用户提供了更加安全可靠的使用环境。此外,这一功能的设计为将来引入更多个性化服务和功能打下了基础,增加了系统的可扩展性。
- 对YOLOv8模型进行深入研究:本文不仅应用了YOLOv8算法,还对其性能进行了全面的评估和分析,包括精准度、召回率等关键指标的深入研究,以及模型在不同环境条件下的表现分析。这些研究成果为理解YOLOv8算法的性能提供了详细的视角,并为算法的进一步优化和改进奠定了基础。
- 提供完整的数据集和代码资源包:为了促进烟雾检测技术的学习和应用,本文提供了一套完整的数据集和代码资源包。这些资源不仅便于读者复现文中的实验结果,还为基于YOLOv8/v7/v6/v5算法的烟雾检测系统的进一步研究和开发提供了宝贵的材料。
1. 数据集介绍
在构建用于烟雾检测的深度学习模型时,一个全面和精确标注的数据集是至关重要的。我们的数据集共包含4470张图像,其中包括3847张训练图像,405张验证图像,以及218张测试图像。这样的划分旨在确保模型能在充足的数据上进行训练,同时留出足够的样本来验证和测试模型的性能。
在数据预处理阶段,我们采取了几项关键步骤以确保数据集的质量。首先,所有图像都经过了自动方向校正,并剥离了EXIF方向信息,这是为了消除因摄影设备的不同拍摄角度而带来的方向差异。接着,所有图像都被统一调整至640x640像素,通过拉伸的方式来适配这一分辨率。虽然这可能导致一些图像的比例失真,但这样做能确保所有图像都适合模型的输入需求,并且可以在不牺牲处理速度的情况下保持图像特征的辨识度。
在我们的数据集中,火焰和烟雾的实例数量基本持平,这有助于防止模型在训练过程中偏向于更频繁标注的类别。此外,数据集中的图像被标记为包含火焰和烟雾两个类别,每个类别的边界框均精确地标注在图像中。这些标注对于训练模型来说非常关键,因为它们为模型提供了识别和定位目标的必要信息。
通过分析数据集的标注分布图,我们注意到大部分标注框集中在图像的中心区域。这一发现指向了数据采集过程中的一个特点,即火焰和烟雾倾向于出现在画面中央。尽管这有助于模型学习识别中心位置的目标,但它也暗示了模型可能在检测图像边缘的火焰和烟雾时表现不足。为了解决这一问题,我们应用了多种数据增强技术,包括随机旋转、缩放、剪裁和颜色变换等,以模拟不同的视角和环境条件,增强模型对各种情况下烟雾的检测能力。博主使用的类别代码如下:
python
Chinese_name = {'Fire': "火焰", 'Fire-': "火焰B", 'Smoke': "烟雾"}
此外,标注框的大小分布表明了火焰和烟雾在图像中的尺寸多样性。我们的模型需要能够识别从小到大的各种尺寸的火焰和烟雾,这在数据集中的宽度和高度分布中得到了体现。
总体来说,本文的数据集经过精心准备和处理,旨在为研究人员和从业者提供一个坚实的基础,以进行深度学习模型的训练和评估。通过本数据集的使用,我们可以深入探讨YOLOv8等先进目标检测算法在烟雾检测任务上的应用潜力,并期待在实际应用中实现更加准确和高效的烟雾检测。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行烟雾检测的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
在目标检测的世界中,YOLOv8代表了技术的最新进展。它是在YOLO(You Only Look Once)系列算法发展中的又一重要里程碑。作为一个高效的目标检测模型,YOLOv8继承了YOLO系列算法的核心思想,即在单次前向传播中同时预测多个目标的类别和位置,实现了检测的实时性和准确性的平衡。
YOLOv8的结构延续了YOLO系列算法的设计哲学,整体框架被划分为三个主要部分:Backbone(主干网络)、Neck(颈部网络)和Head(头部网络)。在Backbone中,YOLOv8采用了CSP(Cross Stage Partial networks)结构,这种设计通过在网络的不同阶段引入部分连接,有效地降低了计算复杂度并提高了特征传递的效率。CSP结构的核心在于模块化设计,它允许网络部分地重复使用特征,从而实现更加高效的特征学习。此外,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进行目标的最终检测和分类。这个部分是整个模型中直接关联到目标检测性能的关键环节。在这里,YOLOv8引入了多种anchor的设计来适配不同大小的目标,并使用了多尺度预测以提高检测的准确率和召回率。此外,为了进一步优化检测性能,YOLOv8还采用了自适应标签分配(adaptive label assignment)机制,这一机制能够动态地调整标签分配策略,确保模型在训练过程中对正负样本的分配更加精确,从而提升了整体的检测性能。
YOLOv8的训练过程也体现了算法的先进性。例如,通过引入AutoML技术自动优化网络结构,使得模型结构更加贴合实际的检测需求。这些技术的应用,保证了YOLOv8在面对各种复杂场景时都能保持出色的性能表现。此外,YOLOv8还采用了先进的损失函数,比如CIoU和DIoU,这些损失函数专门用于更好地优化边界框的位置和大小,从而进一步提高模型在实际应用中的精度和鲁棒性。
总体来说,YOLOv8通过其创新的网络结构和训练技术,不仅提高了目标检测的速度和准确性,还确保了模型在面对各种尺度和复杂性的目标时都能保持良好的性能。这些进步不仅推动了目标检测技术的发展,也为相关应用领域带来了新的可能性。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行烟雾检测的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
python
import cv2
from ultralytics import YOLO
接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
python
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))
然后,使用OpenCV读取了一个图像文件,这个图像文件作为要进行目标检测的图像输入。
python
img_path = abs_path("test_media/1.jpg")
image = cv_imread(img_path)
在读取了图像文件之后,将图像大小调整为850x500,并对图像进行预处理,就可以使用模型进行预测了。
python
image = cv2.resize(image, (850, 500))
pre_img = model.preprocess(image)
pred, superimposed_img = model.predict(pre_img)
4.2 模型训练
在构建一个高效的烟雾检测系统时,我们不能忽视实际操作中模型训练的重要性。通过精心设计的训练流程,我们能够将理论转化为实践,实现对烟雾和火焰等潜在危险的快速识别。在本博客中,我将详细介绍使用Python语言和PyTorch框架进行YOLOv8模型训练的具体步骤和代码。
我们的训练过程从导入必要的模块开始,包括os、torch、yaml以及专门的YOLO类。这些模块为我们处理文件路径、执行数值计算、解析配置文件以及实例化模型提供了基础。接下来,我们确定了训练所使用的计算设备,优先选择GPU(cuda:0),如果不可用,则退回到CPU。
python
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函数获得了配置文件的绝对路径。这是确保不同运行环境下路径的一致性和代码的可移植性。
python
workers = 1
batch = 8
data_name = "FireSmoke"
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格式的配置文件。这一步至关重要,因为它包含了训练过程中需要的关键信息,如类别标签、数据集路径等。我们通过修改配置文件中的path键值,确保了模型能够正确地找到训练和验证数据。
python
# 读取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)
随后,我们加载了预训练的YOLOv8模型,并开始了训练过程。YOLO类的train方法接受了多个参数,包括数据路径、设备、工作进程数、输入图像的大小、训练周期和批次大小。这里的name参数为训练任务提供了标识,方便后续的追踪和分析。
python
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 # 指定训练任务的名称
)
在烟雾检测领域,对训练过程的损失函数进行分析是至关重要的。它不仅反映了模型学习的状况,还指示了模型的性能可能存在的问题。
首先,从训练和验证的损失图中可以看出,随着训练进程的推进,train/box_loss、train/cls_loss和train/obj_loss均呈现出下降趋势,这表明模型在学习过程中逐渐拟合训练数据,并且在边界框定位、类别分类和目标检测上的表现都在不断改进。相应的,验证损失val/box_loss、val/cls_loss和val/obj_loss虽然波动较大,但总体上也显示出下降趋势,这表明模型对未见数据的泛化能力在增强。
具体来看,train/box_loss从接近0.8下降至约0.3,这是一个非常好的信号,意味着模型在边界框的定位上变得越来越精准。类似地,train/cls_loss和train/obj_loss的下降表明分类误差减少和对目标的识别准确度提高。我们希望验证损失也能呈现相似的下降趋势,尽管中途有些波动,但整体下降趋势表明模型的泛化能力在逐渐提高,没有出现过拟合的情况。
在性能指标方面,metrics/precision、metrics/recall、metrics/mAP50和metrics/mAP50-95的图表显示了模型性能的稳步提升。准确率(Precision)和召回率(Recall)随着训练周期增加而增长,这意味着模型在辨识正样本方面变得更加精确,同时也能回收更多的正样本。mAP(mean Average Precision)是目标检测中最重要的评估指标之一,metrics/mAP50和metrics/mAP50-95的提高表明模型对于不同IoU阈值的检测性能都在提升。mAP50指的是在IoU为0.5时的平均精度,而mAP50-95则表示在IoU从0.5到0.95不同阈值下的平均精度,它更全面地反映了模型在各种重叠度下的表现。观察到这些指标的稳步提升,说明模型在整个训练过程中的表现是在不断优化的。
在机器学习领域,F1分数是一个非常关键的性能指标,它综合考虑了模型的准确率和召回率,为我们提供了关于模型分类性能的全面视图。这个指标尤其适用于那些正负样本分布不平衡的情况,能够帮助我们理解模型在检测难以区分的类别时的表现。
从图中我们可以看到,曲线描绘了不同置信度阈值下,模型对于"Fire"和"Smoke"两个类别以及所有类别综合的F1分数。F1分数的最高点代表了模型在该置信度阈值下的最优平衡状态。在分析这些曲线时,我们要特别注意F1分数的峰值以及这些峰值对应的置信度阈值。
观察"Fire"类别,其F1分数曲线在置信度阈值大约为0.4左右达到峰值,这表明在该阈值下,"Fire"检测的准确率和召回率之间达到了最佳的平衡。相似地,"Smoke"类别的F1分数峰值出现在略高于"Fire"的置信度阈值,这可能意味着模型对于"Smoke"类别的检测在更高的置信度下更为准确,或者需要更高的置信度才能更好地平衡准确率和召回率。
整体而言,所有类别的综合F1分数在置信度为0.433时达到了0.65的峰值,这是评估模型整体性能时的一个关键发现。这意味着在这个置信度阈值下,模型对于"Fire"和"Smoke"两个类别的综合检测性能达到了最优。通过调整模型在实际应用中的置信度阈值到这个水平,我们可以期望在保持较高召回率的同时,获得较好的准确率。
在实际应用中,我们可能需要根据特定的场景和需求来调整置信度阈值,以找到最适合的平衡点。例如,在一些对于准确率要求更高的场合,我们可以适当提高置信度阈值;而在对召回率要求更高的应用中,则可能需要降低置信度阈值以避免漏检。
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.646 | 0.670 | 0.638 | 0.634 |
F1-Score | 0.65 | 0.69 | 0.66 | 0.64 |
(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算法,结合PySide6创建一个实时目标检测系统。该系统能够在视频流中识别和标注特定对象,如火焰和烟雾。
(1)引入必要的库
首先,系统的构建开始于导入必要的Python模块开始。sys模块是Python内建的模块,它提供了许多与Python解释器紧密相关的功能。例如,sys.argv用于获取命令行参数,这在启动应用程序时尤为重要。time模块允许我们获取当前时间,这对于性能评估和监控推理时间至关重要。OpenCV库(cv2)是图像处理的核心,它提供了一系列强大的功能来捕捉和处理图像数据。
python
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.FireSmoke.label_name import Label_list
QF_Config.set_verbose(False)
(2)设置主窗口
构建用户界面(UI)是实现系统的重要一步。我们用PySide6库构建了图形用户界面。QMainWindow是我们窗口的基类,提供了一个用于展示处理后图像的画布。通过覆盖keyPressEvent方法,我们可以捕捉用户的键盘输入,从而允许用户通过简单的按键操作来控制程序。
python
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函数,它是系统处理每一帧视频流的核心。该函数首先调整帧大小以适配GUI窗口,然后调用YOLOv8模型进行预测。我们通过计算并打印推理时间来评估性能。如果模型在当前帧中检测到目标,我们将使用drawRectBox函数在图像上绘制矩形框,并添加相关的信息标签。
python
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)初始化检测模型和设备
最后,我们初始化了YOLOv8检测器,加载了训练好的模型,并创建了MediaHandler来处理实时的视频流。通过连接frame_process函数到视频流的每一帧,我们确保了图像可以实时地被处理和展示。整个系统通过一个简洁的GUI窗口为用户提供了实时的目标检测反馈。
python
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 系统设计思路
MainWindow类的主要目标是提供一个用户友好的交互式烟雾检测系统。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。通过对象组合的方式,将不同的处理器和模型组织在一起,让每个功能模块都能独立进行,同时,还利用信号和槽机制来进行模块间的交互和数据传递。
架构设计
我们的系统设计思路以三层架构为核心:处理层、界面层和控制层。在我们的系统设计中,重点放在了确保各个组件能够协同工作,同时保持足够的模块独立性,以便于未来的维护和升级。
- 处理层(Processing Layer):通过采用模块化的处理层,我们能够将YOLOv8Detector类实现的深度学习模型进行封装,这样一来,图像处理和目标检测的复杂性对于其他系统组件来说是透明的。这种封装不仅提高了系统的可靠性,也使得将来替换或升级模型变得更加容易。
- 界面层(UI Layer):在界面层,我们通过PySide6库构建了一套完整的用户界面,提供了直观的操作按钮、状态标签和实时的图像显示。这个界面不仅能够响应用户的操作,还能实时反馈模型的检测结果,从而提高用户的操作便利性和系统的交互性。界面的设计旨在降低用户的学习曲线,即使是没有技术背景的用户也能轻松上手。
- 控制层(Control Layer):控制层是连接用户界面和后端处理模块的桥梁。在这一层中,MainWindow类承担着响应用户交互、控制视频流处理和展示模型预测结果的任务。通过信号和槽机制,我们能够将用户的操作转化为系统的响应,如启动和停止视频流、调整检测设置等。这种设计不仅提高了系统反应的及时性,还增强了用户的控制感。
交互式烟雾检测系统的设计旨在将先进的深度学习技术与用户友好的界面相结合,提供一种简便、高效的烟雾和火焰检测解决方案。通过处理层、界面层和控制层的紧密配合,我们的系统不仅可以快速准确地检测出潜在的火灾风险,还能为用户提供一种互动性强、体验优良的使用环境。
系统流程
在构建一个智能监控系统时,用户体验和系统性能同等重要。本博客将详细介绍我们开发的交互式烟雾检测系统的工作流程,这一系统能够实时检测视频流中的烟雾和火焰,为用户提供直观的监控和操作界面。
- 当用户启动我们的应用程序时,系统首先实例化了MainWindow类。这个类不仅负责初始化用户界面,设置窗口大小和展示区域,还准备了后续处理所需的各项参数。用户界面作为与系统交互的桥梁,为用户提供了选择视频输入源的选项。输入源的灵活性是此系统的一个亮点,用户可以选择实时视频流、预录视频文件甚至单张图片作为检测的媒介。
- 一旦输入源被用户选定,系统便开始调用内置的媒体处理器进行数据的读取和处理。这个过程包括了摄像头的实时捕获设置、视频文件的解码读取以及图像数据的加载入内存。这些环节都是自动化的,无需用户手动配置,充分体现了智能化的设计理念。
- 接下来,系统将进入一个连续的处理循环,不断对实时获取的帧数据进行分析。在预处理阶段,系统通过一系列图像处理技术,如缩放、色彩转换等,使每帧图像符合YOLOv8模型的输入标准。这一步骤对于提高模型的识别效率和准确度至关重要。
- 紧接着,经过预处理的图像被送入经过训练的YOLOv8模型进行实时检测。模型快速地在图像中定位火焰和烟雾,并对它们进行分类,其结果将用于后续的界面更新。我们的系统设计允许实时地在用户界面上显示检测框,标注目标类别,并在界面上实时展示检测的统计数据。这种即时的反馈为用户提供了清晰的视觉指导,帮助他们理解当前环境的安全状况。
- 除了实时监控和展示,用户还可以通过界面进行一系列交互操作,比如保存检测的结果、查询系统信息等。这些功能增强了用户对系统的控制感,并提高了系统的实用性。更进一步,用户还能够通过简单的按钮点击来控制媒体的播放状态,例如启动或停止视频捕获,这为用户提供了额外的灵活性。
总而言之,我们的交互式烟雾检测系统经过精心设计,不仅可以高效地进行烟雾和火焰的实时检测,还提供了一套完善的用户交互界面,使用户能够轻松地监控、操作和管理系统。这种系统的设计思路,将先进的深度学习技术与用户友好的界面设计相结合,为实时监控领域带来了新的解决方案,有望在商业和居民安全领域得到广泛应用。
5.2 登录与账户管理
在构建高效的烟雾检测系统时,除了技术层面的考量,用户管理和个性化设置也是不可或缺的部分。我们的系统不仅关注于实时识别烟雾和火焰,更提供了完备的用户管理功能,确保了每位用户都能在一个安全和私密的环境中使用系统。
通过结合PySide6的强大GUI能力和SQLite的轻量级数据库特性,我们开发了一个简洁而全面的用户登录界面。这个界面不仅实现了基础的账户注册与登录功能,还允许用户进行密码修改、头像设置等个性化操作。每一位用户在注册过程中都会创建一个独立的账户空间,在这个空间中,他们可以保存个人的检测结果和设置,这样的设计增加了系统的使用便利性,使得用户可以轻松回顾和管理自己的检测历史。
在用户完成登录后,系统会进入主界面,这里集成了烟雾检测的各项功能。用户可以选择图像、视频或实时摄像头作为检测输入源,系统将实时地展示检测框、类别及置信度等信息。这不仅为用户提供了实时的视觉反馈,也方便了用户对检测情况的掌控。
为了满足不同用户在目标检测场景下的多样化需求,我们的系统支持批量文件输入,并能够实时记录识别结果。此外,用户还可以在登录界面进行账户注销和重新登录操作,这些功能的加入,不仅提升了用户的操作体验,更赋予了用户对自己账户更高的控制权。
整体来看,我们的烟雾检测系统不仅在技术层面做到了高效准确,还在用户体验层面下足了功夫。从技术的实现到用户的互动,每一步都精心设计,以确保每位用户都能在使用过程中感到便捷和舒适。通过这些细心的考量,我们的烟雾检测系统不仅是一个技术产品,更是一个用户友好的智能平台,旨在为用户提供一个既安全又便捷的使用环境。
下载链接
若您想获得博文中涉及的实现完整全部资源文件 (包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频: https://www.bilibili.com/video/BV17K421t7WC/
在文件夹下的资源显示如下,下面的链接中也给出了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模型的实时烟雾检测系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的烟雾检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
-
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
-
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. ↩︎
-
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. ↩︎
-
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. ↩︎