前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TensorFlow+OpenCV实现睡意检测系统

TensorFlow+OpenCV实现睡意检测系统

作者头像
Color Space
发布2022-09-26 10:08:59
6620
发布2022-09-26 10:08:59
举报

导读

本文主要介绍如何使用 Python、OpenCV、TensorFlow和Keras实现一个睡意检测系统。(公众号:OpenCV与AI深度学习)

背景介绍 如今,司机的嗜睡是造成交通事故的主要原因之一。长时间开车的司机在方向盘后打瞌睡是很常见的但却非常危险。在本文中,我们将构建一个睡意检测系统,该系统会在驾驶员睡着后立即发出警报。

睡意是通过使用基于视觉的技术来识别的,例如眼睛检测、打哈欠和点头。当谈到打哈欠和点头时,有些人可以不打哈欠和点头就睡觉。 另一种方法是使用生理传感器,如生物传感器。这里的缺点是司机可能会犹豫穿它们,或者他可能会忘记穿它们。与其他技术相比,通过眼睛检测来检测睡意是最好的。 让我们开始吧。

系统要求

  • Python
  • OpenCV:OpenCV 是用于图像处理和执行许多计算机视觉任务的出色工具。它是一个开源库,可用于执行面部检测、对象跟踪等任务以及更多任务。
  • TensorFlow:Tensorflow 是一个免费的开源库,由 Google Brain 团队开发,用于机器学习和人工智能。Tensorflow 特别关注深度神经网络的训练和推理。
  • Keras:Keras 是一个开源软件库,它为人工神经网络提供Python 接口。Keras 更加用户友好,因为它是一个内置的 Python 库。

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

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

实现方法 该项目的方法是使用网络摄像头捕获第一个视频,并使用 Harcascade 算法从视频中检测第一张脸,然后检测眼睛。然后我们使用我们的深度学习模型,该模型是使用迁移学习构建的,以了解眼睛的状态。如果它是睁着的眼睛,它会说激活,如果它是闭着的眼睛,它会检查几秒钟,然后它会说司机昏昏欲睡,并会发出警报。 我们将使用 Python、OpenCV、TensorFlow 和 Keras 来构建一个系统,该系统可以检测驾驶员的闭眼情况,并在他们在驾驶时睡着时提醒他们。如果驾驶员的眼睛是闭着的,这个系统会立即通知驾驶员。我们现在要使用的 OpenCV 将通过附加的网络摄像头监控和收集驾驶员的图像,并将它们输入深度学习模型,然后模型会将驾驶员的眼睛分类为“睁眼”或“闭眼”。

数据集 对于这个项目,我们将使用 MRL Eye 数据集。MRL Eye 数据集是一个包含人眼图像的大规模数据集。使用此链接下载数据集。http://mrl.cs.vsb.cz/eyedataset 该数据集包含 37 个不同人的 84898 个眼睛图像,其中 33 个是男性,4 个是女性。它包含所有类型的图像,例如打开、关闭、戴眼镜、不戴眼镜以及不同照明条件下的图像。

下载后将所有图像分成闭合和睁开的眼睛进入两个单独的文件夹。

详细步骤 首先导入所需的库: 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

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

代码语言:javascript
复制
img_size = 224
new_array = cv2.resize(backtorgb, (img_size, img_size))
plt.imshow(new_array, cmap="gray")
plt.show()

创建训练数据:

代码语言:javascript
复制
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()

随机选取数据以避免过拟合:

代码语言:javascript
复制
import random
random.shuffle(training_Data)

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

代码语言:javascript
复制
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,然后保存模型,这样就不需要一次又一次地训练。

代码语言:javascript
复制
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
代码语言:javascript
复制
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')
代码语言:javascript
复制
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 个闭眼帧,它将通过发出警报声来提醒驾驶员。

代码语言:javascript
复制
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()

总结 当您运行代码时,它将打开网络摄像头并捕获视频并根据您的眼睑闭合提供输出。这种瞌睡检测系统对驾驶员有很大帮助,并防止了许多因瞌睡而引起的交通事故。到目前为止,我们已经看到: –> 如何使用迁移学习? –> 如何建立模型,训练模型? –> 如何根据我们的问题陈述更改图层? –> 最终实现嗜睡检测系统。 希望你们发现它有用。 参考链接: https://www.analyticsvidhya.com/blog/2022/05/drowsiness-detection-system/ —THE END—

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 系统要求
  • 迁移学习 在这个项目中,我们将使用迁移学习来构建模型。迁移学习是一种机器学习方法,我们将预训练模型用于具有相关问题陈述的新模型。 例如,用于识别汽车的模型可用于识别卡车。
  • 实现方法 该项目的方法是使用网络摄像头捕获第一个视频,并使用 Harcascade 算法从视频中检测第一张脸,然后检测眼睛。然后我们使用我们的深度学习模型,该模型是使用迁移学习构建的,以了解眼睛的状态。如果它是睁着的眼睛,它会说激活,如果它是闭着的眼睛,它会检查几秒钟,然后它会说司机昏昏欲睡,并会发出警报。 我们将使用 Python、OpenCV、TensorFlow 和 Keras 来构建一个系统,该系统可以检测驾驶员的闭眼情况,并在他们在驾驶时睡着时提醒他们。如果驾驶员的眼睛是闭着的,这个系统会立即通知驾驶员。我们现在要使用的 OpenCV 将通过附加的网络摄像头监控和收集驾驶员的图像,并将它们输入深度学习模型,然后模型会将驾驶员的眼睛分类为“睁眼”或“闭眼”。
  • 数据集 对于这个项目,我们将使用 MRL Eye 数据集。MRL Eye 数据集是一个包含人眼图像的大规模数据集。使用此链接下载数据集。http://mrl.cs.vsb.cz/eyedataset 该数据集包含 37 个不同人的 84898 个眼睛图像,其中 33 个是男性,4 个是女性。它包含所有类型的图像,例如打开、关闭、戴眼镜、不戴眼镜以及不同照明条件下的图像。
  • 详细步骤 首先导入所需的库: 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
  • 检测和警报
    • 总结 当您运行代码时,它将打开网络摄像头并捕获视频并根据您的眼睑闭合提供输出。这种瞌睡检测系统对驾驶员有很大帮助,并防止了许多因瞌睡而引起的交通事故。到目前为止,我们已经看到: –> 如何使用迁移学习? –> 如何建立模型,训练模型? –> 如何根据我们的问题陈述更改图层? –> 最终实现嗜睡检测系统。 希望你们发现它有用。 参考链接: https://www.analyticsvidhya.com/blog/2022/05/drowsiness-detection-system/ —THE END—
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档