在当今时代,驾驶员疲劳驾驶是引发交通事故的主要原因之一。对于长时间驾驶的司机来说,很容易在驾驶过程中打瞌睡。本文将介绍如何构建一个疲劳检测系统,该系统能够在司机打瞌睡时及时提醒他们。
疲劳可以通过视觉技术来识别,例如眼睛检测、打哈欠和点头。然而,有些人在睡觉时可能不会打哈欠或点头。另一种方法是使用生理传感器,如生物传感器。但这种方法的缺点是司机可能不愿意佩戴或忘记佩戴。相比之下,通过眼睛检测来识别疲劳是最佳的方法。
接下来,将介绍构建这个系统所需的技术栈,包括Python、OpenCV和TensorFlow等。这些工具将帮助实现面部检测、目标跟踪等计算机视觉任务,并构建基于深度学习的模型。
技术栈与方法论
将使用迁移学习来构建模型。迁移学习是一种机器学习方法,它允许使用一个预训练的模型来解决一个相关的问题。例如,一个用于识别汽车的模型可以被用来识别卡车。这种方法主要侧重于在一个问题中获得的知识,并将其应用于不同的但相关的问题。
项目的第一步是使用摄像头捕获视频,然后使用Haar级联算法检测面部,接着检测眼睛。然后,使用基于迁移学习的深度学习模型来确定眼睛的状态。如果眼睛是睁开的,系统将显示“活跃”;如果眼睛是闭上的,系统将在几秒钟后显示司机疲劳,并发出警报。
数据集与实现
对于这个项目,将使用MRL Eye数据集,这是一个大规模的数据集,包含人类眼睛的图像。下载数据集后,将所有图像分为闭眼和睁眼两个不同的文件夹。
首先,需要导入所需的库,并读取数据集中的所有图像。然后,将所有图像调整为224x224的大小,以便更好地提取特征。接下来,将创建训练数据,并随机打乱数据以避免过拟合。
import tensorflow as tf
import cv2
import os
import matplotlib.pyplot as plt
import numpy as np
模型构建与训练
model = tf.keras.applications.mobilenet.MobileNet()
base_input = model.layers[0].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)
new_model.save('my_model.h5')
import winsound
frequency = 2500
duration = 1500
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)
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)
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)
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
cv2.rectangle(frame, (x1, y1), (x1 + w1, y1 + h1), (0,0,0), -1)
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()