周万根 黄 隽
(江门职业技术学院,广东 江门 529000)
疲劳驾驶作为影响驾驶安全的重要因素之一,已成为热门研究课题。国内外对疲劳驾驶检测的研究方法总体上可以分为两大类:主观检测方法[1]和客观检测方法[2]。主观检测方法包括评价性检测与生理反应检测。然而,主观方法存在自身的局限性,只能用于疲劳判定,难以用于汽车行驶环境。本文采用人脸识别分析人眼特征的疲劳检测算法,适合于汽车行驶的场合,具有较高的便捷性、实用性和经济性,可接受性强,并且检测准确率高,因而具有较好的研究价值和社会价值。
如图1 所示,在DSP 的硬件平台,软件利用OpenCV 提供的框架提取视频文件,从视频流循环中读取图像;对图像做维度扩大,并进灰度化;提取帧图像检测人脸,用矩形框标注人脸,并对人脸图像标识 68个关键特征点;将脸部位置特征信息转换为数组格式,分别提取左右眼坐标,构造函数计算眼部特征EAR 值;根据EAR 值实时计算PERCLOS 值,再结合非疲劳时的EAR,两者实时对比,即可判定为是否疲劳状态,超过疲劳阈值则发出疲劳示警。
图1 系统工作原理
采用DSP 芯片TMS320C6748 搭建图像采集与处理的硬件系统,其中还有红外CCD(DH-S10-1080P)、声光预警电路和3.5 寸LCD 屏,组成了一套具备实时采集、处理、图像显示的系统。红外摄像头安装在驾驶台上前方,通过USB 把图像传输给DSP,在夜晚也能采集驾驶员脸部图像。硬件系统的组成如图2所示,红外摄像头安装在驾驶台上前方,通过 USB 端口把图像数据传输到DSP 芯片内部,在光线较差的夜晚也能较清楚的采集到驾驶员脸部的图像信息。DSP 内部运行调用OpenCV 图像识别开源库,进行人脸识别,将采集的图像显示在3.5 寸的液晶屏上,其中可以根据参数设置选择是直接显示采集的图像和带有测试点的图像信息,带有测试点的显示模式便于程序调试。SD 卡作为存储元件,是保存驾驶员的人脸特征信息,尤其是精神饱满时的特征值,以便于实时判别其疲劳状态。
图2 硬件系统结构
利用 OpenCV 读写视频流,循环出图像帧,初始化 DLIB 的人脸检测器(HOG),然后创建面部标志物预测。引入并使用人脸识别算法应用中的开源检测器工具dlib.get_frontal_face_detector 和 dlib.shape_predictor构建人脸位置检测器[3],再获取人脸特征关键点。对从视频流中循环读取出的帧图像做维度扩大,并灰度化。使用 detector(gray,0)进行人脸位置检测,使用predictor(gray,0)获取人脸特征关键点的位置信息,参数gray 表示灰度图。将获取的信息转换为array 数组格式。再使用 cv2.convexHull 获取数组array 的凸包位置,画出人脸轮廓位置,进行画图操作。使用 shape_predictor_68_face_landmarks.dat,可以得到 68 个特征点位置的坐标,其中人脸外轮库的标记点的序号为0-16,共计17 点,右眉毛的特征点序号为17-21 共5 个点,左眉为22-25,鼻部的特征点的序号为27-35,右眼特征点序号36-41,左眼为42-47,48-67 均为嘴唇的特征点。这些特征点的坐标值就可以用于一些相关信息的计算,其中36-47 可以作为双眼睁闭信息的识别。
根据已经得到的 68 个特征点位置的坐标,参照以上描述的人脸各个重点部位的特征点序号,右眼36-41或者左眼42-47 可获得1 个眼长和2 个眼宽参数,以右眼为例眼长为36 与39 之间横向差值,眼宽共有两个,宽1 为37 与41 的纵向差值,宽2 为38 与40 的纵向差值,并计算眼睛长宽比EAR 值如式(1)所示:
用EAR 大小判定眼睛的睁闭状态,还可以求得眼皮遮挡眼球率,用于计算一定时间内闭眼所占的比例值,即PERCLOS 值[4],从而进行疲劳判断。如图3 所示,图中的t1为眼睛睁开最大程度至闭合眼度20%的时间,也称为睁开程度80%的时间,t2是从最大睁开度到闭合度80%的时间,t3为从最大睁开度到闭合度100%,再到睁开度为20%的时间和,而t4则可以认为是整个闭眼动作的全周期的基础上减去t1的值。
图3 PERCLOS 原理图
PERCLOS 疲劳检测式通过计算人眼的睁开闭合程度,用来衡量疲劳的标准。PERCLOS 的具体概念为在规定的时间内人眼闭合某个程度的时间所占总时间的百分比,故有一个阈值用于判断人眼是否闭合,对于这个阈值有三个标准,即P70、P80 和EM[5]等标准值。它们具体含义为:P70,遮挡眼球面积大于70%,判定为闭眼;P80,遮挡大于80%;EM,遮挡大于50%,即判定为闭眼。选择任一标准,然后计算眼睛闭合时间比例。PERCLOS 的理论值f,需要计算时间值t1~t4,f 值的公式如式(2)所示:
在实际检测中,时间的精准度难以保证,主控芯片需要实时读取摄像头的图像数据,将图像信息发送至液晶屏显示,而且还需要运行OpenCV 库代码进行人脸识别,上述三个任务让DSP 消费的时间很难精确到毫秒级甚至微秒级别,因此用直观的时间概念来计算PERCLOS 的理论值f 有点不切实际,故采用检测帧数的计数结果作为时间的参照替代参数,从而便有了PECLOS 实际值,或称为PECLOS 近似值的计算,其计算方式以检测帧数为参数进行描述,表示见式(3):
每次开启系统,一般认为是驾驶员精神最佳状态,此时人眼活动可以作为聚类学习的库,采集3~5 分钟的人眼信息后,进行聚类分析,可以得到眼睛的最大睁开特征值和固定眨眼频率参数等,将其保存起来,再采集50 个眼睛睁开特征值,求得平均值作为疲劳判定阈值,就可以用于后续行驶过程中实时判断驾驶员的疲劳状态。
在室内自然光和黑暗无光环境均进行了测试,红外摄像头均可以采集到驾驶员的脸部图像,在灰度显示模式下,同一个驾驶员的脸部信息的采集受到外界光源的影响较小。在以DSP TMS320C6748 为主芯片的Analog Devices Visual DSP++平台下,运行OpenCV 视频流读写库,能够实时采集人脸信息,识别出人脸的68 个特征点,对于同一个驾驶员在疲劳和非疲劳状态,在68 个特征点中的双眼12 个特征点的相对位置变化较为频繁,嘴部特征点也有一些细微变化,其他部位的36 个点均较为稳定,通过实时计算人眼的特征值,实现疲劳检测的功能,并能发出警示声光。实验结果表明本系统能实现疲劳驾驶的检测功能,能达到92%的准确率,检测帧率普遍维持在24FPS 左右,完全满足疲劳检测对实时性的要求。
本文基于DSP 平台,采用OpenCV 开源资源对驾驶人进行人脸识别,实现了实时疲劳告警的功能需求,因其设备便携度高,可以广泛应用于汽车出行。该系统具备良好的可维护性和可拓展性,经过进一步训练与改进,能够成为一个功能更加完备、人机交互更加舒适的疲劳驾驶检测系统。