摘要:本文详细说明了如何利用深度学习开发一个用于监测吸烟行为的系统,并分享了完整的代码实现。该系统采用了先进的YOLOv8算法,同时还使用YOLOv7、YOLOv6、YOLOv5算法,并对它们进行了性能比较,呈现了不同模型的性能指标,例如mAP和F1 Score。文章深入探讨了YOLOv8的工作机制,提供了必要的Python代码和训练数据集,并融合了一个基于PySide6的用户界面。
该系统可以精确地识别和区分吸烟行为,支持从图片、图片文件夹、视频文件以及摄像头输入进行检测,功能包括柱状图分析、标记框类别标注、类别统计、可调节的置信度、IOU参数以及结果的可视化展示。系统还包含了一个基于SQLite的用户管理界面,允许模型切换以及界面自定义。本文目的在于为深度学习新手提供一份实操指南,文末提供了代码和数据集的下载链接。本文结构如下:
文章目录
- 前言
- 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界面+训练数据集)
前言
在当今社会,吸烟被公认为对人类健康构成重大威胁,不仅影响吸烟者自身的健康,还可能对非吸烟者产生二手烟的危害。根据世界卫生组织(WHO)的报告,每年有数百万人死于与吸烟相关的疾病。此外,公共场所的无序吸烟行为还违反了健康法规,威胁到公共安全和环境卫生。因此,开发有效的吸烟检测系统显得尤为重要,它不仅有助于及时识别并阻止公共场所的吸烟行为,还能通过监控和管理减少二手烟对人群健康的影响,具有重大的社会和公共卫生意义。
随着深度学习技术的飞速发展,基于YOLO1(You Only Look Once)系列算法的吸烟检测系统表现出了优异的检测速度和准确性,特别是最新的YOLOv82及其前身YOLOv73、YOLOv64、YOLOv55等版本,它们在性能上的大幅提升,每一次迭代都在模型结构、检测速度和准确性等方面做出了显著改进,为实时视频监控和自动化检测技术的发展奠定了坚实的基础。在吸烟检测领域,这些技术的进步大大推动了自动吸烟检测系统的发展,为公共健康和安全提供了有力的技术支持。
近年来,深度学习模型,尤其是卷积神经网络(CNN)和YOLO(You Only Look Once)系列,已成为吸烟检测研究的热点。YOLO算法以其高效的一次性检测多目标的能力,在实时性和准确率方面均表现出色。除YOLO系列外,其他算法如Faster R-CNN、SSD等也被应用于吸烟行为的检测中,各有优缺点。
在数据集方面,早期研究多依赖于有限的、特定场景下收集的图像和视频数据。这限制了模型的泛化能力。为应对这一挑战,近期研究致力于构建更为丰富和多样化的数据集,包括不同环境、光照条件以及吸烟动作的变化,以提高模型在现实世界应用中的鲁棒性和准确性。
本博客的主要贡献在于系统地介绍了基于YOLOv8算法构建的吸烟检测系统,不仅涵盖了算法原理和系统界面的设计,还提供了完整的开发过程和资源包。具体贡献如下:
- 采用最先进的YOLOv8算法进行吸烟检测:本文详细阐述了如何利用YOLOv8,当前最先进的目标检测算法,来实现高效准确的吸烟检测。与先前广泛使用的YOLOv7、YOLOv6、YOLOv5等版本相比,YOLOv8在检测速度和精度上均有显著提升。我们通过对比分析,展示了YOLOv8在吸烟检测任务上的优越性能,为该领域研究者和实践者提供了新的视角和工具。
- 利用PySide6实现吸烟检测系统:通过采用Python的PySide6库,我们成功开发了一个具有友好用户界面的吸烟检测系统。这一系统的设计不仅便于用户操作,而且加强了算法在实际场景中的应用潜力,有效推动了吸烟检测技术的广泛应用。
- 集成登录管理功能:系统中设计的登录管理功能为系统使用提供了安全保障,并为将来引入更多个性化服务奠定了基础。这一功能强调了系统设计的综合性和实用性,提升了用户体验。
- 对YOLOv8模型的深入研究:本文不仅介绍了YOLOv8算法的应用,还深入探讨了该模型在吸烟检测任务上的性能。通过详细的性能评估和环境适应性分析,我们为读者呈现了一个全面的YOLOv8算法评估报告,为算法的进一步优化提供了坚实的基础。
- 提供完整的数据集和代码资源包:为了便于读者更好地理解、学习和应用YOLOv8及其他版本算法在吸烟检测中的具体实施,我们提供了包括训练和测试数据在内的完整数据集以及实现系统的完整代码包。这些资源的分享使读者能够轻松复现研究结果,并在此基础上进行自己的研究和开发。
1. 数据集介绍
在开发我们的吸烟检测系统时,我们认识到了拥有一个高质量、精准标注的数据集对于训练有效深度学习模型的重要性。为此,我们构建了一个专门的数据集,它涵盖了4408张训练图像、358张验证图像,以及25张测试图像,总计4791张图像。这个数据集专为识别各种吸烟行为而设计,图像来源多样,包含室内外各种场景。我们的目标是训练一个能够在多变环境中准确识别吸烟行为的模型,数据集的广泛性和多样性是实现这一目标的基础。
我们的数据集只关注一个类别——“cigarette”,这有助于模型更专注于识别吸烟的特定视觉特征。每张图像中的烟草都由红色边框标注,确保了标注的一致性和准确性。我们还对图像进行了预处理和增强,以模拟实际应用中可能遇到的挑战,如光照变化、尺度变换等。预处理包括图像的缩放和归一化,而增强处理则包括随机旋转、缩放、翻转和亮度对比度调整,这些步骤旨在增加模型对各种变化的适应性,提高其泛化能力。
我们的数据集分布分析进一步展示了数据的特征。从中心分布图可以看出,大多数烟草目标出现在图像的中央区域,这可能与人们在日常生活中吸烟时的位置有关。此外,边界框的高度和宽度分布图表明,我们的数据集包含了不同大小的烟草目标,从远距离的小目标到近距离的大目标,从部分遮挡的到完整露出的目标都有涉及。这种大小的变化说明我们的模型必须能够适应广泛的目标尺寸,确保在实际应用中的准确性。
我们精确地标记出图像中的烟草位置,为每一个出现的烟草对象绘制了红色边框,并赋予了“cigarette”的标签。通过这样的标注,模型能够学习到吸烟行为的特定视觉特征,并在各种场景中准确识别出吸烟动作。数据集中只包含了一类标签,即吸烟行为,这样的单类别标注使得问题定义清晰,且便于模型专注于吸烟检测这一单一任务。博主使用的类别代码如下:
Chinese_name = {'cigarette': "香烟"}
总之,我们的数据集旨在为吸烟检测提供一个全面的训练和评估环境。它通过多样化的图像、精准的标注、细致的预处理和增强处理,以及深入的分布分析,为开发出一个高效准确的吸烟检测系统奠定了坚实的基础。通过这些严谨的步骤,我们确保了数据集能够全面支持深度学习模型的训练,使其在各种真实世界的场景中都能保持优异的性能。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行吸烟检测的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
在探讨YOLOv8算法的原理时,我们首先需要理解YOLO(You Only Look Once)系列算法的核心理念,即在单次前向传播过程中同时进行目标的定位和分类。这种一步到位的检测方式使得YOLO算法在速度和效率上有着显著的优势。YOLOv8作为这一系列中的最新迭代,不仅继承了前代YOLO算法的这些优点,而且在结构设计和性能上都有了显著的改进,从而进一步提升了检测的准确性和速度。
YOLOv8算法的结构可以分为三个主要部分:Backbone(主干网络)、Neck(连接网络)和Head(检测头)。在Backbone部分,YOLOv8采用了CSP(Cross Stage Partial networks)结构,这种结构有效地平衡了模型的学习能力和参数量。CSP结构通过部分跨阶段连接,促进了梯度的直接传播,这对于深层网络的学习是极为有益的。它还减少了计算量,因为它允许网络在少量的参数下进行更深层次的特征学习。
Neck部分则是负责提取不同尺度特征并进行融合的关键模块。YOLOv8的Neck部分利用了SPP(Spatial Pyramid Pooling)结构和FPN(Feature Pyramid Networks)技术。SPP能够提取多尺度的上下文信息,这对于检测不同尺寸的目标至关重要。而FPN采用了一个自顶向下的结构,将高层的语义信息传递到低层,从而实现了从粗到细的特征融合。
在Head部分,YOLOv8采取了自适应标签分配(adaptive label assignment)策略,这是一种更为灵活的标签分配方式,允许模型根据目标的不同特性自动调整标签。这意味着算法能够根据目标的大小、形状以及其在图像中的上下文信息,动态地选择最合适的锚点,这种策略能够有效地减少标签分配误差,提升模型的性能。
YOLOv8还引入了AutoML技术,在算法的设计和优化过程中自动寻找最优的模型参数和结构。这种技术可以减轻手动调参的工作量,确保了YOLOv8在不同的检测场景下都能达到最佳性能。此外,YOLOv8还支持云端训练和边缘计算,使得算法可以在资源受限的设备上进行训练和推断,同时还可以利用云端的强大计算能力进行大规模的训练任务。
综上所述,YOLOv8通过其独特的结构设计,不仅继承了YOLO系列的高速检测特性,而且还通过CSP网络结构和先进的特征融合技术,显著提升了对于各种尺寸目标的检测能力。这些技术的融合使得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/1.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 模型训练
在这部分博客内容中,我们将深入探讨一个使用PyTorch框架和Ultralytics YOLO库进行模型训练的实际案例。通过解析提供的代码,我们将一探究竟,看看如何利用这些强大的工具来训练一个吸烟检测模型。
代码的核心逻辑是首先设置好训练环境,然后加载预训练的YOLO模型,并在此基础上进行进一步的训练以适应我们的特定任务——在这里是吸烟检测。这个过程涉及到许多细节,包括数据路径的设置、模型参数的配置以及训练过程的初始化。
首先,代码通过import语句导入必要的Python包,包括操作系统接口os、PyTorch库torch、YAML文件解析库yaml以及Ultralytics的YOLO模型。紧接着,我们设置设备变量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_name和数据集配置文件的路径data_path,这里使用了一个辅助函数abs_path来确保获取到文件的绝对路径。
workers = 1
batch = 8
data_name = "Smoking"
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文件,保持原有顺序
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)
在加载预训练模型的部分,我们加载了预训练模型,随后启动了训练过程。这部分代码通过指定数据集配置文件路径、训练设备、工作进程数、图像尺寸、训练周期和批次大小等参数,调用了model.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 # 指定训练任务的名称
)
在吸烟检测领域,对训练过程的损失函数进行分析是至关重要的。它不仅反映了模型学习的状况,还指示了模型的性能可能存在的问题。
从训练损失图中,我们可以观察到边界框损失(box_loss)、分类损失(cls_loss)和目标损失(obj_loss)随着训练周期的增加而持续下降,这意味着模型在逐渐学习如何更准确地预测烟草的位置、类别和存在性。具体来说,训练中的边界框损失从接近2.0开始,迅速下降至1.0左右,显示出模型在定位目标方面的学习效果显著。分类损失和目标损失的趋势也类似,从最初的较高值逐渐下降至更低的稳定水平,表明模型在区分烟草与背景及其他类别方面的性能正在增强。
验证损失图表中,我们看到了类似的趋势,但存在一定程度的波动,这是正常的,因为验证集上的数据模型之前未见过,它们代表模型的泛化能力。验证过程中边界框损失、分类损失和目标损失的值在经历初始的波动后趋于平稳,这表明模型在训练过程中没有出现过拟合的情况,并且具有良好的泛化性能。
至于性能指标,我们的模型表现出色。精确度(precision)和召回率(recall)在训练过程中逐渐提高,最终达到了高平稳状态,这说明模型能够准确地识别大部分的正样本(即图像中的烟草),同时保持较低的假阳性率。平均精度均值(mAP)在50%的IoU(交并比)阈值下已经非常接近1,这是一个极其优秀的结果,表示模型在不同的置信度阈值下能够保持较高的检测性能。而在不同IoU阈值下的mAP,即mAP50-95,虽然低于mAP50,但仍然显示出模型在更严格的IoU标准下依然保持了良好的性能。
在深度学习模型的评估过程中,准确评估模型性能是确保系统可靠性和有效性的关键步骤。F1分数作为精确度和召回率的调和平均,是衡量模型性能的重要指标,尤其是在我们的单一类别检测任务中更是如此。上图显示的是我们的模型在评估阶段的F1-Confidence曲线,该曲线图提供了一个全面的视角来观察在不同置信度阈值下模型的表现。
曲线表明,在置信度约为0.425时,我们的模型达到了最高的F1分数,大约是0.87。这个高分数表示我们的模型在精确度和召回率之间实现了良好的平衡,确保了在识别吸烟行为时既不会错过太多正样本(即减少了漏检),也不会将太多负样本错认为正样本(即降低了误检)。F1分数随着置信度阈值的增加而下降,这表明当模型越来越肯定其预测时,可能会忽略一些正确的吸烟案例,从而错失一些真正的正样本。
在F1分数曲线的起始部分,我们可以看到F1分数迅速升高,这意味着即使是在较低的置信度阈值下,模型也能保持较高的性能。然而,随着置信度阈值的进一步提高,F1分数开始下降,尤其是在0.425之后,表明模型在更高的置信度阈值下可能过于保守,未能识别所有的正样本。此外,曲线尾部的下降表明在接近完美置信度的范围内,模型的性能急剧下降,这可能是由于高置信度阈值导致模型的召回率降低。
综合以上分析,我们的模型训练显示出YOLOv8在我们的吸烟检测系统上的有效性。损失函数的下降趋势和性能指标的提高表明模型在训练过程中表现出了很好的学习能力和泛化能力。尤其是在mAP指标上,模型能在不同的阈值下保持较高的性能,这为实际应用中的吸烟行为检测提供了坚实的基础。我们的系统将能准确地在各种环境中检测出吸烟行为,为实施吸烟相关的政策和健康倡导提供了有力的技术支持。
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.870 | 0.902 | 0.825 | 0.895 |
F1-Score | 0.84 | 0.89 | 0.80 | 0.87 |
(3)实验结果分析:
在智能视频监控领域,吸烟检测作为一项重要功能,其算法的性能至关重要。我们最近在相同的数据集上对YOLO系列的几种算法进行了深入的实验和比较。本次实验所选的算法包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n,旨在通过F1-Score和mAP两个关键性能指标,来全面评估各版本YOLO算法在吸烟检测任务上的表现。
通过实验数据可以发现,YOLOv6n在mAP上以0.902的成绩领先其他版本,表明其在平均精度上具有最佳的检测效果。mAP(平均精度均值)是衡量检测模型准确性的重要指标,高mAP值意味着模型在各个置信度阈值上均能获得良好的性能。相比之下,YOLOv7-tiny的表现最为逊色,mAP仅为0.825,这可能是因为"tiny"版本的模型为了减少计算资源的使用而简化了网络结构,从而牺牲了一定的准确性。
F1-Score作为精确率和召回率的调和平均值,同样是评价模型性能的重要指标,它更侧重于模型的准确性和可靠性。在这一指标上,YOLOv6n同样以0.89的得分表现最好,其次是YOLOv8n,得分为0.87。YOLOv5nu的F1-Score为0.84,而YOLOv7-tiny再次表现较差,得分为0.80。
总体来看,YOLOv6n无论在mAP还是F1-Score上都表现出了较为出色的性能,其对于吸烟行为的检测能力较强。YOLOv8n虽然在mAP上略低于YOLOv6n,但仍旧保持了相对较高的水平,并且其F1-Score也相当可观。相比之下,YOLOv5nu和YOLOv7-tiny在这两个指标上表现较弱,尤其是YOLOv7-tiny,这提示我们在追求速度和模型轻量化的同时,也要注意到准确性的重要性。此次对比分析为今后的模型选择和优化提供了重要依据,为进一步提高吸烟检测技术的精确度和实用性指明了方向。
4.4 代码实现
在现代计算机视觉领域,将深度学习模型应用于实时图像处理任务已成为一项重要技术。本博客将重点介绍如何通过YOLOv8模型实现吸烟检测的完整过程。此任务不仅涉及模型的准确性,还包括用户界面的交互性和友好性,以便于用户能够直观地观察和评估模型的检测结果。
(1)引入必要的库
系统的整体框架基于QtFusion和PySide6库构建。通过这些库,我们能够创建一个窗口,并在这个窗口中实时展示摄像头捕捉到的图像及检测结果。我们的MainWindow类扩展了QMainWindow,它定义了窗口的基本属性和行为,如尺寸和关闭事件的处理。利用QtWidgets.QLabel作为图像的显示载体,用户能够看到每帧视频在经过算法处理后的输出。
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)初始化模型
我们定义了一个类别名称列表cls_name,它包含了我们要检测的所有对象的名称。然后,我们加载预训练的YOLOv8模型并获取每个类别的颜色。这些颜色将用于在最终的图像上区分不同的对象。
cls_name = ["香烟"] # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/smoking-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
(3)设置主窗口
为了能够有效地与用户交互,我们定义了MainWindow类,这是我们应用程序的主窗口。这个窗口负责显示视频流和检测结果。在构造函数中,我们设置了窗口的尺寸,并创建了一个标签(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() # 关闭窗口
(4)主程序流程
在处理视频流的每一帧图像时,我们的frame_process函数首先调整图像大小以适配界面,然后将图像通过模型进行预处理。在图像预测过程中,我们记录了时间以测量推理速度,这是评估实时应用性能的关键指标。
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控件上显示图像
最后,我们创建了应用程序和主窗口的实例,并设置了MediaHandler来处理视频流。我们连接了frame_process函数到frameReady信号,这样每次新的视频帧准备好时,都会调用这个函数。我们选择默认的摄像头作为视频输入设备,并启动了媒体流的处理。
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())
整个程序以一个典型的Qt应用程序流程结束,显示主窗口并进入主事件循环,等待用户操作或内部事件的发生。这段代码的魅力在于它如何将高级深度学习模型与现代GUI应用程序框架结合起来,创建出一个用户友好且功能强大的实时物体检测系统。通过精心设计的代码结构,我们可以清晰地理解整个系统的工作流程,并欣赏到将深度学习应用于实际问题的潜力。
5. 吸烟检测系统实现
在实现一款实时吸烟检测系统时,我们深入考虑了用户体验和操作便捷性。系统设计思路的核心是将高效的目标检测能力与直观的用户界面(UI)紧密结合,以确保即使是非技术用户也能轻松地使用系统。为此,我们设计了一个综合架构,其中MainWindow类扮演了控制中心的角色,协调处理层和界面层的交互。
5.1 系统设计思路
MainWindow类的主要目标是提供一个用户友好的交互式吸烟检测系统。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。
架构设计
我们的系统设计思路以三层架构为核心:处理层、界面层和控制层。在我们的系统设计中,重点放在了确保各个组件能够协同工作,同时保持足够的模块独立性,以便于未来的维护和升级。
- 处理层(Processing Layer):处理层是系统的技术核心,由YOLOv8Detector类及其方法组成。这个预训练的模型是吸烟检测能力的源泉,负责识别视频流中的吸烟行为,并提供实时反馈。我们对模型进行了细致的优化,确保其能够快速准确地处理图像数据,即使是在复杂的场景中也不例外。
- 界面层(UI Layer):界面层则是用户的第一触点,我们通过Ui_MainWindow类设计了一系列直观的用户交互元素。这些元素不仅使得用户能够直观地观察模型的检测结果,还能够调整设置,以适应不同的监控需求。我们的设计理念是“所见即所得”,用户无需深厚的技术背景,也能轻松掌握系统的操作。
- 控制层(Control Layer):控制层则起到了指挥中心的作用,通过MainWindow类中的方法和槽函数,响应用户的输入,协调媒体处理器的行为和检测模型的运行。无论是启动和停止视频流,还是切换检测模式,控制层都能确保用户的命令得到及时响应,从而使得整个系统的运作更加流畅和精准。
总的来说,我们的交互式吸烟检测系统在设计上力求简洁明了,功能上追求全面高效,体验上注重直观友好。通过这样的系统设计思路,我们为用户提供了一个高度集成的解决方案,用于吸烟行为的实时监测和分析,同时也为未来可能的扩展留下了足够的灵活性。这不仅体现了我们对技术的深入理解,也展示了我们对用户需求的深切洞察。
系统流程
在本博客中,我们将深入了解如何构建一个基于YOLOv8模型的吸烟检测系统。这个系统是一个交互式应用程序,它集成了图像处理、目标检测与用户交互,提供了从图像输入到目标识别的完整流程。我们的目的是提供一个既直观又功能强大的工具,使用户能够轻松处理并分析夜间行车环境中的车辆信息。
- 用户在软件界面上的每一个选择都被设计得直观易懂。无论用户是希望通过摄像头实时监控,还是通过视频文件和静态图像输入,界面上都有清晰的指引来帮助他们完成选择。这种设计大大简化了用户的操作步骤,使得无论是专业人士还是普通用户都能轻松上手。
- 一旦输入源被确定,程序就会调用专门设计的媒体处理器和方法来适当地处理这些数据。例如,如果用户选择了摄像头作为输入源,程序将配置摄像头并开始捕捉图像;如果是视频文件或图像,程序将读取并加载它们。
- 在媒体源准备完毕后,系统进入了连续帧处理的核心流程。每一帧图像都会经历一个精心设计的预处理阶段,包括尺寸调整、颜色空间转换等,以确保图像数据能满足YOLO模型的输入需求。随后,这些预处理后的图像被送入我们的YOLOv8模型中,模型利用其先进的算法精确地检测出画面中的吸烟行为,并实时地反馈结果。
- 系统的另一个亮点在于界面的实时更新功能。检测结果不仅会在界面上以可视化的方式展现出来,用户还能在界面上看到检测统计数据的展示,这些都是通过表格和图形等形式呈现的。这样的即时反馈让用户能够直观地理解当前的检测情况,为后续的操作提供依据。
- 更进一步,我们为用户提供了丰富的交互操作选项。用户可以保存检测结果以供后续使用,或是通过下拉菜单筛选和深入分析特定的结果。此外,我们还增加了媒体控制功能,允许用户根据自己的需求控制媒体播放状态,增强了应用的灵活性和用户的主导性。
总的来说,整个系统流程的设计充分考虑了操作的便捷性和检测功能的高效性,旨在为用户提供一个无缝衔接的吸烟行为检测体验。我们相信,通过这种综合的设计思路,可以使得交互式吸烟检测系统不仅在技术上达到行业领先水平,更在用户体验上树立新的标杆。
5.2 登录与账户管理
在构建吸烟检测系统的过程中,账户管理功能起到了至关重要的作用,它不仅确保了用户数据的安全性,也提供了个性化的用户体验。利用PySide6的强大功能以及SQLite数据库的便捷性,我们设计了一套完整的用户登录界面,并实现了注册、密码管理、个人化设置等功能。
我们的登录界面不仅仅是访问系统的门户,它还允许新用户进行注册,并为现有用户提供账户管理功能。通过用户界面,用户能够轻松进行账户创建、密码修改、头像设置等个性化操作。我们在设计这个系统时考虑到了用户便利性,因此操作流程直观简单,界面友好,确保用户可以不受干扰地管理他们的账户。
进入系统之后,用户会发现一个功能丰富的主界面,不仅可以进行实时的吸烟行为检测,还能够实时显示检测框、类别和置信度等重要信息。无论是处理单张图片、视频文件,还是来自实时摄像头的视频流,甚至是批量文件输入,我们的系统都能够准确识别吸烟行为并将结果即时反馈给用户。
而且,为了增强系统的个性化体验,我们还在登录界面中嵌入了账户注销和重新登录的功能。用户可以在完成检测任务后,选择注销账户,以保障个人信息的安全。如果用户需要重新登录,系统也提供了便捷的操作路径。
通过上述的设计和实现,我们的吸烟检测系统不仅展示了强大的多目标检测能力,还提供了细致的用户管理功能。这使得用户在使用我们的系统进行实时目标检测时,可以享受到个性化和安全的用户体验。这些特点共同确保了我们的吸烟检测系统不仅在技术上是先进的,而且在用户体验上是友好和考虑周全的。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1HW421A74J/
在文件夹下的资源显示如下,下面的链接中也给出了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. ↩︎
Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎
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. ↩︎