基于Dlib的疲劳检测系统
需要源码的朋友可以私信我
基于Dlib的疲劳检测系统
- 1、设计背景及要求
- 2、系统分析
- 3、系统设计
- 3.1功能结构图
- 3.2基于EAR、MAR和HPE算法的疲劳检测
- 3.2.1基于EAR算法的眨眼检测
- 3.2.2基于MAR算法的哈欠检测
- 3.3.3基于HPE算法的点头检测
- 4、系统实现与调试
- 4.1初步实现
- 4.2具体实现过程
- 5、系统实现与调试
1、设计背景及要求
随着经济的飞速发展,货运行业的发展趋势愈加迅猛,货车驾驶员24h都留在车上的现象已成为行业常态。据国家统计局数据显示,近几年的特大事故中,有超40%的事故是由于驾驶员疲劳驾驶造成的。为了减少疲劳驾驶导致的交通安全问题,本系统旨在设计一款可以自动实时检测驾驶员是否疲劳驾驶并发出警报的系统。
设计要求
(1) 设计并实现一个软件界面,能够实时获取人脸视频;
(2) 使用OpenCV或Dlib库实现人脸检测和特征点标定;
(3) 定义并提取与疲劳驾驶相关的人脸特征;
(4) 合理设计算法,实现驾驶员疲劳状态检测,检测到疲劳时发出预警;
(5) 测试系统性能,并分析
2、系统分析
通过摄像头实时采集驾驶员的行为表情状态,判断驾驶员的头部姿态,眼睛闭合频率和单位时间打哈欠的次数来判断驾驶员的疲劳程度。
3、系统设计
3.1功能结构图
功能结构图设计:

本系统通过收集人脸朝向、人脸位置、瞳孔朝向、眼睛开合度、眨眼频率等数据,提取驾驶员面部68个特征点及其坐标,准确定位驾驶员人脸的位置,并利用眼部的12个特征点计算眼部长宽比EAR,根据嘴部的6个特征点计算嘴巴的MAR,利用其他坐标结合HPE算法计算头部转动的欧拉角。将这些数据分别与对应的阈值比较,从而统计出驾驶员眨眼、打哈欠和点头的次数。通过对驾驶员眨眼、打哈欠、点头次数的统计,可实时判断驾驶员的注意力集中程度,分析驾驶员是否疲劳驾驶,并及时作出安全提示。
3.2基于EAR、MAR和HPE算法的疲劳检测
3.2.1基于EAR算法的眨眼检测
当人眼睁开时,EAR在某个值域范围内波动,当人眼闭合时,EAR迅速下降,理论上接近于0。当EAR低于某个阈值时,眼睛处于闭合状态;当EAR由某个值迅速下降至小于该阈值,再迅速上升至大于该阈值,则判断为一次眨眼。为检测眨眼次数,需要设置同一次眨眼的连续帧数。眨眼速度较快,一般1~3帧即可完成眨眼动作。



3.2.2基于MAR算法的哈欠检测
基于MAR算法的哈欠检测,利用Dlib提取嘴部的6个特征点,通过这6个特征点的坐标(51、59、53、57的纵坐标和49、55的横坐标)来计算打哈欠时嘴巴的张开程度。当一个人说话时,点51、59、53、57的纵坐标差值增大,从而使MAR值迅速增大,反之,当一个人闭上嘴巴时,MAR值迅速减小。

3.3.3基于HPE算法的点头检测
HPE(Head Pose Estimation, HPE)算法步骤 :2D人脸关键点检测,3D人脸模型匹配,求解 3D点和对应2D点的转换关系,根据旋转矩阵求解欧拉角。检测过程中需要使用世界坐标系(UVW)、相机坐标系(XYZ)、图像中心坐标系(uv)和像素坐标系(xy)。
世界坐标系转换到相机坐标系:

相机坐标系转换到像素坐标系:

像素坐标系与世界坐标系的关系为:

图像中心坐标系转换到像素坐标系:

4、系统实现与调试
4.1初步实现
系统的关键就是对驾驶员的面部进行识别,然后计算并统计出疲劳值,通过显示屏把数据显示在屏幕上给驾驶员看,如果驾驶员被判定为疲劳驾驶或者危险驾驶系统就会立即进行语音提醒。想要成功获得人脸面部的68个特征点,就必须先检测到人脸的存在。调用Dlib中的正向人脸检测器API,如果没有检测到人脸就会在屏幕上显示“No Face”,控制台输出“没有检测到人脸”,这里用手遮住脸、脸转向左右两边的幅度太大、人脸不在摄像头的摄像范围里,人脸距离摄像头太远都算没有检测到人脸。

从视频流进行循环,读取图片,并对图片做维度扩大,并进灰度化,使用dlib获得脸部位置以及脸部特征位置,将脸部特征信息转换为数组array的格式,从而提取左眼和右眼坐标。构造函数计算左右眼的EAR值,使用平均值作为最终的EAR。类似的,获得嘴部MAR值。分别计算左眼、右眼和嘴部的评分求平均作为最终的评分,如果小于阈值,则加1,如果连续3次都小于阈值,则表示进行了一次眨眼活动;如果嘴部评分大于阈值,则表示一次打哈欠。


4.2具体实现过程

基于上述程序基础,添加可视化界面,增加系统交互性。利用wx进行界面搭建,设置视频源,可选择摄像头或视频文件导入,提供实时检测和文件检测功能;添加疲劳检测参数设置,可自行勾选检测参数以及疲劳时间调整,检测条件更加灵活;状态输出栏可查看历史状态,追溯用户历史数据,为事故调查提供条件。如图7为 UI界面。
后添加点头检测增加系统精度,本系统根据计算欧拉角判断驾驶员的点头次数,这里涉及欧拉角的三个角,分别是 Pitch(绕X轴旋转),Yaw(绕Y轴旋转),Roll(绕Z轴旋转),一个物体对于相机的姿态可以用旋转矩阵(R)和平移矩阵(T)来表示。人脸2D与3D之间的仿射变换矩阵包含了头部旋转和平移信息,可以直接调用OpenCV的solvePnp()函数求解得出旋转和平移向量,最终利用得到的旋转矩阵来求解欧拉角。当在某一个时间段10s内,驾驶员的|Pitch|≥20或者|Roll|≥20的时间占比超过0.3时,则判定驾驶员处于疲劳状态。

5、系统实现与调试
本系统采用人脸追踪和图像处理相结合的方式采集面部图像处理疲劳信息,利用面部疲劳特征判断疲劳状态,以采集到的人脸图像信息作为输入,通过检测算法输出判断结果,判断为疲劳状态后,系统发出警告。

本系统通过Dlib库中的人脸识别和dat模型中的68个关键点,结合EAR、MAR和HPE算法,判断驾驶员是否眨眼、打哈欠、点头,不仅实现了检测指标多样化,还实现了实时检测驾驶员疲劳状态的目的,可用于货车、汽车、出租车等机动车辆,为驾驶员的生命安全增加一份保障。本系统的不足之处在于当驾驶员面部有部分遮挡时就无法准确判断驾驶员是否处于疲劳驾驶状态,只会发出提示,提醒驾驶员“您已脱离摄像范围”。因此,下一步的工作重点是如何解决在有遮挡情况下也能正确识别驾驶员精神状态的问题。
相关文章:
基于Dlib的疲劳检测系统
需要源码的朋友可以私信我 基于Dlib的疲劳检测系统 1、设计背景及要求2、系统分析3、系统设计3.1功能结构图3.2基于EAR、MAR和HPE算法的疲劳检测3.2.1基于EAR算法的眨眼检测3.2.2基于MAR算法的哈欠检测3.3.3基于HPE算法的点头检测 4、系统实现与调试4.1初步实现4.2具体实现过程…...
three.js通过CubeTexture加载环境贴图,和RGBELoader加载器加载hdr环境贴图
一、使用CubeTexture进行环境贴图 1.CubeTexture使用介绍 Three.js中可以通过使用CubeTexture进行环境贴图,CubeTexture需要将6张图片(正面、反面、上下左右)包装成一个立方体纹理。下面是一个简单的例子: 首先需要加载六张贴图…...
pycharm中Terminal输入sqlite3,出现无法将sqlite项识别为cmdlet**的解决方法
前提:本机上已安装sqlite3,安装详见:pycharm社区版中安装配置sqlite3_Sunshine_0426的博客-CSDN博客 问题: cmd命令行中或pycharm中Terminal行输入sqlite3 db.sqlite3命令后,出现“无法将“sqlite3”项识别为 cmdlet…...
VSCode 安装配置教程详解包含c++环境配置方法
vscode安装教程及c环境配置详解 vscode下载安装下载C扩展插件VScode C环境配置配置环境变量检查 MinGW 安装配置编译器:配置构建任务检查是否安装了编译器配置完毕 vscode下载安装 地址:官网下载地址 直接打开下载好的.exe文件进行安装即可࿰…...
Baumer工业相机堡盟工业相机如何通过BGAPISDK将图像放大缩小显示(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK将图像放大缩小显示(C#) Baumer工业相机Baumer工业相机BGAPISDK和图像放大缩小的技术背景Baumer工业相机通过BGAPISDK将相机图像图像放大缩小功能1.引用合适的类文件2.通过BGAPISDK将相机图像图像放大缩小功能…...
8.1 PowerBI系列之DAX函数专题-进阶-解决列排序对计算的影响
需求 下列矩阵中,在月份列不按照原始数据的month_no排列时,能正确计算销售额占比,但是当月份按照month_no排序时就会出错,需要解决这个问题。 实现 month % divide([amount],calculate([amount],all(date[month desc]))) //排…...
Java的第十二篇文章——集合
目录 第十二章 集合 学习目标 1. 集合框架的由来 2. 集合框架的继承体系 3. Collection接口 3.1 Collection接口的常用方法 4. Iterator接口 4.1 Iterator接口的抽象方法 4.2 获取迭代器接口实现类 4.3 迭代器的实现原理 4.4 并发修改异常 4.5 集合存储自定义对象并…...
docker 镜像制作 与 CI/CD
目录 镜像到底是什么? 使用docker创建镜像 步骤: 1、编辑Dockerfile(Dockerfile是docker制作镜像的配方文件) 2、编辑requirements.txt文件 3、编辑app.py文件,我们的程序文件 4、生成镜像文件 5、查看生成的镜…...
Spring Boot 异常报告器解析
基于Spring Boot 3.1.0 系列文章 Spring Boot 源码阅读初始化环境搭建Spring Boot 框架整体启动流程详解Spring Boot 系统初始化器详解Spring Boot 监听器详解Spring Boot banner详解Spring Boot 属性配置解析Spring Boot 属性加载原理解析Spring Boot 异常报告器解析 创建自定…...
瑞亚太空活动公司RSA与英国国防与安全加速器达成量子项目合作
(图片来源:网络) 瑞亚太空活动公司(RSA)与英国国防与安全加速器(DASA)签署了合作协议,主要开发名为“无限交换”的可操纵量子真空的技术项目。这是RSA在英国签订的第一份合同&…...
Shapley值法介绍及实例计算
Shapley值法介绍及实例计算 为解决多个局中人在合作过程中因利益分配而产生矛盾的问题,属于合作博弈领域。应用 Shapley 值的一大优势是按照成员对联盟的边际贡献率将利益进行分配,即成员 i 所分得的利益等于该成员为他所参与联盟创造的边际利益的平均值…...
不用手动改 package.json 的版本号
“为什么package.json 里的版本还是原来的,有没有更新?”,这个时候我意识到,我们完全没有必要在每次发布的时候还特意去关注这个仓库的版本号,只要在发布打tag的时候同步一下即可 node.js 部分,我们得有一个…...
gitlab Can‘t update,dev has no tracked branch
代码仓库迁移到gitlab后本地更改仓库地址后 拉取代码报错: Can’t update,dev has no tracked branch: 解决办法: 在当前项目的目录下运行命令: git branch -u git dev --set-upstream-toorigin/dev第一个dev是本地分支名字&…...
sql批量操作
SQl: 1,在某一字段后批量增加内容:UPDATE 表名 SET 字段 CONCAT(字段,要增加的内容) 例:UPDATE b8_niuniu_permission SET game_ids CONCAT(game_ids,,3) (或者后面可以加where条件) 2,批量修改某一字段…...
数据库监控与调优【九】—— 索引数据结构
索引数据结构-B-Tree索引、Hash索引、空间索引、全文索引 二叉树查找 对于相同深度的节点,左侧的节点总是比右侧的节点小。在搜索时,如果要搜索的值key大于根节点(图中6),就会在右侧子树里查找;key小于根…...
哈工大计算机网络传输层详解之:流水线机制与滑动窗口协议
哈工大计算机网络传输层详解之:流水线机制与滑动窗口协议 哈工大计算机网络课程传输层协议详解之:可靠数据传输的基本原理哈工大计算机网络课程传输层协议详解之:TCP协议哈工大计算机网络课程传输层协议详解之:拥塞控制原理剖析 …...
Unity Mac最新打苹果包流程
作者介绍:铸梦xy。IT公司技术合伙人,IT高级讲师,资深Unity架构师,铸梦之路系列课程创始人。 IOS详细打包流程1.申请APPID2.申请开发证书3.创建描述文件 IOS详细打包流程 1.申请AppID 2.创建证书 3.申请配置文件(又名描…...
【MySQL数据库 | 第二十篇】explain执行计划
目录 前言: explain: 语法: 总结: 前言: 上一篇我们介绍了从时间角度分析MySQL语句执行效率的三大工具:SQL执行频率,慢日志查询,profile。但是这三个方法也只是在时间角度粗略的…...
学Python能做哪些副业?我一般不告诉别人!建议存好
前两天一个朋友找到我吐槽,说工资一发交完房租水电,啥也不剩,搞不懂朋友圈里那些天天吃喝玩乐的同龄人钱都是哪来的?确实如此,刚毕业的大学生工资起薪都很低,在高消费、高租金的城市,别说存钱&a…...
简化 Hello World:Java 新写法要来了
OpenJDK 的 JEP 445 提案正在努力简化 Java 的入门难度。 这个提案主要是引入 “灵活的 Main 方法和匿名 Main 类” ,希望 Java 的学习过程能更平滑,让学生和初学者能更好地接受 Java 。 提案的作者 Ron Pressler 解释:现在的 Java 语言非常…...
利用快马平台十分钟快速构建开源项目网站原型:以openclaw101为例
作为一个经常参与开源项目的开发者,我深知快速验证想法的重要性。最近在尝试为开源项目openclaw101搭建网站时,发现InsCode(快马)平台能完美解决从零搭建的繁琐过程。下面分享如何用十分钟完成一个具备完整功能的项目网站原型。 明确需求与功能规划 首先…...
解决Python ssl模块与系统OpenSSL版本不一致的编译指南
1. 为什么Python的ssl模块会与系统OpenSSL版本不一致? 很多开发者都遇到过这样的困惑:明明系统已经升级了OpenSSL,为什么Python的ssl模块还在使用旧版本?这个问题其实源于Python的编译机制。Python在编译安装时,会将当…...
Python智能内存回收实战:3种GC策略对比+4个生产级调优参数配置(附压测数据)
第一章:Python智能体内存管理策略生产环境部署在高并发、长生命周期的Python智能体服务中,内存管理直接影响系统稳定性与响应延迟。默认的CPython引用计数循环垃圾回收(GC)机制在动态对象频繁创建销毁的场景下易引发内存抖动和不可…...
GitHub功能多元拓展,korb工具革新REWE购物流程
【导语:GitHub提供了涵盖AI代码创作、开发者工作流、应用程序安全等多方面的丰富功能,同时推出不同规模和用例的解决方案。而korb命令行工具则为REWE超市购物带来新体验,可实现自动化购物流程。】GitHub:功能全面的开发者平台GitH…...
高效安全的网页资源提取方案:猫抓开源工具的技术实现与专业应用
高效安全的网页资源提取方案:猫抓开源工具的技术实现与专业应用 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化时代ÿ…...
Z-Image-Turbo_Sugar脸部Lora部署案例:科研团队构建可复现实验人脸数据集
Z-Image-Turbo_Sugar脸部Lora部署案例:科研团队构建可复现实验人脸数据集 1. 项目背景与价值 在计算机视觉和人工智能研究领域,高质量、标准化的人脸数据集对于模型训练和算法验证至关重要。传统的人脸数据收集面临诸多挑战:数据隐私问题、…...
C++ 网络服务端主线:从线程池到 Reactor 的完整路线图
一、为什么要写这个系列? 前面我已经把 C 并发基础和线程池完整走了一遍: std::threadstd::mutexstd::condition_variablestd::atomic手写线程池future / 拒绝策略 / 优雅关闭 但到这里,其实还只停留在: 并发组件层 也就是说&a…...
树莓派新手必看:保姆级vim安装与配置指南(含国内源切换和常见报错解决)
树莓派新手必看:保姆级vim安装与配置指南(含国内源切换和常见报错解决) 第一次接触树莓派的新手们,面对命令行操作往往既兴奋又忐忑。作为Linux系统中最强大的文本编辑器之一,vim的高效与灵活令人向往,但初…...
智能提取B站字幕:告别手动抄录的高效开源工具
智能提取B站字幕:告别手动抄录的高效开源工具 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 还在为手动记录B站视频字幕而烦恼?BiliBiliC…...
告别数学恐惧:用Python可视化单相PWM整流器的dq变换过程
用Python动画拆解单相PWM整流器的坐标变换魔法 1. 从交流到直流的控制艺术 当我们面对单相PWM整流器的控制问题时,最令人着迷的挑战莫过于如何将交流系统中的正弦量转化为适合控制的直流量。这就像是要在汹涌的交流海浪中建造一个稳定的直流岛屿。传统三相系统可以…...
