点击以下链接获取源码:
https://download.csdn.net/download/qq_64505944/88421622?spm=1001.2014.3001.5503
基于深度学习的驾驶员疲劳监测系统的设计与实现
1 绪论
在21世纪,各国的经济飞速发展,人民越来越富裕,道路上的汽车也逐年增多,根据交通管理局的相关统计,到2022年,我国的汽车保有量已经高达3.02亿辆。在给人们带来生活便利的同时,交通事故发生的频率也在随着汽车保有量的升高而逐年攀升,这给交通安全带来了非常严峻的挑战。尤其对于出租车、公交车等公共交通,一旦发生意外,后果是非常严重的。我国由于发生交通事故而死亡的人数一直位于世界前列,交通安全问题受到越来越多学者的关注。
交通事故是由驾驶员、道路条件、汽车损坏等多重因素导致的,但大部分交通事故的缘由是驾驶员的不安全行为。驾驶员的不安全行为有疲劳驾驶、疲劳驾驶、酒后驾驶等,都会在一定程度上导致交通事故的发生。早期的研究主要集中在研究驾驶员疲劳驾驶方向,而实际上疲劳驾驶更为常见。根据美国印第安纳大学的相关调研数据,有高达90%的交通事故均与驾驶员的行为有密切的联系,是由驾驶员的不当操作引发的,疲劳驾驶成为导致交通事故的最大“杀手”。根据交通管理局相关研究表明,我国每年发生约200万起的交通事故,这其中由于驾驶员疲劳驾驶而导致的交通事故占据了高达80%的比。
根据国际标准化组织( ISO )的定义,疲劳驾驶指的是驾驶员在驾驶时,将自身注意力分散的指向与正常驾驶不相干的行为,如瞌睡点头、打哈欠、向后座拿东西等行为,疲劳驾驶是一个常见的并极其危险的行为。有研究表明,边开车边打电话,交通事故发生的几率会增加4倍;边开车边喝水,增加1.5倍;开车与旁人交谈,增加0.6倍;当驾驶员注视其他目标超过2秒时,交通事故发生的几率也会增加3倍以。从这些数据来看,疲劳驾驶是不可忽视的安全性问题,如果能够对驾驶员的危险行为进行实时准确的检测并提醒,就可以在源头上降低交通事故发生的几率,这是社会强烈的需求。但是目前,在驾驶员疲劳行为识别方面,得到实际广泛应用的产品暂时还没有出现。
随着二十一世纪以来计算机科学的飞速发展,计算机在计算能力方面已经远远超越十年前,并且信息交流趋向全球化,数据可以通过各种各样的渠道采集,数据集不再是问题,深度学习发展速度飞快,出现了很多效果优秀的卷积神经网络模型)。如dlib库里面的深度残差网络ResNet已经可以有很高准确率的识别了
本文就驾驶员疲劳行为识别进行研究,将深度学习技术应用到疲劳驾驶研究领域中,在一定程度上,对开展疲劳驾驶识别领域具有一定的意义。
1.1 驾驶员疲劳监测系统发展现状
在多年来,关于驾驶员异常行为的识别一直是一个比较热门的研究方向,早期主要集中在研究驾驶员疲劳驾驶方向。近几年,国内外关于驾驶员异常疲劳行为的识别研究逐渐增多。
研究人员对于驾驶员疲劳行为识别大致分为三类,基于生理数据、基于行驶车辆数据以及驾驶员行为数据。早期的研究人员利用人体生理数据来检测驾驶员的疲劳程度,如心电图、脑电图等,这类方法需要让驾驶员在身上时刻戴生理特征传感器,带来极大的不便;另一类研究人员利用行驶车辆数据来检测驾驶员的疲劳行为,如行驶速度、方向盘运动等,这类方法检测速度不够快,不适用于实时的检测疲劳行为;随着深度学习、计算机视觉I20等技术领域的兴起,越来越多的学者开始利用驾驶员行为数据进行疲劳行为的检测。
1.2 设计内容及问题
本系统主要是使用Python的opencv和dlib库函数,实现驾驶员疲劳监测系统的各种信息的采集与功能的实现,通过各种脸部,眼球坐标收集而来的信息来进行计算,通过计算出的前后数据对比即可判定驾驶员是否疲劳
本系统达到的目标如下:
(1)打哈欠监测模块:嘴巴张大且相对较长时间保持这一状态,记录一次。
(2)眨眼监测模块:眼睛微闭,此时眨眼次数增多,且眨眼速度变慢,记录一次。
(3)点头监测模块:瞌睡点头,记录一次。
(4)可视化界面模块:拥有参数调整功能,和疲劳类型的检查以及脱岗监测。
2 系统需求分析与结构
2.1 驾驶员疲劳监测系统的需求分析
2.1.1 需求概论
近针对危险驾驶行为所导致的大量交通事故问题,世界各国已出台一系列法律法规来进行应对。但执法难、取证难、监管人力成本高使得危险驾驶行为难以杜绝。如果能从技术上对开车时的疲劳行为进行有效的监测,确保行为发生后能够及时发现与矫正,不仅能减少危险驾驶监管成本,还能大大降低交通事故发生概率。由于危险驾驶行为的危险性和高发性,国内外学者提出了多种驾驶行为监测技术方案,基于行车数据的驾驶行为监测需在车内安装传感器设备,由于传感器成本高,且该方法易受到道路环境的影响,所以很难投入到实际应用;基于驾驶员生理信号的驾驶行为监测需将生理信号提取设备戴到驾驶员身体上,除了设备本身存在价格昂贵、体积大的缺点外,还会影响驾驶员的驾驶操作,实用性较差。我们的目的就是寻找驾驶员疲劳检测系统成本更低的可行方案
2.1.2 用户需求
驾驶员疲劳监测系统是一个针对大多数普通人的开车安全保障,杜绝疲劳,杜绝疲劳。了解和分析大多数普通人的驾车习惯,需要实现系统的识别率高,制作成本低,购买价格低。系统要实现信息的采集,如人脸坐标、人眼坐标、嘴巴坐标,通过计算判断驾驶员是否疲劳。
根据分析,系统需满足一下用户需求:
(1)考虑到使用驾驶员疲劳监测系统的用户可能会是消费观念的人,购买汽车成本有限,需要降低使用的门槛,驾驶员疲劳监测系统控制需要准确率高便宜耐用,所有驾驶员的汽车都能普及。
(2)驾驶员疲劳监测系统需要有眨眼检测模块,打哈欠检测模块,瞌睡点头模块,可视化界面模块这四大功能模块。
(3)驾驶员疲劳监测系统需要长时间的开启,整个系统的功耗和稳定性要到达足够的水平。
(4)驾驶员疲劳监测系统需要直观的显示驾驶员的状态信息。
2.1.3 功能需求
通过对用户需求的分析,确定了本个系统功能由驾驶员眨眼检测模块,打哈欠监测功能模块,瞌睡点头功能模块总共三大功能模块组成。以下是各功能模块实现的具体功能:
(1)驾驶员眨眼检测模块功能需求:读取位置、瞳孔朝向、眼睛开合度、眨眼频率、瞳孔收缩率等数据,通过计算,如果超过疲劳标准连续3帧内,眼睛长宽比为 0.2,就认定为疲劳。
(2)打哈欠监测功能需求:嘴巴张大且相对较长时间保持这一状态,如果超过疲劳标准连续3帧内,嘴部长宽比为 0.5,就认定为疲劳。
(3)瞌睡点头功能模块的功能需求:采集人脸朝向数据,如果超过疲劳标准连续3帧内,pitch(x)旋转角为 0.3,就认定为疲劳。
2.2 驾驶员疲劳监测系统的可行性分析
可行性分析是通过对Python第三方库opencv和dlib库的整体函数和相关信息,从技术、经济、工程等方面进行整体的一个分析以及调查,进而提供一个综合性的系统的分析方法,为项目决策做准备。提出有关于驾驶员疲劳监测系统这个项目的投资价值和构建该项目的意见,可行性分析应具有前瞻性、公平性、稳定性、科学性的特点。
2.2.1 社会需求可行性分析
迄今为止,已经有越来越多的汽车搭载驾驶员疲劳监测系统,让人们的出行安全进一步的到保障,距离驾驶员疲劳监测系统的初次出现已经过去了很多年。世界上首个驾驶员疲劳监测系统的问世以来。世界各国都开始发展驾驶员疲劳监测系统。随着集成技术以及互联网技术的持续突破,驾驶员疲劳监测系统正式走进消费级市场,越来越低的价格也吸引了众多的消费者购买和使用搭载驾驶员疲劳监测系统的汽车。在国内,消费级的智能家居控制系统产品市场已经变得十分火热。各大科技厂商的入场,互联网上的有关辅助驾驶的信息的传递,以及汽车的普及都使得驾驶员疲劳监测系统跟越来越多的人有接触。越来越多的消费者都体验到了驾驶员疲劳监测系统带来的对安全的提升。社会对驾驶员疲劳监测系统的接受程度也大大的加强,驾驶员疲劳监测系统市场目前来说还没有饱和,还有发展空间。
2.2.2 系统技术可行性分析
驾驶员疲劳监测系统的软件部分主要使用的是Python,里面拥有大量的优秀的第三方库函数可以利用,如本次使用的主要是opencv和dlib库函数。Python有着方便快捷、学习成本低的优点,通过各种第三方的扩展库可以实现各种功能。
驾驶员疲劳监测系统主要使用的环境如下:Win11、Python3.9解释器、anaconda3、JupyterNotebook 技术
Opencv:图像处理
Dlib:一个很经典的用于图像处理的开源库,shape_predictor_68_face_landmarks.dat是一个用于人脸68个关键点检测的dat模型库,使用这个模型库可以很方便地进行人脸检测,并进行简单的应用。
Numpy:基于Python的n维数值计算扩展。
Imutils :一系列使得opencv 便利的功能,包括图像旋转、缩放、平移,骨架化、边缘检测、显示
matplotlib 图像(imutils.opencv2matplotlib(image)。
wx:python界面工具
2.3 驾驶员疲劳监测系统的结构
系统的总设计方案如下:
图2.1 系统设计结构图
3 驾驶员疲劳监测系统的设计
3.1 系统的开发环境
开发环境:Win11、Python3.6、anaconda3、JupyterNotebook 技术:
Opencv:图像处理
Dlib:一个很经典的用于图像处理的开源库,shape_predictor_68_face_landmarks.dat是一个用于人脸68个关键点检测的dat模型库,使用这个模型库可以很方便地进行人脸检测,并进行简单的应用。
Numpy:基于Python的n维数值计算扩展。
Imutils :一系列使得opencv 便利的功能,包括图像旋转、缩放、平移,骨架化、边缘检测、显示
matplotlib 图像(imutils.opencv2matplotlib(image)。
wx:python界面工具
3.2 系统功能的设计
本系统能够通过打哈欠(嘴巴张大且相对较长时间保持这一状态)、眨眼(或眼睛微闭,此时眨眼次数增多,且眨眼速度变慢)、点头(瞌睡点头)。本实验从人脸朝向、位置、瞳孔朝向、眼睛开合度、眨眼频率、瞳孔收缩率等数据入手,并通过这些数据,实时地计算出驾驶员的注意力集中程度,分析驾驶员是否疲劳驾驶和及时作出安全提示。
3.2.1 眨眼监测功能的设计
本功能能够收集眼部各种信息并作出是否疲劳的判断,功能图如图3.1所示
图3.1 眨眼监测功能功能图
眨眼监测功能的主要代码是eye.py,通过摄像头采集到的眼球坐标数据并进行一些预算判断是否疲劳
如果在连续3帧内,眼睛长宽比超过 0.2就可以认定为疲劳了
图3.2 眼球坐标的处理
眨眼的判定条件
图3.3 眨眼判定条件
图3.4眨眼计数
3.2.2 打哈欠监测功能的设计
基于dlib人脸识别68特征点检测、获取嘴部面部标志的索引,通过opencv对视频流进行灰度化处理,检测出人嘴的位置信息。
人脸特征点检测用到了dlib,dlib有两个关键函数:dlib.get_frontal_face_detector()和dlib.shape_predictor(predictor_path)。
前者是内置的人脸检测算法,使用HOG pyramid,检测人脸区域的界限(bounds)。
后者是用来检测一个区域内的特征点,并输出这些特征点的坐标,它需要一个预先训练好的模型(通过文件路径的方法传入),才能正常工作。
使用开源模型shape_predictor_68_face_landmarks.dat,可以得到68个特征点位置的坐标,连起来后,可以有如图所示的效果(红色是HOG pyramid检测的结果,绿色是shape_predictor的结果,仅把同一个器官的特征点连线)
嘴巴张大且相对较长时间保持这一状态就会被认定为疲劳。
图3.5 打哈欠监测功能功能图
思路:双阈值法哈欠检测——即对内轮廓进行检测:结合张口度与张口时间。
Yawn为符合打哈欠的帧数,N为1min内总帧数,设阈值为10%,当Freq>10%时认为打了一个深度哈欠或者至少连续两个浅哈欠,此时给出疲劳提醒,关键代码如图3.6所示。
图3.6 嘴巴坐标数据处理代码图
计算嘴巴的开合度和次数运行效果如图3.7
图3.7 打哈欠监测的运行图
3.2.3 瞌睡点头功能的设计
如何确定疲劳思路一:可利用姿态估计结果(如Pitch的读数)来判断是否点头及点头幅度
如何确定疲劳思路二:或用鼻尖处30号点的前后移动值(或是方差,方差表示一个单位时间数据的偏离程度,程度越大,则表示发生点头动作的概率越大、点头幅度越大)代码图如3.9所示。
图3.9 设计思路代码图
欧拉角也是非常适合来检测是否点头的函数,在本文中也应用了这种技术。核心代码如图3.10所示。
图3.10 点头欧拉角核心代码图
图3.11 运行结果图
3.2.4 可视化界面的设计
本功能主要是由wxFormBuilder编辑的,主要结构图如图3.12所示。
图3.12 主要结构图
图3.13 主要界面图
设计思路眨眼监测,打哈欠监测,瞌睡点头监测是并行的,多线程同时运行,以确保每个环节都不出错
3.14多线程代码图
在本次测试中除了认定为眨眼,打哈欠,瞌睡点头等标准之外,我还设定了在这些行为达到多少次就会认定为疲劳驾驶,确定疲劳提示:眨眼50次,打哈欠5次,瞌睡点头8次
图3.15认定标准图
4 系统测试
4.1 测试内容
4.1.1 软件部分测试
打开摄像头测试能否检测或识别到上述所述功能。测试用例如下:
眨眼测试
打哈欠测试
瞌睡点头测试
视频识别测试
4.2 测试结果
本次测试测试了系统的所有功能,目前系统通过了本次测试的所有测试,表明系统目前可以稳定正常的运行。
5 总结与改进
5.1驾驶员疲劳监测系统总结
本设计利用已有的计算机视觉库可以实现很多好玩和有用的应用,本文只是粗略地展示了一个进行实时人脸识别的dlib,还有很多可以改善的点来提高精度和效率,比如人脸受角度、表情影响很大,或者需要处理速度要求更高的场景;同时图像类别规模很大的情况下如何保证效果,如何优化这些都是难点。另外dlib中的提供的这些模型都是已经训练好的,我们可以到官方demo下载,demo给出了在一些benchmark中的效果,也可以自己训练得到这些模型,当然前提是你需要有GPU,并且要求很大量的数据以及丰富的调参经验,这些也都是深度学习中的点。
参考文献
学习记录参考:
cungudafa博客:Dlib模型之驾驶员疲劳检测系列(眨眼、打哈欠、瞌睡点头、可视化界面)
https://blog.csdn.net/cungudafa/article/details/103477960
https://blog.csdn.net/cungudafa/article/details/103496881
https://blog.csdn.net/cungudafa/article/details/103499230
谢 辞
光阴似箭,日月如梭。伴随着专业综合实训论文初稿的完成,大学最后一个作品专业综合实训也到达了尾声。
在此,我要首先感谢北京理工大学珠海学院全体老师在大学里对我的教导与栽培,感谢计算机学院所有的老师在大学来对学生的付出。老师们不仅教会我书里面的知识,还有教了我很多书里学不到的东西,教会了我如何一个人钻研学习,教会了我学会一个人思考,还教会我社会不是单打独斗,还要学会团队合作才能成为一个被社会需要的人。我还要感谢我的父母和同学朋友,他们每次都在我最需要帮助的时候给我鼓励与支持,帮我度过一个个难关。
本实训设计是由胡敬朋老师的悉心教导下完成的。从选题,到开题报告再到完成实训论文,这整个过程中都是胡敬朋老师在耐心的指导我完成。碰到不懂的技术问题,胡敬朋老师也仔细的给我讲解。我从胡敬朋老师感受到了对技术的认真和对教育事业的热情,从中我也学到了很多,胡老师的严格要求也让我努力成为更好的自己。
大学的青春是人生最美好的时间,希望多年以后会想起这段时间,只有美好的回忆。
附 录
附录1 eye.PY的代码
main.py代码