基于OpenCV的树莓派人脸识别疲劳驾驶检测系统

2021-09-23 07:06张伯辰施鑫杰霍梅梅
现代计算机 2021年23期
关键词:树莓关键点人脸

张伯辰,施鑫杰,霍梅梅

(浙大城市学院,计算机与计算科学学院,杭州310015)

0 引言

现代社会,随着经济的发展和道路交通的日趋完善,汽车出行成为了人们生活不可或缺的组成部分。同时,人们对生活质量的要求与日俱增,为了达成目标不得不在疲劳的状态下工作奔波,而驾驶人的疲劳状态会大大增加车祸发生的概率。为了避免许多因疲劳驾驶造成的车祸,构建智能交通系统[1],做好对驾驶人的注意力监控十分必要。理论上,驾驶辅助系统可以依靠监控驾驶人的生理信号、操作行为、车辆状态以及面部表情判定其疲劳程度,一般地,面部行为的判定最直接有效反映驾驶人状态。

一个疲劳驾驶检测系统需要满足对驾驶人的实时监控、疲劳判定、实时告警等,本文在系统的软硬件架构设计方面采用轻量化方案。原型系统的设计基于Python脚本语言,选择OpenCV跨平台机器视觉库[2],在图像处理、计算机视觉等方面均有丰富的第三方开发支持,为系统的实现提供了轻量化构建的基础。选择树莓派(Raspberry Pi)作为基础硬件载体,树莓派在满足该系统的功能需求的同时大大降低了系统的成本,此外,硬件良好的性能能够保证疲劳监控的灵活性,给未来的系统功能拓展奠定了良好基础。

1 疲劳驾驶检测系统的原理

1.1 硬件组成

疲劳驾驶检测系统在树莓派平台上进行开发,通过I/O引脚能够方便地控制具备特殊功能的底层硬件。硬件组成主要包括摄像头模块和语音模块,其中,摄像头模块选用motionEyeOS红外夜视摄像头。

1.2 软件设计

在树莓派上搭建OpenCV运行环境,下载mo⁃tionEyeOS系统镜像文件并完成配置。在对驾驶人进行疲劳检测时,将摄像头安装在驾驶人上方,开启摄像头,运行算法,系统会自动实时采集脸部图像,并对图像做灰度化、关键点检测、3D特征提取等操作进行人脸识别。如图1所示,系统将眨眼频率[3]、哈欠频率[4]和头部姿势[5]作为疲劳判定依据,当系统实时判定驾驶人处于疲劳状态时,通过语音模块告警。

图1 软件工作流程

2 系统设计方案

2.1 系统工作流程

(1)利用OpenCV提供的框架提取视频文件;

(2)从视频流循环中读取图像,对图像做维度扩大,并进灰度化;

(3)2D人脸关键点检测,获取脸部位置特征信息,并转换为数组格式;

(4)设置阈值;

(5)分别提取左右眼坐标,构造函数计算眼部特征EAR值,并使用平均值作为最终的EAR;

(6)提取嘴部坐标,构造函数计算嘴部特征MAR值;

(7)3D人脸模型匹配,求解3D点与对应原2D点的转换关系,求解头部旋转姿态欧拉角,结合眼部和嘴部特征判定瞌睡点头;

(8)获得规定时间内眨眼频率、打哈欠频率,点头频率,超过阈值则发出疲劳示警。

2.2 关键步骤

(1)提取帧图像检测人脸,进行画图操作,用矩形框标注人脸,并对2D人脸图像标识68个关键特征点。

(2)分别计算左眼和右眼的EAR值求平均作为最终的EAR值,若小于阈值,则记眨眼一次;每三秒计算眨眼频率若大于1.5倍的正常眨眼频率,则判定为疲劳状态;同理可通过打哈欠判断是否疲劳。

(3)通过计算头部上下旋转的欧拉角度,若角度小于-30°则判定为低头行为,同时若眨眼频率或打哈欠频率比正常情况高则判定为疲劳状态。

(4)若触发疲劳示警,控制显示器和蜂鸣器发出提示,则所有计算结果清零。

图2 软件功能实现

3 系统算法实现细节

3.1 图像处理

3.1.1 人脸位置信息获取

首先,利用OpenCV读写视频流,循环出图像帧,初始化DLIB的人脸检测器(HOG),然后创建面部标志物预测。引入并使用人脸识别算法应用中的开源检测器工具[6]dlib.get_frontal_face_detector和dlib.shape_predictor构建人脸位置检测器,再获取人脸特征关键点。

对从视频流中循环读取出的帧图像做维度扩大,并通过OpenCV进灰度化。使用detector(gray,0)进行人脸位置检测,使用predictor(gray,0)获取人脸特征关键点的位置信息,其中,gray表示灰度图。将获取的信息转换为array数组格式。

3.1.2 画图操作

使用cv2.convexHull获取array数组的凸包位置,并使用drawContours画出轮廓位置,进行画图操作。使用shape_predictor_68_face_landmarks.dat,可以得到68个特征点位置的坐标。结果如图3所示,标识出68个特征关键点,并用矩形框标注人脸。

图3 关键点标识

3.2 疲劳检测

3.2.1 人眼信息识别

根据已经得到的68个特征点位置的坐标,分别获取所图4所示的左右眼面部标志的索引E1、E2、E3、E4、E5、E6,并计算眼睛长宽比[7]EAR值:

图4 人眼标志坐标

当人眼处于正常睁开状态时,EAR值在某个值上下波动。闭眼过程中,EAR值迅速下降,理论上,当完全闭合后,EAR值将为零。由于视频检测存在误差,因此本文认为当EAR值低于某个阈值时,判定眼睛处于闭合状态。

人眼眨眼速度较快,一般情况下,1~3帧就可以完成一次眨眼动作,而在疲劳状态下,眨眼频率会下降。实际过程下,根据EAR值的变化,若EAR值小于阈值,则记一次眨眼。在判定疲劳时,计算三秒内的眨眼频率,若大于1.5倍的正常眨眼频率,则判定为疲劳。其中包含的两个阈值都要根据实际情况设置。

3.2.2 嘴部信息识别

同眨眼判定过程理,本文利用嘴部关键点计算嘴部长宽比[8]MAR值:

一般情况下的张嘴行为持续的时间较短,而在打哈欠过程中张嘴时间会延长,根据MAR值的变化来判断张嘴及张嘴的时间,从而确定是否在打哈欠。记录规定时间内的MAR值,若连续三次小于阈值,则判定人体处于疲劳状态。打哈欠判定的关键在于通过大量模型训练区分打哈欠和唱歌等非疲劳行为。

3.2.3 头部信息识别

眨眼和打哈欠的判定只需要通过2D人脸关键点检测,帧与帧之间的对比就可以得到效果,而点头的判定需要引入3D人脸模型匹配,并求解3D点和对应2D点的转换关系,来判定点头行为。

首先,引入相机模型中四个坐标系,世界坐标系、相机坐标系、图像中心坐标系和像素坐标系。摄像头成像过程是三维的,通过构建这四个坐标系,就可以得到旋转矩阵,从而求解头部姿势旋转的欧拉角,若角度小于-30°,则判定低头行为。

实际情况下,驾驶人的点头行为不仅发生在疲劳状态下,也可能是主动行为。因此,本算法规定当驾驶人连续出现低头行为的同时,若眨眼频率和张嘴频率均较正常情况低,则判定为瞌睡点头。

3.3 疲劳告警

本文选择的语音模块是有源蜂鸣器,这种蜂鸣器与树莓派配套使用,其内部带震荡源,单片机一个高低电平就可以发出声音。系统既定疲劳判定标准,驾驶人一出现疲劳状态,该语音模块就会发出提示,直至驾驶人不再处于疲劳状态。

4 疲劳驾驶检测系统性能测试

疲劳驾驶检测如图5所示,图中红色立方体为根据头部姿势重新建立的空间姿态立方体,将它与图像中的标准坐标对比后的结果见图中X、Y、Z,由右上角图可见当眨眼频率和哈欠频率较高时该算法能及时给出警告。本文使用采集了100组含疲劳状态的驾驶视频对本系统算法进行准确率检验,由于算法中的参数因人而异因此检测到疲劳行为的准确率在87%左右。

图5 系统性能测试

5 结语

本文首先选择树莓派作为硬件架构,采用OpenCV、Dlib等开源资源对驾驶人进行人脸识别,实现了实时疲劳告警的功能需求,因其设备便携度高,可以广泛应用于汽车出行。该系统围绕深度学习和物联网知识体系,具备良好的可维护性和可拓展性。经过进一步训练与改进,能够成为一个功能更加完备,人机交互更加舒适的疲劳驾驶检测系统。

猜你喜欢
树莓关键点人脸
论建筑工程管理关键点
肉兔育肥抓好七个关键点
有特点的人脸
一起学画人脸
玻璃窗上的人脸
利用定义法破解关键点
黄金水果红树莓
树莓红了 游人醉了
e络盟率先推出第三代树莓派
年度睡姿大盘点(下)