摘要:开发用于日常环境中的人脸识别系统对增强安全监测和提供定制化服务极为关键。本篇文章详细描述了运用深度学习技术开发人脸识别系统的全过程,并附上了完整的代码。该系统搭建在强大的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界面+训练数据集)
前言
在当今快速发展的智能化社会中,人脸检测技术已经成为一个重要的研究领域,特别是在日常场景下的应用更是广泛而深入。从安全监控到智能广告,从个性化服务到社会管理,人脸检测技术正逐渐成为连接现实世界与智能系统的重要桥梁。
人脸检测作为计算机视觉领域的一项基础任务,其研究意义不仅仅体现在技术层面,更关乎其在实际应用中所承载的社会价值。随着深度学习技术的发展,尤其是YOLO(You Only Look Once)系列算法的推出和迭代,日常场景下的人脸检测技术取得了飞速的进展。从YOLOv5到YOLOv8,每一次更新都带来了检测速度与准确度的显著提升123。这些技术的进步不仅提高了人脸检测的实用性,也为进一步的应用探索提供了可能。
数据集的发展也是推动人脸检测技术进步的重要因素。早期的人脸检测研究多依赖于FDDB和WIDER FACE等数据集,这些数据集在当时对算法的改进和评估起到了重要作用4。近年来,更多高质量、多样性的数据集被开发出来,例如CASIA-WebFace和MS-Celeb-1M,这些数据集不仅在规模上远超早期数据集,还在多样性和复杂度上进行了大幅提升,更适合训练和测试现代深度学习模型5。
尽管人脸检测技术取得了显著进展,但在日常场景下的应用仍面临许多技术挑战。例如,极端光照条件、面部遮挡、复杂背景和多种姿态变化等问题,都极大地增加了检测难度。此外,随着隐私保护意识的提高,如何在确保个人隐私的前提下进行有效的人脸检测,也成为了一个亟待解决的问题。
面对这些挑战,未来的研究趋势可能会集中在以下几个方面:一是算法的优化和创新,如通过引入注意力机制、神经网络架构搜索(NAS)等技术来提高模型的性能和效率;二是数据集的多样化和真实性,通过构建更接近真实世界场景的数据集来提高模型的泛化能力;三是隐私保护技术的研究,探索在保护用户隐私的前提下进行有效人脸检测的新方法。
本博客旨在介绍基于YOLOv8算法的日常场景下的人脸检测系统,不仅深入探讨了算法原理和实现过程,还详细比较了YOLO系列中不同版本算法的性能差异。通过这篇博客,我们期望为人脸检测技术的研究与应用提供新的视角和实用工具。本文的主要贡献包括以下几个方面:
- 我们采用了当前最先进的YOLOv8算法作为核心,实现了在日常场景下对人脸的高效准确检测。相较于早期的深度学习模型,如CNN和ResNet,YOLOv8展示出了更优秀的性能,尤其在处理速度和检测精度上都有显著提升。本文不仅详细介绍了YOLOv8算法的工作原理,还通过实验比较了YOLOv7、YOLOv6、YOLOv5等不同版本在人脸检测任务上的效果,为读者提供了一份全面的性能评估报告。
- 我们利用PySide6库成功构建了一个用户友好的人脸检测系统界面。这一创新使得日常场景下的人脸检测变得更加直观和便捷,极大地促进了YOLOv8算法在实际应用中的普及。系统界面的设计旨在为用户提供简洁明了的操作体验,同时保证了足够的功能性和灵活性,满足不同用户的需求。
- 为了增强系统的安全性和个性化服务,我们特别设计了登录管理功能。这一设计不仅保护了用户的个人信息安全,还为将来引入更多定制化功能留下了空间,展现了系统的可扩展性。
- 在技术研究方面,本文对YOLOv8模型进行了深入的性能分析,包括对模型精准度、召回率等关键指标的综合评估,以及在不同环境和条件下的性能测试。这些研究成果不仅帮助我们更好地理解了YOLOv8算法的性能特点,也为进一步优化和改进算法提供了宝贵的数据支持。
- 为了便于读者理解和应用,本文还提供了一套完整的数据集和代码资源包。这些资源覆盖了从训练到测试的全过程,使得读者能够轻松复现实验结果,并在此基础上进行进一步的研究和开发。
1.数据集介绍
在构建高效的人脸检测系统时,一个精心设计和平衡的数据集是不可或缺的。我们的数据集共包含16,103张图像,其中训练集有10,877张,验证集有3,226张,测试集有2,000张。这样的数据集规模确保了系统在面对现实世界的多样化人脸时,能够展现出高度的准确性和鲁棒性。
在数据集构建过程中,我们特别注意到了实例分布的多样性。数据集中的人脸涵盖了从单人肖像到群体聚会的各种场景,这反映出了日常生活中人脸检测的真实复杂性。图像包含了各种环境下的人脸,从户外自然光照到室内人造光源,从直视镜头到侧脸,每种情况都对检测算法提出了不同的挑战。
此外,我们对数据集进行了细致的预处理和增强处理,包括图像标准化以及应用多种数据增强技术。这些处理不仅提升了数据的一致性,还增加了数据的变化性,模拟了实际应用中可能遇到的各种挑战,如光照变化、遮挡和表情多样性等。同时,为了训练出能够适应不同宽高比人脸的模型,我们在数据集中包含了多种形状和尺寸的人脸,确保模型能够灵活识别各种类型的人脸。
从数据集的分布图中,左上角的图展示了数据集中人脸实例的数量,红色区块清晰地表明了人脸这一类别在数据集中的统治地位。这个单一类别的大量实例对于深度学习模型的训练是非常有利的,因为它可以使模型在学习过程中更加专注于人脸特征的提取和识别。
左下角的图展示了人脸检测框在图像中的位置分布。我们可以看到大量的点集中在图像的中央区域,这表明大部分人脸位于图像中心附近。这种分布可能是因为在日常拍摄中,人们往往会不自觉地将拍摄对象居中。然而,这也暗示了一个潜在的偏差:模型可能会对位于中心区域的人脸有更好的识别性能,而对边缘区域的人脸检测则可能存在一定的挑战。
右下角的图反映了检测框的宽高比分布。我们观察到大多数人脸检测框倾向于更接近正方形的比例,但也存在一些较宽或较窄的检测框。这种多样的宽高比展示了人脸在图像中可能呈现的不同姿态和表达,从正面到侧面,从直视到俯视,都在这些数据中得到了体现。
综合以上分析,我们的数据集在人脸类别的覆盖度、位置分布和宽高比上显示出了良好的多样性和均衡性。这为训练出一个能够准确识别各种实际场景中人脸的模型提供了坚实的基础。在接下来的博客内容中,我们将进一步探讨如何利用这些特点来优化我们的人脸检测模型,确保它在实际应用中具有更高的准确性和鲁棒性。通过对数据集特性的深入理解,我们将能够更有针对性地调整训练策略,从而提升模型的综合性能。
数据集的标注质量对于训练过程至关重要。我们的数据集中每个人脸都被精确标注了边界框,这些边界框不仅提供了人脸的位置信息,而且还包含了人脸的类别信息。图像中人脸的位置主要集中在中心区域,这可能会导致模型对中心区域的人脸识别性能优于边缘区域。为了解决这一问题,我们在数据增强阶段特别强调了对图像边缘区域人脸的处理,以提升模型的整体识别能力。博主使用的类别代码如下:
Chinese_name = {'face': "人脸"}
总之,我们精心构建的数据集不仅在数量上满足了深度学习模型的需求,而且在质量上也经过了精细的打磨。从预处理到增强,从标注到类别平衡,每一个步骤都旨在为人脸检测系统的开发提供坚实的基础。通过对这些数据的深入分析和理解,我们确保了训练出来的模型能够在真实世界的复杂场景中准确高效地工作。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行人脸表情检测的图片或视频,或者启动摄像头进行实时检测。在进行人脸表情检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
Ultralytics公司于2023年初发布YOLOv8模型,相较于2020年发布的YOLOv5模型,YOLOv8模型将C3模块(CSP Bottleneck with 3 convolutions)改进成C2f模块(CSP Bottleneck with 2 convolutions),C3模块和C2f模块结构如下图(a)所示。图中CBS(Convolutions Bn SiLU)模块由基础卷积(Conv)、批量归一化(BN)和激活函数(SiLU)组成。C2f模块采用了多分支流设计,为模型提供了更丰富的梯度信息,强化了模型的特征提取能力,提高网络的学习效率。
YOLOv8模型仍然采用anchor free方法,降低检测过程中正样本框数量,并提升处理速度。此外,模型结合了GFL(generalized focal loss)损失计算策略,将Detect模块由YOLOv5中的耦合头改进成解耦头,如上图(b)所示。解耦头将分类任务和回归任务分开进行,避免了两个任务之间的干扰,理论上能够提高模型的训练效率。传统的YOLO系列算法的耦合头输出三类信息,而YOLOv8模型中的解耦头仅输出分类和回归信息。分类信息的输出通道数等于类别数,输出的内容综合了分类信息和置信度信息。回归信息的输出通道数等于4 reg_max(Regression maximum),输出内容为回归框在最大回归范围上的概率分布。
YOLOv8采用了动态标签匹配策略,增加了正样本框选择的灵活度。在损失计算方面,YOLOv8除了计算分类和回归损失外,还引入了DFL(distribution focal loss)损失。DFL损失利用交叉熵的思想,通过将预测框回归至标签框的上下整数范围内,优化模型训练。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行人脸表情检测的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
import cv2
from ultralytics import YOLO
接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
model.load_model(abs_path("weights/emotion-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)
4.2 模型训练
这里我们开始训练和测试自己的数据集,在cmd终端或pycharm中运行run_train_model.py进行训练,以下是训练过程中的结果截图。YOLOv8的损失函数是其性能的关键部分,它指导模型学习如何准确地检测和分类对象。YOLOv8损失函数通常由以下几部分组成:
坐标损失(Bounding Box Loss):这部分损失确保预测的边界框准确地覆盖目标对象。它通常使用均方误差(Mean Squared Error, MSE)来计算预测框和真实框之间的差异。公式表示为:
L c o o r d = ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] L_{coord} = \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{ij}^{obj} [(x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2] Lcoord=i=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2]
置信度损失(Confidence Loss):这部分损失计算模型预测的边界框中存在对象的置信度与实际情况之间的差异。它通常使用交叉熵损失(Cross-Entropy Loss)来计算。
L c o n f = ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j log ( σ ( C i ) ) + 1 i j n o o b j log ( 1 − σ ( C i ) ) L_{conf} = \sum_{i=0}^{S^2} \sum_{j=0}^{B} 1_{ij}^{obj} \log(\sigma(C_i)) + 1_{ij}^{noobj} \log(1 - \sigma(C_i)) Lconf=i=0∑S2j=0∑B1ijobjlog(σ(Ci))+1ijnoobjlog(1−σ(Ci))
分类损失(Classification Loss):这部分损失计算预测的类别与真实类别之间的差异。对于多类别分类问题,通常使用交叉熵损失。
L c l a s s = − ∑ i = 0 S 2 1 i o b j ∑ c ∈ c l a s s e s p i ( c ) log ( p ^ i ( c ) ) L_{class} = -\sum_{i=0}^{S^2} 1_{i}^{obj} \sum_{c \in classes} p_i(c) \log(\hat{p}_i(c)) Lclass=−i=0∑S21iobjc∈classes∑pi(c)log(p^i(c))
整体损失函数是这三个部分的加权和,可以表示为:
L = λ c o o r d L c o o r d + λ c o n f L c o n f + λ c l a s s L c l a s s L = \lambda_{coord} L_{coord} + \lambda_{conf} L_{conf} + \lambda_{class} L_{class} L=λcoordLcoord+λconfLconf+λclassLclass
以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:
超参数 | 设置 | 说明 |
---|---|---|
学习率(lr0 ) | 0.01 | 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。 |
学习率衰减(lrf ) | 0.01 | 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。 |
动量(momentum ) | 0.937 | 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。 |
权重衰减(weight_decay ) | 0.0005 | 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。 |
热身训练周期(warmup_epochs ) | 3.0 | 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。 |
批量大小(batch ) | 16 | 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。 |
输入图像大小(imgsz ) | 640 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在模型训练部分,首先导入YOLO模型,并加载了预训练的YOLOv8模型。
from ultralytics import YOLO
model = YOLO('./weights/yolov8s.pt', task='detect')
接着开始训练模型。其中指定了训练数据的配置文件路径,使用GPU进行训练,使用2个工作进程加载数据,输入图像的大小为640x640,训练120个epoch,每个批次的大小为8,训练任务的名称为’train_emotion’。
results2 = model.train(
data=data_path,
device='0',
workers=workers,
imgsz=640,
epochs=120,
batch=batch,
name='train_v8_' + data_name
)
在深度学习模型的训练过程中,损失函数图像是理解模型学习过程和评估模型性能的关键。本博客将分析上图所示的YOLOv8训练过程中的损失函数图像,这些图像包含了不同损失类型的变化趋势以及性能指标,它们为我们提供了模型训练状态的直观反馈。
从损失函数图中可以观察到,训练和验证的框损失(box_loss)随着训练的进行呈下降趋势,这表明模型在定位目标的准确性上逐渐提升。类别损失(cls_loss)和目标损失(obj_loss)的下降也反映了模型在识别目标类别和检测目标存在性方面的学习效果。值得注意的是,验证损失的曲线在初期下降迅速,随后逐渐趋于平稳,这通常意味着模型在验证集上的泛化能力趋于稳定。
在性能指标方面,我们看到精确度(precision)和召回率(recall)随着训练逐步提高,这表明模型能够更准确地检测出更多的正样本。mAP(平均精度均值)是衡量目标检测模型性能的重要指标,其值也随着训练逐步提高,表明模型对于不同阈值下检测性能的整体提升。特别是mAP@0.5和mAP@0.5:0.95两个指标,它们分别代表了模型在IoU(交并比)为0.5时的性能,以及在不同IoU阈值(从0.5到0.95)下的平均性能,都显示了模型检测能力的提升。
在机器学习和计算机视觉领域,F1分数是一个衡量模型精确度和召回率平衡的重要指标,特别是在分类和检测任务中。上图展示的F1-Confidence曲线为我们提供了关于模型在不同置信度阈值下的性能表现的宝贵信息。从曲线上可以看出,随着置信度阈值的增加,F1分数先是迅速上升,达到一个峰值,然后随着置信度的继续提高而逐渐下降。这种趋势揭示了模型在低置信度阈值下可能会产生更多的假阳性,而在高置信度阈值下则容易错过一些正确的预测,也就是假阴性的增加。
具体来说,曲线上的最高点表示模型在该置信度阈值下达到了最佳的精确度和召回率的平衡,这个点通常被视为模型性能的最佳指标。在本例中,最高的F1分数大约为0.69,发生在置信度阈值约为0.239的位置。这个分数表明模型在这个阈值下对人脸检测的预测既相对精确又具有较高的覆盖率。
需要注意的是,F1分数的最大值并不接近1,这可能意味着在当前的模型和数据集配置下,还有改进的空间。为了进一步提高模型性能,可以考虑进行模型结构的优化,训练策略的调整,或者更细致的数据预处理和增强。
此外,评估模型性能时,不应单一依赖于F1分数的最高点,还需要考虑在不同应用场景下可能需要不同的置信度阈值。例如,在安全性要求更高的场合,可能会选择一个更高的置信度阈值来确保准确性,即使这样会牺牲一些召回率。
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.653 | 0.648 | 0.694 | 0.664 |
F1-Score | 0.68 | 0.69 | 0.73 | 0.69 |
(3)实验结果分析:
在下图中,我们展示了YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四个版本在相同数据集上的性能对比。图中两组条形图分别代表了这些模型的mAP(平均精度均值)和F1分数,这两个指标是评估目标检测模型性能的重要指标。mAP衡量了模型检测准确性的整体水平,而F1分数则是精确度和召回率的调和平均值,两者共同反映了模型在准确性和可靠性上的综合表现。
从图中可以看出,YOLOv7-tiny在mAP指标上达到了最高值0.694,表明它在我们的实验设置中具有最佳的平均检测准确性。在F1分数方面,YOLOv7-tiny同样以0.73的分数领先,这表明它在精确度和召回率之间取得了最佳平衡。这可能归因于YOLOv7-tiny在处理实验数据集时对小尺寸目标的优异识别能力,或是其更加高效的特征提取和分类策略。
与此相比,尽管YOLOv5nu和YOLOv8n的mAP分数略低,但它们的F1分数接近,分别是0.68和0.69。这意味着尽管它们的平均检测准确性略有不足,但在检测出正确目标的同时避免错误检测方面,它们的表现仍然相当均衡。YOLOv6n在这两个指标上的表现略逊一筹,但仍在接近范围内。
通过坐标轴的优化显示范围,我们能够清晰地看到各模型之间的性能差异,这为模型选择和进一步研究提供了依据。在实际应用中,这些细微的性能差异可能会因为特定场景的需求而导致不同的模型被优先考虑。例如,在对检测速度要求较高的场景中,YOLOv5nu和YOLOv8n可能更受欢迎;而在对准确度要求极高的场景中,YOLOv7-tiny则可能是更佳的选择。
整体而言,我们的分析揭示了在相同数据集上不同YOLO版本之间的细微性能差异,为研究者和开发者在选择合适模型进行应用开发时提供了宝贵的参考。
4.4 代码实现
在这一节中,我们将详细介绍如何使用YOLOv8实现摄像头画面中日常场景下的人脸检测的代码实现。这个实现主要包括创建主窗口、处理每一帧图像、加载模型、开始处理媒体流等步骤。
在实时日常场景下的人脸检测系统中,结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及人脸表情的检测和标注等功能。
(1)导入必要的模块和配置
首先,需要引入一些必要的库,包括图像处理库OpenCV、图形界面库QtFusion和PySide6,以及物体检测模型库YOLOv8Model等。
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.WiderFace.label_name import Label_list
QF_Config.set_verbose(False)
这一部分主要负责导入各种模块,其中包括sys用于系统相关操作,time用于计时,cv2 (OpenCV)用于图像处理。同时,我们使用了PySide6库来构建用户界面,这是一个提供Qt工具的Python库,可以创建跨平台的应用程序。
(2)定义类别和模型
在这里,cls_name定义了要识别的人脸检测类型。colors为每种类型生成随机颜色,用于检测结果的可视化。model是我们的YOLOv8检测器,用于加载并运行目标检测模型。
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,用于创建GUI窗口。在构造函数中,我们设置窗口大小并创建一个标签来显示图像。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函数,它使用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控件上显示图像
最后,我们将应用程序的执行流程串联起来。创建了QApplication对象和MainWindow对象,设置了视频处理的相关参数,并启动了媒体流处理。整个系统在这里开始进入事件循环,等待用户的交互。
5. 日常场景下的人脸检测系统实现
在实现一款实时日常场景下的人脸检测系统时,采用面向对象的设计思路,依赖Python语言和多种开源库如Pyside6、QtFusion、Pytorch等。其中,重要的MainWindow类是系统的主体,负责提供用户界面来控制输入源、进行人脸表情检测与识别,并展示检测结果。以下将详细介绍其设计思路、架构设计以及整个流程。
5.1 系统设计思路
MainWindow类的主要目标是提供一个用户友好的交互式日常场景下的人脸检测系统。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。通过对象组合的方式,将不同的处理器和模型组织在一起,让每个功能模块都能独立进行,同时,还利用信号和槽机制来进行模块间的交互和数据传递。
(1)架构设计
在MainWindow类的架构设计中,采用了处理层、界面层、控制层的设计模式。这个系统的设计充分考虑了用户体验和系统性能,通过合理的架构设计和技术选型,实现了一个高效且易于使用的日常场景下的人脸检测系统。
- 处理层(Processing Layer):这一层的核心是YOLOv8Detector类,它封装了YOLOv8算法的所有细节,如图像预处理、推理和后处理。它直接与模型交互,负责处理原始图像数据,并将检测结果传递给界面层。
- 界面层(UI Layer):由PySide6库提供支持,我们创建了直观的用户界面,其中包含了必要的交互元素如按钮、标签和图像显示框。这些元素使用户可以轻松地上传图片、开始检测过程,并查看检测结果。
- 控制层(Control Layer):这一层通过MainWindow类中定义的槽函数和事件处理逻辑来实现。它负责响应用户的操作(如按键事件),并指挥媒体处理器MediaHandler和YOLOv8Detector来执行具体的任务。
(2)系统流程
以下是日常场景下的人脸检测系统的工作流程详细介绍,这里博主绘制了一张系统逻辑的流程图供大家参考:
-
当用户启动应用程序时,他们首先会遇到由MainWindow类实例化的主界面。这个界面不仅美观简洁,而且功能齐全,使用户能够轻松选择他们的输入源。无论是实时的摄像头捕捉、本地的视频文件播放,还是单张图片的加载,都可以通过简单的操作来选择。
-
选择了输入源后,系统通过MediaHandler类来处理媒体流。在此过程中,媒体数据会经过多个阶段的处理。首先是预处理阶段,系统会调整图像的尺寸,转换色彩空间,并进行归一化处理,确保图像数据满足YOLO模型的输入要求。
-
随后,经过预处理的图像数据将送入训练有素的YOLOv8模型进行检测与识别。模型利用其深度学习的能力,快速准确地识别出图像中的人脸及其属性。检测结果包括人脸的位置和可能的其他相关信息,例如表情类别,这些信息都将实时地在主界面上更新和展示。
-
主界面的更新是动态进行的,检测到的人脸将被矩形框标注,并附上类别标签。用户可以直观地看到每一帧中的检测情况,并通过图表或统计数据更全面地了解检测结果的分布。
-
系统的交互性也体现在用户可以通过界面进行多种操作。用户可以保存检测结果,查询系统信息,甚至使用下拉菜单进行更细致的结果筛选和分析。这些功能的集成,使得用户能够根据自己的需求,进行个性化的数据探索和操作。
-
最后,系统的媒体控制功能赋予了用户更大的自由度。用户可以随时启动或停止摄像头的捕捉,控制视频的播放,或对图像进行分析。这种灵活性不仅提高了用户体验,而且使得系统能够适应不同的使用场景。
5.2 登录与账户管理
系统的用户登录界面是基于PySide6构建的,PySide6是一个跨平台的Qt库的Python绑定,它允许我们创建现代、美观且功能强大的图形用户界面。用户的账户信息和个人设置则存储在SQLite数据库中,这是一个轻量级的数据库系统,非常适合嵌入式系统或中小型项目。
当用户首次使用系统时,他们可以通过简洁直观的注册界面来创建新账户。注册过程涵盖了设置用户名、密码以及(可选的)上传头像等步骤。一旦注册成功,用户就可以使用这些凭据登录系统,并开始进行人脸检测。
在登录后,用户将进入主界面,这里他们可以上传和检测图片或视频,并查看实时的检测结果。我们的系统不仅在主界面中实时显示包括检测框、类别及置信度等信息,还允许用户保存检测记录,以便日后查看或分析。
此外,用户可以随时返回登录界面对自己的账户进行管理,比如修改密码、更换头像或注销账户。这一层额外的个性化和安全设置确保了用户能够保持对自己的数据和使用体验的完全控制。
我们的系统支持多种输入源,包括实时摄像头捕捉、视频流和静态图片输入。这为用户在不同场景下的目标检测提供了灵活性。无论是单个用户的简单使用,还是多用户环境下的复杂应用,系统都能提供稳定和高效的服务。
综上所述,登录和账户管理模块是我们系统的基石,它不仅提高了用户操作的便捷性,还为系统的可靠运行提供了保障。通过不断优化这一模块,我们致力于为用户提供一个安全、可靠且易于管理的人脸检测平台。在未来的开发中,我们将继续扩展这些功能,提高用户体验,并加入更多的个性化选项。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1zz421Q7XB/
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的人脸检测结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Huang, ZY., Chiang, CC., Chen, JH. et al. A study on computer vision for facial emotion recognition. Sci Rep 13, 8425 (2023). https://doi.org/10.1038/s41598-023-35446-4 ↩︎
Talaat F M, ZainEldin H. An improved fire detection approach based on YOLO-v8 for smart cities[J]. Neural Computing and Applications, 2023, 35(28): 20939-20954. ↩︎
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. ↩︎