施冬梅,肖 锋
(1.苏州信息职业技术学院计算机科学与技术系,苏州215200;2.西安工业大学计算机科学与工程学院,西安710021)
我国交通事业蓬勃发展,随之而来的是交通事故频繁发生,据统计,这些事故中有69%的事故与驾驶员疲劳驾驶和不安全驾驶行为有关[1]。因此通过科技手段对驾驶员的驾驶行为进行检测并分析是当今智能交通领域的研究热点。疲劳驾驶和不安全驾驶行为的检测,主要是采用学习算法首先定位视频序列中的人脸和肢体,然后再对人眼、嘴巴等小目标进行识别,分析其状态,从而判断是否安全驾驶。在视频序列图像的人脸识别深度学习算法中,卷积神经网络(convolutional neural networks,CNN)和递归神经网络(recurrent neural networks,RNN)是目前常用的神经网络结构,RNN结构将时间的先后顺序信息加入到了神经网络中,可以实现视频时序图像的识别。目前疲劳驾驶和不安全驾驶行为,主要通过生理参数[2-3]、车辆轨迹[4-5]、肢体动作特征[6]进行检测,常见的生理参数检测方法需要智能穿戴类检测设备[7],且已有应用,但受限于人的心理、情绪变化,存在一定的误差。车辆轨迹行为检测方法受限于路面因素,也易造成误判且有一定的滞后[8]。而肢体动作特征检测方法主要采用机器视觉和深度学习算法判断不安全行为[9-10],如通过闭眼时间比例(percentage of eyelid closure over the pupilover time,PERCLOS)[11]、眨眼频率[12]、面部表情、肢体动作等特征进行检测,学者关注较多。如利用多尺度同态滤波图像增强算法[13],针对复杂环境下捕捉到的图像进行增强,并通过视觉定位,分析驾驶员眼睛所处状态[14]、嘴部动作,进而分析驾驶员的驾驶行为[15]。通过深度学习算法分析视频时序语义信息,判断驾驶员的不安全行为[16]。
在对时序信息建模时,为了防止梯度爆炸的问题,在RNN的结构基础上引入了长短时记忆(long short time memory,LSTM)的神经网络结构,LSTM的记忆和遗忘功能可以提高时序图像的识别精度,因而LSTM模型通常被用来进行视频行为以及人脸识别[17],广泛用于考勤、安保等监控领域。文献[18]中利用单层的相关滤波器来预测目标位置,并使用LSTM自适应地学习确定最终目标位置。文献[19]中将提取的卷积特征输入到具有两个不同方向的双向LSTM中,正反两个方向模拟演化过程,实现特征融合。文献[20]中通过自适应语义注意模型,将两个独立的LSTM网络集成后用于图像目标捕捉。文献[21]中提出了一种改进的基于双流结构的时空注意模型来识别视频中的不同行为。文献[22]中提出一种基于双流特征的时空关注度长短时记忆网络模型,用于行为识别。文献[23]中提出了一个基于时空层次卷积长短期记忆网络来模拟时空域的行为结构,用于行为识别。现有视频序列人体行为识别的难点在于目标动作仅占视频序列中的一个小区域或者小部分,同时被识别人脸目标易被周围的背景信息干扰,如噪声、光线、遮挡等,因此从视频序列中提取人脸或人体行为的有效时空信息,成为行为识别的关键问题。注意力机制是一种内部资源分配机制,在深度学习模型中,引入注意力机制(attention mechanism,AM),加强对关键语义信息的提取,能提高算法的识别准确率[24]。目前描述LSTM模型应用文献中,主要集中在人体行为识别、人脸识别、物体识别等方面,而利用LSTM模型结构和注意力机制有机融合进行人脸与疲劳驾驶检测的文献比较少见。
本文中针对视频图像序列识别方法中的不足,将对LSTM方法进行改进,并引入注意力机制,设计了混合双流通道AM⁃LSTM网络结构,分为时间流和空间流两个通道卷积神经网络,采用不同的网络算法,以空间金字塔池化层(spatial pyramid pooling,SPP)代替传统的均值池化,统一特征图的尺度变换,用SSD进行眼睛的定位,给出了眼睛状态的检测方法以及疲劳驾驶的判断标准,本算法主要用于对驾驶员的疲劳状态以及不安全驾驶行为进行检测,发现异常及时报警提醒,减少交通事故的发生。
在人脸图像识别中,CNN无须图像预处理,就可以直接输入原始图像,进行卷积分类,因而得到了广泛的应用。但CNN在处理时间序列图像存在一定不足,而LSTM模型含有记忆单元ct、输入门it、遗忘门ft和输出门ot,能有效解决这一问题。本文中对基本LSTM结构进行改进[25],在当前输入增加单层卷积,假设xt为输入,ht为隐含层的当前值,网络函数记为f,则LSTM模型的卷积计算表示如下:
权矩阵;bf、bc、bo代表偏置;ht-1代表上一时刻状态量,在这里使用tanh非线性函数;σ为门函数,σ输出在0到1之间。为从复杂信息中选出目标关键信息,进一步在LSTM网络结构中的输入门中引入注意力机制,构成AM⁃LSTM结构,如图1所示。
图1 AM⁃LSTM网络结构
假设用残差网络对视频序列每一帧图像提取的目标特征为{xi},目标长度为n1,则注意力机制动态加权所有特征的总和为
第t个时间,特征xi的权重为,则特征向量xi所对应的权重计算如下:
式中:fatt表示使用多层感知机;ht-1表示上个时刻的状态;为一个中间变量。计算出权重之后,注意力机制开始对输入序列进行选择,得到选择后的序列ht,本文中注意力机制采用的是自适应注意力模型,图像描述框架如图2所示。
图2 注意力机制的图像描述框架
由于驾驶图像采集过程中,像人眼这样的小目标,传统的池化层会造成图像部分信息缺失,所以在设计网络结构时,本文中以空间金字塔池化层代替传统的均值池化,把不同卷积层的特征图转换成固定大小的特征向量,实现对特征图统一尺度变换。设计混合双流通道AM⁃LSTM结构算法进行疲劳驾驶行为检测。双流网络分别使用图像和光流场来表示时间流和空间流信息,虽然增加了一定的计算量,但可以降低复杂环境对时光流视频序列产生的噪声,提高了识别准确率。时间流基于VGG16+Inception网络结构采用SSD算法计算视频序列中相邻两帧光流图像,再提取多帧光流图像时序信息,主要是针对人眼等小目标的检测;空间流采用CNN方法对t帧时刻的RGB图像提取空间特征,再经过通道注意力和空间注意力模块进行关键信息的记忆、对比分析与提取,进而实现特征融合,最后采用softmax分类,获得驾驶行为状态信息,混合双流通道AM⁃LSTM如图3所示。
图3 混合双流通道CNN+AM⁃LSTM网络结构
AM⁃LSTM模型的损失函数采用交叉熵函数,再通过反向传播方法训练模型参数。根据前面的推导,可以通过前向传播计算出在时刻t网络的输出向量y,总的误差值L可定义如下:
式中:dit为输出层第i个神经元的期望输出;yit为输出层第i个神经元的实际输出;Y为输出层神经元的个数。在LSTM中,需要计算隐层输出的误差梯度δht和记忆状态δct的误差梯度,方法如下。
模型计算过程如下:初始化网络权值,首先采用前向传播,计算输出值y和此时刻t的总误差值;然后计算隐层单元的误差梯度δht和记忆状态δct;再计算遗忘门、输入门、输出门的权值更新ΔWf、ΔWi、ΔWo,最后更新权值Wf。
将AM⁃LSTM模型的时间步长设置为m,将最后一个时间步长的隐层状态输出看作最具特征代表性的高层语义特征,在AM⁃LSTM网络中加一个soft max层,变成最终分类任务,针对最后的时间步长可以将公式修改为
式中:Wo表示隐含层到输出层的权重矩阵;bo表示偏差;ym表示最终分类结果;hm表示步长达到m时的h状态值。AM⁃LSTM模型的损失函数采用传统的交叉熵函数,通过反向传播方法训练参数。
当驾驶员处于疲劳状态时,最能反映的就是眼睛和嘴巴,如打哈欠、眯眼睛等,通过算法检测人眼的开度、PERCLOS值和动作频率来判断疲劳程度。其中,PERCLOS值与疲劳驾驶的相关性最大。本文中采用PERCLOS标准,其含义是指在一个眨眼周期中,眼睛开度小于最大开度20%的时间与眼睛开度小于最大开度80%的时间的比值,以ρ表示:
式中:t1代表眼睛从眼睑闭合至最大开度20%到完全闭合,再睁开至最大开度20%的时间;t2代表眼睛从眼睑闭合至最大开度80%到完全闭合,再睁开至最大开度80%的时间。计算人眼开度时,首先要定位人脸,再利用SSD算法在人脸中搜索人眼,依据人眼上眼睑与下眼睑标定的特征点来计算人眼开度,人眼的检测点位如图4所示。
图4 人眼检测示意图
每只眼睛有8个检测点,每个点位对应一个坐标,用(xEi,yEi)表示,首先计算出睁开眼时E1和E5、E2和E4、E6和E8之间的距离,取平均值作为正常驾驶人眼睁开基准值。
某人第i次眼睛睁开值可表示为
因为每个驾驶员人眼大小的状态是不同的,同一辆车可能由多个驾驶员使用,针对不同人的眼睛大小、环境变化以及是否戴眼镜等因素,实际的眼睛开度可用Eopen表示为
Eopen作为眼睛开度指标,考虑光照等环境因素,测试结果为人眼开度处于0.8到0.65定位为轻度疲劳,0.65到0.45为疲劳,0.45以下为重度疲劳。人在疲劳情况下眨眼频率会变快,眨眼频率可以通过把时间转换为该检测时段里的视频帧数比例来表示:
FEopen作为一个阈值,是用来判断疲劳状态的依据。实际采用眼睛开度、PERCLOS值和眨眼频率综合来判断疲劳状态,具体规则如表1所示。
表1 不同方法的疲劳状态判断值
本实验是在主频为4.0GHz Intel CPU、GeForce GTX 1080显卡上实现的,软件采用Python3.0、Matlab2016a和Tensor flow1.3框架。在驾驶行为检测时,采用850 nm波长的近红外摄像头采集视频序列,采样率为30 fps,视频大小统一为320×240。在LFW数据集中进行人脸图像识别和在自建驾驶数据集进行驾驶行为检测实验。为便于分析测试数据,根据测算数据绘制了ROC(receiver operating characteristic)曲线,ROC分析的是二元分类模型,根据分类结果和AUC(area under curve,AUC)面积判断方法的好坏,AUC面积越大代表方法越好。
通过近红外摄像头分别采集驾驶员正常状态下的视频以及处于疲劳状态下的视频,每隔0.2 s采集一帧图像,采集时间10 s,50幅图像为一组数据。检测结果如图5所示。
从图5可以看出,实测结果和表1的疲劳状态判断值很接近,验证了本方法的可行性。正常状态的Eopen的值较大,疲劳状态下,PERCLOS值和FEopen值较大,说明闭眼时间明显加大,或处于眯眼状态。
图5 视频序列图像的眼睛开度示意图
LFW数据集共有13 233张人脸图像,都是来自于自然场景,每张图像均给出对应的人名,共有5 749人,实验时选取了1 000张图像,其中800张用于训练,200张用于测试。采用了CNN、SSD、LRCN、LSTM等方法进行ROC值和准确率实验,结果如图6所示。
从图6可知,本方法的人脸目标识别的ROC曲线的真阳率和准确率分别达到了0.855和83.28%,比CNN方法分别提高了0.077和4.76个百分点,比LSTM方法分别提高了0.016和1.36个百分点,虽然增加了一定的计算量,但识别精度和成功率提高了。表2是不同方法在LFW数据集中的计算量对比。
图6 不同方法在LFW数据集中的实验结果
表2 不同方法计算效率对比
本方法在双流LSTM网络结构的基础上,增加了注意力模块,使得网络参数量略有增加,虽然训练时间增加了1.4 s,FLOPS减少了0.132,但本方法的准确率提升1.36个百分点,在实施时,可以采用嵌入式DSP处理器和FPGA技术,能满足疲劳驾驶检测数据处理的精度和实时性需求。
为验证本文所提方法的准确度和实用性,实验增加自建驾驶行为数据集,共采集到包括用手机、吃东西、双手离开转向盘、说话、扭头、眯眼睛、打哈欠、正常和其他违规动作在内的10种情形,每种情况采集3个视频,共30个视频,编号S1-S30。训练时,设置初始学习速率为0.001,Relu作为激活函数,用随机梯度下降方法优化,网络节点数为64。将训练视频数据未进行二次稀疏光流提取的光流图分别以连续2帧、连续4帧、连续10帧采集光流图输入网络中进行训练。在自建驾驶数据集上和其他方法进行对比分析。
选取4种状态的6个视频序列对眼睛进行测试,编号为S16-S21样本帧数为800,结果如表3所示。
表3 眼睛状态测试结果
在自建数据库中对5种不安全驾驶行为进行了测试,结果如表4所示。
表4 不同方法在自建数据库中的测试结果
从表4可知,本方法采用了VGG16 Inception Net基础网络,融合了自适应注意力机制,用混合双流通道改进了LSTM网络结构,利用注意力机制加强关键语义信息的提取,网络学习能力得到了增加,提升了视频系列图像识别准确率。最难检测的疲劳状态,SSD方法只有68.75%,LSTM为70.78%,本方法达到了73.36%,分别提高了4.61和2.58个百分点。
为进一步验证本文模型对不同驾驶行为的检测能力,基于AM⁃LSTM结构模型的检测结果,分别对8种驾驶行为结果绘制了ROC曲线,如图7所示。
图7 不同方法的ROC曲线
从图7的8种驾驶行为的ROC曲线总体走势可以看出,采用了金字塔池化,融入了注意力机制的混合双流通道的LSTM结构,具有较好的分类性能,尤其是对于用手机、说话、吃东西等AUC值达到了81%以上,疲劳驾驶中的打盹行为检测也达到了72.7%。
在自建驾驶行为数据集中进行CNN、LRCN、SSD、AM⁃LSTM 4种方法的损失函数实验分析,数据的前75%用于训练,后25%用于测试,学习率设定为0.001。采用交叉熵损失函数,利用Adam优化器训练模型,500次迭代的损失函数曲线如图8所示。
图8 4种模型训练损失函数曲线
从图8可以看到,4种模型的损失函数随迭代次数增加逐渐减小并趋向0。CNN网络损失函数值下降速度最慢,且最终的损失值大约为0.15。在刚开始阶段,SSD的收敛速度比AM⁃LSTM快,这是因为网络融入了注意力模块,增加了计算量。但AM⁃LSTM的收敛速度逐渐加快,且最后收敛时的损失函数值要小于其他网络。4种模型准确率曲线如图9所示。
图9 4种模型准确率曲线
从图9看出,4种网络的准确率随着迭代次数增加均不断升高。初始阶段,LRCN网络的准确率比AM⁃LSTM网络准确率上升速度略快,但最终AM⁃LSTM网络的准确率略高于其他网络模型。
疲劳驾驶和驾驶员的违规行为是造成交通事故的主要来源,本文中针对驾驶安全问题,采用人工智能技术和深度学习理论,基于CNN和LSTM相融合的方法,并融入注意力机制,提出了改进的混合双流CNN网络,用于驾驶安全行为检测。在网络中采用金字塔池化代替传统池化层,统一图像尺寸,在LSTM网络中引入注意力机制,有效选取语义信息。在双通道设计时,一个通道采用的是CNN算法,对视频RGB图像提取空间特征,一个通道采用SSD算法对视频序列中相邻两帧计算光流图像,用于对脸部眼睛等小目标的检测,双通道特征融合以后,分类,获得检测结果。在LFW数据集和自建驾驶行为数据集中进行了实验,获得了不同方法和不同驾驶行为的ROC曲线、正确率和损失函数,测试结果表明本方法有较好的优越性,能有效提高疲劳驾驶和不安全驾驶行为的检测率。