基于图像识别的防瞌睡系统设计
2022-03-24林盛楠
林盛楠
(武警工程大学密码工程学院,陕西 西安 710086)
作者简介:林盛楠(1999-),女,硕士研究生在读,研究方向为图像识别。
DOI:10.19981/j.CN23-1581/G3.2022.06.032
为保障单位安全,单位内部设有值班室。事实证明,因为生理疲劳等客观原因,仅从规章制度上难以有效地杜绝值班人员瞌睡情况发生。值班人员由于工作压力大、休息时间不够及心理情绪影响等因素,均可能导致在值班时瞌睡,从而不能履行好职责导致事故发生。因此,通过图像识别的方法揭示值班人员的瞌睡特征,实时准确地对值班人员瞌睡状态进行检测,并确保正常值班的情况下给出预警机制,可以很大程度上减少安全事故的发生。本文针对值班人员打瞌睡不履职尽责的情况,设计依托Python Dlib 库和OpenCV 的图像识别技术实现的非接触防瞌睡系统。在详细介绍图像采集、图像处理的基础上,进一步比较判定值班人员处在正常或者疲劳状态并用声光提示。
目前,对人员瞌睡检测的研究已经有很多,基于人员生理特征的检测方法主要有5 种:检测头部状态、检测瞳孔信息、检测脑电信号、检测脉搏频率和检测眼睛活动信息[1]。本课题选择非接触式眼动信息检测技术,对值班人员的瞌睡程度进行24 h 实时检测,如果结合“人形”检测还可以进一步拓展“脱岗”检测等功能。
本文介绍了一种基于图像识别的防瞌睡系统,该防瞌睡系统通过摄像头采集到值班人员人脸的图像,利用人脸检测技术定位人脸区域并进行人眼定位与人眼疲劳状态分析,当检测到值班人员瞌睡时,能及时对值班人员进行预警。
1 系统基本结构
本系统主要完成对摄像头获得的图像进行分析处理,判定值班人员是否瞌睡,主要包括:利用摄像头进行图像采集;对采集到的图像进行人脸检测;在检测人脸的基础上进行人眼定位;提取人眼特征点位置;对人眼状态进行识别;判定值班人员是否瞌睡和对处理结果进行分析处理。若判定瞌睡则报警,否则返回,重新检测图像(图1)。
图1 系统流程图
通过对目前人脸检测技术的对比,本系统人脸检测部分采用基于Haar 特征的AdaBoost 算法,实效性高。人眼定位技术采用Dlib 开源库通过OpenCV 图像处理进行人脸特征点定位,准确性高,最后利用EAR 值判定值班人员状态。
2 系统各部分设计
该系统主要由图像数据采集、图像识别以及瞌睡判定与预警3 部分组成。图像识别包括了人脸检测和人眼定位,是整个系统的关键技术。该系统的各部分内容如下。
2.1 人脸检测
人脸识别[2]的关键环节是人脸检测,由于人脸特征中具有灰度特征,例如,眼睛通常比脸颊颜色深;鼻梁的两侧比鼻梁颜色深;嘴巴颜色比周围颜色深。因此,可以简单地用矩形特征(Haar 特征)描绘面部特征。通过特征模板图像窗口的大小位置变换得到的特征称为矩形特征。Haar 特征的数值编码反映了人脸图像的灰度级。在对人脸进行检测时,人脸特征可以通过对Haar 特征的编码进行描述。在固定样本的前提下,Haar 特征的检测编码能够准确地显示指定区域的形态,而且其检测速度比用像素检测的编码系统要好得多。因此,防瞌睡系统采用基于Haar 特征的AdaBoost 算法进行人脸检测。
积分图[3]模型是一种能够描述图像中全局矩形特征信息的矩阵表示方法。Viola 将积分图[4]应用到计算Haar特征中。定义图像中坐标为(x,y)的点的积分图=此点左上角方向上所有像素值的和,点(x,y)的积分图等于阴影部分的所有像素和。通过一个图像区域端点的积分图能够计算该图像区域的像素值。
AdaBoost[5]是集成学习系统中的最常用的特征分析方法之一,它将许多弱分类器的特征分析与结合,达到一个强分类器h(x,f,p,θ)的特征分类和训练效果。在确定各训练窗口样本中Haar 特征的数量和特征值后,对Haar特征窗口中的每一个矩形特征f,训练弱分类器,x 是一个24×24 大小的子窗口,p 是表示不等号的特征方向,θ是Haar 特征的阈值。
级联分类器是由几个简单分类器和AdaBoost 强分类器连接而成的。分类器训练过程:
选择一个级联分类器每层的误检率f;检测率d,标准误检率Ftarget;
设P 为一组正例,N 为一组负例;
初始值设F0=1.0,D0=1.0;令i=1;
当Fi>Ftarget时;i=i+1;ni=0,Fi=Fi-1;
当Fi>f×Fi-1;ni=ni+1;
训练一个有n 个特征的级联分类器;
分类器的数量每层递增,训练得出Fi和Di;
训练直至完全达到目标分类器的检测准确率和误检率。
综上所述,基于Haar 特征的AdaBoost 人脸检测算法共包括4 部分:Haar 特征、积分图快速计算像素值、AdaBoost 训练强分类器和将多个强分类器级联的级联分类器,提高人脸检测精确度。
进行人脸检测时,由于人脸大小具有差异性,可选择2 种方式实现检测:缩小检测图像和放大检测窗口。缩小检测图像的方法是固定检测窗口不变,将检测图像进行大小变换,将变换后的图像通过检测窗口进行图像输入。放大检测窗口的方法是保持检测图像不变,将检测窗口进行大小变换,然后依次使用变换后的检测窗口检测图像。
由于人脸尺寸不同,放大检测窗口不易控制变换程度,可能会造成漏检率或误检率上升。因此,本系统采用缩小检测图像的方法进行人脸检测。
2.2 人眼定位
人脸检测技术已经解决了图上是否有人脸的问题,人眼定位解决了人眼的位置问题。通过ERT 算法训练,在Python 中建立了Dlib 官方开源库[6],效果较好。因此,本系统在Python 平台下采用Dlib 库进行人眼定位。
Python Dlib 库是在Python3 中用于在人脸图像处理的经典模型库,Dlib 库中有一个经过ERT 算法训练的人脸关键点[7]检测器,在利用AdaBoost 算法确定人脸大致位置后,在OpenCV 平台下使用Dlib 库正式训练的68 点模型“shape_predictor_68_face_landmarks.dat”进行图像处理,在人脸上绘制68 个点并显示序列号。通过Dlib 库人脸识别68 特征点检测,分别获取左右眼面部标志的索引,利用OpenCV 对视频流进行灰度化处理,检测出人眼的位置信息。利用数字序号定位人眼[8],使用该模型库可以方便地用于人脸检测和简单的应用(图2)。
2.3 瞌睡状态检测指标
在人脸特征点68 位定位中可以看到37-42 为左眼位置,43-48 为右眼位置。当人眨眼时,这6 个点之间的距离会发生变化(图2)。
图2 人脸特征点位置编号示意图
本防瞌睡系统主要提取值班人员眼睛状态的EAR值[9]指标,基于EAR 值在视频处理序列的基础上,判定值班人员瞌睡状态。其中,指标定义如下:
EAR(Eye Aspect Ratio)是描述眼睛张开程度,即眼睛纵横比。利用上下眼皮特征点之间的距离描述眼睛张开程度,当EAR 低于阈值时,眼睛处于闭合状态。
在进行人眼定位后,开始根据人眼定位坐标计算眼睛纵横比EAR,根据大量实验数据显示,正常状态下,人眼纵横比大概在0.2~0.3 之间。在本系统中,设定阈值为0.2。当前帧2 只眼睛纵横比与前1 帧的差值的绝对值大于0.2,则认为值班人员处于瞌睡状态[10](图3)。
图3 眼长宽比方程
在OpenCV 平台下,构造函数计算左右眼EAR 值,而后求平均值作为最终的EAR 值与设定的阈值做对比,若小于阈值,则更换下一个值班室的摄像头继续检测,若连续3 次小于阈值,则屏幕显示睡着,判定值班人员瞌睡,并发出警报声,对值班人员进行预警,然后重置眼帧计数器,继续检测。
3 实验与结果
实验中主要运用前文所说的原理和方法,软件编程[11]实现,并对人脸检测和人眼定位算法进行测试。在进行检测人脸的过程中,利用Python 平台和OpenCV 中训练好的基于Haar 特征的AdaBoost 级联分类器来进行对人脸的检测。检测中,通过ORL 人脸数据库人脸检测技术的准确率进行测试,并通过统计得出算法的测试结果,最后对测试结果的准确率进行分析。在人脸检测的基础上,通过标定人脸特征点方法进行人眼定位,得出测试结果,并分析该方法的检测准确率。
3.1 人脸检测结果分析
本系统中,通过OpenCV[12]中已经训练好的级联分类器检测人脸,由于值班室一般是单人执勤,所以在检测过程中,我们只取单人的图像来验证算法的精确度。因此,本系统使用ORL 人脸数据库来检测系统的精确度。ORL人脸数据库包含40 个人在不同表情下的人脸图像共400 张,图片大小为92×112(单位/像素)。部分样本如图4所示。
图4 ORL 人脸数据库
利用OpenCV 中已经训练好的人脸分类器进行人脸数正确检测,测试结果见表1。
表1 人脸检测结果
上述数据表明,本系统进行人脸检测时具有较高的精确度,对于复杂的光照环境,仍能精确检测到人脸。部分正确的检测结果如图5 所示。但本系统使用的是OpenCV 平台[13]中训练好的级联分类器,还不够精确,但能够说明基于Haar 算法的AdaBoost 算法在人脸检测上可以满足本系统对于人脸检测实效性和准确性的需求。
图5 人脸正确检测结果
3.2 人眼定位结果分析
在本系统人眼定位技术中,采取利用Python Dlib 开源库进行人脸特征点定位的方法进行检测,测试样本集仍采用ORL 人脸数据库,在检测到人脸的基础上继续定位人眼,定位结果见表2。
表2 人眼定位检测结果
根据以上结果可以发现,基于Dlib 库的人脸特征点定位法对人眼进行定位的精确度较高,同时定位速率也较快,符合本系统实时性和实效性要求。部分正确定位人眼的结果如图6 所示。但若人眼附近有遮挡物,眉毛与眼睛相近时,很可能导致因定位相近而无法定位眼睛准确位置,从而无法检测。当图像分辨率小于63×74 时,无法识别图像中人脸及人眼位置,当图像亮度为-129 或+125时,图像也无法识别。
图6 人眼正确定位测试结果
3.3 人眼状态检测结果分析
对于人眼状态检测,本系统利用EAR 值即眼睛纵横比进行判定,设定阈值为0.2,若检测到的EAR 值小于0.2,则判定为闭眼。检测中仍采用ORL 人脸数据库作为测试样本集。由于需先定位到人眼,才能检测到闭眼情况,因此此次检测在人眼定位结果下继续进行。
对人眼状态的检测结果见表3。
表3 人眼状态检测结果
下面是部分误检的图像,如图7 所示。
图7 人脸错误检测图像
通过以上检测结果发现,错识误识人眼状态的主要原因有:人脸视线向下、人眼区域光照不均匀和人眼的个体性强、不能适应阈值设置等。
实验结果表明:使用EAR 值作为眼睛的闭合标准准确率较高,阈值设定为0.2 也比较符合人眼的生理特征。因此,本系统使用EAR 值检测法具有较高的精确度,同时算法简便,也符合值班室检测环境。
4 结论
本系统通过摄像头对值班人员脸部图像进行采集,通过对人眼状态的检测判定值班人员是否瞌睡。检测指标为眼睛纵横比EAR 值。本系统检测的主要步骤为人脸采集与检测和人眼定位与状态识别。采集到图像后进行人脸检测,确定人脸位置后进行人眼定位和人眼状态分析。本系统主要使用在OpenCV 中训练好的级联分类器来进行人脸检测,在此基础上通过Dlib 库进行了人眼识别与人眼定位,而后利用EAR 值进行人眼状态判断,最后通过眨眼次数判定值班人员是否瞌睡。实验结果证明,本系统可实时有效地检测值班人员是否瞌睡。继续优化级联分类器算法,精确分析值班人员眼部状态是下一步研究的重点。