基于图像处理的疲劳检测系统结题论文.docx
- 文档编号:5052397
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:58
- 大小:1.04MB
基于图像处理的疲劳检测系统结题论文.docx
《基于图像处理的疲劳检测系统结题论文.docx》由会员分享,可在线阅读,更多相关《基于图像处理的疲劳检测系统结题论文.docx(58页珍藏版)》请在冰点文库上搜索。
基于图像处理的疲劳检测系统结题论文
教育部国家大学生创新性实验计划项目类别:
国家创新基金
基于图像处理的疲劳检测系统
结题论文
项目时间:
2009年11月~2010年11月
项目负责人:
肖永龙
承担单位:
空天科学技术研究院
指导老师:
********
摘要
疲劳驾驶是当今交通安全的重要隐患之一。
驾驶人在疲劳时,其对周围环境的感知能力、形势判断能力和对车辆的操控能力都有不同程度的下降,因此很容易发生交通事故。
因此,研究开发高性能的驾驶人疲劳状态实时监测及预警技术,对改善我国交通安全状况意义重大。
本系统旨在准确判断得到驾驶员的疲劳程度,判断PERCLOS值是最具有潜力和最准确的疲劳测定方法之一,其中PERCLOS指在一定的时间内眼睛闭合时所占的时间比例,通过对驾驶室中的驾驶员快速准确的定位其眼部区域,接着得到其眼睛状态,最后计算得到PERCLOS值。
根据PERCLOS值的判断标准得到驾驶员的疲劳程度,用以警示驾驶员。
关键词:
司机疲劳;疲劳检测;PERCLOS
第一章引言
1.1.选题背景
疲劳驾车是引发道路交通事故的一个重要因素,从国内历年交通事故统计的大量案例分析中可得出结论:
因司机疲劳驾驶所造成的道路交通事故约占总数的15%至20%。
而随着交通运输业的不断发展,这一比例可能还会继续上升。
交通事故给国家造成巨大的经济损失和人员伤亡,给个人造成难以想象的后果,增加了社会的不安定因素,因而研究预防检测疲劳的方法意义深远而重大。
目前疲劳的生理特征的检测方法较多,其中PERCLOS指在一定的时间内眼睛闭合时所占的时间比例。
美国联邦公路局曾经检测PERCLOS、头部姿势的变化、脑电图等方法的测试结果与疲劳的关系程度。
结果显示PERCLOS与客观疲劳程度的相关系数最大,可以说PERCLOS是最具有潜力和最准确的疲劳测定方法之一。
目前,PERCLOS方法已被公认为最有效的、实时的驾驶疲劳检测方法,具有实时、非接触式检测的特性。
因此,研制基于PERCLOS和图像处理疲劳检测系统,进行驾驶员疲劳状态的检测,在驾驶员疲劳驾驶时进行报警提醒,对于提高行车安全,降低交通事故发生率具有重要意义。
当然,基于图像处理的疲劳检测系统,也可以对工厂工人的疲劳程度进行实时检测,提早发现工人的疲劳状况,这不仅可以为决策者做出决策提供依据,更可以提高工作效率,提高产品质量,还可以更好地保护工人的身体健康,对工厂和工人来说,进行疲劳检测也具有重大意义。
1.2.系统简介
该疲劳检测系统主要是通过从摄像头中读取图像,然后对所得到的图像进行人脸定位,人眼定位,人眼面积的计算,perclos值的计算以及疲劳判断,进而实现对人疲劳状态的实时检测及报警的功能,满足疲劳检测的基本需求。
该疲劳检测系统的主要框架如图1-1:
图1-1
包括图像读取,图像处理,参数计算这三个模块,其中在图像处理模块中,主要是对读取到的图像进行人脸定位和人眼定位,在计算参数时,主要是计算人眼的面积,并根据计算出来的人眼面积系列,进行perclos值的计算。
在该系统中,每个模块都放在一个线程中运行,线程间的通信采用windows的消息循环机制,数据通信通过传递指针的方式实现。
通过一定的线程管理激活机制,使得系统得以实现对人疲劳状态的实时检测及报警的功能,满足疲劳检测的基本需求。
系统开发环境:
●VC++2008
●OpenCV2.0
●.NETFramework
该系统的运行环境:
●.NETFramework
●windows系统
第二章整体
该疲劳检测系统如图2-1:
图2-1
主要有视频图像区,参数区,操作区及人眼面积波形显示区组成,当操作者打开程序,单击开始按钮后,程序便自动进行疲劳检测,定位人脸,定位人眼,计算人眼面积,计算perclos值,如果单击打开波形按钮,则会打开人眼面积波形窗口,实时显示当前人眼面积的波形。
另外,该系统还提供暂停功能,零时关闭系统中正在运行的线程,以降低程序对系统的消耗。
2.1.图像获取
图2-2
当程序打开后,单击开始按钮,系统自动从摄像头中读取图像,并实时显示在图像区,直到系统暂停或关闭。
2.2.人眼面积的显示
图2-3
当系统开始工作之后,单击打开波形按钮,系统会另开一个窗口,用于实时显示当前人眼面积的波形,其中横轴为时间轴,纵轴为经过处理的面积轴。
图像中每一个波谷都代表着一次眨眼。
当单击关闭波形按钮时,系统会关闭该窗口,暂时关闭波形的显示。
2.3.参数的显示
图2-4
当正常工作时,系统会对人眼的面积进行实时的计算和统计,实时计算perclos值,并在参数区进行显示,系统会取5次perclos值作为一次有效的perclos值,当该perclos值>0.15时,便认为是疲劳状态,并给出相应的提示和警告。
2.4.状态信息
图2-5
图2-6
图2-7
图2-8
在状态栏中,显示当前检测到的状态信息。
当刚开始检测时,状态栏显示灰色,提示信息为:
正在检测(如图2-6);如果检测信息正常,则状态中显示为绿色,提示信息为:
正常(如图2-7);如果当前人perclos值大于0.15,则状态中显示为红色,并给出提示,请注意休息(如图2-8)。
2.5.系统的功能
图2-9
为方便操作,系统提供了4个基本功能,开始、暂停、结束、和波形显示。
其中当系统开启时,仅有开始按钮有效,单击开始按钮后,系统进入工作状态,将其余按钮使能,可进行暂停、波形显示、结束等操作;单击打开波形按钮,系统开启一个波形显示窗口,提供实时人眼面积波形,按钮提示文字变为关闭波形;单击暂停按钮,系统将关闭除主线程外的所有线程,系统进入暂停工作状态。
第三章读取视频模块
为了使系统的后续操作能够顺利进行,在初始化时,程序需要对系统是否具有摄像头,有多少个摄像头进行统计,如果没有摄像头,则进行提醒,如果有多个摄像头,便提醒使用者进行选择,以使系统能够正确的进行配置。
同时,由于待处理的视频图像数据量巨大,而图像的大小直接关系到待处理的数据量,为此,在对摄像头进行设置时,需要将读入的视频帧的大小为320x240。
其设置如下:
cvCapturecapture=cvCaptureFromCAM(0);
cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH,320);
cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT,240);
当初始化设置完成后,使用者选择开始时,通过IplImage*cvQueryFrame(cvCapturecapture)的调用,程序便进行一次视频帧的读取,并通过
CvvImageimg;
IplImage*Image2=(IplImage*)wParam;
if(Image2){
img.CopyOf(Image2);//从IplImage拷贝图像数据到CvvImage
img.DrawToHDC(hDC,&rect);//在控件上绘制图像
}
将图显示在句柄hDC指向的控件上;不断重复读视频帧,显示视频帧,便可以看到一个连续的视频。
第四章图像处理模块
图4-1
4.1.图像识别方法
4.1.1.肤色识别
肤色是人脸的重要信息,不依赖于面部的细节特征,对于旋转、表情变化等情况都能适用,具有相对的稳定性并且和大多数背景物体的颜色相区别。
利用肤色分割检测人脸的方法,聚类紧凑.选用YCbCr空间易于实现聚类算法。
经分析可知满足二维高斯分布,则对于像素的色度C=[Cb Cr]T,肤色像素的概率分布如图4-2:
图4-2
对获得的每一帧的图像采用0.4 图4-3图4-4 将肤色图区域化形成肤色区域(如图4-5),以便在肤色区域进行下一步处理。 图4-5 4.1.2.AdaBoost算法 AdaBoost算法是一种迭代方法,它本身是通过改变数据分布来实现的。 它根据每轮训练中每个样本的分类是否正确,以及上轮的总体分类准确率,来确定每个样本的权值。 将每次训练得到的分类器融合起来,作为最后的决策分类器。 在AdaBoost算法中,每一个训练样本都被赋予一个权重,表明它被某个弱分类器选入训练集的概率。 如果某个样本没有被正确的分类,那么在构造下一个训练集时,它被选中的概率就会增加: 相反,如果某个样本已经被正确的分类,那么在构造下一个训练集时,它被选中的概率就会降低。 通过这样的方式,AdaBoost算法能够“聚焦于”那些较困难(更富信息)的样本上。 在具体的实现上,最初令每个样本的权重都相等,对于第t次迭代操作,就根据这些权重来选取样本点,进而训练分类器。 然后就根据这个分类器,来提高被它错分的那些样本点的权重,并降低被正确分类的样本权重。 然后,权重更新后的样本集被用来训练下一个分类器,整个训练过程如此循环下去。 AdaBoost算法具有很强的实用性,表现在: 1)算法的速度快;. 2)除了训练轮数T外,不需要调节任何参数; 3)不需要知道任何关于弱分类器的先验知识; 4)对弱分类器的性能要求不高,只需要比随机猜测性能稍好即可,这种弱分类器在实际情况下是很容易获得的,从而降低了算法的复杂度,提高了效率 5)在弱分类器的构成上可以兼容多种方法,这些弱分类器可以是神经网络,决策树,最近邻域分类器,经验规则等;. 6)训练数据可以是文本、数字、离散值等等,并且AdaBoost算法很容易被推广到多类目标的分类问题中去。 4.1.3.AdaBoost算法训练 Adaboost学习算法的学习过程,可以理解为“贪婪的特征选择过程”。 对一个问题,通过加权投票机制,用大量的分类函数的加权组合来判断。 算法的关键就是,当分类器对某些样本正确分类时,则减少这些样本的权值;当错误分类时,则增加这些样本的权值,让学习算法在后续的学习中集中对比较难的训练样本进行学习,最终得到一个识别准确率理想的分类器。 每个矩形特征对应一个弱分类器,利用AdaBoost算法生成强分类器的过程就是寻找那些对人脸和非人脸区分性最好的那些矩形特征,由这些特征所对应的弱分类器组合生成的强分类器对人脸的区分度达到最优。 训练过程的意义可以表述为: 每一次迭代过程在当前的概率分布上找到一个具有最小错误率的弱分类器,然后调整概率分布,增大当前弱分类器分类错误的样本的概率值,降低当前弱分类器分类正确的样本的概率值,以突出分类错误的样本,使下一次迭代更加针对本次的不正确分类,即针对更“困难”的样本,使得那些被错分的样本得到进一步重视。 这样,后面训练提取的若分类器就会更加强化对这些分类错误样本的训练。 通过AdaBoost算法生成了由重要特征组成的强分类器。 对于一个200特征的强分类器,可以将之用于人脸检测,但由于检测过程要扫描待检测图像的每个位置的各个规模的每个窗口,所以要检测的窗口数量很多,这种条件下,如果每个窗口都进行200个特征的特征值计算,检测工作的整个过程将花费很多的时间。 在实际的人脸检测过程中可以采用“先重后轻”的级联分类器的思想。 它首先使用更重要的特征构成的结构较简单的强分类器进行非人脸窗口的排除,随着特征的重要性的逐渐降低,分类器的数目越来越多,但同时待检测窗口也越来越少。 .PaulViola和MichaelJones于2001年提出了级联AdaBoost人脸检测方法,该方法采用一种“积分图”的图像表示方法,可以快速计算出haar-like特征,利用AdaBoost学习算法将由haar-like特征生成的简单分类器叠加成为强分类器,再将强分类器级联而成为分级分类器用于检测入脸,该方法可使图像的背景区域快速地丢弃,而在有可能存在人脸的区域花费更多的计算。 级联分类器结构如图4-6所示: 图4-6 “级联分类器”的每一“层”是一个由连续AdaBoost算法训练得到的强分类器。 设置每层的阈值,使得大多数人脸都能通过,在此基础上尽量抛弃负样本。 位置越靠后的层越复杂,即包含越多的弱分类器,因而也具有更强的分类能力。 这样做是因为非人脸样本通过的层数越多就越像人脸,因而越接近分类边界。 级联分类器就像一系列筛孔大小递减的筛子,每一步都能筛除一些前面筛子漏下的负样本,最终通过所有筛子的样本才被接受为人脸。 级联分类器串连的级数依赖于系统的错误率和响应速度。 前面的几层强分类器通常结构简单,通常一层仅由一到两个弱分类器组成,但这些结构简单的强分类器可以在早期达到近100%的检测率,同时误检率也很高,我们可以利用它们快速的筛选掉那些显然不是人脸的子窗口,从而大大减少需要后续处理的子窗口。 4.1.4.Haar-like生成简单分类器 直接利用haar-like特征构成的分类器称为简单分类器,简单分类器与矩形特征一一对应。 一般来说,简单分类器的性能比随机分类略好一些,它的优点是设计简单、计算量小、实时性强,但是分类能力弱。 对于Haar-llke特征而言,一个24*24的矩形区域,可能的特征达几万种,远远超过了24*24的象素的个数。 即使每个特征都可以快速的计算,整个计算过程也非常耗时。 在实际计算中,必须找到那些对于分类比较重要的特征,AdaBoost算法是选取这些特征的有效手段。 分类器训练完以后,就可以应用于输入图像中的感兴趣区域(与训练样本相同的尺寸)的检测。 检测到目标区域(汽车或人脸)分类器输出为1,否则输出为0。 为了检测整副图像,可以在图像中移动搜索窗口,检测每一个位置来确定可能的目标。 为了搜索不同大小的目标物体,分类器被设计为可以进行尺寸改变,这样比改变待检图像的尺寸大小更为有效。 所以,为了在图像中检测未知大小的目标物体,扫描程序通常需要用不同比例大小的搜索窗口对图片进行几次扫描。 分类器中的“级联”是指最终的分类器是由几个简单分类器级联组成。 在图像检测中,被检窗口依次通过每一级分类器,这样在前面几层的检测中大部分的候选区域就被排除了,全部通过每一级分类器检测的区域即为目标区域。 基础分类器是至少有两个叶结点的决策树分类器 4.2.训练自己的分类器 利用分类器识别人脸区域 通过训练人脸20X20的2000张正例和2000张反例图片,我们可以得到一个比较好的级联分类器。 分类器训练完以后,就可以应用于输入图像中的感兴趣区域的检测。 要训练一个Haar分类器,总体上包括3步: 1)准备正负样本;2)用CreateSamples程序建正样本集;3)用HaarTraining程序训练,得到最终的分类器模型(xml文件)。 图4-7 样本准备: HaarTraining需要使用正样本和负样本进行训练。 本训练选择2000张正样本,2000张负样本。 大小裁剪到20X20 样本训练的总体流程: 图4-8是HaarTraining训练的一个简单流程。 这个流程之所以是简单流程,因为只有当用户是要建一个简单的级联分类器时才是这么一个流程。 对于建树形强分类器,其流程比这个要复杂。 图4-8 4.3.识别人脸模块 为了提高系统对人眼检测的准确性,系统先定位人脸,再在定位到的人脸基础上定位人眼。 图4-9 系统先采用传统的肤色识别,定位速度很快,但是精确度不太高,为此,当采用肤色识别之后,便在小区域中进行模式识别,得到非常精确的人脸区域,若肤色识别得到的区域小于既定值,则说明肤色识别失败,得对全部区域进行模式识别,得到人脸区域。 为了检测整副图像,可以在图像中移动搜索窗口,检测每一个位置来确定可能的目标。 为了搜索不同大小的目标物体,分类器被设计为可以进行尺寸改变。 为了在图像中检测未知大小的目标物体,扫描程序通常需要用不同比例大小的搜索窗口对图片进行几次扫描。 检测人脸需要对单通道的图像进行模式识别,而此时传过来的肤色区域是三通道RGB图像。 因此在进行人脸检测的之前我们必须进行图像预处理。 三通道图像到单通道图像的转换公式如下: Y=0.299R+0.587G+0.114B; 同时单通道的亮度信息可能会对检测过程造成很大的影响,预处理过程还需对单通道图像均衡化。 均衡化效果如下: 图4-10图4-11 由于人脸区域的大小未知,需要程序按照1.3比例对传进来的肤色区域图像缩放后扫描几次,最终得到的是肤色区域中是否还有人脸区域,有的话返回的是人脸区域的相关信息,包括人脸区域的大小,位置信息。 4.4.定位人眼模块 检测人眼区域和检测人脸区域差不多,通过训练人脸20X20的2000张正例和2000张反例图片,我们得到一个比较好的级联分类器。 分类器训练完以后,就可以应用于输入图像中的感兴趣区域的检测。 由于人脸大小未知,可能传过来的感兴趣区域比较小,导致检测程序检测不到人眼区域。 利用Gaussian金字塔分解对人脸区域图像向上采样。 首先通过在图像中插入偶数行和偶数列,然后对得到的图像用指定的指定的滤波器进行高斯卷积,其中滤波器乘以4做插值。 所以输出的图像为原输入人脸区域的4倍大小。 效果如图4-12和图4-13: 图4-12图4-13 得到了上采样之后的图像,利用和之前人脸区域检测相同的算法,只是人眼区域检测的级联器有所不同而已。 第五章参数计算模块 5.1.计算人眼面积模块 计算人眼面积是得到perclos值的前提,为了得到尽可能准确的人眼面积,有必要对图像进行一些列的处理。 在该系统中,计算人眼面积的流程如图5-1: 图5-1 先计算出得到的人眼面积区域图像的空间和中心矩,并提取出x一阶矩M10和y一阶矩M01;然后再计算出图像的重心,并根据重心的位置估计出人眼的区域,再画出人眼区域图像的轮廓,经过腐蚀,就可以计算出人眼的面积了。 当经过一定的时间处理后,得到人眼面积系列,其波形如图5-2: 图5-2 在该波形中,纵轴表示人眼面积,横轴表示时间;包含了一定量的噪声;但在眨眼时,人眼面积最小,在波形中以波谷形式存在,而在波形中出现频数最多的,应该是人眼处于平常睁开状态。 5.2.perclos值计算 1996年,美国Knipling,Wang和Kanianthra[5]等人测量开闭、运动和眼睛的生理学表现形态来研究机动车驾驶员的疲劳问题。 他们认为利用眼睛来判断疲劳是非常恰当的,并且也是行之有效的方法。 Dinges认为,PERCLOS(单位时间内眼睛闭合时间所占的百分率)能相当准确地反映疲劳状态。 1999年4月,美国联邦公路管理局(FederalHighwayAdministration)10%[2]。 的技术论坛上发表题为“OcularMeasuresofDriv-erAlertness”的文章,首先提出了把PERCLOS作为预测机动车驾驶员驾驶疲劳的可行方法。 JohnStern博士是研究眼睛部位运动状态与驾驶疲劳之间的关系的权威人士。 由他领导的美国联邦公路管理局和汽车联合会资助的研究所,通过开发专用的照相机、脑电图仪和其他仪器来精确测量眼睛瞳孔的直径变化、眨眼频率和头部运动,以此来研究驾驶疲劳问题。 弗吉尼亚大学[8]的精神生理学教授WaltWierwille博士提出的疲劳测量(psychoph-ysiologicalfatiguedetectiondevicesandmeasures)方法是采用PERCLOS作为疲劳测量指标。 目前,PERCLOS方法已被公认为最有效的、车载的、实时的驾驶疲劳测评方法。 5.2.1.perclos的原理或概念 PERCLOS是PercentageofEyelidClosureOverthePupilOverTime的缩写,即: 眼睛闭合时间占某一特定时间的百分率。 如图1,只要测出t1~t4的值,就可计算出PERCLOS的值。 公式为: 其中t1是眼睛最大瞳孔闭合到80%瞳孔所用时间;t2是眼睛80%瞳孔闭合到20%瞳孔所用时间;t3是眼睛20%瞳孔闭合到20%瞳孔睁开所用时间;t4是眼睛20%瞳孔睁开到80%瞳孔所用时间;f为眼睛闭合时间占某一特定时间的百分率,即为PERCLOS值。 图5-3 在具体试验中有P70、P80、EYEMEA(EM)3种度量标准。 P70: 眼睛闭合面积70%以上的时间百分比;P80: 眼睛闭合面积80%以上的时间百分比,该指标是最常用的; 5.2.2.我们计算perclos的方法 当得到人眼的面积时,一方面,系统通过一定的方法将其显示在人眼面积波形上(如图1), 图5-4 另一方面,系统会将该面积记录在缓存中,当缓存中数据记录满300个时,便进行频数统计,将面积在4000-11500间的数据间隔500进行统计,如下: 图5-5 由于采集过程中存在噪声,取频数最大的面积为人眼的最大面积,再对大于最大面积80%、小于最大面积20%的记录分别进行统计,设为大于最大面积80%的频数为N1,小于最大面积20%的频数为N2;频数总和为N,则 这样,通过对300个人眼面积进行统计,减小了由于噪声等造成的误差,使得计算出来的结果更为科学,为了进一步减小误差,可取五个perclos值进行平均,并将这个平均值作为perclos值,通过对这个perclos值的判断,若perclos值>0.15,则被测试人已经处于疲劳状态,系统便会进行一些相关处理,如提醒等。 第六章线程管理模块 在系统中,读取视频,显示视频模块均采用的是无限循环策略,若是直接放在主线程,则整个应用程序就会出现假死,对所有的系统操作都失效,为此,我们采用了多线程的策略,将读取视频放在了一个新线程中,同时,为了提高系统处理视频的速度,我们为图像处理,人眼面积的记录、perclos值的计算分别开了一个新线程。 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。 这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,一般线程进行通讯有两种方式: 1、使用全局变量进行通信,2、使用自定义消息进行通讯。 使用全局变量进行通讯,对于传递数据量超大的图像信息不太实用,为此,我们选用了第二种方法,在一个线程的执行函数中向另一个线程发送自定义的消息来达到通信的目的。 一个线程向另外一个线程发送消息是通过操作系统实现的。 利用Windows操作系统的消息驱动机制,当一个线程发出一条消息时,操作系统首先接收到该消息,然后把该消息转发给目标线程,但是接收消息的线程必须已经建立了消息循环,为此,我们在程序设计时,为每个线程建立一个私有的消息循环: while(PeekMessage(&message,NULL,0,0,PM_REMOVE)) { if(message.message==WM_USER_QUIT) { //quit return0; } TranslateMessage(&message); DispatchMessage(&message); } //... 通过为每个线程添加消息循环,线程间通信便变得非常简单,仅仅需要 pRecordThread->PostThreadMessageA(WM_USER_NEWPARAMETER,(int)param,NULL)便可发送向pRecordThread指针指向的线程发送一个WM_USER_NEWPARA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 图像 处理 疲劳 检测 系统 论文