蔡 菁,程 雷,王红霞
(武汉理工大学计算机科学与技术学院,湖北 武汉430063)
交通安全问题是当今社会亟待解决的一大难题。近年来随着车辆数目的快速增长,道路交通安全状况日益恶化,如何保障安全驾驶已成为影响社会经济发展的重要研究课题。调查研究发现,疲劳驾驶是引发交通事故的重要原因之一[1]。针对这种情况,以驾驶员行为特征、驾驶员生理参数、车辆行为特征等为基础的疲劳驾驶预警方法的研究受到广泛关注,而进一步融合多种信息,提高疲劳驾驶监测系统的适应性与可靠性,是今后的重点研究方向之一[2]。
有关疲劳状态监测及特征提取与融合的研究已经有了一些探索。胡鸿志[3]设计了一种基于驾驶操作行为及车辆行驶状态信息的驾驶疲劳识别系统,采集指标并用神经网络方法判断驾驶员驾驶状态。吕健健[4]研究了基于贝叶斯网络的驾驶员疲劳评估方法,利用因果关系构建出驾驶员疲劳评估模型拓扑结构。柯明君[5]在驾驶员疲劳视频监测系统中归纳并提出了多项的疲劳程度评价指标并基于此构建驾驶员疲劳状态评价模型。然而这些研究存在难以被驾驶员接受、投入成本较高、受光照等环境影响较大、或监测准确率不够高等问题。
微软2010 年发布的Kinect传感器集成了彩色摄像头、红外投影机和红外摄像头,它能快速进行骨骼监测,并提供了高效的人脸识别算法,由于具有红外摄像功能,减少了光照等环境因素的影响,而且物美价廉,应用于驾驶员安全驾驶状态的监测便于实际的应用和推广。目前主流的用机器视觉对驾驶员进行疲劳检测主要是基于行为特征的检测,比如眼部、头部、嘴部的检测等[6],利用Kinect可以很方便地实现眼部、头部及嘴部的检测,进而综合判断疲劳状态。
华南理工大学的胡习之建立了一种基于Kinect的驾驶员状态监测系统,对汽车驾驶过程中容易出现的驾驶疲劳、注意力分散等状况进行监测,通过实车测试,验证了将Kinect用于保障驾驶员安全驾驶的可行性[7]。但是,该监测系统没有很好地解决夜晚监测效率下降的问题,只是简单地利用Kinect获取了驾驶员头部、脸部、眼部等的特征信息,也没有对各种特征信息进行有效融合。
疲劳驾驶在夜晚的发生率很高[8],而夜晚行车时车内照明不足,由于Kinect本身提供了红外数据,且红外数据受光照等环境因素的影响较少,于是在光线不足时,将红外数据代替彩色数据作为人脸识别的源数据,可在一定程度上解决夜晚太黑导致彩色摄像头效率低的问题。本文基于Kinect传感器研究设计一种驾驶员疲劳状态综合监测系统,利用Kinect提供的红外图像及人脸识别模块获取驾驶员嘴部、头部、眼部等与驾驶员疲劳状态监测相关部位的特征信息,通过对Kinect获取的红外图像数据的预处理,并通过融合各种特征信息,综合判断驾驶员的疲劳状态,提高白天尤其是夜晚的驾驶员疲劳状态监测准确率。
本 系 统 利 用 Microsoft 提 供 的Kinect for Windows SDK (K4WSDK)和Face Tracking SDK(FTSDK)工具进行相应开发。K4WSDK 提供了Kinect的驱动及开发接口,而FTSDK 通过人体骨架模型和深度数据结合彩色图像数据实现人脸识别功能,相对于单独基于彩色图像数据的人脸识别方法,提高了效率和鲁棒性。FTSDK 提供了IFTResult类以存储人脸跟踪结果。从IFTResult::Get2DShapePoints方 法 可 获 取 脸 部 轮廓数据。Kinect可跟踪100 个脸部轮廓特征点。从IFTResult::Get3DPose方法可获得头部姿态角度。FTSDK 也提供了IFTModel类以存放3D人脸模型识别结果。这个3D 人脸模型是根据Candide3模型定义的,有6个动态单元和11个形状单元,形状单元估计了人脸的形状,而动态单元跟踪了张嘴、皱眉等动作。系统处理流程如图1所示。
Figure 1 System flowchart图1 系统流程图
本系统利用Kinect获取彩色图像、红外图像、深度图像和骨骼模型等数据,并对红外图像进行预处理。光照强时,使用彩色图像;光照弱甚至没有光照时,使用红外图像(通过检测当前图像平均灰度的大小实现切换)。再结合其他两种数据,通过FTSDK 进行脸部识别获得眼睛的位置和人脸模型。从人脸模型中获取嘴部状态和头部朝向并分别计算其疲劳参数。通过眼睛的位置获取眼部的图片,然后对眼部的状态进行识别,计算眼部的疲劳参数。进而通过RBF神经网络对疲劳参数进行融合,并使用滑动平均法完成疲劳值的计算。最后通过疲劳值分级判断疲劳状态并报警。为便于积累监测数据和经验进一步提高驾驶员疲劳状态监测效果,将疲劳参数、监测数据和结果均保存到数据库中。
Kinect 1.0设备提供了680*480的16 位红外图像数据,每秒15帧。受激光投射的光斑的影响,不够清晰。为进行人脸识别,首先对红外数据图像进行格式转化,将红外数据图像格式和人脸识别模块的接口统一起来,然后调节图像对比度,最后进行高斯滤波、腐蚀等处理。
(1)格式转化。
FTSDK 接收32位rgba图像数据,而提供的红外图像是16位的。首先将16位红外图像数据压缩为8位灰度图像数据,并直接对8位灰度图像进行对比度调节和滤波等处理,然后再转化为32位的rgba图像数据用于人脸识别。
(2)对比度调节。
为更多地保留图像信息,避免常用的直方图均衡化图像处理方法会损失一部分图像信息的问题,本文采用自适应的直接对比度增强方法。即:当检测到人脸时,计算人脸矩形框的平均灰度a1,并增强整个图像对比度,使a1达到一个定值A1;当没有检测到人脸时,计算整个图像的平均灰度a2并增强,使a2达到一个定值A2。
(3)滤波等处理。
对于得到的灰度图像,先采用高斯滤波减弱噪声,再采用腐蚀突出轮廓。由于人眼像素低,可以在高斯滤波后直接识别人眼状态,以免因腐蚀操作扩大轮廓而增加误差。
图2a和图2b给出了白天的原红外图像及预处理后的红外图像,本文方法明显增强了图像的可辨识度。夜晚无光时,Kinect也能获取到红外图像,但由于只靠Kinect发射的红外线而缺少太阳光提供的红外线,图像的效果会相对变差,识别效率会一定程度地降低。使用本文提出的红外图像预处理方法,夜晚Kinect也能比较正常地进行监测,效果如图2c所示。
本系统通过监测驾驶员的低头情况获取两个头部疲劳参数:驾驶员的低头频率(保存到整型变量headPara中),及单位时间(例如1 分钟)内是否出现长时间低头情况(保存到布尔变量isHead-Low中)。
Figure 2 Infrared image before and after pretreatment图2 预处理前后的红外图像
从IFTResult::Get3DPose方法可以获取头部的pitch俯仰角rotationX。角度在-90°到90°之间,头上仰为正。通过监测头部俯仰角rotationX,首先检测是否一直低头。当rotationX小于λ1(例如-10°)且持续超过一定时间β1(例如3s)时,则判定是长时间低头。同时,对低头动作进行检测,每当rotationX小于0 且持续下降超过λ2(例如10°)时,认为低头一次,headPara++。变量isHeadLow和headPara每隔单位时间进行更新。
本系统通过监测驾驶员打哈欠的情况获取一个嘴部疲劳参数:打哈欠的频率(保存到整型变量mouthPara中)。
从IFTResult::GetAUCoefficients方法中获取动态单元的参数pAUs,其中pAUs[1]表示了嘴部张合状态。pAUs[1]=1 时嘴部完全张开;pAUs[1]=0时嘴部闭合。当pAUs[1]大于一定值α(例如0.4)时,认为嘴部张大到了打哈欠的程度。持续超过一定时间β2(例如3s),则判定打了一个哈欠。每打一个哈欠,打哈欠频率加1,mouthPara++。mouthPara每隔单位时间更新。
由文献[6]可知,PERCLOS值(单位时间内眼睛闭合的时间占总时间的百分比值)与驾驶员是否疲劳有很大的关联。本系统通过监测眼睛睁闭情况获取两个眼部疲劳参数:单位时间内的眼部状态监测结果是否有效(保存到布尔变量isValid中),及单位时间的PERCLOS值(保存到浮点型变量eyePara中)。
(1)眼部图像获取。
从IFTResult::Get2DShapePoints方法中获取脸部轮廓特征点,其中87号特征点为左眼中心,88号特征点为右眼中心。以左右眼中心为中心截取左右眼16*12像素的矩形图片,水平方向为16像素,从左到右像素位置标记为X;垂直方向为12像素,从上到下像素位置标记为Y。
(2)眼部状态识别。
眼部状态有很多识别方法,如模板匹配法、椭圆拟合法、灰度投影法、支持向量机识别法等等。由于Kinect获取的眼部图像比较模糊且像素低,而另一方面,Kinect可以不受睁闭眼影响固定跟踪人眼中心,故而采用灰度投影法。在监测过程中,驾驶员头部到Kinect设备的距离保持在0.8m左右。
在灰度投影法中,有两个变量可以作为眼部状态识别的标准:一个是使水平投影最小的Y值,水平投影是每一行像素的灰度值的和,如图3a所示;另一个是水平投影积分比值,即当前水平投影积分与总积分的比值,如图3b所示。相对而言,最小值的变化显著,积分比值的变化不明显,但积分比值能反映总体的情况。所以,用最小值来识别眼部的睁闭状态,同时,用积分比值来校验眼部状态识别的有效性。
Figure 3 Eye image analysis图3 眼部图像分析
首先计算眼部图像的灰度水平投影,找到最小处,即波谷,记对应的Y值为K。睁眼和闭眼的波谷是完全不同的。睁闭眼时,K的变化情况如图3c,K处于波峰时眼睛完全闭合。当K≥8时判定眼部闭合状态的效果最好。当左右眼同时闭合时,判定眼睛完全闭合。
在眼部状态识别中会存在一些误判,必须采取一些措施减少误判。本系统采用两个方法识别误判。
方法1 根据头部偏离角度进行判断。因为驾驶员的头部一般都应该朝向正前方,当头部朝向偏离正前方一定位置时,眼部监测的准确率将大大降低,此时需定义眼部状态识别结果无效。IFTResult::Get3DPose方法可以获取头部朝向的三个角度,当这三个角度中任一个角度偏离一定角度(例如10°)以上时,认定识别结果为无效。
方法2 有时候脸部移动过快,导致眼部不能正确跟踪,这时可以根据水平投影积分进行筛选。计算7个像素(从第1个到第7个像素)的水平投影积分比值m。不管睁眼还是闭眼,明显m≥0.5,若m<0.5,则判定结果为无效。
(3)PERCLOS值及有效性。
统计单位时间(例如1min)内彩色/红外图像的总帧数n0(大约为900帧),对每一帧进行分析,统计有效的帧数n1,统计闭眼的帧数n2。那么PERCLOS值为eyePara=n2/n1。眼部状态监测结果的有效性为v,则v=n1/n0。当v小于一定值(例如0.8)时,判定眼部状态监测结果无效。
本系统采用径向基RBF(Radical Basis Function)神经网络进行信息融合。RBF 是一种前向型神经网络[9],能够以任意精度逼近任意连续函数,特别适合于解决分类问题。RBF 有较强的输入输出映射功能,是前向网络中完成映射功能的最优网络,有较好的分类能力和极快的学习收敛速度。
RBF方法可用来对一组多维空间中的数据点进行插值,插值的目的是寻找一个函数F(X)将每个矢量X映射到相应的目标值Y。首先要选择P个基函数,每个基函数对应一个训练数据,各基函数形式为φ(‖X-Xp‖ ),由于距离是径向同性的,因此称为径向基函数。‖X-Xp‖表示差向量的模,或者叫2 范数。基于径向基函数的插值函数为:
输入X是个m维的向量,m<P;wp为权值。RBF的作用是把向量从低维m映射到高维P,使得低维线性不可分的情况到高维能够变为线性可分的。
本系统采用Matlab工具箱设计和训练RBF神经网络。RBF 网络是由输入层、隐含层和输出层构成的三层前向型网络。设输入为矩阵P,输出为矩阵T,则RBF 网络的设计格式为net=netrb(P,T,GOAL,SPREAD)。其中,GOAL为均方误差要求,默认为0;SPREAD为径向基函数的扩展常数,默认值为1,其值越大,函数逼近曲线越光滑。
用Matlab得到RBF 神经网络net,将其转换为表达式,用于C++编程。RBF 网络的训练过程分为两步,第一步为无导师式学习,确定训练输入层与隐含层之间的权值iw;第二步为有导师式学习,确定训练隐含层与输出层之间的权值lw[10]。训练的目标是求取两层的最终权值iw、lw和阈值b1、b2。
设定网络输入为向量x,隐含层采用径向基函数作为激励函数,该径向基函数为高斯函数。则隐含层第i个神经元的输出为:
ri =exp(-(‖iwi-x‖×b1))
输出层采用纯线性函数作为激励函数,其输入为各隐含层神经元输出的加权求和。输出层的输出为:
文献[11]划分了四种疲劳程度:不疲劳、轻度疲劳、中度疲劳、严重疲劳,其疲劳程度对应着不同的疲劳值P(0≤P≤1)。疲劳程度与疲劳值P的划分如表1所示。
Table 1 Correspondence between fatigue degree and the value of fatigue表1 疲劳程度与疲劳值的对应关系
对于疲劳参数isHeadLow和isValid,当出现长时间低头或眼部识别无效时,表明驾驶员出现非常明显的疲劳状态,可直接判定为严重疲劳,P=0.8。
进而根据文献[11]中得出的PERCLOS值、打哈欠频率、低头频率与疲劳值的对应关系,进行归一化处理。由于PERCLOS值已处于0~1,不需要归一化。对于打哈欠频率和低头频率,由于是离散的,故采用分段归一化方法,如表2所示。
Table 2 Normalized yawning frequency and normalized bow frequency表2 打哈欠频率和低头频率的归一化
对于驾驶员疲劳信息融合,已有一些研究。最简单的一种是权值分配法[5]。权值分配法简单直接,但灵活性不好,抗干扰能力弱。还有抗干扰能力强的贝叶斯网络方法[4],但贝叶斯网络方法适用于离散变量,需要将连续的PERCLOS值离散化,因而误差变大。有的采用神经网络方法进行融合[3],从而识别疲劳状态。但是,由于对于结果过于离散化,只有0和1两个状态,造成误差较大。
本系统采用RBF 神经网络方法,对于结果疲劳值采用连续化方法。根据文献[11]得到14组数据,用newrb()创建网络net。经过实验,网络参数保持默认值效果较好。神经网络训练好之后,对先前预留的10组验证数据进行疲劳识别,从而检验RBF神经网络识别驾驶疲劳状态的准确性。将结果与估计的疲劳值进行比较,可以看出RBF 神经网络既保留了单一变量与结果之间的映射关系,也保留了多个变量与结果之间的映射关系。模拟实验表明,只要用较准确的数据训练网络net,实验结果就能达到精度要求。
通过疲劳信息融合可以得到单位时间(例如1min)内的疲劳值,但这种结果容易受到非疲劳行为(例如偶尔低头看仪表显示)等的影响,可靠性不高。对此,本系统采用滑动平均法,对相对较长的一段时间(例如5min)的状态进行综合评价,从而提高疲劳监测的稳定性和可靠性。
每一单位时间可以获得一个临时疲劳值,对最近的N个单位时间进行综合判断,把临时疲劳值放到长度为N的队列中。首先进行差错处理,由于疲劳时不会检测成非疲劳状态,而非疲劳时可能检测成疲劳状态。所以,只要有一个临时疲劳值小于0.2,则判定驾驶员不疲劳。然后进行误差处理,在保证无差错的情况下,对这个队列的所有临时疲劳值求均值,这样就可以得到误差较小的可靠结果。每当过了单位时间,就让当前的临时疲劳值入队列,让最远的临时疲劳值出队列,将队列长度保持为N。
一般监测系统只是单纯地识别状态并发出警报,而忽略了对监测到的历史数据的利用。监测到的历史数据有诸多用途。首先,根据历史数据能对驾驶员的全程状态有一个较全面的判断,使得当前驾驶员状态的判断更加准确。其次,根据对历史数据的分析,可以归纳出驾驶员疲劳驾驶的习惯和规律,事先给驾驶员以警示。此外,历史数据的记录有助于深化疲劳驾驶的科学研究。目前疲劳驾驶还没有明确的定义,一部分原因是实验数据的不足。总之,将疲劳驾驶的大量监测数据综合利用起来,从中可以得到更精准的疲劳状态分析和预警。
本系统将前面所设定的疲劳参数和监测到的相关疲劳值保存到数据库中,方便查询、利用和进一步的研究。
系统模拟实验使用Windows 7 系统的台式机,速龙2.9GHz双核CPU,采用Microsoft Visual Studio 2010作为开发平台,Kinect for Windows SDK v 1.8作为开发工具,OpenCV 2.4.10作为图像处理工具,Microsoft SQL Server 2008作为数据库工具,Matlab 作为数据处理工具,另有Kinect for XBox 360设备。
Kinect 1.0设备能提供彩色图像和红外图像,但两种图像不能同时获取。先在彩色图像条件下进行测试。对彩色图像进行识别,可直接跟踪人脸;将彩色图像转化为灰度图像,可用以上方法识别眼部状态。然后,在红外图像条件下进行测试,最后对结果进行综合分析。选两名志愿者做模拟测试,与Kinect保持适当距离并直视前方。每种条件情况下对闭眼、点头和打哈欠等识别测试10组,每组10次,共100次。
先用彩色图像在不同光照条件下进行测试;光线充足选取的条件是晴朗天气时室内下午14:00~15:00,人脸显得很清晰;光照不足选取的条件是晴朗天气时太阳刚落山后,室内光线较暗,人脸显得模糊。完全入夜后,如果没有额外光源,彩色图像完全看不清,人脸识别无法进行。
Table 3 Fatigue recognition accuracy on color images表3 彩色图像的疲劳状态识别准确率
再用红外图像在不同光照条件下进行测试,将经过预处理和未经过预处理的测试结果进行对比。白天选取的条件是晴朗天气下室内下午14:00~15:00,这时有太阳光辐射的红外线,红外图像效果较好;夜晚选取的条件是夜晚室内21:00~22:00,这时室内基本完全黑暗。
Table 4 Fatigue recognition accuracy on infrared images表4 红外图像的疲劳状态识别准确率
测试结果表明,光照充足时采用彩色图像识别效果最好,随着光照的减弱,识别准确率逐渐下降,而光照减弱到一定程度时,完全无法识别。用红外图像进行测试时,在太阳光提供足够红外线条件下识别效果较好,但不及光照充足的彩色图像。随着太阳光红外线的减弱,识别效果变差。然而,Kinect设备自身提供一定的红外线,所以即使没有太阳光也有一定的识别成功率。红外图像经过本文提出的预处理之后,识别准确率都有一定的提升,其中夜晚打哈欠的识别准确率提升最大,超过20%。预处理能增强图像对比度,突出面部轮廓,进而增加人脸识别的成功率。
实验验证了本文提出的将彩色图像和红外图像综合利用进行疲劳状态监测的效果最好,光照强时利用彩色图像,光照弱或夜晚时利用红外图像;并且采用本文提出的预处理方法之后,疲劳状态识别准确率都有进一步的提升。实验表明本系统能有效地识别疲劳状态,且无论白天还是夜晚都能够有较高的识别准确率。
本文基于Kinect研究设计驾驶员疲劳状态综合监测系统,通过Kinect人脸识别获取驾驶员嘴部、头部、眼部等与疲劳状态监测相关部位的特征信息,闭眼识别主要靠眼部位置灰度的变化,点头识别主要靠五官的位置,而打哈欠识别主要靠嘴部的轮廓。通过对Kinect提供的红外图像进行预处理,减弱了光照不足的影响;采用自适应的直接对比度增强方法,将图像的灰度平均值适量增大,能明显改善图像质量;采用灰度投影法进行人眼状态识别和监测,实现了基于模糊和低像素图片的人眼状态识别;利用RBF 神经网络对驾驶员头部、嘴部、眼部等的特征信息进行融合,并利用滑动平均法及数据库技术,使得疲劳状态监测更加准确可靠。模拟实验表明,本系统在白天夜晚都能较有效地监测驾驶员疲劳状态。下一步将拓展对疲劳状态的监测,对驾驶员的注意力分散状态进行监测,并努力创造条件开展实车实验。
[1] Li Hai-qin,Li Li.Analysis of unsafe driving behavior based on questionnaire[J].Automobile Technology,2015(2):145-148.(in Chinese)
[2] Sun Wei,Zhang Wei-gong,Zhang Xiao-rui,et al.Research progress of fatigue driving early warning system [J].Automotive Electrical Appliances,2009(1):4-8.(in Chinese)
[3] Hu Hong-zhi.Research of vehicle driving fatigue recognition system[D].Wuhan:Wuhan University of Technology,2010.(in Chinese)
[4] Lv Jian-jian.Study on driver fatigue alertness based on Bayesian network[D].Dalian:Dalian University of Technology,2013.(in Chinese)
[5] Ke Ming-jun.The key technics and architectural design of video-based drowsy driving detecting system[D].Changsha:National University of Defense Technology,2008.(in Chinese)
[6] Wu Ya-xuan,Li Wen-shu,Shi Guo-sheng,et al.Survey on fatigue driving detection method research[J].Industrial Control Computer,2011,24(8):44-46.(in Chinese)
[7] Hu Xi-zhi,Taha Mansour Jmour.The driver condition monitoring system based on Kinect sensor[J].Value Engineering,2014(20):193-194.(in Chinese)
[8] Li Du-hou,Liu Qun,Yuan Wei,et al.Relationship between fatigue driving and traffic accident[J].Journal of Traffic and Transportation Engineering,2010,10(2):104-109.(in Chinese)
[9] Chai Jie,Jiang Qing-yin,Cao Zhi-kai.RBF neural network function approximation ability and algorithm [J].Pattern Recognition and Aitificial Intelligence,2002,15(3):310-316.(in Chinese)
[10] Zhang De-feng.Matlab neural network application design[M].Beijing:China Machine Press,2012.(in Chinese)
[11] Wang Lei,Sun Rui-shan.Study on face feature recognitionbased fatigue monitoring method for air traffic controller[J].China Safety Science Journal,2012,22(7):66-71.(in Chinese)
附中文参考文献:
[1] 李海琴,黎莉.基于调查问卷的不安全驾驶行为分析[J].汽车实用技术,2015(2):145-148.
[2] 孙伟,张为公,张小瑞,等.疲劳驾驶预警系统的研究进展[J].汽车电器,2009(1):4-8.
[3] 胡鸿志.机动车驾驶疲劳识别系统研究[D].武汉:武汉理工大学,2010.
[4] 吕健健.基于贝叶斯网络的驾驶员疲劳评估方法研究[D].大连:大连理工大学,2013.
[5] 柯明君.驾驶员疲劳视频监测系统设计与关键技术研究[D].长沙:国防科学技术大学,2008.
[6] 吴雅萱,李文书,施国生,等.疲劳驾驶检测技术研究综述[J].工业控制计算机,2011,24(8):44-46.
[7] 胡习之,Taha Mansour Jmour.基于Kinect传感器的驾驶员状态监测系统[J].价值工程,2014(20):193-194.
[8] 李都厚,刘群,袁伟,等.疲劳驾驶与交通事故关系[J].交通运输工程学报,2010,10(2):104-109.
[9] 柴杰,江青茵,曹志凯.RBF 神经网络的函数逼近能力及其算法[J].模式识别与人工智能,2002,15(3):310-316.
[10] 张德丰.Matlab神经网络应用设计[M].北京:机械工业出版社,2012.
[11] 汪磊,孙瑞山.基于面部特征识别的管制员疲劳监测方法研究[J].中国安全科学学报,2012,22(7):66-71.