首页 > 其他分享 >基于深度学习的疲劳驾驶检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

基于深度学习的疲劳驾驶检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

时间:2024-04-04 17:12:31浏览次数:33  
标签:训练 疲劳 检测 模型 驾驶 YOLOv8 v5 v7

摘要:在当今社会,随着交通事故频发,疲劳驾驶成为了一个严峻的问题。基于YOLOv8/v7/v6/v5的疲劳驾驶检测技术,作为一种有效的预防措施,引起了广泛的研究和应用。本文深入探讨了利用YOLOv8、YOLOv7、YOLOv6、YOLOv5等先进深度学习模型来实现疲劳驾驶检测的方法与技术。核心采用YOLOv8模型,并将其与YOLOv7、YOLOv6、YOLOv5进行了细致的性能对比分析。本文详细阐述了疲劳驾驶检测的国内外研究现状,对不同数据集的处理方法、算法原理进行了系统的介绍。同时,模型构建与训练代码部分详尽地展示了如何利用这些高效的算法构建出准确度高、响应快速的疲劳驾驶检测模型。此外,我们还设计了基于Streamlit的交互式Web应用界面,使得用户可以在Web页面中轻松地进行图像、视频以及实时摄像头的疲劳驾驶检测。该界面支持用户上传不同的训练模型(YOLOv8/v7/v6/v5)进行推理预测,界面的可修改性强,用户体验良好。文章的最后,我们附上了完整的网页设计、深度学习模型代码和训练数据集的下载链接,方便读者下载和使用。通过本文的研究与分享,我们希望能够为疲劳驾驶的预防与检测提供一种有效的技术手段,为减少交通事故、保护人们的生命安全作出贡献。

@

目录

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


完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频https://www.bilibili.com/video/BV1YJ4m1j7bV/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZ2Xm5tp
YOLOv8和v5项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2XmJdx
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2XmZ1u
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Xmp1w

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


1. 网页功能与效果

        (1)开启摄像头实时检测:本系统允许用户通过网页直接开启摄像头,实现对实时视频流中疲劳驾驶的检测。系统将自动识别并分析画面中的疲劳驾驶,并将检测结果实时显示在用户界面上,为用户提供即时的反馈。

        (2)选择图片检测:用户可以上传本地的图片文件到系统中进行疲劳驾驶检测。系统会分析上传的图片,识别出图片中的疲劳驾驶,并在界面上展示带有疲劳驾驶标签和置信度的检测结果,让用户能够清晰地了解到每个疲劳驾驶状态。

        (3)选择视频文件检测:系统支持用户上传视频文件进行疲劳驾驶检测。上传的视频将被系统逐帧分析,以识别和标记视频中每一帧的疲劳驾驶。用户可以观看带有疲劳驾驶检测标记的视频,了解视频中疲劳驾驶的变化。

        (4)选择不同训练好的模型文件:系统集成了多个版本的YOLO模型(如YOLOv8/v7/v6/v5),用户可以根据自己的需求选择不同的模型进行疲劳驾驶检测。这一功能使得用户能够灵活地比较不同模型的表现,以选择最适合当前任务的模型。

        在本系统中,我们提供了一系列功能以增强用户体验并提高疲劳驾驶检测的效率和准确性。首先,用户可以利用开启摄像头实时检测功能直接通过摄像头捕获画面进行疲劳驾驶的即时检测,这对于确保驾驶安全至关重要。此外,系统支持选择图片检测选择视频文件检测,允许用户上传本地的图片或视频文件进行深入的疲劳状态分析。为了适应不同的检测需求,用户还可以选择不同训练好的模型文件,以达到最佳的检测效果。

        进一步地,系统整合了多个高级功能以优化检测过程。用户可以选择检测画面与原始画面的同时或单独显示,并通过下拉框单独标记特定目标显示结果,从而实现更精确的分析。检测结果会直观地在页面表格中展示,并且用户可以动态调整检测算法的置信度阈值IOU阈值,以便根据实际情况优化检测精度。为了便于数据的记录和分析,系统提供了功能,允许用户将检测结果以csv格式导出。此外,标记的图片、视频及摄像头画面结果均可导出为avi图像文件,便于保存和进一步使用。这些功能的融合不仅提升了疲劳驾驶检测的实用性,也极大地便利了用户对检测结果的管理和分享。


2. 绪论

2.1 研究背景及意义

        随着汽车成为人们日常生活中不可或缺的交通工具,道路安全问题也随之成为社会关注的焦点之一。在众多导致交通事故的因素中,疲劳驾驶无疑是一个重要且常被忽视的原因。疲劳驾驶会显著降低驾驶员的反应速度,影响判断力和协调能力,从而极大增加交通事故的风险。据统计,疲劳驾驶是导致严重交通事故的主要原因之一[1]。因此,疲劳驾驶检测技术的研究与应用对于提高交通安全具有重大的实际意义。

        近年来,随着人工智能技术的迅速发展,尤其是深度学习技术在图像处理和视频分析方面的应用成果,疲劳驾驶检测方法也日益多样化。从最初的生理信号监测发展到现在的行为分析和面部表情识别,技术手段不断进步。目前,基于计算机视觉的疲劳驾驶检测已经成为研究的热点。特别是,YOLO(You Only Look Once)系列算法因其高效率和高准确率在实时视频分析中展现出了巨大的潜力,为疲劳驾驶检测提供了新的技术路径[2][3]

        然而,尽管已有研究取得了一定的进展,但疲劳驾驶检测技术仍面临多项挑战,包括在复杂环境下的检测准确性、算法的实时性能以及对不同个体的适应性等。为了克服这些问题,研究者持续在算法优化、数据集扩充以及系统集成等方面进行探索。近期的研究表明,通过对YOLO算法的改进和深度学习模型的细致训练,可以显著提高疲劳驾驶检测的性能,包括提升检测的准确率和实时响应速度[4][5]

        此外,随着大数据和云计算技术的发展,收集和处理大规模驾驶行为数据成为可能,这不仅有助于优化疲劳驾驶检测模型,还为个性化和场景化的疲劳驾驶预警提供了数据支持。疲劳驾驶检测技术的进步,将进一步促进智能驾驶辅助系统的发展,为实现交通安全提供更加有效的技术手段。

2.2 国内外研究现状

        在疲劳驾驶检测领域,随着计算机视觉和深度学习技术的飞速发展,相关算法和模型也在不断进化。近年来,研究者们致力于提升疲劳驾驶检测的准确性、实时性和适用性,尤其是在目标检测算法方面的研究成果显著。基于YOLO(You Only Look Once)算法的系列改进,在疲劳驾驶检测方面表现出色,因其快速高效的特性,被广泛应用于实时疲劳状态的识别中。

        YOLOv3算法因其较好的速度和准确度平衡,被用于识别驾驶员的面部特征,如眨眼次数、打哈欠频率等,从而有效判断疲劳状态。随后,YOLOv4引入了多种新技术,如CIoU loss、CSP结构等,进一步提升了检测的准确性和速度,使其在复杂环境下的疲劳驾驶检测应用中获得了更好的表现。YOLOv5,作为一个轻量级模型,通过简化模型结构和优化计算过程,实现了在较低计算资源下的高效运行,使得在移动端或嵌入式设备上的疲劳驾驶检测成为可能。进一步地,随着YOLOv6和YOLOv7的推出,研究者在这两个版本上实现了算法的进一步优化和性能提升。YOLOv6通过改进的注意力机制和更精细的特征融合策略,提高了对驾驶员微妙疲劳行为的识别能力。YOLOv7则在保持高准确度的同时,进一步优化了算法的运行速度,为实时疲劳驾驶检测提供了强有力的支持。这些进展不仅提升了疲劳驾驶检测的性能,也为后续的研究提供了新的思路和基础。

        除了YOLO系列,Transformer架构在目标检测领域也展现出了其潜力。ViT(Vision Transformer)通过自注意力机制捕捉全局特征,这对于理解驾驶员在车内复杂背景下的疲劳状态有着不可忽视的优势。另一方面,传统的目标检测算法如RetinaNet和Faster R-CNN在处理静态图像方面仍有其独特价值。它们的精确性和稳健性为验证疲劳驾驶行为提供了可靠的基准。

        DETR(Detection Transformer)利用Transformer的编码器-解码器结构,摒弃了复杂的预处理和后处理步骤,提供了端到端的目标检测解决方案。这种方法在处理不同尺度的目标时显示出独特的优势。类似地,Glod-YOLO和最新的YOLOv9均在原有架构的基础上进行了改进和创新,以适应更广泛的应用场景,包括对疲劳驾驶的检测。

        MMDetection作为一个开源目标检测工具箱,为研究者提供了多样的算法选择和灵活的实验设置。这对于在不断变化的疲劳驾驶检测任务上快速迭代和测试新思路具有重要意义。

        综合以上各类算法,我们可以看到目标检测领域正面临技术融合的趋势。注意力机制的引入、Transformer的应用以及端到端学习模式的探索,都在推动着这个领域向更精确、更智能的方向发展。在疲劳驾驶检测的任务上,这些算法的融合和创新有望解决如驾驶员多样化行为的识别、光照和环境变化下的稳健性、实时性能与精确性的平衡等挑战。

2.3 要解决的问题及其方案

2.3.1 要解决的问题

        针对基于YOLOv8/v7/v6/v5的疲劳驾驶检测系统,我们面临的核心问题和挑战可以细化为以下几点,每一点都是基于实际应用场景和技术发展的考量:

  1. 疲劳驾驶行为的准确性和实时性检测
    疲劳驾驶检测的核心挑战在于如何实现对驾驶员疲劳行为的高准确度识别与实时处理。鉴于驾驶员的疲劳状态表现可以非常细微,如眨眼频率、打哈欠次数、头部姿态等,系统需要能够准确捕捉并分析这些细节。此外,疲劳驾驶行为的实时检测对于及时预警具有至关重要的意义,因此开发一个能够快速响应并准确识别疲劳驾驶行为的模型成为项目的首要任务。

  2. 环境适应性和模型泛化能力
    驾驶环境的复杂多变对疲劳驾驶检测提出了额外的挑战。变化的光照条件、车内外复杂的背景以及天气变化等因素都可能影响识别准确性。因此,系统需要具备出色的环境适应性和模型泛化能力,确保在多样化的环境条件下都能保持高识别准确率。

  3. 用户交互界面的直观性和功能性
    系统的用户界面设计对于确保用户能够有效利用疲劳驾驶检测系统至关重要。界面需要设计得直观易懂,降低用户的操作难度。同时,功能布局应合理,快速让用户访问到他们需要的功能,如实时监控、历史数据查询、模型切换等,提升用户体验。

  4. 数据处理能力和存储效率
    鉴于疲劳驾驶检测系统将处理大量的图像和视频数据,系统需要具备强大的数据处理能力和高效的存储机制。这关系到识别的实时性及长期数据的管理和查询效率。考虑到个人隐私保护,数据的安全性和隐私保护措施也需得到充分的考虑和实施。

  5. 系统的可扩展性和维护性
    随着技术进步和用户需求的变化,系统可能需要支持更复杂的疲劳驾驶行为检测,或集成新技术以提高识别性能。因此,系统设计时需考虑到未来的可扩展性,允许无缝集成新的模型或功能。同时,确保系统的维护性,使其能够持续稳定运行,及时进行更新和升级,是构建一个成功的疲劳驾驶检测系统的关键。

2.3.2 解决方案

        针对疲劳驾驶检测系统的设计与实现,我们计划采取一系列方法来应对提出的挑战,并确保系统的高效性、准确性和用户友好性。以下是我们拟采用的关键策略:

  1. 深度学习模型的选择和优化
  • 模型架构:我们将采用YOLOv8/v7/v6/v5系列作为核心的深度学习模型,这些模型在速度和准确度之间提供了优秀的平衡,特别是YOLOv8的最新进展在准确性上有显著提升,非常适合实时疲劳驾驶检测任务。
  • 数据增强:为提高模型对不同驾驶环境和驾驶员行为的适应性,我们将利用多种数据增强技术,包括但不限于随机裁剪、旋转、色彩调整等,以增强模型的泛化能力。
  • 迁移学习:通过在大规模数据集上预训练的模型作为起点,利用迁移学习技术针对疲劳驾驶的特定任务进行微调,以加速模型训练并提升性能。
  1. 技术框架和开发工具
  • PyTorch框架:选用PyTorch作为开发框架,其灵活性和强大的GPU加速能力非常适合深度学习模型的训练和推理。
  • Streamlit Web应用:基于Streamlit构建交互式Web应用,其快速开发能力能够显著提升项目迭代速度,并简化部署流程。
  • PyCharm IDE:使用PyCharm作为主要的开发环境,其丰富的功能和对Python生态的深度支持,大大提高开发效率。
  1. 功能实现和系统设计
  • 多输入源支持:设计系统支持多种输入源,包括图像文件、视频流和实时摄像头捕获,以适应不同用户场景。
  • 模型切换功能:实现用户可选择不同的YOLO版本进行疲劳驾驶检测的功能,提高系统的灵活性和实用性。
  • 交互式Web界面:通过Streamlit和CSS美化,设计直观且功能丰富的用户界面,支持实时检测结果展示、历史数据查询等功能。
  1. 数据处理和存储策略
  • 高效数据处理:利用PyTorch的数据加载和预处理能力,实现快速有效的图像和视频数据处理流程,保证系统的实时响应能力。
  • 智能数据存储:采用高效的数据存储方案,对检测结果和历史记录进行有效组织,支持快速查询和分析,同时确保数据安全性。
  1. 性能优化和系统测试
  • 性能调优:定期进行系统性能评估,通过模型压缩、硬件加速等手段优化系统性能,确保高效稳定运行。
  • 全面系统测试:实施包括单元测试、集成测试和压力测试在内的全面测试计划,确保系统功能完整、性能稳定、用户体验优良。

        通过实施上述策略,我们目标构建一个既准确又高效的疲劳驾驶检测系统,满足不同用户在多样化环境中的需求,同时提供易用的操作界面和强大的后端支持,为提高道路安全贡献力量。

2.4 博文贡献与组织结构

        本文详细探讨了利用最新的深度学习技术,特别是YOLOv8/v7/v6/v5算法,来检测疲劳驾驶行为的高效方法。通过深入分析和实验验证,本文在疲劳驾驶检测领域做出了显著的贡献,具体包括以下几个方面:

  1. 全面的文献综述:本文提供了关于疲劳驾驶检测的深入文献综述,不仅回顾了传统方法,还重点分析了基于深度学习的最新进展,为读者提供了该领域研究的广阔背景和深入理解。

  2. 数据集的详细处理:详细介绍了数据集的选择、预处理和增强方法,为构建高效、准确的疲劳驾驶检测模型奠定了坚实的数据基础。

  3. 算法选择与优化:本文不仅对比了YOLOv8/v7/v6/v5等算法的性能,还针对疲劳驾驶检测的特点进行了算法优化,提高了模型的准确率和实时性。

  4. 友好的用户界面设计:采用Streamlit框架设计了美观且用户友好的网页界面,使得非专业用户也能轻松地使用本系统进行疲劳驾驶检测。

  5. 实验结果与分析:通过一系列实验对比分析,验证了所选算法在疲劳驾驶检测上的有效性,为未来的研究和应用提供了重要参考。

  6. 完整的资源分享:提供了完整的数据集和代码资源包,方便读者下载和使用,促进了研究成果的共享和复现。

        后续章节的组织结构如下: 绪论:介绍研究背景、目的和本文的主要贡献;算法原理:详细介绍YOLOv8/v7/v6/v5等算法的工作原理及其在疲劳驾驶检测中的应用;数据集处理:讨论使用的数据集及其预处理、增强方法。代码介绍:提供模型训练和预测的详细代码说明,包括环境搭建、参数配置和执行步骤。实验结果与分析:展示不同模型在疲劳驾驶检测任务上的实验结果,并进行比较分析。系统设计与实现:介绍基于Streamlit的疲劳驾驶检测系统的设计与实现细节。结论与未来工作:总结本文的研究成果,并讨论未来的研究方向和潜在的改进空间。


3. 数据集处理

        在本研究中,我们采用了一个精心构建的数据集,专门针对疲劳驾驶行为的检测任务。该数据集由总计16,246张图片组成,其中包括13,719张训练图片、1,380张验证图片和1,147张测试图片。这样的分布保证了模型可以在丰富的数据上进行训练,同时有足够的独立数据进行验证和测试,以评估模型在未知数据上的表现。博主使用的类别如下:

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

        数据集的构建旨在捕捉驾驶员在实际驾驶环境中的各种潜在疲劳行为。为了确保数据的质量和多样性,我们进行了详细的预处理步骤。首先,所有图像均经过自动定向校正,确保图像朝向一致性,并移除了可能干扰模型训练的EXIF方向信息。然后,每张图像都被统一调整为448x448像素的大小,通过拉伸方式保证了数据输入的统一性,这对于保持神经网络处理的一致性和提高计算效率至关重要。

        分析数据集的标签分布,我们发现‘打哈欠’和‘闭眼’的样本数量较多,这反映出这两种行为在驾驶疲劳中的常见性和重要性。在疲劳驾驶的情境下,打哈欠通常与显著的疲劳感相关,而频繁的闭眼则直接关联到驾驶安全。我们的数据集聚焦于这些关键行为,以确保模型训练时能重点识别这些高风险的疲劳指标。对于标注框的分析,我们观察到大多数的标注框集中在图像的中心区域。这一分布模式对于驾驶疲劳检测来说是合理的,因为在实际应用中,摄像头通常会对准驾驶员的面部中心区域。因此,这种分布有助于模型学习和识别那些在驾驶过程中最为关键的疲劳信号。

        此外,我们通过标注框的宽高比分析发现,疲劳行为特征(如眼部活动)往往只占据图像的小部分区域。这种发现强调了在训练疲劳检测模型时,需要高度关注图像中的这些关键区域,并确保模型能够细致地识别出这些小而重要的特征。

        综上所述,本研究所用的数据集在疲劳驾驶检测领域中是极具价值的资源。其标签丰富,分布均衡,且经过细致的预处理,为训练高效、准确的疲劳驾驶检测模型提供了坚实的基础。


4. 原理与代码介绍

4.1 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.2 模型构建

        在代码介绍部分,我们将深入探讨构建用于疲劳驾驶检测的深度学习模型的关键步骤和技术细节。本研究采用了Python语言,结合了多个高效强大的库和框架,以实现对疲劳驾驶行为的快速且准确检测。

        首先,使用OpenCV库,即cv2模块,主要用于实现图像处理的相关操作。它是处理图像和视频的标准库,对于读取、写入以及展示图像至关重要。接下来,torch库为我们提供了一个高效且灵活的计算框架,它是PyTorch深度学习框架的核心,为模型训练和推理提供支持。模型开发中,利用QtFusion库中的Detector基类。Detector基类定义了检测器的通用接口,直观展示模型在图像中的关注区域。这种可视化是理解和调优模型的一个宝贵工具,尤其是在需要精确定位疲劳行为特征时。ultralytics库提供的YOLO类用于加载训练好的YOLO模型,而select_device函数则负责选择运算设备。这一步骤确保了模型能在最优的设备上运行,无论是GPU还是CPU。

import cv2
import torch
from QtFusion.models import Detector
from datasets.label_name import Chinese_name
from ultralytics import YOLO
from ultralytics.utils.torch_utils import select_device

        在初始化参数ini_params中,我们设置了模型在预测时所需的配置,包括:设备类型、置信度阈值、IOU阈值、类别过滤器,这些参数对于调整模型性能和适应不同场景至关重要。

device = "cuda:0" if torch.cuda.is_available() else "cpu"
ini_params = {
    'device': device,
    'conf': 0.25,
    'iou': 0.5,
    'classes': None,
    'verbose': False
}

        count_classes函数是一个实用工具,用于统计预测结果中每个类别的实例数量。这对于了解模型在各类别上的表现和可能需要额外关注的类别非常有帮助。

def count_classes(det_info, class_names):
    count_dict = {name: 0 for name in class_names}
    for info in det_info:
        class_name = info['class_name']
        if class_name in count_dict:
            count_dict[class_name] += 1
    count_list = [count_dict[name] for name in class_names]
    return count_list

        接下来的代码部分定义了一个YOLOv8v5Detector类,这是一个针对疲劳驾驶检测定制的检测器,它继承自Detector。该类在初始化时,加载模型并设置模型参数。这些参数包括设备类型、置信度阈值、IOU阈值以及类别过滤器等,这些都是进行高精度检测所必须的配置。通过load_model方法加载的模型是本系统的核心。它从指定路径加载YOLO模型,并对其进行预热,使模型在实际执行推理之前达到最优状态。在加载过程中,类别名称通过与中文名称的映射转化,使得最终的输出更加友好,易于理解。

class YOLOv8v5Detector(Detector):
    def __init__(self, params=None):
        super().__init__(params)
        self.model = None
        self.img = None
        self.names = list(Chinese_name.values())
        self.params = params if params else ini_params
	def load_model(self, model_path):
	    self.device = select_device(self.params['device'])
	    self.model = YOLO(model_path)
	    names_dict = self.model.names
	    self.names = [Chinese_name[v] if v in Chinese_name else v for v in names_dict.values()]
	    self.model(torch.zeros(1, 3, *[self.imgsz] * 2).to(self.device).type_as(next(self.model.model.parameters())))
	def preprocess(self, img):
	    self.img = img
	    return img
	
	def predict(self, img):
	    results = self.model(img, **ini_params)
	    return results
	
	def postprocess(self, pred):
	    results = []
	    for res in pred[0].boxes:
	        for box in res:
	            class_id = int(box.cls.cpu())
	            bbox = box.xyxy.cpu().squeeze().tolist()
	            bbox = [int(coord) for coord in bbox]
	            result = {
	                "class_name": self.names[class_id],
	                "bbox": bbox,
	                "score": box.conf.cpu().squeeze().item(),
	                "class_id": class_id,
	            }
	            results.append(result)
	    return results
	    
    def set_param(self, params):
        self.params.update(params)

        模型预测流程的实现分为三个步骤:预处理、推理和后处理。preprocess方法将原始图像作为输入,并进行必要的预处理。这可能包括调整图像大小、标准化像素值等。之后,predict方法使用处理好的图像进行推理,得到原始的检测结果。最后,postprocess方法将YOLO模型的输出转换为易于理解的格式。这一步骤涉及解析边界框、类别ID和置信度,并将其转换为包含中文类别名称的结果列表。set_param方法提供了一种机制,允许在运行时更新模型参数,提供了灵活性以适应不断变化的检测需求。

        这一系列的方法共同工作,构成了我们疲劳驾驶检测系统的计算流程。在实际应用中,这些方法的实现确保了模型不仅可以有效加载和运行预测,而且还能够根据实际需求进行适当的调整。

4.3 训练代码

        在疲劳驾驶检测的深度学习任务中,模型的训练是一个至关重要的过程。训练环节负责将算法应用于实际数据,通过迭代学习来提升模型的性能。这一段博客将详细介绍如何使用Python代码对YOLOv8模型进行训练,以及这些代码背后的含义以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:

超参数 设置 说明
学习率(lr0 0.01 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。
学习率衰减(lrf 0.01 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。
动量(momentum 0.937 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。
权重衰减(weight_decay 0.0005 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。
热身训练周期(warmup_epochs 3.0 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。
批量大小(batch 16 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。
输入图像大小(imgsz 640 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。

        环境设置与模型加载:首先,我们的代码通过导入必要的库和包开始,其中torch是PyTorch深度学习框架的核心库,而yaml用于处理配置文件。ultralytics的YOLO类是一个接口,用于加载预训练的YOLO模型,并执行训练任务。QtFusion.path中的abs_path函数用于获取文件的绝对路径,这对于确保数据集路径的准确性至关重要。

import os
import torch
import yaml
from ultralytics import YOLO  # 用于加载YOLO模型
from QtFusion.path import abs_path  # 用于获取文件的绝对路径

        在这里,代码使用torch库来确定训练设备,自动检测是否有可用的GPU,这是因为GPU能够显著加速模型的训练过程。如果没有检测到GPU,代码则回退到CPU上进行训练,这虽然速度较慢,但确保了代码的可移植性。

device = "0" if torch.cuda.is_available() else "cpu"

        数据集准备:接着,代码中定义了数据集的路径,并通过处理yaml文件来设置正确的数据目录。这一步骤是至关重要的,因为它确保了无论数据集被放置在何处,训练过程都能找到正确的数据进行训练。

workers = 1  # 工作进程数
batch = 8  # 每批处理的图像数量
data_name = "Drowsiness"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')
unix_style_path = data_path.replace(os.sep, '/')

        一旦我们获取了YAML文件的路径,我们就打开它,并可能更新其中的一些路径项。在深度学习训练中,确保所有文件和路径都被正确设置是至关重要的,因为这些路径将指导模型去哪里找到训练数据和如何保存训练结果。

directory_path = os.path.dirname(unix_style_path)
with open(data_path, 'r') as file:
    data = yaml.load(file, Loader=yaml.FullLoader)

if 'path' in data:
    data['path'] = directory_path
    with open(data_path, 'w') as file:
        yaml.safe_dump(data, file, sort_keys=False)

        训练模型:最后,我们使用YOLO类创建了一个对象,并指定了模型权重文件的路径。加载了预训练权重之后,我们利用train方法来训练模型,其中包括了数据路径、设备、工作进程数量、图像尺寸、训练周期、批次大小和训练任务的名称等参数。这些参数的设置直接影响了训练过程的效率和模型的性能。在此过程中,模型将通过120个训练周期来学习如何识别疲劳驾驶的行为。每个训练周期都会处理全部的训练数据,每次处理批量大小为8的数据,这是为了平衡训练速度和内存使用。工作进程的数量设置为1,这是在单GPU上进行训练时的常见设置。

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  # 指定训练任务的名称
)

        通过以上步骤的详细介绍,我们可以了解如何使用现代深度学习框架和算法来构建一个疲劳驾驶检测模型。整个过程体现了在机器学习领域中从理论到实践的转化,即从基础的环境设置到模型训练的具体实施。这一系列操作不仅涉及到代码的执行,还包括了对深度学习工作流程的深刻理解。


5. 实验结果与分析

5.1 训练曲线

        分析模型训练过程中的损失和性能指标是深度学习实践中的重要组成部分。通过这些指标,我们能够了解模型的学习进度、识别问题的能力以及优化的方向。在本部分博客中,我们将详细分析YOLOv8模型在训练过程中的表现,并解释这些指标对模型性能的含义。

        首先,训练损失图显示,边界框损失、类别损失和目标损失随着训练周期的增加呈现出下降的趋势。这表明随着模型对数据集的学习逐渐深入,模型在定位目标、识别类别和预测目标框的准确性上有了显著提升。初期损失值的大幅波动可能是由于模型参数的随机初始化,但随着训练的进行,模型开始收敛,损失曲线逐渐平滑。

        在验证损失方面,我们可以看到与训练损失类似的下降趋势,这表明模型具有良好的泛化能力,并能够在未见过的数据上进行准确的预测。一开始的损失值较高,但随着模型的训练逐渐降低,这显示了训练过程中模型对于新数据的适应性在不断提高。

        精确度和召回率的图像提供了关于模型性能的另一视角。精确度指标显示,在训练过程中,模型对于正样本的预测准确性有了显著的提升。召回率则表明,模型能够正确识别的正样本数量在不断增加。这两个指标的结合反映了模型在区分疲劳驾驶行为和非疲劳驾驶行为方面的能力。

        平均精度(mAP50)和严格平均精度(mAP50-95)指标则提供了一个整体的性能评估。mAP50衡量的是检测准确率在IoU为50%时的性能,而mAP50-95则是评估模型在IoU从50%增加到95%的平均性能,更为严格。从图中我们可以看出,这两个指标随训练周期增长而增加,特别是mAP50-95,其稳定的上升趋势显示了模型对于检测任务的掌握越来越精细。

        整体来说,这些图表展示了YOLOv8模型在疲劳驾驶检测任务上的优异训练表现。损失函数的下降和性能指标的提升表明模型在学习过程中取得了显著的进步,既能精确地识别出疲劳驾驶行为,也显示了模型对新数据具有良好的适应和泛化能力。

5.2 PR曲线图

        精确度-召回率曲线(Precision-Recall Curve,简称PR曲线)是衡量目标检测模型性能的重要工具之一,尤其在数据集中正负样本分布不均时,PR曲线提供了比ROC曲线更为真实的性能评估。通过深入分析上图中的PR曲线,我们可以评估模型在不同类别的疲劳驾驶行为检测任务上的表现。

        首先,观察“打哈欠”(Yawn)类别,其精确度接近0.956,意味着模型在检测打哈欠行为时几乎没有误报。这一高精确度表明,当模型预测驾驶员出现打哈欠时,我们可以非常自信地相信这一预测。同时,召回率与精确度曲线接近水平,这表明即使在不同的置信度阈值下,模型依然能保持高精确度。

        接着是“闭眼”(Close)类别,其精确度达到0.927,表明模型在识别驾驶员闭眼行为时也有很高的准确性。召回率的曲线稍微下降,这可能意味着在某些情况下模型可能会错过某些闭眼行为的检测,但总体来看表现仍然很强。

        然而,“未打哈欠”(noYawn)和“睁眼”(Open)的精确度显著较低,分别为0.256和0.424。这低精确度可能表明在这些类别上存在较多的误报,模型可能将不相关的行为错误地分类为这两个类别。对于“未打哈欠”类别,模型的性能特别差,这可能是因为“未打哈欠”的特征不如“打哈欠”明显,或者训练数据不足以使模型有效区分这一行为。

        从整体的平均精确度([email protected])来看,模型在所有类别上达到了0.641的平均精确度,这是一个相对均衡的结果,考虑到类别不平衡和检测任务的困难度,这个结果是令人鼓舞的。但是,“未打哈欠”和“睁眼”类别的低精确度提醒我们,在未来的工作中需要改进模型或提供更多训练样本以提高这些类别的检测性能。

5.3 YOLOv8/v7/v6/v5对比实验

(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 作为衡量模型性能的重要指标,尤其在处理类别分布不均的数据集时显得尤为关键。它通过结合精确率与召回率,提供了一个单一的度量标准,能够全面评价模型的效能。精确率衡量的是模型在所有被标记为正例中真正属于正例的比例,而召回率则关注于模型能够识别出的真正正例占所有实际正例的比例。F1-Score通过两者的调和平均,确保了只有当精确率和召回率同时高时,模型的性能评估才会高,从而确保了模型对于正例的预测既准确又完整。
  • mAP(Mean Average Precision):在目标检测任务中,Mean Average Precision(mAP)是评估模型性能的重要标准。它不仅反映了模型对单个类别的识别精度,而且还考虑了所有类别的平均表现,因此提供了一个全局的性能度量。在计算mAP时,模型对于每个类别的预测被单独考虑,然后计算每个类别的平均精度(AP),最后这些AP值的平均数形成了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系列几个版本的模型(YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n)在同一数据集上的表现。通过mAP(平均精度均值)和F1-Score这两个度量指标,我们可以从多个角度评估和比较这些模型的性能。

        首先,从mAP得分来看,YOLOv5nu模型以0.650的得分位居榜首,而YOLOv8n紧随其后,其得分为0.641。mAP作为衡量模型检测准确性的指标,YOLOv5nu的表现说明了其在检测边界框的定位上有较好的性能,这可能得益于它的网络架构和训练过程中更有效的特征提取能力。此外,YOLOv5nu的结构可能更适合处理本数据集中的特定类型的疲劳驾驶行为,这也是它能取得如此高mAP得分的原因之一。

        接着,我们看到YOLOv6n和YOLOv7-tiny在mAP上的得分分别为0.602和0.583,较前两者有所下降。这种性能上的差异可能与这些模型的网络架构和参数优化有关。YOLOv6n和YOLOv7-tiny的设计目标是在速度和性能之间找到平衡点,特别是在资源受限的环境中。由于其网络架构可能较为简化,这可能在一定程度上牺牲了模型在某些复杂疲劳驾驶行为检测场景中的准确性。

        对于F1-Score,所有模型的得分都相对较为接近,均在0.55至0.56之间。F1-Score作为精确度和召回率的调和平均值,其较为均衡的结果表明了在综合考虑误报和漏报的情况下,各模型均达到了一定水平的性能。值得注意的是,尽管YOLOv7-tiny在mAP得分较低,但其F1-Score最高,这表明在实际应用中,该模型在减少误报(提高精确度)和漏报(提高召回率)之间取得了良好的平衡。

       综上所述,这些实验结果揭示了不同YOLO模型版本在疲劳驾驶检测任务上的性能差异。通过对这些模型的综合评估,我们不仅可以根据具体的应用需求选择合适的模型,例如在需要更快检测速度的场景中选择YOLOv6n或YOLOv7-tiny,或者在对检测准确性要求更高的情况下选择YOLOv5nu或YOLOv8n,同时也为未来如何改进这些模型提供了有价值的洞察。


6. 系统设计与实现

6.1 系统架构概览

        在设计基于YOLOv8/v7/v6/v5的疲劳驾驶检测系统时,我们将整个系统的架构细化为几个关键组件,每个组件都承担着系统运行中的特定任务。以下是结合代码中的部分类和方法名,具体且详细地介绍系统的架构设计。

  1. 数据收集与预处理模块
    该模块主要负责从摄像头采集驾驶员的实时图像,并对这些图像进行预处理以适应模型的输入要求。这一模块的实现依赖于cv2.VideoCapture来捕获摄像头数据,使用cv2库中的图像处理函数(例如cv2.resize)调整图像大小,以确保图像满足模型输入的尺寸要求。

  2. 模型训练与加载模块
    YOLOv8v5Detector类中,我们封装了模型加载和初始化的逻辑。这个类使用load_model方法来加载预训练的YOLO模型权重文件。这些权重文件是基于大量驾驶员行为数据(包括疲劳状态下的行为特征)预先训练得到的。通过加载这些权重,我们的系统能够快速识别疲劳驾驶的关键特征。

  3. 实时检测模块
    frame_process方法是实时检测模块的核心,它负责处理每一个摄像头捕获的图像帧。在这个方法中,首先对输入的图像帧进行必要的预处理,然后使用YOLOv8v5Detector进行疲劳特征的检测。该方法会分析驾驶员的面部特征,如眼睛闭合程度、打哈欠频率等,以判断是否存在疲劳驾驶行为。

  4. 用户界面(UI)模块
    Detection_UI类负责构建和管理用户界面。这个类通过streamlit库创建一个直观友好的界面,让用户可以轻松地选择摄像头、上传文件、调整模型设置(如置信度阈值conf_threshold和IOU阈值iou_threshold)等。此外,它还负责展示实时的检测结果和预警信息。

  5. 日志记录与结果展示模块
    LogTable类中,我们实现了检测结果的记录和展示功能。这个类会将每次检测的结果存储起来,并能够将这些结果以表格的形式展示给用户。这对于分析疲劳驾驶行为模式、优化模型参数具有重要意义。

6.2 系统流程

        基于YOLOv8/v7/v6/v5的疲劳驾驶检测系统设计精妙、流程清晰,其核心流程可以细分为以下几个关键步骤:

  1. 初始化数据与配置:系统启动时,首先通过Detection_UI类的构造方法初始化系统所需的基础配置。这包括加载标签列表Label_list、设置置信度阈值conf_threshold和IOU阈值iou_threshold、以及初始化日志数据保存路径等。

  2. 模型加载:接下来,系统会检查st.session_state中是否已经加载了模型实例。如果没有,将利用YOLOv8v5Detector类创建并加载YOLO模型实例,并将训练好的模型权重加载到系统中。

  3. 用户界面设置:系统会调用setup_page方法设置页面布局,并通过def_css_hitml方法应用CSS样式,使得用户界面更加友好。

  4. 侧边栏配置:用户可以通过侧边栏进行一系列配置,包括选择模型类型、设置置信度和IOU阈值、选择摄像头或上传文件等。这些配置项通过调用setup_sidebar方法实现。

  5. 模型文件选择:用户还可以选择使用默认的模型文件或上传自定义的模型文件。这一步骤通过侧边栏中的文件上传器实现,系统会根据用户的选择调用YOLOv8v5Detectorload_model方法加载相应的模型。

  6. 开始运行检测:用户点击"开始运行"按钮后,系统将调用process_camera_or_file方法根据用户的选择处理摄像头输入或文件输入。

    • 对于摄像头输入,系统会通过OpenCV获取摄像头视频流,并循环处理每一帧图像。
    • 对于文件输入,如果是图片文件,则直接处理该图片;如果是视频文件,则同样循环处理视频中的每一帧图像。
  7. 帧处理:不论是摄像头输入还是文件输入,系统都会对每一帧图像调用frame_process方法进行处理。该方法首先对图像进行预处理,然后利用YOLO模型进行目标检测,并处理检测结果。

  8. 结果展示与日志记录:检测完成后,系统会将检测结果实时展示在用户界面上,并通过LogTable类记录检测结果。用户可以选择导出检测结果和日志。

  9. 导出结果:用户可以点击"导出结果"按钮,将检测结果和相关日志导出为文件,方便后续分析和存档。

  10. 系统清理:在检测任务完成后,系统会清理所占用的资源,准备下一次检测任务。

        整个流程条理清晰,从初始化、配置、检测处理到结果展示和导出,每一步都紧密相连,确保了系统的高效性和准确性。通过这套流程,基于YOLO模型的疲劳驾驶检测系统能够实时准确地识别并警告疲劳驾驶行为,为保障道路安全做出贡献。


代码下载链接

         如果您希望获取博客中提及的完整资源包,包含测试图片、视频、Python文件(*.py)、网页配置文件、训练数据集、代码及界面设计等,可访问博主在面包多平台的上传内容。相关的博客和视频资料提供了所有必要文件的下载链接,以便一键运行。完整资源的预览如下图所示:

        资源包中涵盖了你需要的训练测试数据集、训练测试代码、UI界面代码等完整资源,完整项目文件的下载链接可在下面的视频简介中找到➷➷➷

演示与介绍视频https://www.bilibili.com/video/BV1YJ4m1j7bV/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZ2Xm5tp
YOLOv8和v5项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2XmJdx
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2XmZ1u
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Xmp1w

完整安装运行教程:

        这个项目的运行需要用到Anaconda和Pycharm两个软件,下载到资源代码后,您可以按照以下链接提供的详细安装教程操作即可运行成功,如仍有运行问题可私信博主解决:

  1. Pycharm和Anaconda的安装教程https://deepcode.blog.csdn.net/article/details/136639378

        软件安装好后需要为本项目新建Python环境、安装依赖库,并在Pycharm中设置环境,这几步采用下面的教程可选在线安装(pip install直接在线下载包)或离线依赖包(博主提供的离线包直接装)安装两种方式之一:

  1. Python环境配置教程https://deepcode.blog.csdn.net/article/details/136639396(2,3方法可选一种);
  2. 离线依赖包的安装指南https://deepcode.blog.csdn.net/article/details/136650641(2,3方法可选一种);

        如使用离线包方式安装,请下载离线依赖库,下载地址:https://pan.baidu.com/s/1uHbU9YzSqN0YP_dTHBgpFw?pwd=mt8u (提取码:mt8u)。


7. 结论与未来工作

        本文通过深入研究并实践了基于YOLOv8/v7/v6/v5的深度学习模型在疲劳驾驶检测领域的应用,成功开发了一个结合了这些先进算法的疲劳驾驶检测系统。通过对多个版本的YOLO模型进行细致的比较和优化,本研究不仅提升了疲劳驾驶检测的准确率和实时性,还通过Streamlit创建了一个直观、美观且易于使用的Web应用,使用户能够轻松地进行疲劳状态识别,从而在实际应用中发挥重要作用。

        经过一系列实验验证,本文所提出的方法在疲劳驾驶检测的准确性和处理速度上都达到了令人满意的水平。同时,我们还提供了完整的数据集处理流程、模型训练和预测的代码,以及基于Streamlit的系统设计和实现细节,为后续的研究者和开发者复现和参考提供了方便。尽管取得了一定的成果,但疲劳驾驶检测作为一个复杂多变的任务,仍然面临着许多挑战和改进空间。在未来的工作中,我们计划从以下几个方向进行探索:

  • 模型优化:继续探索更深层次的网络结构和优化策略,如神经网络架构搜索(NAS)技术,以进一步提升模型的性能和效率。
  • 多模态融合:考虑结合生理信号、驾驶行为等其他模态信息,采用多模态学习方法进行疲劳状态识别,以更全面地理解驾驶员的状态。
  • 跨域适应性:研究不同驾驶环境下的疲劳驾驶特征,通过领域自适应技术提高模型在不同环境中的泛化能力。
  • 用户交互体验:进一步优化系统的用户界面和交互设计,使其更加人性化、智能化,以满足更广泛用户的需求。
  • 实际应用拓展:探索疲劳驾驶检测在更多实际应用场景中的应用,如智能交通系统、长途运输监控等,以发挥其最大的社会和经济价值。

        总之,疲劳驾驶检测技术正处于快速发展之中,随着技术的不断进步和应用场景的不断拓展,我们相信在不久的将来,基于深度学习的疲劳驾驶检测将在人机交互、社会安全、医疗健康等领域发挥更加重要的作用。


  1. Zhao L, Wang Z, Wang X, et al. Human fatigue expression recognition through image-based dynamic multi-information and bimodal deep learning[J]. Journal of Electronic Imaging, 2016, 25(5): 053024-053024. ↩︎

  2. Dalve S, Ramdasi I, Kothawade G, et al. Real Time Prevention of Driver Fatigue Using Deep Learning and MediaPipe[J]. International Journal of Innovative Research in Computer Science & Technology (IJIRCST) Volume-11, Issue-3, 2023. ↩︎

  3. El-Nabi S A, El-Shafai W, El-Rabaie E S M, et al. Machine learning and deep learning techniques for driver fatigue and drowsiness detection: a review[J]. Multimedia Tools and Applications, 2024, 83(3): 9441-9477. ↩︎

  4. Almazroi A A, Alqarni M A, Aslam N, et al. Real-Time CNN-Based Driver Distraction & Drowsiness Detection System[J]. Intelligent Automation & Soft Computing, 2023, 37(2). ↩︎

  5. Liu Y, Chen Z, Xu C, et al. Driver Fatigue Detection Algorithm Based on Improved Yolov4[J]. World Scientific ResEARch Journal, 2022, 8(1): 58-63. ↩︎

标签:训练,疲劳,检测,模型,驾驶,YOLOv8,v5,v7
From: https://www.cnblogs.com/deeppython/p/18076949

相关文章