瞌睡检测系统介绍

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

3cbc3fd2ec62df82225d8c433080a340.jpeg

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

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

要求

●Python

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

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

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

迁移学习

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

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

81ec56fd45ebb4f87f0b7e7e15af2b88.png

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

方法

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

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

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

4da26985514b3d93a89277bf36cc2f0b.png

数据集

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

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

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

10e05e5e67bb759c3a462690f2990751.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

fde17c9f688b746150536edfc6ca4102.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<0.3:
        counter = counter + 1
        status = "Closed Eyes"
        cv2.putText(frame,
                status,
                (150,150),
                font, 3,
                (0, 0, 255),
                2,
                cv2.LINE_4)
        x1,y1,w1,h1 = 0,0,175,75
        cv2.rectangle(frame, (x1,y1), (x1 + w1, y1 + h1), (0,0,255), 2)
        if counter > 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()

结论

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

–> 如何使用迁移学习?

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

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

–> 实现嗜睡检测系统。

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

b87cc13dd44f12fb705d57ce76362b57.jpeg

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
驾驶员瞌睡及注意力警告系统(DDAW)的认证流程主要包括以下几个步骤: 1. 系统设计和开发:DDAW系统需要经过专业领域的设计和开发,确保系统能够准确地判断驾驶员的瞌睡和注意力状态。设计人员会考虑到驾驶环境、传感器使用和数据处理等方面因素,以提高系统的可靠性和准确性。 2. 实验室测试:在系统设计和开发完成后,需要将DDAW系统进行实验室测试。实验室测试主要是通过模拟不同驾驶场景和情境,采集驾驶员的生理和行为数据并与系统判断结果进行对比,以评估系统的准确性和可靠性。这些实验室测试可能包括使用眼动仪、脑电图(EEG)、心率变异性(HRV)等设备对驾驶员状态进行监测和记录。 3. 道路试验:在通过实验室测试后,需要进行实际道路上的试验来验证系统的性能。这些试验一般会在真实的驾驶环境中进行,使用实时数据来评估系统的准确性和稳定性。试验内容可能包括不同的驾驶路况、路段和时间段,以模拟真实的驾驶情境。 4. 认证和标准检测:在通过实验室测试和道路试验后,DDAW系统需要进行认证和标准检测。一般来说,相关机构或认证机构将对系统的性能指标进行评估,如准确率、误报率等,并与相关的行业标准进行对比和验证。通过认证和标准检测,可以确保系统符合相关的规范和要求,具备一定的可靠性和有效性。 总的来说,驾驶员瞌睡及注意力警告系统(DDAW)的认证流程包括系统设计和开发、实验室测试、道路试验以及认证和标准检测。这一系列流程的目的是验证系统的准确性、可靠性和有效性,以保证DDAW系统能够准确地警示驾驶员的瞌睡和注意力状态,提高驾驶安全性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值