睡意检测是一项安全技术,可以防止驾驶员在驾驶时入睡而导致的事故。
这个中间Python项目的目的是建立一个睡意检测系统,该系统将检测人的眼睛闭合几秒钟。 当检测到困倦时,该系统将警告驾驶员。
驾驶员嗜睡检测系统–关于项目
在此Python项目中,我们将使用OpenCV收集来自网络摄像头的图像,并将其输入到深度学习模型中,该模型将对人的眼睛是“睁开”还是“闭合”进行分类。 我们将用于此Python项目的方法如下:
步骤1 –将图像作为来自摄像机的输入。
第2步–检测图像中的人脸并创建关注区域(ROI)。
第3步–从ROI中检测眼睛并将其输入分类器。
步骤4 –分类器将对睁开或闭合的眼睛进行分类。
步骤5 –计算分数以检查该人是否困倦。
现在,在开始 先决条件,数据集和模型体系结构之前 ,如果您是新手,我建议您参考此 Python Master工作表 以学习Python编程语言的所有必要概念。
先决条件-
此Python项目的要求是一个网络摄像头,我们将通过该摄像头捕获图像。 您需要在系统上安装Python(建议使用3.6版),然后使用pip安装必需的软件包。
- OpenCV – pip安装opencv-python (面部和眼睛检测)。
- TensorFlow – pip安装tensorflow(keras使用TensorFlow作为后端)。
- Keras – pip安装keras(以建立我们的分类模型)。
- Pygame –点子安装pygame(播放警报声音)。
数据集-
用于此模型的数据集由我们创建。 为了创建数据集,我们
编写了一个脚本,可以捕获相机的眼睛并将其存储在本地
磁盘。 我们将它们分为各自的标签“打开”或
'关闭'。 通过删除不需要的图像手动清除了数据
这对于构建模型不是必需的。 数据包括
在不同的照明条件下,大约可以看到7000张人眼的图像。
在我们的数据集上训练模型后,我们将最终
权重和模型架构文件“ models / cnnCat2.h5”。
现在,您可以使用此模型对人眼睁开或闭眼进行分类。
模型架构-
我们使用的模型是通过Keras使用卷积神经网络(CNN)构建的。 卷积神经网络是一种特殊的深度神经网络,在图像分类方面表现非常出色。 CNN基本上由一个输入层,一个输出层和一个可以包含多个层的隐藏层组成。 使用在层和滤波器上执行2D矩阵乘法的滤波器对这些层执行卷积运算。
CNN模型架构包括以下几层:
- 卷积层; 32个节点,内核大小为3
- 卷积层; 32个节点,内核大小为3
- 卷积层; 64个节点,内核大小3
- 全连接层; 128个节点
最后一层也是具有2个节点的完全连接的层。 在所有
层,除了在输出层中使用Relu激活功能
我们使用Softmax。
Python项目执行驾驶员嗜睡检测步骤
从zip下载Python项目源代码,然后将文件提取到系统中: Python Project Zip File
压缩文件的内容为:
- “ haar级联文件”文件夹包含从图像中检测对象所需的xml文件。 在我们的案例中,我们正在检测人的脸部和眼睛。
- models文件夹包含我们的模型文件“ cnnCat2.h5”,该文件在卷积神经网络上进行了训练。
- 我们有一个音频剪辑“ alarm.wav”,当人昏昏欲睡时播放。
- “ Model.py”文件包含用于通过对数据集进行训练来构建分类模型的程序。 您可以在此文件中看到卷积神经网络的实现。
- “睡意检测.py”是我们项目的主文件。 要开始检测过程,我们必须运行此文件。
现在,让我们逐步了解我们的算法。
步骤1 –将图像作为相机的输入
使用网络摄像头,我们将图像作为输入。 因此,要访问网络摄像头,我们进行了无限循环,将捕获每个帧。 我们使用OpenCV提供的方法cv2.VideoCapture(0)访问摄像机并设置捕获对象(上限)。 cap.read()将读取每一帧,然后将图像存储在frame变量中。
第2步–在图像中检测人脸并创建关注区域(ROI)
要检测图像中的人脸,我们首先需要将图像转换为灰度,因为用于对象检测的OpenCV算法在输入中获取了灰度图像。 我们不需要颜色信息来检测物体。 我们将使用haar级联分类器来检测人脸。 该行用于设置我们的分类器face = cv2.CascadeClassifier('我们的haar级联xml文件的路径') 。 然后,我们使用faces = face.detectMultiScale(gray