基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的吸烟行为检测系统(深度学习+Python代码+PySide6界面+训练数据集)
摘要:本研究详述了一种采用深度学习技术的吸烟行为检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别吸烟行为检测。文章深入阐述了YOLOv8算法的机理,并附带了Python语言的实现代码、所需训练数据集,以及基于PySide6框架构建的用户界面(UI)。此外,系统还融合了SQLite数据库的用户管理功能,实现了一键切换YOLOv5/v6/v7/v8模型的便捷操作,以及提供了界面的自定义修改选项。本文目的是为吸烟行为检测领域的研究人员以及深度学习初学者提供实用指导和资源。完整的代码库和数据集可通过文末提供的链接进行下载。本文结构如下:
演示与介绍视频:https://www.bilibili.com/video/BV13i421o775/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZyUmZ5y
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZubmplq
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZucmptu
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZyUk5ds
前言
在当今社会,公共场所的健康和安全管理越来越受到重视,其中,禁止吸烟是提升公共卫生水平的重要措施之一。然而,在众多场合,传统的监管和管理手段难以做到实时、有效的监控和干预。因此,利用先进的计算机视觉技术自动检测公共场所的吸烟行为,不仅可以提高监管效率,还能在一定程度上减少人力成本,具有重要的研究意义和应用价值。
近年来,吸烟行为检测领域见证了显著的技术进步,特别是在基于深度学习的目标检测算法上。随着YOLO算法系列的持续更新和优化,研究者们在提高吸烟行为检测的准确性、速度以及适用性方面取得了重要成就。以下是一些最新的研究动态和相关算法的简要介绍,展示了该领域的最新进展。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160629863-186121656.jpg)
首先,YOLOv8算法作为最新一代的YOLO系列算法,它在性能和效率方面都有显著的提升。YOLOv8不仅在处理速度上优于其前身,而且在低光照、部分遮挡等复杂场景下的检测准确率也有显著提高。这对于实时监控公共区域的吸烟行为尤为重要,因为这些场景往往充满挑战[1]。
进一步,一些研究聚焦于算法的自适应能力,如何通过深度学习模型自动调整参数以适应不同的监控环境。例如,一项研究通过引入一种基于图卷积网络(GCN)的方法来优化YOLO算法,以更好地识别和追踪吸烟行为中的细微动作,这对于在人群中识别单个吸烟者尤为关键[2]。
与此同时,数据集的质量和多样性也是推动算法进步的关键因素。最近,一些研究通过构建更加全面和多样化的吸烟行为数据集来训练模型,这些数据集不仅包含不同类型的吸烟行为,还涵盖了多种环境条件下的场景,极大地提高了模型的泛化能力和鲁棒性[3]。
面对复杂多变的检测环境,提高模型的鲁棒性和泛化能力成为当前研究的一个重点。一些研究尝试通过数据增强、迁移学习等方法来提升模型在未见环境下的性能[4]。例如,通过对训练数据进行随机旋转、缩放、裁剪等操作,可以增加模型对于图像变形和遮挡的鲁棒性。
最后,随着计算技术的进步,研究者们也在探索更加高效的模型压缩和加速技术,以便在资源受限的设备上部署高性能的检测模型[5]。这对于在公共场所等实际应用环境中实时监测吸烟行为具有重要意义。
本博客的主要贡献体现在以下几个方面,旨在为吸烟行为检测技术的发展和应用提供新的视角和工具:
- 采用最先进的YOLOv8算法进行吸烟行为检测,并对比YOLOv7、YOLOv6、YOLOv5等算法的结果:本文首次将YOLOv8算法应用于吸烟行为检测领域,展示了其在检测速度和准确率方面相较于早期版本的显著提升。通过详细的性能对比分析,我们揭示了YOLOv8在处理复杂场景和实时检测需求上的优势,为研究社区提供了新的工具和思路。
- 利用PySide6实现吸烟行为检测系统:通过运用Python的PySide6库,本文介绍了一个具有友好用户界面的吸烟行为检测系统的开发过程。这一系统不仅提高了用户交互的便捷性,而且通过直观的操作界面,使得吸烟行为的监测和管理变得更加高效和实用。
3.包含登录管理功能:系统设计了登录管理功能,强化了使用过程的安全性,并为将来集成更多个性化服务提供了可能。这一设计思路考虑了系统的长期发展和用户需求的多样性,体现了作者对用户体验的深刻理解。 - 对YOLOv8模型的深入研究:本文不仅介绍了YOLOv8算法在吸烟行为检测中的应用,还对模型的内部机制、性能指标进行了深入分析。通过评估模型在不同环境和条件下的表现,我们为进一步的算法优化和应用拓展奠定了坚实的基础。
- 提供完整的数据集和代码资源包:为了促进YOLOv8及其前身版本在吸烟行为检测领域的应用和研究,本文分享了详细的数据集和完整的代码实现。这些资源的公开,不仅使得读者能够直接复现研究结果,还为后续的研究和开发工作提供了宝贵的基础材料。
1.数据集介绍
在这篇博客中,我们详细探讨了专为吸烟行为检测任务而设计的目标检测数据集。数据集的深入分析对于理解模型的训练和预期性能至关重要。本数据集的综合介绍如下,它揭示了数据集的规模、结构和特性,以及这些特性如何影响吸烟行为检测系统的构建和优化。
首先,数据集包含8520张图像,分为5950张训练图像、1720张验证图像和850张测试图像。训练图像的大量样本提供了丰富的数据来训练深度学习模型,验证图像允许我们精细调整模型参数,而测试图像用于评估模型对新数据的泛化能力。这种划分策略有助于确保模型训练的可靠性和评估的有效性。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160637362-1478724380.jpg)
我们的数据集专注于单一类别——吸烟行为的检测,这从数据集中的类别实例直方图可以清晰地看出。高度集中的实例表明,虽然只有一个检测类别,但其内部包含了丰富的场景和变体,从而确保了模型能够识别多种吸烟相关的场景。
在预处理和增强处理方面,我们对图像执行了多种标准化步骤,以适配深度学习模型的输入要求。这些步骤包括调整图像大小、格式转换和归一化,以及数据增强措施,如随机旋转、翻转和缩放。这些措施不仅提升了模型对不同吸烟行为表现的识别能力,也增强了模型在多样化环境下的鲁棒性。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160643926-1212091963.jpg)
通过对标注框分布的分析,我们发现吸烟行为主要集中在图像的中心区域,这可能与拍摄时人物居于中心的自然倾向有关。从模型训练的角度,这一发现指导我们可能不需要对图像边缘区域过分关注,而是可以将模型的焦点集中在图像中心。此外,标注框尺寸的多样性表明模型需要能够识别从小到大的吸烟行为。因此,我们在模型训练过程中采用了尺寸不变性策略,以确保模型对吸烟行为的识别不受图像中目标尺寸的影响。博主使用的类别代码如下:
Chinese_name = {'Smoking': "吸烟"}
综合以上分析,本数据集不仅涵盖了各种环境和场景中的吸烟行为,而且通过详细的标注信息和预处理增强措施,为训练高性能的吸烟行为检测模型提供了坚实基础。数据集的深入介绍有助于研究者和实践者更好地理解和应用深度学习在吸烟行为检测方面的潜力,为公共健康监控领域带来创新的解决方案。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160654064-1966179322.gif)
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行吸烟行为检测的图片或视频,或者启动摄像头进行实时检测。在进行吸烟行为检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160658649-214462615.gif)
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160703453-1239029734.gif)
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160712827-704209330.png)
3. YOLOv8算法原理
YOLOv8算法是目前先进的目标检测框架之一,其设计理念在于通过高效的网络结构实现快速而精准的目标检测。YOLOv8的网络架构采用了Neck和Head的分离设计,这意味着特征提取(Backbone)和目标检测(Head)两个过程被明确区分,从而优化了每个部分的性能。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160723142-1511364167.jpg)
在特征提取阶段,YOLOv8继承并发展了YOLOv5和YOLOv7的设计思想,采用CSPNet结构作为其Backbone,CSPNet的优势在于减少计算重复性,同时保持了丰富的渐进式特征。这种结构通过跨阶段部分网络(CSP)的方式,降低了计算量并改进了特征传播效率。这一点在处理大量图像数据时特别重要,因为它能够有效地减少计算资源消耗,同时保持或提升检测性能。
YOLOv8的Neck部分采用了SPP(Spatial Pyramid Pooling)和FPN(Feature Pyramid Networks)的结合,这在多尺度目标检测中尤为关键。SPP能够在不同尺度下提取有效的上下文信息,而FPN通过多尺度特征融合增强了模型对不同大小目标的检测能力。SPP通过最大池化操作捕获不同尺度的特征,而FPN则通过自顶向下和自底向上的路径加强了特征之间的连接。
在Head部分,YOLOv8采取了一种被称为Decoupled-Head的方法,这种方法将分类和定位两个任务分开处理,有助于提升模型在这两个方面的专注度和准确性。相较于传统的设计,Decoupled-Head的方法通过分离这两个任务来减少它们之间的相互干扰,从而提高了整体的检测性能。
YOLOv8还引入了Anchor-Free的机制,这是目标检测领域中的一项创新。与传统依赖Anchor Box的方法不同,Anchor-Free机制允许模型直接预测目标的中心点和边界框,减少了对先验框的依赖,这使得模型更加灵活,也简化了训练过程。
此外,YOLOv8在损失函数上也进行了创新,采用了Distribution Focal Loss和CIoU Loss。Distribution Focal Loss对于不平衡数据分布具有更好的鲁棒性,它能够减少易分样本对损失函数的贡献,更专注于难以识别的样本。CIoU Loss则更加关注边界框的几何精度,不仅考虑了预测框和实际框的重叠面积,还考虑了它们的中心点距离和形状相似度,这有助于在边界框回归任务中获得更高的精度。
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)
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160758223-651450976.png)
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 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在本节,我们将深入探讨如何使用YOLOv8算法训练一个高效的吸烟行为检测系统。我将分享实际的代码实现过程,并对关键步骤进行详细的分析。
首先,我们从导入必要的库开始。使用Python的os和yaml库来处理文件路径和配置文件,并引入YOLO模型,这是我们训练过程中的核心。
import os
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
然后,我们设置了数据集的路径,这通过abs_path函数完成,它将相对路径转换为绝对路径,确保无论我们在哪里运行代码,路径都是正确的。这对于跨平台的项目至关重要,因为不同操作系统的文件路径表示方式可能不同。
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)
接下来,我们读取了配置文件中的内容,并根据需要对其进行了修改。这一步是为了确保配置文件中的path键正确地指向了我们的数据集路径。
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模型。这里我们加载了YOLOv5nu的权重,这一步骤是为了使用这些预训练的权重作为我们训练的起点,这可以大大加快训练速度并提高最终模型的性能。
workers = 1
batch = 8
data_name = "SmokingBehavior"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 数据集的yaml的绝对路径
results = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device='cpu', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v5_' + data_name # 指定训练任务的名称
)
在准备好数据和模型之后,我们开始了训练过程。train方法被用来指定了许多重要的训练参数,如数据集路径、计算设备、工作进程数、输入图像的尺寸、批次大小以及训练周期数。
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect') # 加载预训练的YOLOv8模型
results2 = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device='cpu', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
最后,我们重复了相同的训练步骤,但这次使用YOLOv8的权重。代码展示了如何加载另一个预训练模型YOLOv8并进行训练,这显示了如何灵活地在不同版本的YOLO模型之间进行切换。
在对YOLOv8模型进行训练的过程中,我们通过监控不同的损失函数和性能指标来评估模型的学习进度和性能。损失函数的变化趋势和最终的精确度评估对于理解模型的性能至关重要。本文将对训练过程中损失函数和性能指标的变化进行深入分析。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160811121-1712302787.png)
首先,训练损失图展示了随着迭代次数增加,模型的box_loss、cls_loss和dfI_loss都稳定下降,这是模型训练过程中的一个良好信号。Box_loss的下降表明模型在越来越好地预测边界框的位置和大小;cls_loss的下降说明模型在类别识别方面的性能提高;而dfI_loss的降低则表示模型对于目标形状和大小的预测越来越准确。这些损失函数的组合是评估目标检测模型性能的标准方法,它们的改进直接关系到模型最终性能的优化。
同时,验证损失图也展示了类似的趋势,这表示模型在未见过的数据上也表现出良好的泛化能力。这一点对于实际应用至关重要,因为它表明模型在实际环境中可能也能够维持高性能。我们期望看到的是训练损失和验证损失之间的差异不大,这表示模型没有过拟合。
在评价指标方面,precision和recall曲线均随训练过程逐渐上升,并趋于稳定,这意味着模型能够以高准确率检测到吸烟行为,同时保持较低的遗漏率。具体来说,precision曲线表明,模型识别出的吸烟行为中的正确率不断提高,而recall曲线的上升则表示模型捕捉到的吸烟行为与实际发生的吸烟行为比例不断增加。
mean Average Precision (mAP)是目标检测中最为重要的评价指标之一,它综合考虑了precision和recall。在mAP50和mAP50-95两个指标上,我们可以看到曲线在训练过程中显著上升,这表明模型对于不同IoU阈值下的检测都有着良好的表现。mAP50指的是在IoU为50%时的平均准确率,而mAP50-95则是在IoU从50%到95%的不同阈值下平均准确率的平均值,后者更能全面反映模型性能。
在评估机器学习模型,尤其是目标检测模型的性能时,F1分数是一个重要指标,因为它综合考虑了模型的精确度和召回率。F1分数是精确度和召回率的调和平均,能够平衡两者之间的关系。理想的情况是,模型能够同时拥有高精确度和高召回率,但在实际情况中,通常需要在两者之间做出权衡。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160818738-337216283.png)
观察上图所示的F1-Confidence曲线,我们可以看到在置信度约为0.466时,F1分数达到了0.94的峰值。这一数值结果表明,该吸烟行为检测模型在折中选择召回率和精确度时,实现了相当高的性能水平。在这个置信度阈值下,模型不仅准确地识别出了大多数的吸烟行为,同时也维持了较低的误报率。
曲线的形状表明,在置信度较低的阈值下,F1分数迅速上升至峰值,然后随着置信度的增加逐渐下降,这一下降在置信度接近1时变得尤为明显。当置信度阈值很低时,模型倾向于标记更多的正样本,这意味着它将更多的实例标记为吸烟行为,从而召回率较高。然而,这也可能伴随着较高的误报率。随着置信度阈值的提高,模型变得更加谨慎,只有当它对检测结果非常有信心时才会作出标记,这提高了精确度,但同时也可能遗漏了一些实际的吸烟行为,导致召回率降低。
这个分析对于实际应用中阈值的选择至关重要。如果我们需要在吸烟检测系统中尽可能减少误报(例如,在需要高准确度的场合),我们可以选择更高的置信度阈值。相反,如果我们需要尽可能捕捉到所有的吸烟行为(例如,在对健康风险管理要求很高的场景中),则应该选择一个较低的置信度阈值。
综上所述,这些损失和评价指标图像给我们提供了模型训练过程中详细的性能变化信息。通过仔细分析这些图表,我们可以对模型的学习效率、泛化能力以及在实际应用中的潜在表现有一个深刻的理解。这些分析结果对于进一步调整和优化吸烟行为检测模型至关重要,以确保其在现实世界应用中达到最佳性能。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(1)实验设计:
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160831857-1946542068.png)
本实验旨在评估和比较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.963 | 0.961 | 0.955 | 0.964 |
F1-Score | 0.94 | 0.94 | 0.94 | 0.94 |
(3)实验结果分析:
图表显示了在相同数据集上,YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四种模型的mAP(平均精度)和F1-Score(F1分数)的比较结果。通过对这些性能指标的直观展示,我们可以对每个模型的性能有一个清晰的认识。
从图表中我们可以观察到,YOLOv8n在mAP上略胜一筹,达到了0.964的得分,而其他算法的得分紧随其后。在F1-Score上,四种算法均匀地达到了0.94的得分,显示了各自在准确度和召回率上的良好平衡。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160842334-874906949.png)
这样的细微差异在算法选择时可能会起到决定性作用,尤其是在对检测精度有着严格要求的应用场景中。YOLOv8n在这些实验中表现出轻微的优势可能归因于算法内部的优化和改进,它在处理该数据集时能够更准确地预测和识别吸烟行为。
图表采用了现代风格的美化和学术使用的清新配色,增加了视觉吸引力同时保持了清晰的数据表达。通过优化坐标轴的显示范围,我们使得数据间的对比变得更加明显,即使是在高度相近的性能得分中也能够清楚地看到差异。这种视觉表现手段对于传达各算法性能差异非常有效。
4.4 代码实现
在这篇博客中,我们将探讨如何结合YOLOv8检测器和PySide6框架,实现一个吸烟行为检测系统。这个系统能够处理视频流,并实时展示检测到的吸烟行为,为用户提供直观的视觉反馈。现在,让我们深入理解实现这一功能的代码逻辑。
(1)导入必要的模块和配置
我们从导入必要的库和模块开始,这是任何Python项目的第一步。例如,sys用于操作系统交互,time用于记录事件发生的时间,而cv2即OpenCV库用于执行各种图像处理任务。Qt相关的模块如QtWidgets和QtCore用于构建应用程序的用户界面。这些库和模块的集合使我们能够处理图像、视频流以及用户交互。
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.SmokingBehavior.label_name import Label_list
QF_Config.set_verbose(False)
(2)定义类别和模型
我们实例化YOLOv8Detector,加载预训练模型,并获取用于各个类别标签的颜色。通过创建MediaHandler对象并连接到frame_process函数,我们可以实现对实时视频流的捕捉和处理。
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) # 获取类别颜色
(3)创建主窗口
在定义MainWindow类时,我们继承了QMainWindow来创建应用程序的主窗口。在构造函数中,我们设置窗口的尺寸并初始化一个标签用于显示视频流。此外,还定义了键盘事件处理函数以便用户可以通过按键退出程序。
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() # 关闭窗口
(4)主程序流程
frame_process函数是实时视频流处理的核心。在这个函数中,每一帧图像首先被调整尺寸,然后传递给YOLOv8模型进行预处理和预测。预测完成后,计算预测用时并打印出来。随后,对预测结果进行后处理,如果检测到吸烟行为,将在图像上绘制边界框和置信度标签。
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控件上显示图像
最终,通过设置一系列信号和槽,系统能够实现实时视频流的处理,并在GUI中实时展示结果。当一切准备就绪后,我们通过调用app.exec()进入Qt应用程序的主循环,等待用户的交互。
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)架构设计
系统设计采用的是一个层次化、模块化的架构,以提升整体的灵活性和可维护性。通过精心设计的MainWindow类,我们将用户交互、媒体流处理和深度学习模型有效地融合在一个统一的应用程序中。此外,为了增强各模块间的协作性能,系统特别采用了信号和槽机制来处理模块间的通信,这在Qt框架中是实现事件驱动编程的核心。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160854470-1787825017.png)
- 处理层(Processing Layer):处理层是整个系统的技术核心。我们使用YOLOv8Detector类,这是一个封装了YOLOv8模型的类,它包含了加载预训练模型、进行图像预处理、执行推理以及后处理检测结果等功能。这层的设计关注于算法性能和准确性,确保在各种条件下都能可靠地检测出吸烟行为。
- 界面层(UI Layer):界面层则负责与用户进行交互。我们构建了一个直观的UI,让用户可以通过按钮、滑动条等控件与系统进行互动。用户可以实时查看摄像头捕捉到的视频流,检测结果会直接在视频流上显示,辅以清晰的视觉提示,如边界框和标签,标明检测到的吸烟行为。此外,界面层还能够让用户调整检测设置,如修改置信度阈值等,以适应不同的监控需求。
- 控制层(Control Layer):控制层是系统的指挥中心,它通过MainWindow类的方法,响应用户的输入,控制视频流的处理,并将检测结果反馈到界面层。此层采用了Qt的信号和槽机制,允许在不同的组件间进行松耦合的通信,例如,当检测到新的吸烟行为时,会发出信号,界面层接收到这个信号后,更新显示的信息。
通过上述设计,我们确保了系统不仅能够以高精度检测吸烟行为,而且提供了友好的用户体验。用户可以通过简单的交互即刻获取吸烟行为的信息,并且能够根据自己的需求对检测过程进行定制。这种设计思路使得系统既适用于需要高准确度检测的商业环境,也适用于需要实时监控和操作简便性的个人使用场景。
(2)系统流程
在本博客中,我们将讲述设计一个交互式吸烟行为检测系统的全过程。本系统的核心设计理念是用户友好性,高效整合前沿的YOLOv8目标检测技术和直观的用户界面,以确保即使是非专业用户也能轻松使用该系统。在系统的设计中,我们特别强调了处理层、界面层和控制层的分离,旨在实现高效的模块间交互和数据流管理。
架构设计方面,我们的系统分为三层:处理层、界面层和控制层。处理层的基础是YOLOv8Detector类,这是深度学习的核心,负责图像中吸烟行为的识别和检测。界面层的基础是Ui_MainWindow类,它构成了用户与系统交互的前端界面,包含必要的交互元素如按钮和标签。控制层则由MainWindow类的各种槽函数和方法构成,它处理用户操作,控制媒体处理器,从而操纵整个应用程序的流程。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160902098-1447919996.png)
-
系统流程设计上,我们确保用户从启动应用程序开始就能获得流畅而直观的体验。创建MainWindow实例后,用户将被引导选择输入源,包括实时摄像头捕捉或是本地媒体文件。确定输入源后,系统将配置所需的媒体处理器以加载和处理数据。
-
一旦输入源准备完毕,系统进入实时帧处理循环,包括预处理、检测识别和界面更新。在预处理阶段,每一帧图像都会进行调整以满足YOLO模型的要求。随后,在检测与识别阶段,YOLOv8模型会精准地识别出吸烟行为,并将检测信息反馈到用户界面,实时展示吸烟行为的位置和其他相关信息。
-
同时,用户界面会根据检测结果进行更新,提供实时视觉反馈。此外,用户还能通过界面操作实现对检测过程的直接控制,如开始或停止分析,以及保存和查询检测数据。整个系统的设计考虑到了实时性能和用户操作的便捷性,旨在为用户提供一个高效、易用的吸烟行为监控工具。通过这样的系统设计,我们期待用户不仅能体验到深度学习的强大功能,还能享受到高效且友好的操作体验。
整个系统设计的思路是以用户为中心,旨在提供一个全面、易用且高效的吸烟行为检测工具。从用户启动程序的那一刻起,到最终的检测结果呈现,每一步都旨在创造出一个无缝的用户体验,这也正是我们设计这一系统的初衷。
5.2 登录与账户管理
在构建吸烟行为检测系统时,我们充分考虑到了用户的个性化需求和数据安全性,因此设计了一个完备的用户登录与账户管理系统。该系统基于PySide6实现了用户界面,而后端数据存储则依赖于SQLite数据库,这一组合不仅保证了系统的轻量级和高效性,还确保了用户数据的安全可靠。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160912765-2061449052.png)
当用户启动应用程序时,系统立即激活并实例化MainWindow类。这个类是用户体验的核心,它负责初始化界面、配置参数,并引导用户开始他们的吸烟行为检测任务。用户友好的界面为用户提供了一种简洁的方式来选择和配置输入源,无论是实时的摄像头捕获、视频文件还是静态图像。
用户确定输入源后,系统将调用内置的媒体处理器来处理这些输入,确保数据以适合模型处理的格式呈现。一旦媒体输入源就绪,系统进入一个循环,不断进行帧处理,包括预处理、检测和界面更新。在这个循环中,YOLOv8模型被用来识别和标注吸烟行为,并实时更新主界面以展示检测结果。
除了强大的检测功能,系统还特别强调用户的个性化体验。登录界面不仅提供了标准的账户管理功能,如账户注册和密码修改,还允许用户定制头像,保存个人设置,以及管理检测历史。这些功能通过一套简洁的接口实现,使得用户可以轻松地进行账户操作,并将更多时间集中在主任务上——使用吸烟行为检测系统。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310160922110-1481529878.png)
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240223172556334-254454142.png)
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV13i421o775/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZyUmZ5y
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZubmplq
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZucmptu
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZyUk5ds
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的吸烟行为检测结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 779-788. ↩︎
Redmon J, Farhadi A. YOLO9000: better, faster, stronger[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7263-7271. ↩︎
Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020. ↩︎
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. ↩︎