首页 > 编程语言 >基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的疲劳驾驶检测系统(Python+PySide6界面+训练代码)

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的疲劳驾驶检测系统(Python+PySide6界面+训练代码)

时间:2024-03-18 19:45:06浏览次数:26  
标签:YOLOv7 YOLOv6 疲劳 Python 检测 模型 系统 驾驶 YOLOv8

摘要:本研究详述了一种采用深度学习技术的疲劳驾驶检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别疲劳驾驶行为。文章深入阐述了YOLOv8算法的机理,并附带了Python语言的实现代码、所需训练数据集,以及基于PySide6框架构建的用户界面(UI)。此外,系统还融合了SQLite数据库的用户管理功能,实现了一键切换YOLOv5/v6/v7/v8模型的便捷操作,以及提供了界面的自定义修改选项。本文目的是为疲劳驾驶检测领域的研究人员以及深度学习初学者提供实用指导和资源。完整的代码库和数据集可通过文末提供的链接进行下载。本文结构如下:

目录

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


演示与介绍视频:https://www.bilibili.com/video/BV1FK421878L/
YOLOv8/v7/v6/v5项目合集下载https://mbd.pub/o/bread/mbd-ZZuXmZpy
YOLOv8/v5项目完整资源下载https://mbd.pub/o/bread/ZZuXmJtu
YOLOv7项目完整资源下载https://mbd.pub/o/bread/ZZuXmZhq
YOLOv6项目完整资源下载https://mbd.pub/o/bread/ZZuXl5Zs


前言

        在当今社会,随着汽车数量的剧增和人们生活节奏的加快,疲劳驾驶已成为导致交通事故的重要因素之一。疲劳驾驶不仅危及驾驶员本人的生命安全,也对其他道路使用者构成威胁。因此,开发有效的疲劳驾驶检测系统显得尤为重要,它能够实时监控驾驶员的状态,及时发出警报,从而预防可能发生的交通事故。

        近年来,随着人工智能技术的飞速发展,特别是深度学习在图像处理和模式识别领域的广泛应用,基于YOLO[1](You Only Look Once)系列模型的疲劳驾驶检测技术受到了研究者的高度关注。YOLO作为一种先进的实时物体检测算法,因其高效性和准确性而在多个领域得到了应用。通过对驾驶员面部特征的实时监测和分析,如眨眼频率、打哈欠次数以及头部姿态等,YOLO模型能够准确地判断驾驶员是否处于疲劳状态。此外,随着YOLOv5[2]、YOLOv6[3]、YOLOv7[4]到最新的YOLOv8[5]的迭代更新,模型的检测速度和准确性得到了显著提升,使得基于YOLO的疲劳驾驶检测系统更加可靠和实用。

        除了YOLO系列,深度学习领域的其他算法,如卷积神经网络(CNN)、循环神经网络(RNN)、以及长短期记忆网络(LSTM)也在疲劳驾驶检测领域中发挥着重要作用。这些算法能够处理时间序列数据,对驾驶员的行为模式进行分析,提高疲劳检测的准确性和效率。例如,LSTM在分析连续驾驶行为时能够考虑到时间上的依赖关系,从而更准确地预测疲劳状态。相比之下,传统的机器学习方法如支持向量机(SVM)和决策树在处理复杂的图像和序列数据时表现不足,难以达到深度学习方法的准确率和效率。

        数据集是深度学习研究的基础,对算法的训练和测试至关重要。近年来,针对疲劳驾驶检测的专用数据集逐渐丰富,从最初的小规模、单一场景发展到包含多种照明条件、多样化驾驶行为的大规模数据集。这些数据集不仅提高了模型的泛化能力,还促进了算法在实际场景中的应用。相比之下,早期研究常常受限于数据的质量和数量,难以充分训练复杂的深度学习模型。

        尽管疲劳驾驶检测技术取得了显著进步,但仍面临诸多挑战。首先,在复杂的驾驶环境下,如变化的光照条件、驾驶员的不同面部表情和姿势,都会影响疲劳检测的准确性。其次,不同个体之间在疲劳状态下的生理和行为特征存在差异,这要求算法能够适应个体差异,提高检测的普适性。此外,实时性是疲劳驾驶检测系统的另一个重要需求,这要求算法在保证准确性的同时,还需具备快速响应的能力。

        未来的疲劳驾驶检测技术发展趋势将集中在提高算法的准确性、实时性和鲁棒性上。一方面,通过深度学习模型的进一步优化和新算法的开发,提升系统的检测性能;另一方面,多模态数据融合,如结合生理信号(心率、眼动等)和行为数据,将进一步提高疲劳检测的准确度和可靠性。此外,随着边缘计算技术的发展,将深度学习模型部署到边缘设备上,实现数据的本地处理和实时反馈,也是未来疲劳驾驶检测技术的一个重要发展方向。

        本博客的主要贡献在于结合最新的技术趋势和实用工具,构建了一个先进的疲劳驾驶检测系统。通过采用当前最先进的目标检测算法—YOLOv8,本文不仅推动了疲劳驾驶检测技术的进步,还为相关研究和应用提供了实际的参考价值。以下是本文的五大贡献:

  1. 采用最先进的YOLOv8算法进行疲劳驾驶检测:本文详细介绍了如何应用YOLOv8算法进行高效准确的疲劳驾驶检测。与早期的深度学习模型相比,YOLOv8在效率和精确度方面的优势明显,为疲劳驾驶检测提供了一种新的解决方案。
  2. 利用PySide6实现友好的用户界面:通过Python的PySide6库,开发了一个用户友好的疲劳驾驶检测系统界面。这使得用户能够以直观便捷的方式进行疲劳驾驶检测,大大降低了技术门槛,推广了YOLOv8算法的应用。
  3. 设计登录管理功能以提升系统安全性:系统集成了登录管理功能,确保了使用过程的安全性,并为将来添加更多个性化功能奠定了基础。这一设计不仅提高了系统的实用性,也增强了用户体验。
  4. 对YOLOv8模型进行深入研究和评估:本文不仅应用了YOLOv8算法,还对其性能进行了全面的评估,包括精准度、召回率及在不同环境下的表现分析。这项工作为YOLOv8算法的进一步优化和应用提供了重要的实验数据和分析基础。
  5. 提供完整的数据集和代码资源包:为了便于读者更好地理解和应用YOLOv8及其他版本算法在疲劳驾驶检测中的操作,本文提供了包含训练和测试所需的详细数据集和完整代码资源包。这一贡献使得读者能够直接复现实验结果,并在此基础上进行进一步的研究和开发。

1.数据集介绍

        在本博客的疲劳驾驶检测系统开发过程中,我们特别重视数据集的质量和构成,因为这直接影响到模型的训练效果和最终性能。本系统所使用的数据集包含16,246张图像,这些图像经过精心筛选和预处理,旨在训练出能够准确识别疲劳驾驶迹象的机器学习模型。我们将图像分为三个部分:训练集包含13,719张图像,验证集1,380张,测试集则有1,147张。这种分布确保了模型可以在广泛的数据上进行训练,同时在独立的数据集上进行有效的验证和测试。

        数据集的多样性对模型的泛化能力至关重要。我们的数据集包含了不同性别、年龄和种族的驾驶员,在多种光照条件下的图像,以及多样的驾驶行为,如打哈欠、闭眼、无表情和眼睛睁开。这些类别标签不仅反映了疲劳的关键迹象,也包括了正常驾驶状态下的图像,从而为疲劳驾驶检测提供了一个全面的视角。

        我们进一步通过数据增强技术来提升模型的鲁棒性。这包括50%概率的水平翻转,使模型能够识别镜像中的驾驶员行为;90度旋转增强,让模型适应不同方向的头部姿态;以及随机裁剪和高斯模糊,以模拟真实世界中的视觉干扰和图像质量变化。所有图像最终被统一调整至640x640像素,保证了输入数据的一致性。

        对于类别分布,我们的数据集呈现出明显的不平衡性。'nodawn'即无疲劳迹象的类别样本数量最多,而关键疲劳迹象如'close'和'yawn'的样本较少,'open'类别样本最少。这种不平衡可能会影响模型对疲劳迹象的识别能力,因此我们在模型训练时特别注意了对少数类的重采样或权重调整,以提升模型对疲劳迹象的敏感性。

        通过对标注框位置和尺寸的分析,我们发现大部分标注框集中在图像中心区域,边界框的宽高比也相对一致,这符合人脸的自然形状和图像采集时的人体工程学设定。这种分布有助于模型快速定位和识别驾驶员的面部特征,是模型检测准确性的关键。

        在图像标注方面,我们深知准确的标签对于训练有效的机器学习模型的重要性。我们的数据集包含多个类别的标签,标签及其对应的中文名称如下所示:

Chinese_name = {'Yawn': '打哈欠', 'close': '闭眼', 'noYawn': '未打哈欠', 'open': '睁眼'}

        综上所述,我们精心构建和优化的数据集不仅在数量上足够支持深度学习模型的训练,其多样性和数据增强措施也为模型提供了强大的泛化基础。我们对数据集的分析不仅提供了对当前数据集结构的深入理解,还为未来的数据采集和模型训练提供了宝贵的指导。通过这样的数据集,我们期望本疲劳驾驶检测系统能够在实际应用中表现出色,为确保道路安全做出积极贡献。


2. 系统界面效果

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

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

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

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

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


3. YOLOv8算法原理

        YOLOv8代表了目标检测领域的最新进展,它在保持YOLO系列一贯的实时性的同时,引入了一系列创新技术以提升检测精度。2023年1月由YOLOv5的开发团队UltraLytics公布的这一算法,不仅在标准的测试集上达到了前所未有的准确度,还在处理速度上做出了显著提升。在我们的疲劳驾驶检测系统中,YOLOv8算法起着核心作用。YOLOv8是YOLO(You Only Look Once)系列算法的最新迭代,它是一个高效的实时目标检测算法,旨在实现快速而准确的物体定位和分类。

        YOLOv8沿用了CSPNet的设计,同时在C3模块中集成了多尺度特征融合,这些特征融合能够强化网络对小目标的检测能力。这是因为在多尺度特征融合中,网络能够利用不同层次的特征信息,增强对复杂场景中微小或遮挡物体的识别能力。

        YOLOv8还引入了一种新颖的损失函数——一种基于概率分布的方法。传统的目标检测算法中,损失函数通常会简单地将每个目标的分类和位置误差相加来计算总损失。而YOLOv8通过这种新颖的损失函数,能够在优化过程中考虑不同任务的权重,避免某一项任务(如分类)的损失对总损失的影响过大,从而达到更加平衡的训练效果。

        在算法的训练过程中,YOLOv8引入了Task Aligned Assigner和Distribution Focal Loss来进一步优化性能。Task Aligned Assigner负责为每个预测框分配最合适的目标,它通过考虑任务的特性和目标状态来选择最合适的预测框,而不是简单地根据预测框和目标之间的重叠程度(IoU)。Distribution Focal Loss则是一种新颖的损失函数,它不仅关注于正确分类的损失,还关注于错误分类的概率分布,提供更精细的损失权重调整,以提高模型的识别准确率。

        总之,YOLOv8的设计理念是提高算法的准确性和实时性,使其在实时的目标检测任务中表现出色。通过先进的网络结构、损失函数以及标签分配策略,YOLOv8在目标检测领域中实现了快速、准确的检测,特别是在处理复杂场景和小目标检测方面有显著的优势。这些特性使得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/test.png")
image = cv_imread(img_path) 

        在读取了图像文件之后,就可以使用加载的模型对图像进行预测了。下图为预测结果。

pred, superimposed_img = model.predict(pre_img)

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 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。

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

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

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

results2 = model.train(  
        data=data_path,
        device='0', 
        workers=workers, 
        imgsz=640,  
        epochs=120,  
        batch=batch,  
        name='train_v8_' + data_name  
    )

        首先,框损失负责量化模型预测的边界框与实际标注边界框之间的差异。从图中可以观察到,随着训练的进行,训练和验证集上的框损失都呈下降趋势,这表明模型在边界框定位方面的性能随着训练逐步提高。尤其是在训练集上,框损失的下降速度和稳定性显示了模型对训练数据的适应性和学习效果。

        接着是分类损失,这一损失函数衡量的是模型在分类疲劳驾驶行为时的准确性。图表中显示训练集和验证集的分类损失都有明显的下降,说明模型在区分不同驾驶状态(如正常、打哈欠、闭眼等)上取得了进展。这种下降趋势在验证集上的平稳性也表明模型没有出现过拟合现象,而是在逐步学习如何泛化到未见过的数据。

        目标损失(即定位损失)是一个综合指标,它结合了框损失和分类损失,以优化检测任务的整体性能。从图中可以看出,这一损失在训练和验证过程中都有所下降,验证了模型在训练过程中学习的有效性和鲁棒性。

        性能指标方面,精确度(precision)和召回率(recall)两个图表表明,模型在保持较高召回率的同时,也保持了相对稳定的精确度。这两个指标的平衡是目标检测任务中非常重要的,因为它们共同影响着模型的实际应用效果。另外,平均精度均值(mAP)在不同IoU阈值下的表现也显示了模型的优秀性能,尤其是在更严格的mAP50-95(考虑了IoU从0.5到0.95的范围)指标上,模型显示出了良好的检测精度。

        在评估疲劳驾驶检测模型的性能时,F1得分是一个非常重要的指标,它综合考虑了模型的精确度和召回率。F1得分的最佳值为1,最差值为0,较高的F1得分表明模型在精确度和召回率之间达到了良好的平衡。

         'Yawn'(打哈欠)和'close'(闭眼)两个类别的F1得分较高,尤其在中等置信度阈值区域。这表明模型对于检测这两种疲劳驾驶相关的行为表现良好。相比之下,'noYawn'(无哈欠)类别的F1得分相对较低,这可能是因为'noYawn'状态在视觉上没有明显的特征,使得模型难以区分。

         整体来看,所有类别的F1得分在置信度阈值约为0.217时达到峰值,此时F1得分为0.55。这个阈值平衡了误报和漏报的数量,使得模型达到了相对最优的性能。

        在较低的置信度阈值时,模型倾向于检测出更多的目标,从而提高了召回率,但这同时会增加误报,导致精确度下降。随着置信度阈值的增加,模型变得更为保守,只有那些模型更有信心的检测结果会被视为正检测,从而提高精确度但降低召回率。这种趋势在所有类别中都能观察到。

        在设计和优化疲劳驾驶检测模型时,选择合适的置信度阈值对于模型的最终性能至关重要。在实际应用中,我们可能需要根据具体场景和需求(如是否更重视减少误报还是漏报)来调整置信度阈值。此外,对于性能较低的类别,我们可能需要进一步分析数据或调整模型结构,以提升这些类别的检测精度。

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.650 0.602 0.583 0.641
F1-Score 0.55 0.55 0.56 0.55

(3)实验结果分析

        在深度学习领域,尤其是在目标检测任务中,模型的选择至关重要。YOLO系列作为目标检测的代表算法,其不同版本在疲劳驾驶检测任务上的表现各有千秋。通过详细分析实验数据,我们可以深入了解各版本模型的性能和适用场景。

        首先,观察mAP值,YOLOv5nu以0.650的成绩领先,这表明在平均精度上,YOLOv5nu的表现最为出色。mAP是一个重要的性能指标,它衡量了模型在不同置信度阈值下的精确度和召回率的平均值。YOLOv5nu的高mAP得分表明它在多种情况下都能够保持较高的检测性能,特别是在识别物体的准确性上。紧随其后的是YOLOv8n,以0.641的mAP值显示了与YOLOv5nu相近的性能。这可能归功于YOLOv8n在架构和损失函数上的优化,使得它在检测不同对象时能够维持高准确度。相比之下,YOLOv6n和YOLOv7-tiny的mAP值分别为0.602和0.583,显示出在精度上略有不足。

        F1-Score则是一个综合了精确度和召回率的指标,它是精确度和召回率的调和平均数,较高的F1-Score意味着模型在减少误报和漏报之间取得了良好的平衡。在这个指标上,四种算法表现出相当接近的结果。YOLOv5nu、YOLOv6n和YOLOv8n都达到了0.55的F1-Score,而YOLOv7-tiny以0.56略高一筹。这意味着尽管YOLOv7-tiny在mAP上表现不及其他几个版本,但在平衡误报和漏报方面却做得略好。这也表明在特定应用场景,特别是在召回率更为重要时,YOLOv7-tiny可能是一个更好的选择。

       尽管YOLOv8n在mAP上的表现很接近YOLOv5nu,但F1-Score并没有体现出显著的优势,这可能表明YOLOv8n在某些情况下可能产生了更多的误报,或者在特定类别的检测上存在漏报。为了进一步提升YOLOv8n的性能,可能需要对模型进行更细致的调整,如改进分类损失函数或调整置信度阈值。

       综合以上分析,每个YOLO版本都有其优势和适用场景。YOLOv5nu在整体精度上表现最好,而YOLOv7-tiny在保持召回率和减少误报方面略胜一筹。YOLOv6n和YOLOv8n则显示出平衡的性能,适合在需要较好准确性和召回率平衡的情况下使用。选择哪个模型取决于具体的应用需求,如对速度、精度或是模型大小的特定要求。在实际应用中,我们可能需要根据任务的特性进行适当的模型选择和调优,以达到最佳的性能表现。

4.4 代码实现

        在这篇博客中,我们将深入探讨如何利用Python和深度学习框架构建一个疲劳驾驶检测系统。这个系统基于YOLOv8模型,通过分析驾驶员的面部动作,如打哈欠和闭眼,来实时检测疲劳驾驶行为。本文将展示系统的核心代码,并详细解释其工作原理。

(1)导入必要的模块和配置
        首先,我们的代码引入了必要的Python模块。例如,random模块用于生成颜色代码,sys模块用于与Python解释器交互,time模块用于记录推理时间。接着,我们导入了cv2库,这是处理图像的核心库。此外,我们的用户界面是基于PySide6库构建的,这是一个提供Qt工具集绑定的Python库。

import sys  # 导入sys模块,用于处理Python运行时环境的一些操作
import time  # 导入time模块,用于处理时间相关的操作
import cv2  # 导入OpenCV库,用于处理图像和视频
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from 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.Drowsiness.label_name import Label_list

QF_Config.set_verbose(False)

        在代码中,我们使用QtFusion库,这是一个封装了Qt功能的库,它提供了创建现代化窗口和控件的方法。
(2)定义类别和模型
        接下来,代码初始化了一个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,它构成了我们应用的主窗口。在这个类中,我们设置窗口的基本属性,如大小和标签,这些标签将用于显示图像和检测结果。此外,我们还定义了键盘事件的处理函数,以便用户可以通过按键来控制应用程序。

class MainWindow(QMainWindow):  # 自定义主窗口类
    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.Key_Q:  # 按下Q键时
            self.close()  # 关闭窗口

        在我们的系统中,MainWindow类继承自QMainWindow,它是主窗口的基础。在定义了用户界面的主窗口类MainWindow之后,我们为应用程序设置了事件处理,比如按下'Q'键退出程序的功能。这为用户提供了直观的交互方式。

(4)主程序流程

        接下来的部分是frame_process函数,它是系统的核心。这个函数负责处理视频流的每一帧图像。我们先对图像进行了大小调整,然后将其传递给预先加载的YOLOv8模型进行预测。预测完成后,我们对结果进行后处理,包括绘制边界框和标签,并将处理后的图像显示在主窗口的标签上。

def frame_process(image):  # 定义帧处理函数,用于处理每一帧图像
    image = cv2.resize(image, (850, 500))  # 将图像的大小调整为850x500
    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上显示图像

        最后,我们设置了视频源,连接了frame_process函数以处理每一帧图像,并启动了媒体流的处理。当一切准备就绪后,我们显示主窗口并进入Qt应用程序的主循环。

app = QtWidgets.QApplication(sys.argv)  # 创建QApplication对象
window = MainWindow()  # 创建MainWindow对象

filename = abs_path("test_media/疲劳驾驶.mp4", path_type="current")  # 定义视频文件的路径
videoHandler = MediaHandler(fps=30)  # 创建MediaHandler对象,设置帧率为30fps
videoHandler.frameReady.connect(frame_process)  # 当有新的帧准备好时,调用frame_process函数进行处理
videoHandler.setDevice(filename)  # 设置视频源
videoHandler.startMedia()  # 开始处理媒体

# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())

        通过这些代码,我们能够创建一个实时的疲劳驾驶检测系统。该系统不仅能够处理视频流,还能通过图形界面实时展示检测结果,为用户提供直观的反馈。这一整合应用程序的开发展示了深度学习模型在实际应用中的潜力,以及如何将其应用于提高道路安全的实际问题中。


5. 疲劳驾驶检测系统实现

        在开发交互式疲劳驾驶检测系统时,我们的系统设计思路旨在实现高效的人机交互,确保用户能够直观地监测和分析疲劳驾驶行为。此系统不仅涉及到前沿的机器学习技术,而且还包括用户界面设计和实时数据处理等多个层面的工作。基于这一目标,系统的设计采纳了模块化的架构,每个模块负责处理特定的任务,同时确保了整个系统的高度集成和协同工作。

5.1 系统设计思路

        我们首先定义了MainWindow类作为系统的核心,该类的设计符合MVC(Model-View-Controller)设计模式,将用户界面、数据处理和业务逻辑清晰地分离。这不仅有助于代码的维护和更新,还使得未来的功能扩展和迭代变得更加容易。

(1)架构设计
        在系统的架构设计上,我们遵循了分层的方法,确保了各个组件的清晰划分和高内聚性,同时也易于维护和扩展。具体来说,我们的架构分为三个主要层次:

  • 处理层(Processing Layer):在处理层面,我们集成了YOLOv8Detector类,该类搭载了先进的YOLOv8算法。这个预训练的模型是系统智能分析的核心,负责实时检测视频流中的疲劳驾驶行为,如频繁打哈欠或闭眼等。模型的高效性能确保了检测的准确性和快速响应,使得系统能够及时警告用户注意安全驾驶。
  • 界面层(UI Layer):界面层则通过PySide6框架实现,这是一个跨平台的Python库,用于创建高质量的用户界面。我们定制的UI不仅外观简洁美观,而且操作直观易用。用户可以通过界面上的按钮和菜单来控制视频流的播放、暂停以及检测过程,同时,实时的检测结果将直接在界面上展示,为用户提供即时的反馈。
  • 控制层(Control Layer):控制层作为系统的指挥中心,协调界面层和处理层的互动。通过在MainWindow类中实现的槽函数,系统能够响应用户的交互命令,并调用YOLOv8模型进行数据处理。此外,控制层还负责管理视频流的读取和帧处理,确保视频数据流畅地输送到模型中进行分析。

        系统还充分利用了Qt框架的信号和槽机制,这是一种强大的事件通信机制,允许不同组件之间的松耦合通信。当视频帧准备就绪时,通过信号通知系统进行处理;当检测结果出现时,通过槽函数将结果渲染到界面上。这种设计使得系统能够灵活响应各种事件,同时保持了代码的清晰和易管理。

        综上所述,我们的系统设计通过精心的层次划分和模块化,确保了疲劳驾驶检测系统既能以高准确率执行复杂的图像分析任务,又能提供友好的用户体验。通过这样的设计,我们为用户提供了一个可靠的工具,帮助他们在驾驶过程中识别和预防疲劳驾驶行为,从而提高道路安全。
(2)系统流程

        在本博客中,我们将展开讲述一个基于YOLOv8模型的疲劳驾驶检测系统的设计流程。这个系统通过智能算法分析驾驶员的面部状态,从而实时检测疲劳驾驶行为。系统的操作流程经过精心设计,确保了用户的便捷性和系统的高效性。

  1. 当用户启动应用程序时,系统首先创建MainWindow类的实例。这一实例不仅负责加载和初始化应用程序界面,还负责设置应用程序运行所需的各项参数。用户界面的直观设计使得用户能够轻松地选择和配置媒体输入源。这些输入源可以是实时的摄像头数据流、预录制的视频文件,甚至是静态的图像文件,为不同用户需求提供灵活性。

  2. 选择好输入源后,系统将激活媒体处理器,对输入数据进行适配和预处理。这些处理包括对视频流的捕捉、视频文件的解码以及图像文件的读取等。系统在这一阶段将确保数据以正确的格式和参数被送入后续的处理流程。

  3. 随着媒体输入源的准备就绪,系统进入了核心的连续帧处理循环。首先,每一帧图像都会经过一系列预处理操作,这包括调整图像大小、转换色彩空间以及归一化处理,以适配YOLOv8模型的输入需求。接下来,在检测与识别阶段,预处理后的图像被输入到YOLOv8模型中,模型运用其深度学习算法检测图像中的人脸位置,并识别可能表明疲劳的表情特征,如打哈欠和闭眼等。

  4. 一旦模型输出了检测结果,界面更新阶段开始。系统界面会实时显示检测框,并标注出驾驶员的表情类别。同时,系统还会在界面上展示相关的统计数据,如检测到的疲劳次数,这些数据以图表或列表的形式呈现,为用户提供直观的反馈。

  5. 此外,用户交互是系统设计中的重要考虑。用户可以通过界面上的控制按钮,执行各种操作,例如保存检测结果的功能、查询系统信息,以及使用筛选功能对特定的检测结果进行深入分析。系统也提供了播放控制功能,用户可以通过界面控制媒体的播放、暂停或停止,从而实时监控分析过程。

        总之,这个疲劳驾驶检测系统的设计思路是将高级的YOLOv8检测算法与用户友好的交互界面相结合,通过精心设计的操作流程,不仅提升了用户体验,也确保了系统处理的准确性和实时性。我们的目标是为用户提供一个易于操作、反应迅速且准确度高的疲劳驾驶监测工具,进而为道路交通安全贡献力量。

5.2 登录与账户管理

        在本博客中,我们将详细探讨疲劳驾驶检测系统中的用户账户管理功能。该系统不仅集成了先进的YOLOv8检测算法,还在用户体验方面下了一番功夫,特别是在个性化服务和数据管理方面。账户管理功能的加入,使得每个用户都能够在一个安全的私人空间内操作系统,管理自己的数据和设置,从而提供了一种更加个性化的使用体验。

        用户账户管理是通过结合PySide6 —— 一个强大的Python库,用于创建Qt应用程序 —— 与SQLite数据库构建的。SQLite是一种轻量级的数据库,非常适用于需要轻便、无需复杂配置的场景。通过这样的组合,我们设计了一个友好的用户登录界面,支持新用户注册和现有用户登录。注册时,用户可以创建自己的账户,设置密码,甚至上传个人头像,而这些信息都将被安全地存储在数据库中。

        登录成功后,用户将进入系统的主界面,可以开始进行疲劳驾驶的检测工作。在主界面中,用户不仅可以实时查看检测结果,包括检测框、类别和置信度等信息,还可以对检测结果进行保存和管理。系统支持多种输入源,包括图片、视频、实时摄像头捕捉以及批量文件,使得系统的应用场景更加广泛。

        在用户个性化服务方面,我们的系统提供了一系列功能,使用户能够更加便捷地管理自己的账户。用户可以随时修改密码以保障账户安全,更换头像以个性化自己的界面,以及在需要时注销账户。在用户管理界面中,这些操作都被设计得简单直观,只需要几个点击即可完成,确保了用户可以无障碍地进行各项操作。

        此外,对于已经登入的用户,系统还能够记住用户的偏好设置和检测历史,为用户提供持续的个性化体验。这意味着用户可以在任何时候回到系统中,查看之前的检测记录和设置,继续之前的工作。这样的设计不仅提高了用户体验,也方便了用户对疲劳驾驶行为的长期监测和分析。

        综上所述,通过以上的设计和实现,我们的疲劳驾驶检测系统不仅具备了高效的检测能力,还提供了一系列便利的用户管理功能,从而满足用户在实时目标检测场景下的多元化需求。这些特性使得系统不仅是一个强大的检测工具,也是一个用户友好、易于管理的个性化平台。


下载链接

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

在这里插入图片描述

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

演示与介绍视频:https://www.bilibili.com/video/BV1FK421878L/
YOLOv8/v7/v6/v5项目合集下载https://mbd.pub/o/bread/mbd-ZZuXmZpy
YOLOv8/v5项目完整资源下载https://mbd.pub/o/bread/ZZuXmJtu
YOLOv7项目完整资源下载https://mbd.pub/o/bread/ZZuXmZhq
YOLOv6项目完整资源下载https://mbd.pub/o/bread/ZZuXl5Zs

    在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的疲劳驾驶检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。

        该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。


结束语

        由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。


  1. Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎

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

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

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

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

标签:YOLOv7,YOLOv6,疲劳,Python,检测,模型,系统,驾驶,YOLOv8
From: https://www.cnblogs.com/sixuwuxian/p/18009846

相关文章

  • Python中运算符and ,or 如何运算
    print(TrueandTrue)#True,前者为真,输出后者print(Trueand3)#3,前者为真,输出后者print(0andTrue)#0,前者为假,输出前者print(3or4)#3,前者为真,输出前者print(0or3)#3,前者为假,输出后者print(TrueorFalse)#True,前者为真,输出前者print(Trueor3)#True,前......
  • Python教程:生成Excel并更改表头
    简介在数据处理和报告生成中,Excel文件是一种常见的格式。Python提供了许多库来处理Excel文件,其中包括openpyxl,它是一个功能强大且易于使用的库,可以用来生成、修改和读取Excel文件。本文将介绍如何使用Python的openpyxl库生成Excel文件,并且演示如何更改表头。生成Excel文件首先......
  • 如何使用Python去除文件后缀名?
    简介在Python中,我们常常需要操作文件,包括文件的读取、写入、重命名等操作。在文件操作中,我们经常会遇到需要去除文件后缀的问题。那么,Python如何去除文件后缀呢?本文我们将介绍如何使用Python来去除文件后缀。去除文件后缀名的方法在Python中,去除文件后缀名有多种方法,我们将介绍......
  • Python实现:教你轻松统计文件夹下文件个数
    简介在日常的文件管理中,我们经常需要统计某个文件夹下文件的数量,这对于数据管理、文件清理等工作至关重要。Python作为一种强大而灵活的编程语言,提供了多种方法来实现这一目标。本文将介绍几种Python实现统计文件夹下文件个数的方法,并逐步解析它们的原理和用法。使用os模块Pyth......
  • Python教程:如何获取颜色的RGB值
    简介在许多计算机图形和图像处理应用中,颜色的RGB值是至关重要的信息。Python作为一种多功能的编程语言,提供了丰富的工具和库,可以轻松地获取颜色的RGB值。本文将介绍如何使用Python获取颜色的RGB值,以及一些实际应用的示例。使用PIL工具获取颜色的RGB值PIL(PythonImagingLibrar......
  • Python编程规范+最佳实践
    前言Python之禅是影响Python编程语言设计的19条原则,也是Python编码规范的核心理念。优美胜于丑陋(Python以编写优美的代码为目标)明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)复杂胜于凌乱(如果复杂不可避免,......
  • python时间序列缺失值补零
    有个雨滴谱的数据,情况是有雨滴的时候会记录那个时刻的雨滴情况,但是无雨滴的时间没有记录那么我想花一个雨滴时间序列的情况,就需要补全没有雨滴的时间,并且记录为0数据情况如下: python代码:#!usr/bin/envpython#-*-coding:utf-8-*-"""@author:Su@file:timecomplet.p......
  • Python算法练习
    练习Python算法可以帮助我们提高解决问题的能力、优化代码效率,并深入理解Python语言的特性。以下是一些Python算法练习的建议和示例:排序算法:实现常见的排序算法,如冒泡排序、插入排序、选择排序、快速排序、归并排序等,并比较它们的性能。练习应用排序算法解决实际问题,如查......
  • 系统的学习Python——编程练习
    Python编程练习是提高编程技能和加深对Python语言理解的有效途径。常见的Python编程练习方法如下:解决算法和数据结构问题:练习解决各种算法问题,如排序、搜索、递归等。LeetCode、Hackerrank和ProjectEuler等平台提供了大量的算法和数据结构问题,适合练习。实现各种数......
  • ***python看图软件***(+-切换文件夹,d删除所在文件夹)
    importosimporttkinterastkfromtkinterimportsimpledialog,messageboxfromPILimportImage,ImageTkclassImageViewer(tk.Tk):def__init__(self):super().__init__()#初始化变量self.all_images=[]self.current_f......