Python OpenCV --Drowsiness Detector 睡意检测--项目记录

在这里插入图片描述
睡意检测是一项安全技术,可以防止驾驶员在驾驶中入睡而导致的事故。
目的是建立一个睡意检测系统,该系统将检测人的眼睛闭合几秒钟。 当检测到困倦时,该系统将警告驾驶员。

睡意检测版本1.0

睡眠检测关键步骤

步骤1-从相机获取图像作为输入。
步骤2-检测图像中的人脸并创建关注区域(ROI)。
步骤3-从ROI中检测眼睛并将其输入分类器。
步骤4-分类器将对眼睛睁开还是闭眼进行分类。
步骤5-计算检查该人是否困倦。

1.1睡眠检测前期软件配置

软件1.OpenCV – pip安装opencv-python (面部和眼睛检测)。
由于Tensorflow安装到处采坑,我老老实实慢慢的确定版本号。
Windows 安装OpenCV

  • 1.准备版本号查询
    cmd->pip list

pycharm->File->setting->Project:文件名->Project Interpreter->在左侧Package找 python->对应Version即为版本号
即环境 python版本为3.8 tensorflow版本为2.3.1 Windows系统为64

  • 2.确定你是否已经安装了numpy。

  • 3.opencv下载网站找对应python3.8版本下载.whl 文件。

  python3.8:opencv_python‑4.4.0‑cp38‑cp38‑win_amd64.whl
  opencv下载网站:https://www.lfd.uci.edu/~gohlke/pythonlibs
  • 4.将这个opencv_python‑4.4.0‑cp38‑cp38‑win_amd64.whl文件复制到D:\根目录下即可**
  • 5.打开cmd,将路径切换到D:,然后输入:
pip install opencv_python‑4.4.0‑cp38‑cp38‑win_amd64.whl 回车

软件2.TensorFlow – pip安装tensorflow(keras使用TensorFlow作为后端)。
软件3.Keras – pip安装keras(建立我们的分类模型)。
软件4.Pygame –点子安装pygame(播放警报声音)。

1.2数据集

用于此模型的数据集由我们创建。 为了创建数据集,我们编写了一个脚本,可以捕获相机的眼睛并将其存储在本地磁盘。 我们将它们分成各自的标签“打开”或’关闭’。 通过删除不需要的图像手动清除了数据,这对于构建模型不是必需的。 数据包括在不同的照明条件下,大约有7000张人眼图像。在数据集上训练模型后,我们将最终权重和模型架构文件“ models / cnnCat2.h5”。
现在,您可以使用此模型对人眼睁开或闭眼进行分类。

1.3模型架构

我们使用的模型是通过Keras使用卷积神经网络(CNN)构建的。 卷积神经网络是一种特殊的深度神经网络,在图像分类方面表现非常出色。 CNN基本上由一个输入层、一个输出层和一个可以包含多个层的隐藏层组成。 使用在层和滤波器上执行2D矩阵乘法的滤波器对这些层执行卷积操作。

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

卷积层; 32个节点,内核大小为3
卷积层; 32个节点,内核大小为3
卷积层; 64个节点,内核大小3
全连接层; 128个节点
最后一层也是具有2个节点的完全连接的层。中间层激活用ReLU,最后输出是Softmax。

2.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变量中。

3.在图像中检测人脸并创建关注区域(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 )

4. 从ROI中检测眼睛并将其输入分类器

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

I_eye = frame[ y : y+h, x : x+w ]
l_eye仅包含眼睛的图像数据。 这将被输入到我们的CNN分类器中,该分类器将预测眼睛是睁着还是闭着。 同样,我们将右眼提取到r_eye中 。

5.分类器将对眼睛睁开还是闭眼进行分类

我们正在使用CNN分类器来预测眼睛状态。 要将图像输入到模型中,我们需要执行某些操作,因为模型首先需要正确的尺寸。 首先,我们使用r_eye = cv2.cvtColor(r_eye,cv2.COLOR_BGR2GRAY)将彩色图像转换为灰度。

然后,当我们的模型在24 * 24像素图像cv2.resize(r_eye,(24,24))上训练时,我们将图像调整为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,则表明眼睛是张开的。

6.计算分数以检查人是否困倦

分数基本上是一个值,我们将使用该值来确定该人闭上眼睛多长时间。 因此,如果两只眼睛都闭合,我们将继续增加得分,而当眼睛睁开时,我们将降低得分。 我们正在使用cv2.putText()函数在屏幕上绘制结果,该函数将显示人员的实时状态。

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

例如,如果得分变得大于15,则定义一个阈值,这意味着该人的眼睛长时间闭合。 这是当我们使用sound.play()发出警报声。

7.程序源代码

7.1分块部分

 import cv2
 import os
 from keras.models
 import load_model
 import numpy as np
 from pygame import mixer
 //导入各个需要的库
import time
mixer.init()
 //导入声音提示部分
sound = mixer.Sound('alarm.wav')
face = cv2.CascadeClassifier('haar cascade files\haarcascade_frontalface_alt.xml')
leye = cv2.CascadeClassifier('haar cascade files\haarcascade_lefteye_2splits.xml')
reye = cv2.CascadeClassifier('haar cascade files\haarcascade_righteye_2splits.xml')
//文件路径录入
lbl=['Close','Open']
model = load_model('models/cnncat2.h5')
path = os.getcwd()
cap = cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_COMPLEX_SMALL
count=0
score=0
thicc=2
rpred=[99]
lpred=[99]
 //参数赋初值
while(True): 
ret, frame = cap.read() 
height,width = frame.shape[:2]
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face.detectMultiScale(gray,minNeighbors=5,scaleFactor=1.1,minSize=(25,25))
left_eye = leye.detectMultiScale(gray)
right_eye = reye.detectMultiScale(gray) 
cv2.rectangle(frame, (0,height-50) , (200,height) , (0,0,0) , thickness=cv2.FILLED )
for (x,y,w,h) in faces:
cv2.rectangle(frame, (x,y) , (x+w,y+h) , (100,100,100) , 1 ) 
 //彩色图像变灰色图像,ROI选取,图像基础处理
for (x,y,w,h) in right_eye:
r_eye=frame[y:y+h,x:x+w]
 count=count+1
r_eye = cv2.cvtColor(r_eye,cv2.COLOR_BGR2GRAY) 
r_eye = cv2.resize(r_eye,(24,24))
r_eye= r_eye/255
r_eye= r_eye.
  • 28
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值