摘要:本篇博客详细讲述了如何利用深度学习构建一个活体人脸检测系统,并且提供了完整的实现代码。该系统基于强大的YOLOv8算法,并进行了与前代算法YOLOv7、YOLOv6、YOLOv5的细致对比,展示了其在图像、视频、实时视频流和批量文件处理中识别活体人脸的准确性。文章深入讲解了YOLOv8算法的底层原理,提供了相应的Python代码、用于训练的数据集,以及一个基于PySide6的用户界面。此系统不仅能够精准地检测和分类图像中的活体人脸,还具备了用户注册登录管理、模型一键切换、UI自定义等丰富功能。文章的目标是为深度学习领域的新手提供一份实用指导和参考。完整的代码和数据集已在文章结尾提供链接,便于读者下载和使用。本文结构如下:
文章目录
- 前言
- 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的活体人脸检测系统演示与介绍(Python+PySide6界面+训练代码)
前言
在数字化时代背景下,活体人脸检测技术在安全认证、身份验证等领域扮演着越来越重要的角色。随着网络安全威胁的不断演进,传统的身份验证方法已无法满足当前高安全性需求。活体人脸检测技术能够有效防止利用照片、视频等非活体手段进行的欺诈行为,确保身份认证的真实性和安全性。这一技术的发展不仅对个人信息安全保护至关重要,也在金融交易、门禁系统、远程监控等多个领域有着广泛的应用前景。
近年来,随着人工智能和深度学习技术的快速发展,活体人脸检测技术也取得了显著进步。特别是YOLO1(You Only Look Once)系列算法的不断演进,从YOLOv1到最新的YOLOv8,这些算法在速度和准确性上都有了大幅度的提升。YOLO算法因其实时性强和高准确率而被广泛应用于活体检测之中,其最新版本更是在处理复杂环境下的活体人脸检测问题上展现出了前所未有的性能。
YOLOv82,因其出色的实时性能和高准确率,在活体人脸检测领域获得了广泛的应用。YOLOv8继承了YOLO系列的优点,如单次前向传播即可完成检测的特性,同时在网络结构和训练策略上做了大量的优化,大幅提升了检测的准确性和速度。这些改进使得YOLOv8能够更有效地处理复杂的实时视频流数据,为活体检测提供了强大的技术支持。
除了YOLO系列之外,还有一些其他的算法也在活体人脸检测方面表现出色。例如,利用深度学习和人脸识别技术结合的3D人脸重建方法,能够有效地从2D图像中重建出3D人脸模型,进而进行更准确的活体判断。这种方法通过分析人脸的深度信息,能够有效地区分真人和照片、视频等非活体媒介,从而提高了活体检测的准确率。
此外,还有研究通过引入注意力机制来提高活体检测的性能。这种方法通过模型对人脸图像的关键区域给予更多的关注,以提高检测的准确性。注意力机制的引入,使得模型能够更加聚焦于人脸的重要特征,从而有效提升了活体检测的效果。
尽管如此,活体人脸检测技术仍面临着一系列挑战,包括在复杂光照条件下的检测准确性、多样化欺诈手段的识别问题、以及算法的实时性和资源消耗等。此外,随着技术的进步和应用场景的不断扩大,对活体检测算法的性能要求也越来越高,这就需要不断优化现有算法,或开发新的算法来满足这些需求。
本博客的主要贡献在于综合运用最先进的计算机视觉技术和深度学习模型,构建了一个高效且用户友好的活体人脸识别系统。以下是本文的主要贡献:
- 采用最先进的YOLOv8算法进行活体人脸检测:本文不仅介绍了YOLOv8算法在活体人脸检测领域的应用,还通过与YOLOv73、YOLOv64、YOLOv55等早期版本的对比分析,突出了YOLOv8在效率和精确度上的显著优势。这一部分为活体检测技术的研究和实践提供了新的视角和方法。
- 利用PySide6开发用户友好的界面:通过使用Python的PySide6库,我们开发了一个直观便捷的用户界面,极大地提升了活体人脸检测系统的用户体验。这一创新不仅展示了技术与实用性的结合,也为其他研究者和开发者提供了开发类似系统的参考。
- 集成登录管理功能以提升系统安全性:我们设计并实现了登录管理功能,确保了系统使用的安全性。这一特性不仅保护了用户数据,还为将来系统功能的扩展提供了基础。
- 对YOLOv8模型进行深入研究:本文对YOLOv8算法的性能进行了全面的研究,包括精确度、召回率等关键性能指标的评估,以及算法在不同条件下的表现分析。这些研究成果有助于深化对YOLOv8算法的理解,为算法的优化和改进提供了科学依据。
- 提供完整的数据集和代码资源包:为了促进读者的理解和应用,本文提供了包括训练和测试所需的详细数据集以及实现系统的完整代码资源包。这一贡献使得读者可以轻松复现实验结果,并在此基础上进行更深入的研究和开发。
1.数据集介绍
在构建高效的机器学习模型时,理解和详细描述所使用的数据集是至关重要的。本篇博客将深入介绍我们用于目标检测任务的数据集,并探讨我们所采取的预处理步骤及其潜在影响。我们的数据集包含4520张图像,其中3609张用于训练,766张用于验证,以及145张用于测试。这个比例确保了模型有充分的数据来学习,并且有足够的分离数据来验证和测试其性能。
在预处理步骤中,我们首先对图像进行了自动方向校正,并且去除了EXIF方向信息,这一步骤对于后续的处理至关重要,因为它消除了相机方向对像素数据的潜在影响。随后,我们将所有图像调整大小至640×640像素,采用了拉伸方法来确保图像符合神经网络的输入要求。虽然这种拉伸可能会导致图像的某些部分失真,但它可以保证所有图像在空间维度上的一致性,这对于模型学习是有利的。为了增强图像的对比度,我们采用了自适应均衡化的方法,这种方法可以改善图像的局部对比度,增强模型识别图像细节的能力。
通过对数据集的分布进行分析,我们发现了一些关键的特征和潜在的挑战。类别分布上,我们注意到了明显的不平衡,非活体样本的数量大大超过了活体样本。这种不均衡可能导致模型对非活体样本的过拟合,降低对活体样本的检测能力。为了解决这一问题,我们可能需要通过数据增强或调整训练策略来平衡类别分布。
目标在图像中的位置分布显示,大多数目标位于图像的中心区域。这可能会导致模型对于中心区域的目标过度优化,而忽视图像边缘的目标。为了克服这一偏差,我们计划通过数据增强,如图像平移和旋转,来提升模型对各种位置目标的检测能力。
目标尺寸的分布分析揭示了目标通常较小并且宽高比较一致。尽管这有助于模型对常见尺寸目标的识别,但它也暗示了模型可能在识别非典型尺寸的目标时遇到困难。因此,我们将通过随机缩放和裁剪等技术来增加尺寸多样性,以此来强化模型的泛化能力。博主使用的类别代码如下:
Chinese_name = {'live': "活体", 'spoof': "虚假"}
总的来说,我们的数据集经过精心设计和预处理,以适应目标检测任务的需求。我们的预处理策略考虑了数据的一致性和模型的有效性,并通过分析数据集分布,我们识别了潜在的挑战并制定了相应的解决策略。接下来,我们将在模型训练过程中继续监控这些问题,并适时调整我们的方法,以确保最终模型的鲁棒性和准确性。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行活体人脸检测的图片或视频,或者启动摄像头进行实时检测。在进行活体人脸检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的”更换模型”按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8 是一个最新的实时对象检测算法,它是 YOLO 系列的最新作品。在 YOLOv3 的基础上,YOLOv8 进行了多项改进。YOLOv3 是基于 Darknet53 网络,而 YOLOv8 则是基于更加高效的 C2F 结构。这意味着它在网络的底层采用了与 Darknet53 类似的结构,但是在高层则采用了新的方法。
YOLOv8 还继承了 YOLOv5 中的 C3 模块以及 YOLOv7 中的有效层聚合(Efficient layer aggregation networks, ELAN)方法。C3 模块是基于 BottleNeck 结构的改进,它加入了更多的跳跃连接以增强特征信息的传递,这有助于网络能更好地从输入的图像中学习到有用的信息。而有效层聚合网络(ELAN)则进一步优化了这些跳跃连接,确保了网络不仅在深层能够学习到重要的信息,同时也能保持网络的高效性。
在路径聚合方面,YOLOv8 引入了路径聚合网络(Path Aggregation Network, PANet)来进一步提高特征的传递效率。PANet 通过在不同层之间建立更多的连接,使得网络能够更好地保留和利用低层的细节信息和高层的语义信息。这有助于网络在检测小对象时保持高性能,因为这些小对象往往需要低层的细节信息来进行准确的识别。
最后,YOLOv8 放弃了传统的基于锚点(anchor)的方法,转而采用了无锚点(None anchor)的机制。这种新的机制使得模型不再依赖预设的锚点框来预测对象的位置,而是直接从特征中预测对象的边界框,这样做减少了模型对先验知识的依赖,同时也简化了模型的训练过程,并可能提高了检测的准确性。
综上所述,YOLOv8 在保持了 YOLO 系列高速检测的特点的同时,通过引入新的结构和算法改进,进一步提高了模型的性能,尤其是在处理复杂场景和小型对象时的识别能力。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行活体人脸检测的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
import cv2from ultralytics import YOLO
接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
model.load_model(abs_path("weights/multi-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损失函数通常由以下几部分组成:
以下表格详细介绍了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 YOLOmodel = YOLO('./weights/yolov8s.pt', task='detect')
接着开始训练模型。其中指定了训练数据的配置文件路径,使用GPU进行训练,使用2个工作进程加载数据,输入图像的大小为640×640,训练120个epoch,每个批次的大小为8,训练任务的名称为’train_v8_’ + data_name。
results2 = model.train(data=data_path,device='0', workers=workers, imgsz=640,epochs=120,batch=batch,name='train_v8_' + data_name)
在深度学习模型的训练过程中,监控损失函数和评估指标的变化对于理解模型性能和收敛行为至关重要。从YOLOv8训练损失和评估指标图像中,我们可以对模型的学习过程进行细致的分析。从左至右,上至下,图中依次显示了训练集上的边框损失(train/box_loss)、分类损失(train/cls_loss)、定位损失(train/dfl_loss)、验证集上的边框损失(val/box_loss)、分类损失(val/cls_loss)、定位损失(val/dfl_loss),以及模型的精度(metrics/precision(B))、召回率(metrics/recall(B))、平均精度(metrics/mAP50(B))和广泛平均精度(metrics/mAP50-95(B))。
在训练过程中,我们观察到所有的损失函数随着训练次数的增加而逐渐减小,这是一个积极的迹象,表明模型正在学习数据集的特征并逐渐提高其预测的准确性。特别是,平滑线(橙色虚线)表明在训练集上损失的下降趋势相对平稳,这通常预示着模型的良好泛化能力。
边框损失(box_loss)反映了模型在定位物体边界框时的性能。从图中我们可以看出,在训练和验证集上,这个值都有明显的下降趋势,说明模型在识别物体的位置和大小方面越来越准确。分类损失(cls_loss)显示了模型在识别不同类别的物体时的性能。训练和验证集上的分类损失都随着时间显著下降,这表明模型在区分不同类别的能力上得到了提升。定位损失(dfl_loss)是一个特定的损失,用于衡量模型在预测物体的精确位置方面的性能。从图中可以看出,训练集上的定位损失下降得非常快,但在验证集上波动较大,这可能表明模型在训练数据上过拟合了,或者验证数据的分布和训练数据存在较大差异。
在性能指标方面,精度(precision)和召回率(recall)是衡量模型性能的两个关键指标。精度指的是模型正确预测的正例占所有预测为正例的比例,而召回率指的是模型正确预测的正例占所有实际正例的比例。在这个案例中,这两个指标都达到了非常高的水平,几乎接近1,这表明模型在大多数情况下都能准确识别和定位物体。
mAP(Mean Average Precision)是一个综合考虑精度和召回率的性能指标,用于评估模型在不同阈值下的整体表现。mAP50仅考虑IoU(交并比)大于0.5的预测,而mAP50-95考虑了IoU从0.5到0.95的所有情况。从图中我们可以看出,mAP50和mAP50-95随训练进程有所提高,尽管在某些点上出现了波动,但整体呈上升趋势。
F1分数是精确度和召回率的调和平均值,它是评估分类模型性能的重要指标。在目标检测模型的评估中,F1分数对于理解模型如何平衡精确度与召回率尤为关键。
下图为博主训练活体人脸检测的F1曲线图。在深度学习模型的性能评估中,F1得分是一个关键的评估指标,它综合考虑了模型的精确度和召回率。该曲线图描述了模型预测的置信度阈值与F1得分之间的关系,对于不同的类别展示了不同的曲线,同时还突出了所有类别的平均F1得分。
特别值得注意的是,“所有类别”的曲线在0.643的置信度阈值下标出了最大的F1分数0.98。这是一个极佳的结果,因为F1分数接近完美分数1,表明模型的准确度高,并且精确度与召回率之间有很好的平衡。置信度阈值0.643是达到这个最佳平衡的点;超过这个点,要么因为模型预测了太多假正例而精确度下降,要么因为模型漏掉了真正例而召回率下降。
对于两个类别,曲线右侧的急剧下降表明,如果将置信度阈值提高到大约0.7以上,F1分数会迅速下降,很可能是由于召回率的大幅度下降。相反,从置信度为零到大约0.5的平稳期表明,模型对于一系列较低的置信度阈值具有很强的鲁棒性,保持了高F1分数,从而保持了精确度和召回率的良好平衡。
总的来说,模型在活体人脸检测方面表现出强大的性能,其最佳F1分数为0.98,实现在0.643的置信度阈值。这样的性能表明模型校准得当,它在这个置信度水平上的预测非常可信。然而,在选择操作置信度阈值时,考虑应用上下文是很重要的;在某些情况下,假正例的成本可能比假反例高(或低),这就需要相应地调整阈值,以优先考虑精确度或召回率。
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.982 | 0.992 | 0.943 | 0.987 |
F1-Score | 0.98 | 0.99 | 0.94 | 0.98 |
(3)实验结果分析:
在深度学习领域,持续的算法迭代和更新是提升模型性能的关键途径。我们通过在相同的数据集上实施一系列实验,旨在比较和评估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在活体人脸识别任务上的性能。实验的设计和目的是为了明确各版本模型在准确性和检测效率上的差异,以便为实际应用提供更具指导性的见解。
在这个实验中,YOLOv5nu的mAP为0.982,F1-Score为0.98。这表明YOLOv5nu在检测精度上表现出色,几乎可以检测到数据集中的所有正类目标,并且错误检测的数量非常少。F1-Score的高值意味着精确度和召回率之间的平衡非常好,即它既没有错过太多正类目标,也没有将太多负类目标误判为正类。
YOLOv6n在mAP上达到了0.992,F1-Score也达到了0.99,这是所有算法中最高的。它的性能甚至比YOLOv5nu稍好,这可能是因为算法在检测任务上的改进,或者是模型更好地适应了数据集。这种高精度表明,在实际应用中,YOLOv6n可能会是最优的选择,尤其是在对检测准确性要求极高的场景中。
YOLOv7-tiny版本的性能相对较低,其mAP为0.943,F1-Score为0.94。”tiny”版本的YOLO模型通常设计得更加轻量,以便在计算资源有限的环境下快速运行。尽管性能有所下降,但这可能是为了在速度和准确性之间取得更好的平衡。
YOLOv8n的mAP为0.987,F1-Score为0.98,这是一个非常好的结果,与YOLOv5nu相当,略低于YOLOv6n。这表明YOLOv8n与其前身在性能上相当,但可能包含了其他方面的改进,如计算效率、检测速度或者对小目标的检测能力。
总结来说,YOLOv6n在这组实验中的表现最佳,其次是YOLOv8n和YOLOv5nu,这两者在性能上非常接近。YOLOv7-tiny的性能稍低,这可能是由于它的设计初衷是速度而不是最高精度。当考虑实际应用时,选择哪个版本的YOLO算法应该基于对速度和准确性的具体需求,以及可用的计算资源。如果目标是快速处理且资源有限,YOLOv7-tiny可能是一个合适的选择;如果目标是最高的准确性,YOLOv6n似乎是最好的选项。
4.4 代码实现
在这篇博客中,我们将深入探讨一个基于YOLOv8和QtFusion的人脸活体检测应用的构建过程。这个应用结合了深度学习和图形用户界面(GUI),能够实时检测视频流中的人脸并判断其是否为活体。下面,我们将一步步拆解代码,理解其背后的逻辑,并讲述如何将这些代码组合起来构建一个完整的应用程序。
在实时活体人脸识别系统中,结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及活体人脸的检测和标注等功能。
(1)导入必要的模块和配置
首先,我们需要设置应用程序的基础,这包括导入必要的模块和配置环境。我们引入sys模块来管理程序运行时环境,time模块用于记录和计算操作所需时间,而cv2即OpenCV库则是我们处理图像和视频的主要工具。接下来是QtFusion库的各个组件,它们协助我们构建GUI,并且管理媒体数据。PySide6的组件则用于创建和管理GUI的窗口和事件。
import sys# 导入sys模块,用于处理Python运行时环境的一些操作import time# 导入time模块,用于处理时间相关的操作import cv2# 导入OpenCV库,用于处理图像和视频from QtFusion.path import abs_pathfrom QtFusion.config import QF_Configfrom 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.LivenessFace.label_name import Label_listQF_Config.set_verbose(False)
QF_Config.set_verbose(False) 这行代码是用来关闭QtFusion库的冗余日志输出,让我们的输出更加清晰。
(2)创建主窗口
接着,我们定义了MainWindow类,这是GUI的主窗口。在这个类中,我们通过调用resize方法设定窗口的大小,并且创建一个QLabel来显示视频流图像。我们还定义了一个keyPressEvent方法,使得用户可以通过按下Q键来退出应用。
class MainWindow(QMainWindow):# 定义MainWindow类,继承自FBaseWindow类def __init__(self):# 定义构造函数super().__init__()# 调用父类的构造函数self.resize(850, 500)# 设置窗口的大小为850x500self.label = QtWidgets.QLabel(self)# 创建一个QLabel对象,用于显示图像self.label.setGeometry(0, 0, 850, 500)# 设置QLabel的位置和大小def keyPressEvent(self, event):# 定义键盘按键事件处理函数if event.key() == QtCore.Qt.Key.Key_Q:# 如果按下的是Q键self.close()# 关闭窗口
在这里,我们定义类 MainWindow ,它用作主应用程序窗口。它继承自 QMainWindow 640×640 像素并将其大小设置为 640×640 像素。在窗口内,我们创建一个 QLabel 小部件 ( self.label ) 来显示处理后的图像。
(3)主程序流程
紧接着,我们有frame_process函数,这是应用程序的核心,负责处理每一帧图像。这里,我们先将图像调整到合适的大小,然后使用YOLOv8模型进行预测。这个函数打印出推理时间,并将检测结果绘制在图像上。如果模型检测到了人脸,它将使用drawRectBox函数在人脸周围绘制一个框,并显示类别名称和置信度。
def frame_process(image):# 定义帧处理函数,用于处理每一帧图像image = cv2.resize(image, (850, 500))# 将图像的大小调整为850x500pre_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']# 获取类别名称、边界框、置信度和类别IDlabel = '%s %.0f%%' % (name, conf * 100)# 创建标签,包含类别名称和置信度# 画出检测到的目标物image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id])# 在图像上绘制边界框和标签window.dispImage(window.label, image)# 在窗口的label上显示图像
最后,我们初始化YOLOv8检测器,加载预训练模型,并设置类别颜色。我们创建一个QApplication对象和主窗口实例,配置视频处理器MediaHandler,并开始处理视频流。最后,我们显示主窗口并进入Qt的主循环。
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对象filename = abs_path("test_media/人脸活体检测.mp4", path_type="current")# 定义视频文件的路径videoHandler = MediaHandler(fps=30)# 创建MediaHandler对象,设置帧率为30fpsvideoHandler.frameReady.connect(frame_process)# 当有新的帧准备好时,调用frame_process函数进行处理videoHandler.setDevice(filename)# 设置视频源videoHandler.startMedia()# 开始处理媒体# 显示窗口window.show()# 进入 Qt 应用程序的主循环sys.exit(app.exec())
整个应用程序的设计充分展示了如何将深度学习模型与用户界面相结合,创建一个实用且交互性强的现代应用程序。每一部分代码都经过精心设计,确保了高效率的数据处理和用户友好的交互体验。通过逐行解析,我们不仅理解了代码的机制,也能够领会到将复杂的技术转化为实际应用的艺术。
5. 活体人脸识别系统实现
在构建实时活体人脸检测与识别系统时,我们采用了一种分层的系统设计思路,旨在实现功能模块化,确保系统的高内聚低耦合特性。通过这种设计,每个模块都可以专注于完成自己的任务,而不必关心其他模块是如何工作的。这不仅提高了代码的可维护性和扩展性,也使得未来对系统进行升级和维护变得更加容易。
5.1 系统设计思路
为了让用户能够轻松地与系统互动,我们设计了一个直观的MainWindow类。它不仅负责呈现用户界面,还作为用户操作和系统响应之间的桥梁。我们确保该界面简洁易用,即便是对技术不太熟悉的用户也能够快速上手。
(1)架构设计
我们系统的核心是MainWindow类,它承载着用户界面和后台逻辑的整合,这样做的目的是为用户提供一个直观且响应迅速的使用体验。MainWindow类的设计思路是作为控制层,它负责管理用户界面和后台处理逻辑之间的交互。用户界面提供了直观的操作,而后台处理逻辑则是利用先进的计算机视觉技术进行人脸活体检测。
在处理层,我们利用YOLOv8Detector类中的预训练模型执行图像识别任务。这个模型通过对视频流中的图像进行实时分析,检测出人脸并判断活体特征。该层是系统的智能核心,采用深度学习算法来提高检测的准确率。
界面层的设计以用户为中心,由Ui_MainWindow类构成,提供了简洁且功能完备的操作界面。用户可以通过这个界面与系统互动,比如开始或停止检测、查看检测结果等。界面层的设计关注于用户体验,确保用户可以轻松而直观地使用系统。
控制层作为系统的指挥中心,由MainWindow类负责实现。它通过槽函数和其他方法响应用户的操作,同时管理媒体处理器和模型的行为。例如,当用户点击“开始检测”按钮时,控制层会指挥处理层开始分析视频流。控制层的设计使得用户界面与后台处理逻辑解耦,使得系统更加稳定,并且易于扩展和维护。
此外,我们还利用了Qt框架的信号和槽机制,这是一种事件驱动编程范式,允许不同的组件在无需了解对方内部实现的情况下进行通信。当系统的一个部分需要通知另一个部分时,它会发出一个信号,而接收这个信号的部分则会通过一个槽函数作出响应。这种机制的使用,提高了代码的模块化和灵活性,同时也简化了事件处理流程。
综上所述,我们的设计理念是围绕用户体验来构建一个高效、可靠且易于使用的活体人脸检测系统。通过清晰的分层架构和模块化设计,确保了系统的可扩展性和可维护性,同时也加强了系统的稳定性和性能。这样的系统不仅能够满足当前的需求,也为未来可能的功能扩展和技术升级打下了坚实的基础。
(2)系统流程
在本系统的设计与实现中,我们致力于提供一个用户友好且高效的活体人脸检测体验。从应用程序的启动到最终的检测结果展示,每一步都经过精心规划和优化,以确保用户能够无缝地进行操作并获得准确的检测数据。
应用程序的入口是MainWindow类的实例化。这一步骤是整个应用的基础,它不仅初始化了应用的界面,还设置了一系列的运行参数,为用户的操作提供了起点。我们设计的界面旨在直观易用,用户可以轻松地通过界面选择他们希望分析的输入源,无论是实时摄像头捕获的图像、视频文件,还是静态图片,系统都能够提供支持。
选择输入源后,系统将根据用户的选择调用相应的媒体处理器和方法。这一过程可能包括对摄像头的配置、视频文件的读取或是图像文件的加载等操作,确保了数据的正确输入和处理。接下来,系统进入了一个连续帧处理的循环,这是检测流程的核心。
在预处理阶段,系统会对每一帧图像进行必要的处理,包括图像的缩放、色彩空间转换和归一化等,以确保图像数据符合YOLOv8模型的输入要求。这一步骤是实现高效和准确检测的基础。
随后,在检测与识别阶段,经过预处理的图像将被送入先进的YOLOv8模型进行深度分析,以识别出图像中的人脸及其表情类别。这一阶段的准确性直接关系到系统的整体性能,因此我们采用了最先进的模型以提高识别的准确率和效率。
当模型产出检测结果后,系统进入界面更新阶段。这时,界面会实时展示检测框、标注表情类别,并通过表格或条形图等直观的方式展示检测统计数据。这不仅增强了用户的交互体验,也使用户能够直观地理解和分析检测结果。
此外,系统还提供了丰富的交互操作选项,用户可以通过界面上的按钮执行多种操作,如保存检测结果、查询系统信息等。通过这些功能,用户能够更灵活地管理和使用系统,满足不同场景下的需求。
媒体控制也是系统的一个重要特点,用户可以根据需要控制媒体的播放状态,包括启动或停止摄像头捕捉、视频播放或图像分析,为用户提供了极大的便利和灵活性。通过以上流程的设计和实现,本系统不仅确保了活体人脸检测的高效性和准确性,同时也提供了高度用户友好的操作界面和丰富的功能选择,使得用户在使用本系统进行活体人脸检测时能够获得顺畅和满意的体验。
5.2 登录与账户管理
在构建活体人脸检测系统的过程中,我们特别重视用户体验和个性化需求,因此开发了一个全面的账户管理功能,确保每个用户都能在一个安全和私密的环境中使用系统。这一功能基于PySide6进行图形界面设计,以及SQLite数据库管理后端,旨在为用户提供一个简单、直观且功能全面的登录和账户管理体验。
通过这个账户管理系统,用户首次使用时可以轻松完成账户的注册过程,仅需填写基本信息即可创建一个新的账户。一旦注册成功,用户便可以使用自己的账户登录系统,进而访问和使用活体人脸检测的各项功能。我们理解每个用户的需求和偏好可能不同,因此除了基本的登录功能外,还提供了密码修改、头像设置等个性化选项。这允许用户根据自己的喜好来个性化账户,增强了用户对系统的归属感和满意度。
账户注销和重新登录的功能也被纳入系统中,确保用户能够在需要时,轻松地切换账户或更新自己的账户信息。此外,为了保护用户隐私和数据安全,所有用户信息和检测结果都储存在本地的SQLite数据库中,为每个用户创建了一个独立的空间。在这个空间内,用户不仅可以管理自己的个人信息,还可以保存和管理检测结果和个性化设置。这种设计既保障了数据的私密性和安全性,也为用户提供了极大的便利,使他们能够随时回顾和分析自己的检测历史。
整合账户管理和活体人脸检测功能后,我们的系统不仅拥有了强大的技术核心,能够导入和利用各类深度学习模型进行高效的多物体识别和检测,而且通过精心设计的用户界面和账户管理系统,提升了用户的整体体验。用户可以通过主界面实时查看检测框、类别及置信度等信息,支持多种输入源包括图片、视频和实时摄像头。此外,账户系统的加入,使得每位用户都能在享受高科技带来的便利的同时,也享有个性化和安全私密的使用环境,从而更好地适应和满足实时目标检测场景下的各项需求。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1RS421A7hH/
在文件夹下的资源显示如下,下面的链接中也给出了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 R, Pedoeem J, Chen C. YOLO-LITE: a real-time object detection algorithm optimized for non-GPU computers[C]//2018 IEEE international conference on big data (big data). IEEE, 2018: 2503-2510. ↩︎
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. ↩︎