瞌睡检测系统介绍 您所在的位置:网站首页 python检测系统 瞌睡检测系统介绍

瞌睡检测系统介绍

2023-03-15 16:36| 来源: 网络整理| 查看: 265

点击上方“小白学视觉”,选择加"星标"或“置顶”

重磅干货,第一时间送达

如今,司机的嗜睡是造成交通事故的主要原因之一。长时间开车的司机会打瞌睡是很自然的。文中,我们将构建一个睡意检测系统,该系统会在驾驶员睡着后立即发出警报。

5d06ad826bbb8c2b601a8703374bda05.jpeg

睡意是通过使用基于视觉的技术来识别的,例如眼睛检测、打哈欠和点头。当谈到打哈欠和点头时,有些人却可以不打哈欠和点头就睡觉。

另一种方法是使用生理传感器,如生物传感器。缺点是司机可能会犹豫是否要穿它们,或者他可能会忘记穿它们。与其他技术相比,通过眼睛检测来检测睡意是最好的。

要求

●Python

●OpenCV:OpenCV 是用于图像处理和执行许多计算机视觉任务的出色工具。它是一个开源库,可用于执行面部检测、对象跟踪等任务以及更多任务。

●TensorFlow:Tensorflow 是一个免费的开源库,由 Google Brain 团队开发,用于机器学习和人工智能。Tensorflow 特别关注深度神经网络的训练和推理。

●Keras:Keras 是一个开源软件库,它为人工神经网络提供Python 接口。Keras 更加用户友好,因为它是一个内置的 Python 库。

迁移学习

在这个项目中,我们将使用迁移学习来构建模型。迁移学习是一种机器学习方法,我们将预训练模型用于具有相关问题陈述的新模型。

例如,用于识别汽车的模型可用于识别卡车。

76fe10f589ee9c520f31f8f0596e1fc7.png

这里主要关注在解决一个问题时获得的知识,它适用于不同但相关的问题。

方法

该项目的方法是使用网络摄像头捕获第一个视频,并使用 Harcascade 算法从视频中检测第一张脸,检测眼睛。然后我们使用我们的深度学习模型,该模型是使用迁移学习构建的,以了解眼睛的状态。如果它是睁眼的,它会说司机是活跃的,如果它是闭眼的,它会检查几秒钟,然后它会说司机昏昏欲睡,并会发出警报。

我们将使用 Python、OpenCV、TensorFlow 和 Keras 来构建一个系统,该系统可以检测驾驶员的闭眼情况,并在他们在驾驶时睡着时提醒他们。如果驾驶员的眼睛是闭着的,这个系统会立即通知驾驶员。

我们现在要使用的 OpenCV 将通过附加的网络摄像头监控和收集驾驶员的图像,并将它们输入深度学习模型,然后模型会将驾驶员的眼睛分类为“睁眼”或“闭眼”。

acc78369cab809dd39e2711db307f549.png

数据集

对于这个项目,我们将使用 MRL Eye 数据集。MRL Eye 数据集是一个包含人眼图像的大规模数据集。

使用此链接下载数据集:http://mrl.cs.vsb.cz/eyedataset

该数据集包含 37 个不同人的 84898 个眼睛图像,其中 33 个是男性,4 个是女性。它包含所有类型的图像,例如睁眼、闭眼、戴眼镜、不戴眼镜以及不同照明条件下的图像。

a16ff53e00e566fdbeb81582982b5db5.png

下载后将所有图像分成睁眼和闭眼,并放入两个单独的文件夹。

执行

首先导入所需的库。

import tensorflow as tf import cv2 import os import matplotlib.pyplot as plt import numpy as np

读取数据集中的所有图像

Datadirectory = "mrlEyeDataset2/" Classes = ["Closed_Eyes", "Open_Eyes"] for category in Classes:     path = os.path.join(Datadirectory, category)     for img in os.listdir(path):         img_array = cv2.imread(os.path.join(path,img), cv2.IMREAD_GRAYSCALE)         backtorgb = cv2.cvtColor(img_array, cv2.COLOR_GRAY2RGB)         plt.imshow(img_array, cmap="gray")         plt.show()         break     break

590be54b60b24347daca4a57f8c4cef2.png

调整图像大小

将所有图像的大小调整为 224 x 224,以便更好地提取特征。

img_size = 224 new_array = cv2.resize(backtorgb, (img_size, img_size)) plt.imshow(new_array, cmap="gray") plt.show()

创建训练数据

training_Data = [] def create_training_Data():    for category in Classes:        path = os.path.join(Datadirectory, category)        class_num = Classes.index(category) # 0 1,        for img in os.listdir(path):            try:                img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)                backtorgb = cv2.cvtColor(img_array,cv2.COLOR_GRAY2RGB)                new_array = cv2.resize(backtorgb, (img_size, img_size))                training_Data.append([new_array,class_num])            except Exception as e:                pass create_training_Data()

随机shuffle以避免过度拟合。

import random random.shuffle(training_Data)

创建数组来存储特征和标签

X = [] y = [] for features,label in training_Data:   X.append(features)   y.append(label) X = np.array(X).reshape(-1, img_size, img_size, 3)

导入构建模型所需的库。导入模型并更改最后一个全连接(fc)层并构建新模型。然后使用二元交叉熵损失函数和adam优化器编译模型,将模型训练5个epoch,保存模型,这样就不需要一次又一次地训练。

import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers model = tf.keras.applications.mobilenet.MobileNet() base_input = model.layers[0].input ##input base_output = model.layers[-4].output Flat_layers = layers.Flatten()(base_output) final_output = layers.Dense(1)(Flat_layers) final_output = layers.Activation('sigmoid')(final_output) new_model = keras.Model(inputs = base_input, outputs = final_output) new_model.compile(loss="binary_crossentropy", optimizer= "adam", metrics=["accuracy"]) new_model.fit(X,Y, epochs = 5, validation_split = 0.2) ##training new_model.save('my_model.h5') img_array = cv2.imread('mrlEyeDataset/Closed_Eyes/s0001_00080_0_0_0_0_0_01.png', cv2.IMREAD_GRAYSCALE) backtorgb = cv2.cvtColor(img_array, cv2.COLOR_GRAY2RGB) new_array = cv2.resize(backtorgb, (img_size, img_size)) X_input = np.array(new_array).reshape(1, img_size, img_size, 3) X_input = X_input/255.0 #normalizing data prediction = new_model.predict(X_input) 检测和警报

现在让我们看看检测和警报的实现。这里我们将定时器设置为 2 秒和 5 帧/秒。

如果眼睛连续闭上 2 秒,这意味着如果模型连续捕捉到 10 个闭眼帧,它将通过发出警报声来提醒驾驶员。

import winsound frequency = 2500  # Set frequency to 2500 duration = 1500  # Set duration to 1500 ms == 1.5 sec import numpy as np import cv2 path = "haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml") cap = cv2.VideoCapture(1) #check if webcam is opened correctly if not cap.isOpened():     cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FPS, 5) counter = 0 while True:     ret,frame = cap.read()     eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')     gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)     eyes = eye_cascade.detectMultiScale(gray, 1.1, 4)     for x,y,w,h in eyes:         roi_gray = gray[y:y+h, x:x+w]         roi_color = frame[y:y+h, x:x+w]         cv2.rectangle(frame, (x,y), (x+w,y+h), (0, 255, 0), 2)         eyess = eye_cascade.detectMultiScale(roi_gray)         if len(eyess) == 0:             print("Eyes are not detected")         else:             for (ex, ey, ew, eh) in eyess:                 eyes_roi = roi_color[ey: ey+eh, ex: ex+ew]     gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)     if(faceCascade.empty()==False):         print("detected")     faces = faceCascade.detectMultiScale(gray, 1.1, 4)     # Draw a rectangle around eyes     for (x,y,w,h) in faces:         cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)     font = cv2.FONT_HERSHEY_SIMPLEX     final_image = cv2.resize(eyes_roi, (224,224))     final_image = np.expand_dims(final_image, axis=0)     final_image = final_image/255.0     Predictions = new_model.predict(final_image)     if (Predictions>=0.3):         status = "Open Eyes"         cv2.putText(frame,                 status,                 (150,150),                 font, 3,                 (0, 255, 0),                 2,                 cv2.LINE_4)         x1,y1,w1,h1 = 0,0,175,75         cv2.rectangle(frame, (x1, y1), (x1 + w1, y1 + h1), (0,0,0), -1)         #Add text         cv2.putText(frame, 'Active', (x1 + int(w1/10),y1 + int(h1/2)), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,255,0), 2)     elif Predictions 10:             x1,y1,w1,h1 = 0,0,175,75             #Draw black background rectangle             cv2.rectangle(frame, (x1, y1), (x1 + w1, y1 + h1), (0,0,0), -1)             #Add text             cv2.putText(frame, "Sleep Alert !!!", (x1 + int(w1/10), y1 + int(h1/2)), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,0,255), 2)             winsound.Beep(frequency, duration)             counter = 0     cv2.imshow("Drowsiness Detection", frame)     if cv2.waitKey(2) & 0xFF == ord('q'):         break cap.release() cv2.destroyAllWindows() 结论

当你运行代码时,它将打开网络摄像头并捕获视频,根据你的眼睑闭合程度提供输出。这种瞌睡检测系统对驾驶员有很大帮助,并防止了许多因瞌睡而引起的交通事故。到目前为止,我们已经看到:

–> 如何使用迁移学习?

–> 如何建立模型,训练模型?

–> 如何根据我们的问题陈述更改网络层?

–> 实现嗜睡检测系统。

好消息!

小白学视觉知识星球

开始面向外开放啦👇👇👇

a9117854852038727b50f7aef5f66121.jpeg

下载1:OpenCV-Contrib扩展模块中文版教程 在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。 下载2:Python视觉实战项目52讲 在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。 下载3:OpenCV实战项目20讲 在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。 交流群 欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有