当前位置: 首页 > news >正文

基于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帧即可完成眨眼动作。
在这里插入图片描述
在这里插入图片描述
 Dlib库68个特征点模型

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文件进行安装即可&#xff0…...

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 语言非常…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...