道路千万条,安全第一条!疲劳驾驶可谓交通事故几大罪魁祸首之一,根据美国一项研究显示,司机睡眠不足4小时,交通事故肇事几率等同于醉驾。

为了减少疲劳驾驶现象,驾驶员疲劳检测应运而生。这是一项安全技术,可以预防驾驶员在驾驶过程中因疲劳而导致的安全事故。

该Python中级项目的目的是建立一个驾驶员疲劳检测系统,用于检测人眼闭合时长。当检测到驾驶员疲劳驾驶时,该系统将发出警告。

驾驶员疲劳检测系统

本Python项目将使用OpenCV收集来自网络摄像头的图像,将其输入到“深度学习”模型中,由该模型对人眼按“睁开”或“闭合”进行分类。该Python项目将采取的方法如下:

第1步-从相机中获取图像作为输入。

第2步-检测图像中的脸部并创建一个感兴趣区(ROI)。

第3步-从ROI中检测人眼并将其输入分类器。

第4步-分类器将按睁开或闭合对人眼进行分类。

第5步-计算分数判断驾驶员是否处于疲劳状态。

在学习先决条件、数据集和模型结构前,如果您是新手,建议您参考Python MasterSheet先了解Python编程语言所需的一切概念。

先决条件

该Python项目需要一个网络摄像头,用于捕获图像。您需要在系统上安装Python(建议使用3.6版),然后使用pip安装所需的软件包。

· OpenCV – 使用pip安装opencv-python(面部和眼部检测)。

· TensorFlow – 使用pip安装tensorflow(keras使用TensorFlow作为后端)。

· Keras – 使用pip安装keras(建立分类模型)。

· Pygame – 使用pip安装pygame(播放警告提示音)。

数据集

需要创建用于此模型的数据集。为创建数据集,我们编写了一个脚本来捕获摄像机中的人眼图像并将其存储在本地磁盘中,将人眼图像分为“睁开”或“闭合”状态两类,通过删除构建模型不需要的图像来手动清理数据。

数据包括大约7000张在不同光照条件下的人眼图像。在数据集上训练模型后,我们附加了最终权重和模型结构文件“models /cnnCat2.h5”。现在,你可以使用此模型按人眼睁开还是闭合对图像进行分类。

模型结构

我们使用的模型是Keras通过卷积神经网络(CNN)构建的。卷积神经网络是一种特殊类型的深度神经网络,在图像分类方面表现非常出色。

CNN基本上由一个输入层、一个输出层和一个可以包含多个层的隐藏层组成。通过过滤器在这些层上执行卷积运算,该滤波器在层和过滤器上执行2D矩阵乘法。

CNN模型结构包括以下几层:

· 卷积层;32个节点,内核大小为3

· 卷积层;32个节点,内核大小为3

· 卷积层;64个节点,内核大小为3

· 完全连接层;128个节点

最后一层也是具有2个节点的完全连接层。在所有层中,除了使用Softmax的输出层外,均使用Relu激活函数。

Python项目进行驾驶员疲劳检测的步骤

从zip下载python项目源代码并提取系统中的文件:Python项目Zip文件。

zip的目录为:

1.“haar级联文件/ cascade files”文件夹包含从图像中检测对象所需的xml文件。在本案例中,需要检测人脸和人眼。

2.模型文件夹包含我们的模型文件“cnnCat2.h5”,该文件是在卷积神经网络上进行训练的。

3.我们有一段音频“alarm.wav”,用于在驾驶员昏昏欲睡时播放。

4.“Model.py”文件包含一个程序,通过该程序对数据集进行训练来构建分类模型。您可以从此文件中了解卷积神经网络的执行情况。

5.“Drowsinessdetection.py”是本项目的主要文件。开始检测时,我们必须要运行此文件。

接下来。让我们逐步了解该算法是怎么工作的。

第1步-从相机中获取图像作为输入

使用网络摄像头获取图像作为输入。为了访问网络摄像头,我们进行了无限循环以捕获每一帧。我们使用OpenCV提供的方法cv2.VideoCapture(0)来访问摄像机并设置捕获对象(cap)。cap.read()将读取每一帧,并将图像存储在帧变量中。

第2步-检测图像中的脸部并创建一个感兴趣区(ROI)

为了检测图像中的人脸,首先需要将图像模式转换为灰度,因为用于对象检测的OpenCV算法需要输入灰度图像。因此无需颜色信息即可检测物体。

我们将使用haar级联分类器来检测人脸。通过face =cv2.CascadeClassifier( 抵达haar级联xml文件的路径 )设置分类器,然后使用faces =face.detectMultiScale(gray)执行检测。进而产生带有x、y坐标以及高度(对象边界框的宽度)的检测数组。现在我们可以迭代这些脸并为每张人脸绘制边界框。

for (x,y,w,h)in faces:cv2.rectangle(frame,(x,y), (x+w, y+h), (100,100,100), 1 )

第3步-从ROI中检测人眼并将其输入分类器

检测人脸的过程也同样适用于检测人眼。

首先,我们分别在leye和reye中为眼睛设置级联分类器,然后使用left_eye =leye.detectMultiScale(gray)来检测人眼。现在,我们只需要从完整图像中提取出人眼数据即可。这可以通过提取眼睛的边界框来实现,然后可以使用此代码从帧中提取眼睛图像。

l_eye =frame[ y : y+h, x : x+w ]

l_eye仅包含左眼的图像数据。这将被输入到CNN分类器中,该分类器将预测眼睛是处于睁开还是闭合状态。同样,我们将右眼的数据提取到r_eye中。

第4步-分类器将按睁开或闭合对眼睛进行分类。

使用CNN分类器预测眼睛状态。因为模型需要从正确的维度开始,因此将图像输入模型之前需要执行一些操作。

首先,使用r_eye = cv2.cvtColor(r_eye,cv2.COLOR_BGR2GRAY)将彩色图像转换为灰度图像。

然后,由于模型是在24 * 24像素的图像上测试,需要将图像也调整为24 * 24像素:cv2.resize(r_eye,(24,24))。我们将数据标准化以实现更好的收敛性:r_eye = r_eye/ 255(所有值都在0-1之间)。扩展维度以输入到分类器中。使用model = load_model(‘models / cnnCat2.h5’)来加载模型。

现在我们用模型预测每只眼睛的状态:lpred =model.predict_classes(l_eye)。如果lpred [0]= 1,则说明眼睛是睁开的;如果lpred [0]= 0,则说明眼睛是闭合的。

第5步-计算分数判断驾驶员是否处于疲劳状态

分数基本上是一个值,用于确定驾驶员闭眼的时长。因此,如果双眼都闭合,得分将不断增加,而双眼睁开时,得分将降低。使用cv2.putText()函数在屏幕上绘制结果,该函数将显示驾驶员的实时状态。

cv2.putText(frame,“Open”, (10, height-20), font, 1, (255,255,255), 1, cv2.LINE_AA )

阈值由以下方法确定:例如,如果得分大于15意味着该驾驶员闭眼时间较长,则阈值为15。此时,我们将使用sound.play()发出警报。

主要文件的源代码如下:

Python项目示例

开始项目,查看项目运作情况。要启动该项目,需要打开命令提示符,转到主文件“ drowsinessdetection.py”所在的目录。使用如下命令运行脚本。

python“drowsiness detection.py”

可能需要几秒钟来打开网络摄像头并开始检测。

示例截图:

输出截图:

1.闭眼检测

2. 睁眼检测

3. 疲劳警告

此Python项目构建了一个驾驶员疲劳警报系统,你可以通过多种方式实施该系统。我们通过Haar级联分类器,使用OpenCV检测人脸和人眼,然后根据CNN模型预测状态。

规范驾驶哪家强?Python安全员帮你忙。为了自己和他人的生命安全,请不要疲劳驾驶!

如果你处于想学Python或者正在学习Python,Python的教程不少了吧,但是是最新的吗?说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020最新的Python教程。获取方式,私信小编 “ 资料 ”,即可免费获取哦!

疲劳驾驶打瞌睡?python保障您的驾驶安全的更多相关文章

  1. python 保障系统(一)

    python  保障系统 from django.shortcuts import render,redirect,HttpResponse from app01 import models from ...

  2. 【OpenCV-ANN神经网络自动驾驶】树莓派OpenCV神经网络自动驾驶小车【源码+实物】

    没错!这个是我的毕业设计!!! 整个电子信息学院唯一一个优秀毕业设计 拿到这里炫耀了 实物如下: 电脑端显示效果: 自动驾驶实现过程: 1. 收集图像数据.建立局域网,让主机和Raspberry Pi ...

  3. 自动驾驶缺人才?听听David Silver怎么说!

    如今自动驾驶在全球范围内的发展势头愈发“凶猛”,该领域人才也一度被视为“香饽饽”. 即使在美国,自动驾驶工程师的起薪也已经突破了25万美元,我国‘“开价”之高更是令人咋舌. 人才.人才.还是人才!重要 ...

  4. Google Waymo 2017自动驾驶安全技术报告(一)

    2017年10月Google Waymo向美国交通部提交了一份43页的安全报告,报告中详细说明了Waymo如何装备和训练自动驾驶车辆,从而避免驾驶中的一般和意外情况发生.这份报告对Waymo的自动驾驶 ...

  5. 华为MDC自动驾驶

    华为MDC自动驾驶 智能驾驶汽车中,包含四个核心子系统:传感器.计算平台.执行器与应用算法,华为MDC( Mobile Data Center: 移动数据中心)定位为智能驾驶的计算平台.此平台集成了华 ...

  6. 智能驾驶L2发展策略

    智能驾驶L2发展策略 智能驾驶L2,以们通俗的定义是,以高级辅助驾驶的产品为主的各种巡航产品,包括定速巡航,自适应巡航ACC,预见性巡航,智能巡航等等. 车辆驾驶是集注意力高度集中,手把控方向盘和换挡 ...

  7. NXP开源自动驾驶计算平台Bluebox 打造现实无人汽车

    知名半导体制造商恩智浦NXP已经准备好了自家的自动驾驶计算开源平台Bluebox,将为汽车制造商提供现成的一体化自动 驾驶计算解决方案.专为自动驾驶设备的BlueBox中央计算引擎.不仅能够为无人驾驶 ...

  8. [原]JSBSim 自动驾驶(浅出)

    jsbsim的脚本文件分为几大类: 1.系统脚本: systems  包含通用飞机各部分功能模块组件以及自动飞行控件:Autopilot.xml  和 自动飞行的算法控件:GNCUtilities.x ...

  9. 线控性能比拼,MKZ与CRV作为自动驾驶开发平台的全面测评

    全球自动驾驶创业公司最主流的测试开发用车是林肯MKZ,这是因为其高性能高精度的线控能力表现,易于使用逆向工程实现改装,以及存在成熟的线控改造服务提供商AS和Dataspeed,共同为自动驾驶初创及辅助 ...

随机推荐

  1. python浅学【网络服务中间件】之Redis

    一.关于NoSQL: NoSQL(NoSQL = Not Only SQL ),"不仅仅是SQL". 相比MySQL等关系型数据库,NoSQL为非关系型的数据存储 Nosql中比较 ...

  2. 从字节码来分析,i++与++i区别

    ++/-- 是一种特殊的算术运算符,在算术运算符中需要两个操作数来进行运算,而自增自减运算符是一个操作数 前缀自增(++a):先进行自增运算,再进行表达式运算: 后缀自增(a++):先进行表达式运算, ...

  3. 带有路径压缩和rank优化的并查集实现

    public class unionfind2 implements UF { int[] parent; int[] rank; public unionfind2(int n) { parent= ...

  4. Xmind8 Pro破解版

    思维导图又叫心智导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具.思维导图运用图文并重的技巧,把各级主题的关系用相互隶属与相关的层级图表现出来,把主题关键词与图像. ...

  5. 解决使用requests_html模块,html.render()下载chromium报错、速度慢问题

    来源:https://www.cnblogs.com/xiaoaiyiwan/p/10776493.html 稍作修改 1.第一步,代码如下: from requests_html import HT ...

  6. 移动深度学习 Mobile-deep-learning(MDL)

    Free and open source mobile deep learning framework, deploying by Baidu. This research aims at simpl ...

  7. 分布式配置中心Apollo

    1,什么是分布式配置中心 项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的分布式注册中心,能做 ...

  8. 一款基于SVM算法的分布式法律助手

    一. 项目简介 与 使用说明 体验网站(适配手机端): http://www.zhuchangwu.com 项目基于 Spring Cloud .Vue 构建,平台针对需要维权的用户而设计,主要提供如 ...

  9. B 火车

    时间限制 : 10000 MS   空间限制 : 565536 KB 评测说明 : 1.5s,512m 问题描述 A 国有n 个城市,城市之间有一些双向道路相连,并且城市两两之间有唯一路径.现在有火车 ...

  10. error: cannot bind non-const lvalue reference of type

    这种问题一般是因为引用了匿名变量.涉及左值和右值的区别.一般函数的参数如果是一个表达式,那将会产生一个第3方的匿名变量传入这个函数中,此时如果引用,没用什么实际意义. c++中临时变量不能作为非con ...