基于Dlib库的驾驶员疲劳及心率血氧检测系统设计

2021-04-20 02:23孙洋孙新宇李珺珺王彩凤
电子技术与软件工程 2021年2期
关键词:树莓血氧人脸

孙洋 孙新宇 李珺珺 王彩凤*

(1.滨州学院航空工程学院 山东省滨州市 256600 2.鲁东大学物理与光电工程学院 山东省烟台市 264025)

自汽车行业的发展,疲劳驾驶一直是我国产生重大交通事故中重要原因之一,为缓解疲劳驾驶这一现象,我国学者对驾驶员疲劳驾驶检测正在不断的进行探索与研究,以期在驾驶员疲惫驾驶时能得到及时提醒抑或实现疲劳驾驶的预警。在本文中设计了一套基于Dlib 库的驾驶员疲劳及心率血氧检测系统,旨在针对货车以及客运汽车驾驶员疲劳驾驶时能进行有效的震动及语音提醒,提醒驾驶员安全驾驶。目前驾驶员疲劳驾驶检测状态主要有以下几类:

(1)基于驾驶员人体生理的信号,其主要是采集驾驶员身体不同部位的生理信号,根据不同部位传递出的信号从而判断出驾驶员的疲劳状态。该类方法虽比较精确,但需要在驾驶员身体多个部位进行电线的连接,这对驾驶员的驾驶行为产生较为明显妨碍作用[1]。

(2)基于对驾驶车辆数据的采集,通过在车辆上安装各类传感器,感应车辆行驶状态或者是方向盘的状况。

(3)基于驾驶员行为特征的检测,如对驾驶员的面部表情特征等进行检测,此类方法对驾驶员影响较小,所以此类方法采用较为广泛。目前行为特征检测有PERCLOS 算法[2],主要判断在某一时间段驾驶员眼睛的闭合时间在这一段时间内所占的比例。机器视觉等领域中应用较为广泛的Gabor 小波[3]也可对驾驶员眼部进行识别从而判断驾驶员的此时驾驶状态。

本文介绍的系统是要是利用OpenCV 借助Dlib 库,通过图像的HOG 特征[4]来实现对人脸特征点的提取,对眼部特征点进行标注,并计算眼部的闭合程度再辅以心率等检测从而判断驾驶员的驾驶状态。

1 系统结构与功能

驾驶员疲劳及心率血氧检测系统的结构见图1,系统启动时树莓派与STM32 同时开始工作,树莓派首先通过摄像头获取驾驶员面部图像后,调用face_recognition 模块与Dlib 库进行当前驾驶员人脸编码并与已加载的人脸编码库进行对比,识别驾驶员身份信息,实现驾驶员快速签到功能[5]。信息比对完成后利用Dlib 库中HOG 特征对驾驶员眼部特征点标注,计算驾驶员眼睛闭合程度,开始实时进行驾驶员疲劳状态监测,于此同时STM32 开始进行驾驶员心率血氧的监测,当测定的疲劳值达到一定阈值时,树莓派与STM32 通过串口通信,控制震动模块逐渐加大震动并通过语音播报提醒驾驶员到安全地点进行休息。

2 系统硬件分析

STM32 系统原理图见图2,系统板搭载STM32F103ZET6,其最高的工作频率可以达72 MHz;具有串行的单线调试和JTAG接口,2 个USART 接口可进行全双工通用同步/异步串行收发;STM32 连接有监测驾驶员心率血氧模块、语音模块和震动提醒模块。其中MAX-30100 是一种非侵入式集成的心率和血氧饱和监测模块,其依靠两个发光二极管和一个光检测器,驾驶员只需将手指紧贴传感器之上,便可使系统通过IIC 协议随时读取驾驶员心率与血氧饱和度,其原理见图2U2;语音模块采用的为语音识别模块LD3320[6]、SYN6288 语音合成模块,系统上电后驾驶员可根据预置的唤醒指令激活模块,并进入语音识别状态,系统可根据驾驶员发出的指令进行一系列操作。如驾驶员查询心率时,当模块收到指令之后便会与已设定好的词汇做对比,相一致时所得数据便会通过语音合成模块输出并播报。树莓派4B 采用官方的Raspbian 操作系统,搭载OpenCV 环境,大(主)芯片为Broadcom的BCM2711BO,最高主频1.5GHz,4 个Cortex A72 内核,支持64 位[7]。树莓派4B 配备500 万像素的广角摄像头,其静止图像分辨率可达2592*1944px,并支持720p 与1080p 视频。

3 系统总体设计

当驾驶员启动车辆时,系统内各个模块进行初始化。树莓派通过摄像头获取每帧图像,并在图像中定位驾驶员人脸,通过对驾驶员人脸信息编码并于已预加载中的人脸编码信息库对比获取驾驶员身份信息,并进入签到系统进行签到。车辆行驶过程中树莓派通过计算出驾驶员眼部的闭合程度与嘴部的开合度对驾驶员进行疲劳检测。同时树莓派接收通过STM32 串口通信传来的MAX30100 模块驾驶员的心率与血氧饱和度的数据显示在显示屏中。驾驶员也可通过语音指令获取数据。当检测到驾驶员疲劳驾驶时,系统会通过语音模块与震动模块进行语音与震动提醒。

3.1 驾驶员身份识别

识别驾驶员身份信息时,因为OpenCV[8]读取的图像数据为BGR 格式,所以首先要对树莓派获取视频中每一帧的图像利用cv2.cvtcolor()函数进行预处理,把BGR 格式的图像转换为RGB 格式。处理完成后调用face_recognition 模块对图像中驾驶员人脸信息进行定位并生成128-dimensional 面部编码列表,通过与已知人脸库编码对比得到一个欧式距离(euclidean distance)[9],通过这个距离得到最相似驾驶员人脸信息并将驾驶员姓名显示在屏幕上,若距离相差过大,未在人脸库中找到驾驶员信息则在屏幕中显示“Unknown”。图3,4 为驾驶员身份识别效果图。

图1:驾驶员疲劳及心率血氧检测系统结构

图2:STM32 系统原理

图3:身份识别驾驶员1

图4:身份识别驾驶员2

图5:眼部特征点标记

3.2 驾驶员心率血氧检测

该系统设计采用MAX30100 用来检测心率血氧。该模块中红光、红外光都用来测量驾驶员血液中的氧含量。含氧血液中传递更多的红光并吸收更多的红外光,而脱氧血液中传递更多的红外光并吸收红光,读取两个光源的吸收电平,通过测量心脏向外泵的血液中的氧合血红蛋白增加和减少之间的时间,确定脉搏率(心率)。SpO2 计算公式[10]为:

该模块利用IIC 通信协议与STM32 交换数据,其中SCL 连接PC12,SDA 连接PC11 读取rawIRValue(红外FIFO 数据)、rawRedValue(红光FIFO 数据)进行处理计算驾驶员心率血氧数据。当驾驶员心率血氧异常时,进行语音报警提醒。系统主要检测指标,及人体正常情况下的数据如表1。

表1:人体健康参数指标参考表

3.3 驾驶员疲劳检测

驾驶员疲劳检测首先计算的是眼睛与嘴部的长宽比,首先在之前视频流中读取的图片利用imutils.resize()函数进行维度扩大,并利用cv2.cvtColor()加图片转化为灰度图,从定位的人脸框中获取脸部特征信息与提取左右眼坐标与嘴部坐标,如图5,图6所示。

构造函数分别计算左右眼的EAR 值,使用左右眼的EAR 平均值作为最终的EAR 值。同理计算出嘴部的张合度Mouth 值。

当驾驶员眼睛闭合时,EAR 迅速下降,当EAR 低于某个阈值时,眼睛处于闭合状态。于是可通过帧数算出驾驶员眨眼次数为检测眨眼次数,调试并设置同一次眨眼的连续帧数。通过设定的单位时间内闭眼次数、闭眼时间的阈值判断驾驶员是否已经进入疲劳驾驶。

设定一个阈值M,当Mouth≤M 时,没有打哈欠动作,即为驾驶员正常状态,若Mouth≥M 时,则为打哈欠状态,其判断公式如下:

若T>85%则为疲劳驾驶状态。检测疲劳驾驶流程图如图7所示。

3.4 系统测试

如图8、9 所示。

图6:嘴部特征点标记

图7:系统疲劳检测流程图

图8:正常行驶状态

图9:疲劳驾驶

4 结语

本文针对客车以及货车驾驶员疲劳驾驶问题,利用OpenCV 与Dlib 库等,完成了基于Dlib 库的驾驶员疲劳及心率血氧检测系统的总体设计。该系统能为客车及货车驾驶员提供实时提供本地提醒与报警功能,从而保障了客车以及货车驾驶员的驾驶安全,有效减少因疲劳驾驶所造成的交通安全事故。

猜你喜欢
树莓血氧人脸
有特点的人脸
基于树莓派的骑行智能头盔设计
智能血氧饱和度监测系统设计与实现
三国漫——人脸解锁
基于树莓派的远程家居控制系统的设计
响应面法优化红树莓酒发酵工艺
基于血氧模拟前端AFE4490的无创血氧测量模块设计
马面部与人脸相似度惊人
乳腺血氧与多普勒联合检查在乳腺癌早期筛查中的应用
欧盟:速冻树莓比鲜食树莓市场更好