驾驶员疲劳检测系统开发

在当今时代,驾驶员疲劳驾驶是引发交通事故的主要原因之一。对于长时间驾驶的司机来说,很容易在驾驶过程中打瞌睡。本文将介绍如何构建一个疲劳检测系统,该系统能够在司机打瞌睡时及时提醒他们。

疲劳可以通过视觉技术来识别,例如眼睛检测、打哈欠和点头。然而,有些人在睡觉时可能不会打哈欠或点头。另一种方法是使用生理传感器,如生物传感器。但这种方法的缺点是司机可能不愿意佩戴或忘记佩戴。相比之下,通过眼睛检测来识别疲劳是最佳的方法。

接下来,将介绍构建这个系统所需的技术栈,包括PythonOpenCVTensorFlow等。这些工具将帮助实现面部检测、目标跟踪等计算机视觉任务,并构建基于深度学习的模型。

技术栈与方法论

将使用迁移学习来构建模型。迁移学习是一种机器学习方法,它允许使用一个预训练的模型来解决一个相关的问题。例如,一个用于识别汽车的模型可以被用来识别卡车。这种方法主要侧重于在一个问题中获得的知识,并将其应用于不同的但相关的问题。

项目的第一步是使用摄像头捕获视频,然后使用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()
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485