危险驾驶行为分析统计系统python深度学习危险驾驶行为分析统计系统眨眼哈欠点头摇头分析情绪分析生气厌恶害怕喜悦悲伤惊讶普通

在当今交通安全日益受重视的时代,利用Python深度学习构建危险驾驶行为分析统计系统有着重大意义。这个系统能通过对驾驶员眨眼、哈欠、点头摇头等行为,甚至情绪如生气、厌恶、害怕、喜悦、悲伤、惊讶及普通状态的分析,提前预警潜在危险。

眨眼与哈欠分析

眨眼和哈欠频繁出现可能暗示驾驶员疲劳。在Python中,我们可以借助OpenCV库来实现对眼部动作和嘴巴开合程度的检测。

import cv2
import dlib

# 加载人脸检测器和特征点检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = detector(gray)

    for face in faces:
        landmarks = predictor(gray, face)
        # 提取眼部和嘴部特征点
        left_eye = []
        right_eye = []
        mouth = []
        for n in range(36, 42):
            x = landmarks.part(n).x
            y = landmarks.part(n).y
            left_eye.append((x, y))
        for n in range(42, 48):
            x = landmarks.part(n).x
            y = landmarks.part(n).y
            right_eye.append((x, y))
        for n in range(48, 68):
            x = landmarks.part(n).x
            y = landmarks.part(n).y
            mouth.append((x, y))

        # 计算眼部纵横比(EAR)判断眨眼
        left_ear = (abs(left_eye[1][1] - left_eye[5][1]) + abs(left_eye[2][1] - left_eye[4][1])) / (2 * abs(left_eye[0][0] - left_eye[3][0]))
        right_ear = (abs(right_eye[1][1] - right_eye[5][1]) + abs(right_eye[2][1] - right_eye[4][1])) / (2 * abs(right_eye[0][0] - right_eye[3][0]))
        ear = (left_ear + right_ear) / 2
        if ear < 0.2:
            print("眨眼检测到")

        # 通过嘴部高度宽度比判断是否打哈欠
        mouth_height = abs(mouth[12][1] - mouth[4][1])
        mouth_width = abs(mouth[0][0] - mouth[6][0])
        if mouth_height / mouth_width > 0.5:
            print("哈欠检测到")


    cv2.imshow('Frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

在这段代码里,首先通过dlib库的检测器和预测器来定位人脸和面部特征点。接着,分别提取左右眼和嘴部的特征点。通过计算眼部纵横比(EAR),当EAR小于一定阈值时,就判定为眨眼。而对于哈欠检测,通过计算嘴部的高度与宽度比例,当比例大于设定值时,认为驾驶员在打哈欠。

点头摇头分析

对于点头摇头动作,我们可以通过追踪头部在连续帧中的位置和角度变化来判断。同样利用OpenCV和一些数学计算实现。

import cv2
import numpy as np

# 初始化视频捕获
cap = cv2.VideoCapture(0)

prev_center = None
while True:
    ret, frame = cap.read()
    if not ret:
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
        center = (int(x + w / 2), int(y + h / 2))
        if prev_center:
            dx = center[0] - prev_center[0]
            dy = center[1] - prev_center[1]
            if abs(dx) > 30 or abs(dy) > 30:
                if abs(dx) > abs(dy):
                    if dx > 0:
                        print("头部向右移动可能是摇头")
                    else:
                        print("头部向左移动可能是摇头")
                else:
                    if dy > 0:
                        print("头部向下移动可能是点头")
                    else:
                        print("头部向上移动可能是点头")
        prev_center = center


    cv2.imshow('Frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

在这部分代码中,通过haarcascadefrontalfacedefault.xml级联分类器检测人脸。记录每一帧人脸的中心位置,与前一帧的中心位置对比。根据横纵坐标的差值来判断头部是左右移动(可能是摇头)还是上下移动(可能是点头)。

情绪分析

情绪分析可借助深度学习模型,如使用预训练的卷积神经网络(CNN)在面部表情数据集上进行微调。这里以Keras框架为例简单说明。

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from keras.preprocessing.image import ImageDataGenerator

# 构建模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(48, 48, 1)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(7, activation='softmax'))

# 数据增强
train_datagen = ImageDataGenerator(rescale=1. / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    'train_directory',
    target_size=(48, 48),
    batch_size=64,
    color_mode='grayscale',
    class_mode='categorical')

test_generator = test_datagen.flow_from_directory(
    'test_directory',
    target_size=(48, 48),
    batch_size=64,
    color_mode='grayscale',
    class_mode='categorical')

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(
    train_generator,
    steps_per_epoch=train_generator.samples // train_generator.batch_size,
    epochs=10,
    validation_data=test_generator,
    validation_steps=test_generator.samples // test_generator.batch_size)

上述代码构建了一个简单的CNN模型,包括卷积层、池化层、全连接层。通过ImageDataGenerator进行数据增强,扩充训练数据。然后在训练集上训练模型,并在测试集上验证。最终可以根据模型预测驾驶员的情绪状态,是生气、厌恶、害怕等其中的一种。

通过这些基于Python深度学习的方法,我们能较为全面地构建一个危险驾驶行为分析统计系统,为交通安全保驾护航。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐