基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的口罩识别系统(Python+PySide6界面+训练代码)

摘要:开发口罩识别系统对于提升公共卫生安全和疫情防控具有重要意义。本篇博客详细介绍了如何利用深度学习构建一个口罩识别系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并结合了YOLOv7YOLOv6YOLOv5的对比,给出了不同模型之间的性能指标如mAPF1 Score等结果分析。文章深入讲解了YOLOv8算法的底层原理,提供了相应的Python代码训练数据集,并封装成一个基于PySide6的美观UI界面

系统能够精准地检测和分类图像中是否佩戴口罩,支持选择图片图片文件夹视频文件以及开启摄像头检测,包含热力图分析标记框类别类别统计、可调ConfIOU参数可视化结果显示等功能。另外,设计了基于SQLite数据库的用户注册登录管理界面可点击按钮切换不同模型可方便修改的UI界面。本文旨在为深度学习领域的新手提供一份实用指导和参考,完整的代码和数据集已在文章结尾提供链接,便于读者下载和使用。本文结构如下:

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


演示与介绍视频:https://www.bilibili.com/video/BV1Zi421Z78u/
YOLOv8/v7/v6/v5项目合集https://mbd.pub/o/bread/mbd-ZZualJxu
YOLOv8/v5项目完整资源https://mbd.pub/o/bread/ZZuZlZlr
YOLOv7项目完整资源https://mbd.pub/o/bread/ZZualJps
YOLOv6项目完整资源https://mbd.pub/o/bread/ZZualJpr


前言

        近年来,随着全球范围内公共卫生事件的爆发,口罩检测技术得到了迅速发展和广泛应用。这项技术主要集中在通过图像识别和机器学习方法来自动识别人群中是否佩戴口罩,以及口罩佩戴的正确性。当前的研究重点包括了提高检测准确性、降低误报率、以及增强系统对不同环境条件(如不同光线和背景)的适应性。

        早期的口罩检测主要依赖于传统的图像处理技术,如边缘检测、颜色分析等。在过去几年中,随着人工智能和机器学习技术的快速发展,口罩检测技术也取得了显著进步。目前,最常见的技术是基于深度学习的面部识别系统,这些系统通过训练大量的带口罩和不带口罩的面部图像,来提高识别的准确性。卷积神经网络(CNN)的发展,口罩检测的准确度和效率得到了显著提升[1]

        随着YOLO(You Only Look Once)系列目标检测算法的出现和发展,已经提出了更高效、更精准的目标检测工具。从最早的YOLO[2],到YOLO9000[3],再到YOLOv4[4],YOLOv5等,这一系列的发展都在推动着目标检测技术的进步。在去年美团发布了YOLOv6[5],然后紧接着YOLOv7[6],到现在的YOLOv8[7],这个最新版本在许多方面都进行了优化与改进,如使用了更复杂的网络架构,更精细的预测机制,以及加入了对小目标的更好处理。

        注意力机制,尤其是自注意力(Self-Attention),在众多深度学习模型中扮演着重要角色。它能够使模型聚焦于输入数据中的关键部分,对于理解图像中的复杂模式特别有效。在口罩识别等视觉任务中,注意力机制有助于模型更好地区分遮挡和非遮挡的面部区域,从而提升识别性能。

        MMDetection是一个开源的目标检测工具箱,提供了丰富的目标检测和实例分割算法,包括但不限于Faster R-CNN、Mask R-CNN、YOLO等。MMDetection以其模块化和可扩展性强的特点,支持快速实验和研究不同算法的组合,对于开发和测试新的口罩识别模型极为有用。

        在COVID-19疫情期间,许多公共场所部署了口罩检测系统以确保人们遵守佩戴口罩的规定。此外,这项技术也被应用于机场安检、公共交通系统以及一些需要身份验证的场合口罩检测技术在当前的公共卫生危机中发挥了重要作用。口罩检测作为一个新兴的研究领域,随着技术的不断进步和社会需求的变化,其发展潜力巨大。然而,为了充分发挥其价值,需要克服当前的技术挑战,并且在尊重个人隐私和伦理原则的基础上进行发展。未来的研究将更加注重系统的准确性、适应性和用户体验,以更好地服务于公共健康和安全。

        尽管口罩检测技术取得了一定的进展,但是仍面临一些挑战。例如,不同类型和颜色的口罩可能会影响检测的准确性。此外,环境因素如光照条件和背景噪声也可能对系统的性能产生影响,还需要确保这项技术的使用不侵犯个人隐私权。

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

  1. 采用最先进的YOLOv8算法进行口罩识别: 我们深入探讨了YOLOv8算法在口罩识别任务中的应用,展示了其在效率和精准度方面相比于YOLOv7、YOLOv6、YOLOv5等早期版本的显著优势。通过对这些算法的细致对比,本文不仅展示了YOLOv8的先进性,也为研究者和从业者提供了价值的参考,鼓励他们在未来的研究中考虑采用更高效的算法。
  2. 利用PySide6实现用户界面友好的口罩识别系统: 本文详细介绍了如何使用Python的PySide6库开发一个既美观又易于操作的口罩识别系统界面。这一贡献不仅提高了口罩识别系统的可用性,也促进了高效算法如YOLOv8在实际应用中的普及和应用。
  3. 设计了登录管理功能以提升系统安全性: 系统集成了登录管理功能,增强了使用过程中的安全保障,并为后续开发个性化服务打下了基础。这一创新点兼顾了用户体验和系统安全,体现了本研究在系统设计方面的综合考虑。
  4. 对YOLOv8模型进行了深入研究: 除了应用实现,本文还对YOLOv8模型的性能进行了全面的评估和分析,包括精确度、召回率以及在不同条件下的表现等,为了解和优化YOLOv8算法提供了坚实的基础。
  5. 提供完整的数据集和代码资源包: 为了促进学术共享和技术传播,本文提供了一套完整的数据集和代码资源包,使读者能够轻松复现研究结果,并在此基础上进行进一步的研究和开发。

1. 数据集介绍

        在这个博客章节中,我们将详细介绍为口罩识别系统构建的专用数据集。数据集的质量直接影响着机器学习模型的训练效果和最终性能,因此,我们精心准备和预处理了这个包含2000张图像的数据集,旨在为研究人员和开发者提供一个坚实的基础,以开发和评估他们的口罩识别模型。本数据集的构成相当平衡,其中包含1200张训练图像、400张验证图像以及400张测试图像。这种划分确保了模型可以在充足的数据上进行训练,同时也有足够的数据进行验证和独立测试,以避免过拟合并评估模型的泛化能力。所有图像均经过严格的预处理,包括自动方向校正和EXIF方向信息的剥离,确保所有图像在输入模型前方向一致。此外,为了适应目标检测算法的要求,所有图像都被标准化为640x640像素的尺寸,通过拉伸的方式进行调整。自适应均衡化技术也被用来增强图像的对比度,这有助于模型在不同光照条件下更准确地识别口罩。

        数据标注的准确性对于训练高效的目标检测模型至关重要。在我们的数据集中,每张图像都被精确标注,定义了戴口罩和未戴口罩两个类别。从类别分布上看,戴口罩的样本数量略多于未戴口罩,反映了当前公共卫生情况下对戴口罩情形的重视。标注框的分布分析显示,大多数标注框的中心点集中在图像中心区域,这可能与实际场景中人脸位置相对摄像头的中心位置有关。标注框的尺寸多集中在一定的范围内,表明大部分人脸标注框的大小比例相对一致,有利于模型识别和预测。

        尽管数据集在一致性和准确性上表现良好,但我们也注意到标注框在图像中的位置和尺寸存在一定程度的集中趋势。为了提升模型的泛化能力,我们建议在未来的工作中可以通过更多样化的数据增强技术来扩展数据集的多样性。例如,加入更多不同位置和尺寸比例的人脸图像,以及进行随机裁剪、旋转和色彩调整等操作。博主使用的类别代码如下:

Chinese_name = {'mask': "佩戴口罩",'no-mask': "未戴口罩", }

        总之,我们提供的这个数据集旨在为口罩识别任务提供一个坚实的训练和测试基础。通过细致的预处理和严格的标注流程,我们确保了数据集的高质量和实用性。同时,我们也期望通过本文分享的数据集分析,能够启发更多的研究人员和开发者在此基础上进行创新和改进。未来,我们也计划不断完善和扩充这个数据集,以支持口罩识别技术的发展和应用。

2. 系统界面效果

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

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

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

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

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


3. YOLOv8算法原理

        YOLOv8(You Only Look Once version 8)是一种最新的、用于目标检测、图像分类和实例分割任务的先进YOLO模型。YOLOv8与前代产品相比,专注于提高准确性和效率。

        YOLOv8算法提供了一个全新的SOTA模型,可用于计算机视觉领域的目标检测、图像分类、实例分割和目标跟踪等任务。YOLOv8的主要结构包括主干特征提取网络(Backbone)、特征强化提取网络(Neck)以及检测头(Head)三个部分。其网络结构图如下图所示。

        骨干网络和Neck部分跨阶段局部网络(Cross Stage Partial Network,CSP)模块的预处理从三次卷积换成了两次卷积,借鉴YOLOv7 ELAN模块多堆叠的设计思想,将YOLOv5的C3结构换成了梯度流更丰富的C2f结构,并对不同尺度模型调整了不同的通道数,使网络能够学习到更多的特征,并且具有更强的鲁棒性。CSP模块的预处理从三次卷积换成了两次卷积,并且借鉴了YOLOv7的多堆叠结构。具体的实现方式是第一次卷积的通道数扩充为原来的两倍,然后将卷积结果在通道上对半分割,这样可以减少一次卷积的次数,加快网络的速度。[8]
        检测头部分,YOLOv8采用无锚分体式检测头,与基于锚框的方法相比,有助于提高准确性和更高效的检测过程。Head部分较YOLOv5而言有两大改进。首先,换成了目前主流的解耦头结构,将分类和检测头分离,用于缓解分类和定位任务之间存在的冲突;其次,参考YOLOX,从Anchor-Based换成了AnchorFree,面对长宽不规则的目标比较有优势。[8:1]
        损失函数计算部分,YOLOv8的Loss计算包括两个部分:分类分支和回归分支。分类分支依然采用BCELoss,回归分支需要和分布式聚焦损失函数(DistributionFocalLoss,DFL)中提出的积分形式表示法绑定,因此使用了DFL,同时还使用了(Complete Intersection over Union, CIoU)Loss。[8:2]

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/val_178.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 模型训练

        在模型训练部分,首先导入YOLO模型,并加载了预训练的YOLOv8模型。

from ultralytics import YOLO  
model = YOLO('./weights/yolov8s.pt', task='detect')  

        赋值data_name,获取数据集的yaml的绝对路径。

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

        接着开始训练模型。其中指定了训练数据的配置文件路径,使用CPU进行训练,使用2个工作进程加载数据,输入图像的大小为640x640,训练100个epoch,每个批次的大小为8。

results = model.train(  
    data=data_path,  
    device='cpu',  
    workers=2,  
    imgsz=640,  
    epochs=100,  
    batch=8,  
    name='train_v8_' + data_name 
)

        在深度学习中,我们通常通过损失函数下降的曲线来观察模型训练的情况。在训练结束后,我们也可以在logs目录下找到生成对若干训练过程统计图。下图为博主训练口罩目标检测过程中训练情况截图,以及损失函数曲线图,展示了模型在训练和验证过程中的性能指标变化。

        首先,训练集上的损失函数图表中,我们可以看到随着训练的进行,框损失(train/box_loss)、分类损失(train/cls_loss)和目标损失(train/obj_loss)都呈现出了下降的趋势,并且在经过一定数量的训练周期后,损失值开始趋于稳定。这表明模型在识别目标的位置、分类及存在性上都取得了学习效果,并且随着训练的进行,其性能稳步提升。然而,在验证集上,损失函数值相比训练集要高,且波动更大。这可能是由于模型在验证数据上的泛化能力不如在训练集上那样强,或是验证集中包含了更多训练集未覆盖的难以识别的样本。验证集上的框损失(val/box_loss)、分类损失(val/cls_loss)和目标损失(val/obj_loss)虽然在训练过程中逐渐下降,但损失值的波动表明模型对于未见数据的适应性还有待提高。

        从模型的精度(precision)和召回率(recall)图中可以观察到,模型在训练过程中逐渐达到较高的精度和召回率,这意味着模型能够较好地识别出数据集中的正样本,并且在它识别出来的样本中,有较高比例是正确的。但是,我们也注意到精度和召回率的曲线在训练过程中出现了一些波动,这可能是由于模型在某些训练批次中遇到了难以分类的样本,或是训练数据中存在一些噪声。最后,评估模型性能的另一个重要指标是平均精度均值(mAP),其中mAP@0.5和mAP@0.5:0.95分别代表了模型在IOU阈值为0.5时和0.5到0.95这个范围内的平均精度。mAP@0.5的曲线显示出模型在IOU阈值为0.5时有着较好的性能,而mAP@0.5:0.95的波动则暗示在更为严格的IOU阈值下,模型的表现存在一定程度的波动。这可能表明模型在更精确地定位目标上仍有改进的空间。

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

         从曲线图中可以看出,“no-mask”类别的PR曲线(橙色)高于“mask”类别(蓝色),且“no-mask”类别的mAP@0.5值达到了0.948,而“mask”类别的mAP@0.5值为0.824。这表明模型在检测未戴口罩的样本时更加精确和可靠。高精确度表示在模型预测为“no-mask”类别的样本中,有较高比例确实是未戴口罩的。同时,高召回率表明模型能够识别出大部分实际未戴口罩的样本。相比之下,戴口罩类别的精确度和召回率较低,可能是因为戴口罩的样本在视觉特征上更加多样化,或者因为口罩遮挡了部分面部特征,增加了识别的难度。

         所有类别合并后的mAP@0.5值为0.886,说明整体模型在IOU阈值为0.5时具有较高的平均检测准确性。这个值结合了所有类别的检测性能,可以视为模型整体性能的指标。值得注意的是,PR曲线图中“mask”类别的曲线在召回率接近1时精确度急剧下降,这意味着为了尽可能不遗漏戴口罩的样本(即提高召回率),模型不得不降低判断标准,导致一些实际未戴口罩的样本被错误地分类为戴口罩,从而减少了精确度。

         总体而言,模型在“no-mask”类别上的表现比“mask”类别更优,可能是由于未戴口罩的脸部特征更容易被模型捕捉。未来的工作可以着重于提高戴口罩类别的精确度和召回率,例如通过增加戴口罩样本的多样性、优化模型对遮挡特征的学习能力或调整分类阈值。此外,模型整体表现良好,但应继续探索提升“mask”类别检测性能的方法,以实现更均衡的分类效果。通过这些分析,我们可以更深入地理解模型在各个类别上的表现,并指导后续的模型优化和改进策略。

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.879 0.740 0.723 0.886
F1-Score 0.85 0.77 0.78 0.86

(3)实验结果分析

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

        我们可以看到YOLOv5nu和YOLOv8n的表现相较于YOLOv6n和YOLOv7-tiny有显著的提升。YOLOv5nu的mAP为0.879,而F1-Score为0.85,这表明YOLOv5nu在平衡假阳性和假阴性方面做得相对较好。它在识别准确性和结果的精确性-召回率平衡上都有着优秀的表现。YOLOv6n的性能在四个版本中是最低的,mAP为0.740,F1-Score为0.77。mAP较低可能表明它在各种阈值下的平均精确度较低,而较低的F1-Score表明精确度与召回率之间存在较大的平衡问题。

        YOLOv7-tiny,作为一个轻量级版本,其性能略高于YOLOv6n,mAP和F1-Score分别为0.723和0.78。尽管作为一个“tiny”版本,它在资源受限的环境下可能是一个较好的选择,但在性能方面仍有所欠缺。YOLOv8n展现了最优秀的性能,mAP达到了0.886,F1-Score为0.86,这说明YOLOv8n不仅在整体的平均检测准确性上表现出色,而且在精确度与召回率之间达到了很好的平衡。这可能归功于YOLOv8版本在算法结构上的优化,例如更有效的特征提取网络、更好的训练策略以及更先进的损失函数等。

        从这些数据可以看出,随着YOLO版本的迭代,性能有了显著的提升,特别是从YOLOv6到YOLOv8的提升最为明显。这种性能的提升可能是由于算法内部结构的改进,包括更好的卷积网络结构、注意力机制的引入以及更加高效的损失计算方法。对于实际应用来说,YOLOv8n的高性能使其成为在精确度和速度之间需要权衡时的理想选择。然而,对于计算资源受限的环境,YOLOv7-tiny依然有其应用的价值。这些分析结果为我们提供了在不同场景下选择适合的YOLO版本的重要信息。

4.4 代码实现

        在这一节中,我们将详细介绍如何使用YOLOv8实现摄像头画面中口罩识别的代码实现。这个实现主要包括创建主窗口、处理每一帧图像、加载模型、开始处理媒体流等步骤。

        在实时口罩识别系统中,结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及口罩的检测和标注等功能。

(1)引入必要的库
        首先,需要引入一些必要的库,包括图像处理库OpenCV、图形界面库QtFusion和PySide6,以及物体检测模型库YOLOv8Model等。

import sys  
import time  

import cv2  
from QtFusion.BaseFrame import FBaseWindow  
from QtFusion.Handler import MediaHandler  
from QtFusion.ImageUtils import drawRectBox  
from QtFusion.ImageUtils import get_cls_color  
from PySide6 import QtWidgets, QtCore  
from YOLOv8Model import YOLOv8Detector

(2)设置主窗口
        在设置主窗口的过程中,定义了一个名为MainWindow的类,该类继承自QtFusion库中的FBaseWindow类。在MainWindow类中,设置了窗口的大小,并创建了一个用于显示图像的标签。此外,我们还设置了一个按键事件,使得用户可以通过按Q键来关闭窗口。

class MainWindow(FBaseWindow):  
    def __init__(self):  
        super().__init__()  
        self.resize(850, 500)  
        self.label = QtWidgets.QLabel(self)  
        self.label.setGeometry(0, 0, 850, 500)  

    def keyPressEvent(self, event):  
        if event.key() == QtCore.Qt.Key_Q:  
            self.close()

(3)图像帧处理与口罩识别
        在进行图像帧处理和机器器件检测的过程中,定义了一个名为frame_process的函数。首先,将图像的大小调整为850x500,然后使用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控件上显示图像

(4)初始化检测模型和设备

        在主函数部分,我们首先实例化YOLOv8Detector类,并加载预先训练好的模型权重。根据模型预设的类别标签获取了每个类别对应的颜色,这些颜色将在后续的检测结果可视化中使用。创建一个MainWindow对象,以便在屏幕上显示图像。再创建了一个MediaHandler对象,用于从摄像头设备中读取视频流并处理每一帧图像。

cls_name = ["佩戴口罩", "未戴口罩"] 
model = YOLOv8Detector()  
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))  
colors = get_cls_color(model.names)  

app = QtWidgets.QApplication(sys.argv)  
window = MainWindow()  

videoHandler = MediaHandler(fps=30)
videoHandler.frameReady.connect(frame_process)  
videoHandler.setDevice(device=0)  
videoHandler.startMedia()  


window.show()
sys.exit(app.exec())

        在此,"weights/best-yolov8n.pt"是经过大量口罩图像训练得到的模型权重文件,而model.names则包含了模型可以识别的所有口罩类别的名称。这就是实现实时口罩检测系统的完整代码,整个过程包括了数据预处理、YOLOv8模型预测、结果后处理和可视化等步骤,结构清晰,逻辑简洁。通过这样的方式,可以实现对摄像头捕获的画面进行实时口罩识别和标注。


5. 口罩识别系统实现

        在实现一款实时口罩识别系统时,我们的目标是打造一个直观、易于使用且功能强大的用户界面,同时确保系统的高效和稳定性。我们的设计理念是将复杂的功能模块化,易于维护和扩展,并且保证用户与系统的交互尽可能简洁明了。

5.1 系统设计思路

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

架构设计
        我们的系统设计遵循了经典的MVC(Model-View-Controller)架构模式,将应用程序划分为三个核心组件:模型(Model)、视图(View)和控制器(Controller),分别对应我们的处理层、界面层和控制层。

  • 处理层(Processing Layer):处理层是系统的数据处理中心,核心由YOLOv8Detector类承担,该类封装了YOLOv8模型和相关的数据处理方法。它负责接收输入数据,运用预训练的模型进行图像处理和口罩检测,并将结果输出给控制层。此层专注于算法的实现和优化,确保检测结果的准确性和处理速度。
  • 界面层(UI Layer):界面层则是用户与系统交互的前端,由Ui_MainWindow类实现,它提供了图形用户界面(GUI)。用户可以通过这个界面上传图片或视频进行口罩检测,界面会展示检测的实时结果。我们在设计界面时注重用户体验,界面布局直观、操作简单,以支持非技术用户的日常使用。
  • 控制层(Control Layer):控制层作为桥梁,连接处理层和界面层,由MainWindow类中的方法和槽函数组成。它响应界面层的用户操作,调用处理层的检测方法,并将结果反馈到界面上。此外,控制层还负责协调各组件之间的通信,使用Qt的信号和槽机制来实现模块间的松耦合交互,提高了代码的可读性和系统的可靠性。

        为了进一步提升系统的实用性和可扩展性,我们还考虑到了后续可能的功能迭代和技术升级。系统设计中预留了接口和抽象层,方便未来引入新的检测模型或升级现有算法,以及添加新的用户功能,如实时视频流处理、云端数据同步等。综上所述,我们的交互式口罩识别系统系统在设计上追求用户友好性、模块独立性和系统可扩展性。通过精心的架构设计,将先进的YOLOv8目标检测技术与高效的用户界面相结合,我们为用户提供了一个强大而直观的口罩检测工具。

系统流程
        以下是口罩识别系统的工作流程:

  1. 用户打开应用程序,创建MainWindow类的实例,并初始化界面和相关参数。
  2. 用户通过界面操作选择摄像头、视频或图像作为输入源。
  3. 根据用户选择的输入源,调用相应的处理器和方法进行媒体处理和检测。
  4. 当媒体输入启动成功后,进入循环处理帧的流程:
  • 对每一帧图像进行预处理。
  • 使用YOLOv8模型对图像进行口罩识别,得到检测结果。
  • 根据检测结果更新界面的显示,包括绘制检测框、更新表格数据和条形图等。
  • 用户可通过按钮进行保存检测结果、显示作者信息和版本信息等操作。
  • 用户可通过控制按钮来控制摄像头、视频和图像的启动和停止。
  • 用户可通过表格和下拉菜单选择特定的检测结果进行查看和分析。

5.2 登录与账户管理

        在我们的交互式口罩识别系统中,为了提供更加安全和个性化的用户体验,我们精心设计了一套完整的用户账户管理系统。该系统基于PySide6框架构建用户界面,使用SQLite作为后端数据库来存储用户数据,确保了操作的流畅性和数据的安全性。

        首先,系统提供了一个直观的登录界面,用户可以在这里进行账户的注册和登录。我们意识到每个用户的需求和喜好都是独特的,因此在账户创建过程中,除了基本的身份验证信息外,用户还能设置个性化头像,使每个账户都具有独特的个人标识。一旦注册完成,用户便可以使用自己的账户在不同设备上登录系统,无缝地同步个人设置和历史记录。

        除了基础的注册和登录功能外,我们还为用户提供了密码修改和账户注销的选项,以满足用户对隐私和安全性的关切。用户可以随时更新自己的密码,确保账户安全,同时也可以在必要时注销账户,保护个人信息不被他人访问。

        在用户成功登录系统后,将进入主界面开始口罩识别任务。该系统支持多种数据输入方式,包括图片、视频、实时摄像头捕获和批量文件处理。用户可以在个人空间中管理和查看自己的检测记录,包括检测框、类别及置信度等信息的实时显示。这些信息不仅可以在主界面实时查看,还可以被保存下来,供用户日后查阅和分析。

        此外,我们设计的账户管理系统还考虑到了易用性。例如,如果用户忘记了密码,我们提供了密码找回的功能;如果用户希望在多个设备间同步设置和历史记录,我们也提供了相应的支持。通过以上的用户账户管理设计,口罩识别系统能够满足用户在实时目标检测场景下的各种需求,无论是个人用户还是企业用户,都可以依赖这一系统高效、安全地完成口罩识别任务,同时享受个性化的用户体验。

下载链接

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

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

演示与介绍视频:https://www.bilibili.com/video/BV1Zi421Z78u/
YOLOv8/v7/v6/v5项目合集https://mbd.pub/o/bread/mbd-ZZualJxu
YOLOv8/v5项目完整资源https://mbd.pub/o/bread/ZZuZlZlr
YOLOv7项目完整资源https://mbd.pub/o/bread/ZZualJps
YOLOv6项目完整资源https://mbd.pub/o/bread/ZZualJpr

    在文件夹下的资源显示如下,下面的链接中也给出了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. Zhang, Y., et al. (2022). "Deep Learning for Mask Detection in the Era of COVID-19." Journal of Computer Science and Technology. ↩︎

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

  3. Redmon J, Farhadi A. YOLO9000: better, faster, stronger[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7263-7271. ↩︎

  4. Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020. ↩︎

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

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

  7. Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎

  8. 周飞,郭杜杜,王洋,王庆庆,秦音,杨卓敏,贺海军.基于改进YOLOv8 的交通监控车辆检测算法[J/OL].计算机工程与应用. https://link.cnki.net/urlid/11.2127.TP.20240104.0953.008 ↩︎ ↩︎ ↩︎

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