Dlib模型实现人脸检测疲劳检测(眨眼、打哈欠、瞌睡点头)带GUI界面

494 阅读10分钟

更多项目完整介绍资料,演示视频,数千个计算机毕设计成品项目,百度搜:毕设库。 如果你想要完整项目资料包,点击这里下载: pan.baidu.com/s/1-vA1Gce4…

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。

《------往期经典推荐------》

项目名称 1.【基于ResNet50模型的船型识别与分类系统研究】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现mnist手写数字识别】 5.【fasterRCNN模型实现飞机类目标检测】 6.【CNN-LSTM住宅用电量预测】 7.【VGG16模型实现新冠肺炎图片多分类】 8.【AlexNet模型实现鸟类识别】 9.【DIN模型实现推荐算法】 10.【FiBiNET模型实现推荐算法】 11.【钢板表面缺陷检测基于HRNET模型】 …

1. 项目简介

疲劳在人体面部表情中表现出大致三个类型:打哈欠(嘴巴张大且相对较长时间保持这一状态)、眨眼(或眼睛微闭,此时眨眼次数增多,且眨眼速度变慢)、点头(瞌睡点头)。本实验从人脸朝向、位置、瞳孔朝向、眼睛开合度、眨眼频率、瞳孔收缩率等数据入手,并通过这些数据,实时地计算出驾驶员的注意力集中程度,分析驾驶员是否疲劳驾驶和及时作出安全提示。

疲劳认定标准:

  • 眨眼:连续3帧内,眼睛长宽比为 0.2
  • 打哈欠:连续3帧内,嘴部长宽比为 0.5
  • 瞌睡点头:连续3帧内,pitch(x)旋转角为 0.3 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

2.技术创新点摘要

该项目的技术创新点体现在以下几个方面。首先,它结合了人脸关键点检测和姿态估计,基于dlib库的68点模型实现了对人脸特征的精准检测。这些特征点被用于计算眼睛长宽比(EAR)、嘴巴长宽比(MAR)以及头部姿态(欧拉角),从而实现多维度的疲劳状态检测,如眨眼、打哈欠和瞌睡点头(mouth_detecting)(node_detecting)。

其次,该项目不仅检测常见的疲劳表现(如眨眼频率),还使用头部姿态估计技术,通过旋转和平移矩阵计算出头部的俯仰角度,实现对瞌睡点头等动作的检测。结合欧拉角的计算,这种方法能够准确分析驾驶员或其他用户的疲劳状态(main_UI)。

该系统实现了实时性检测,能够通过计算连续若干帧内的动作,自动判断是否出现眨眼过频、长时间打哈欠或频繁瞌睡点头等疲劳表现。这种多特征结合的监测方法,提高了检测的准确性和鲁棒性,尤其适用于动态场景如驾驶员监测。此外,该项目的灵活性体现在对视频源的兼容,不仅支持实时摄像头数据,也支持本地视频文件的分析(mouth_detecting)。

最后,系统的参数可调性使其适用于不同个体的差异化需求。通过界面,用户可以调节疲劳检测的阈值,如眨眼频率、打哈欠时间等,适应不同人群的生理特征 。

4. 模型架构

  1. 模型结构的逻辑: 该模型的核心是基于dlib的68点人脸关键点检测模型,结合OpenCV进行图像处理。模型使用这些关键点来计算眼睛长宽比(EAR)、嘴巴长宽比(MAR)和头部姿态角度(pitch、yaw、roll)。通过检测连续的帧来判断用户是否疲劳,特别是通过眨眼频率、打哈欠频率和瞌睡点头的行为判断疲劳状态(main_UI)(node_detecting)。模型的主要处理流程如下:
  • 输入数据:实时从摄像头或视频流中获取人脸图像,并将其转为灰度图像处理。
  • 人脸检测:使用dlib的HOG特征检测器定位人脸,并通过预训练的68点模型识别面部特征点。
  • 关键点分析:提取左眼、右眼和嘴巴的特征点,分别计算EAR和MAR。
  • 头部姿态估计:通过solvePnP算法计算头部姿态的欧拉角,从而估计瞌睡点头行为。
  • 输出判断:根据设定的阈值(如眼睛EAR < 0.2,嘴巴MAR > 0.5)和帧数连续性来判断疲劳状态,并输出报警提示(node_detecting)。
  1. 模型的整体训练流程和评估指标: 该项目基于预训练的dlib人脸特征点检测模型,不需要额外的深度学习训练,但评估过程主要基于行为检测。评估的主要指标包括:
  • 眨眼检测:通过EAR来检测,当EAR连续低于设定阈值时,计数一次眨眼。评估通过眨眼频率和持续时间来判断用户是否疲劳(main_UI)(mouth_detecting)。
  • 打哈欠检测:通过MAR值判断嘴巴张开状态,并记录打哈欠的频率。连续3帧内MAR高于阈值即判断为打哈欠(mouth_detecting)。
  • 瞌睡点头检测:根据头部姿态的俯仰角度(pitch),检测频繁点头行为,判断瞌睡(node_detecting)。

本次实验设计:计算对视频中每帧图片检测眼睛长/宽的值是否大于阈值,连续超过50次则认为已经“睡着”。(本次实验设置阈值为0.2,但每个人的眼睛大小比例不同,应该采取平均值计算方法——阈值的获取方式是:先采集30次数据,取其平均值作为默认的值。为了数据的准确,采集数据时应该平视摄像头。)

第一步:使用dlib.get_frontal_face_detector() 获得脸部位置检测器

第二步:使用dlib.shape_predictor获得脸部特征位置检测器

第三步:分别获取左右眼面部标志的索引

第四步:打开cv2 本地摄像头

第五步:从视频流进行循环,读取图片,并对图片做维度扩大,并进灰度化

第六步:使用detector(gray, 0) 进行脸部位置检测

第七步:循环脸部位置信息,使用predictor(gray, rect)获得脸部特征位置的信息

第八步:将脸部特征信息转换为数组array的格式

第九步:提取左眼和右眼坐标

第十步:构造函数计算左右眼的EAR值,使用平均值作为最终的EAR

第十一步:使用cv2.convexHull获得凸包位置,使用drawContours画出轮廓位置进行画图操作

第十二步:进行画图操作,用矩形框标注人脸

第十三步:分别计算左眼和右眼的评分求平均作为最终的评分,如果小于阈值,则加1,如果连续3次都小于阈值,则表示进行了一次眨眼活动

第十四步:进行画图操作,68个特征点标识

第十五步:进行画图操作,同时使用cv2.putText将眨眼次数进行显示

第十六步:统计总眨眼次数大于50次屏幕显示睡着。

————————————————

5. 核心代码详细讲解

1. 眼睛长宽比(EAR)的计算

暂时无法在飞书文档外展示此内容

解释

  • 眼睛长宽比(EAR)通过计算眼睛关键点的垂直距离(点1与点5、点2与点4)与水平距离(点0与点3)来实现。该公式是通过垂直距离的总和除以水平距离的两倍得到的。
  • 如果眼睛长宽比低于预设阈值(如0.2),则认为用户处于闭眼状态 。

2. 嘴巴长宽比(MAR)的计算

暂时无法在飞书文档外展示此内容

解释

  • MAR用来判断打哈欠行为,通过嘴巴的上中点与下中点、左右两侧的点之间的距离关系进行计算。如果MAR超过设定阈值(如0.5),则认为用户在打哈欠 。

3. 姿态估计与欧拉角计算

暂时无法在飞书文档外展示此内容

解释

  • solvePnP函数用于求解3D世界坐标点到2D图像坐标点的旋转和平移矩阵,projectPoints函数则将3D点重新投影到2D图像上。
  • 通过这些矩阵,可以计算出头部的姿态(俯仰、偏航、翻滚角),即所谓的欧拉角(pitch、yaw、roll)。这对于判断用户的点头行为非常重要(mouth_detecting) 。

4. 疲劳行为检测逻辑

暂时无法在飞书文档外展示此内容

解释

  • 该代码段是检测眨眼的逻辑。当眼睛长宽比低于阈值时,计数器(COUNTER)增加。如果连续多帧(如3帧)都检测到眼睛闭合,则累计眨眼总数(main_UI)。

5. 摄像头实时视频流处理

暂时无法在飞书文档外展示此内容

解释

  • 使用VideoCapture打开摄像头,并通过read方法循环读取帧。将帧转换为灰度图以便于人脸检测。detector函数用于检测图像中的人脸矩形框,随后在每一帧中识别人脸(main_UI)。

6. 模型优缺点评价

模型优点

  1. 多特征融合检测:该模型结合了眼睛长宽比(EAR)、嘴巴长宽比(MAR)和头部姿态角度(欧拉角)三个维度,能够较为全面地检测用户的疲劳状态(如眨眼、打哈欠和瞌睡点头)。这种多维度的检测方法提高了模型的准确性和鲁棒性(main)(main_UI)。
  2. 实时性强:模型可以从摄像头或视频流中获取实时数据,利用预训练的人脸检测和关键点预测模型,实现高效的实时疲劳监测,适用于驾驶监控等场景(mouth_detecting)(node_detecting)。
  3. 易用性和可扩展性:模型结构清晰、参数可调,用户可以根据实际需求调整阈值,适应不同场景和个体的生理差异。并且可以扩展支持更多数据源,如预录制的视频(main_UI)。

模型缺点

  1. 对光照和角度敏感:模型依赖于摄像头的图像质量,对于不同光照条件和脸部遮挡的场景(如佩戴眼镜、光线过暗),检测准确性会大幅下降(mouth_detecting)。
  2. 姿态估计有限:头部姿态的检测主要依赖于简单的欧拉角计算,无法捕捉复杂的头部动作。对某些极端角度(如侧脸)的姿态检测不够稳定(node_detecting)。
  3. 缺乏深度学习特性:虽然模型使用了dlib的预训练模型,但缺乏通过深度学习优化的自适应能力,无法利用大规模数据进行端到端训练和提升。

改进方向

  1. 深度学习模型优化:可以考虑引入卷积神经网络(CNN)或Transformer结构,使用大规模数据集进行微调或训练,以提高模型的自适应能力和对复杂场景的鲁棒性。
  2. 超参数调整:可以优化EAR、MAR等阈值,结合更多样化的数据集,通过交叉验证进行超参数调优,提高检测的泛化性。
  3. 数据增强:利用更多的数据增强方法(如光照变化、旋转、平移等),增强模型的鲁棒性,尤其在不同光照、头部角度和遮挡情况下表现更好(main_UI)(mouth_detecting)。

更多项目数据集、代码、教程点击下方名片↓