瞌睡检测是一种汽车安全技术,有助于防止驾驶员在驾驶时睡着了造成的事故。根据 NHTSA(美国国家公路交通安全管理局)的数据,警方报告的 91,000 起车祸涉及疲劳驾驶。这些车祸导致 2017 年估计有 50,000 人受伤和近 800 人死亡。目前,方法主要集中在使用深度学习或机器学习技术进行眨眼检测,但是,如果司机戴墨镜怎么办?

如果我们同时考虑驾驶员的头部倾斜、打哈欠和其他因素会怎样?是的,这正是本文所做的。

在进入特征提取部分之前,从“ULg 多模态嗜睡数据库”(也称为DROZY(http://www.drozy.ulg.ac.be/) )中获取数据,该数据库包含各种类型的嗜睡相关数据(信号、图像等)。

该数据集包含大约 45 个视频剪辑,这些剪辑按照卡罗林斯卡嗜睡量表 (KSS) 进行标记。KSS 量表范围从 1 到 9,其中 1 表示非常警觉,9 表示非常困。

由于该数据集中缺少数据和标签,因此将标签从 1-9 转换为 1-3,分别表示无嗜睡、中度嗜睡和高度嗜睡。本来会使用视频分类过程,但由于数据不够,先提取特征并将它们用作我的模型输入。这样,模型将使用更少的数据达到更准确的效果。

特征提取

对于这个特定任务,我将使用 TensorFlow-GPU 2.6 和 python 3.6 以及使用 pip 预安装的库 open-cv、dlib、scipy。

特征提取所需的所有库:

from scipy.spatial import distance as dist
from imutils.video import FileVideoStream
from imutils.video import VideoStream
from imutils import face_utils
import numpy as np
import argparse
import imutils
import time
import dlib
import cv2
import datetime
import csv
import os
import math

平均眨眼持续时间:眼睛纵横比低于 0.3 然后高于 0.3 的持续时间被检测为眨眼。眨眼发生的时间称为眨眼持续时间。平均每分钟眨眼持续时间以计算平均眨眼持续时间。

# grab the indexes of the facial landmarks for the left and
# right eye, respectively
(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"]
(rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]def eye_aspect_ratio(eye):A = dist.euclidean(eye[1], eye[5])B = dist.euclidean(eye[2], eye[4])C = dist.euclidean(eye[0], eye[3])ear = (A + B) / (2.0 * C)return ear

眨眼频率:每分钟眨眼的次数称为眨眼频率。

def time_difference(start_time, end_time):start_time = start_time.split() for i in range(0,8):hours = int(start_time[3])mins = int(start_time[4])secs = int(start_time[5])milisecs = int(start_time[6])microsecs = int(start_time[7])#converting it to microsecst1, m1, s1, ms1, mis1  = hours, mins, secs, milisecs, microsecsstart_time_microsecs = mis1 + 1000*(ms1 + 1000*(s1 + 60*(m1 + 60*t1)))end_time = end_time.split()for x in range(0,8,1):hours = int(end_time[3])mins = int(end_time[4])secs = int(end_time[5])milisecs = int(end_time[6])microsecs = int(end_time[7]) t2, m2, s2, ms2, mis2  = hours, mins, secs, milisecs, microsecsend_time_microsecs = mis2 + 1000*(ms2 + 1000*(s2 + 60*(m2 + 60*t2)))#finding the duration of blinktime_differ = end_time_microsecs - start_time_microsecs#print 'time_difference in microsecs = ', time_differreturn time_differ

嘴部纵横比:计算 MAR 以检测一个人是否在打哈欠。

(omouth, emouth) = face_utils.FACIAL_LANDMARKS_IDXS["mouth"]
def mouth_aspect_ratio(mouth):# compute the euclidean distances between the two sets of# vertical mouth landmarks (x, y)-coordinatesA = dist.euclidean(mouth[2], mouth[10])  # 51, 59B = dist.euclidean(mouth[4], mouth[8])  # 53, 57# compute the euclidean distance between the horizontal# mouth landmark (x, y)-coordinatesC = dist.euclidean(mouth[0], mouth[6])  # 49, 55# compute the mouth aspect ratiomar = (A + B) / (2.0 * C)# return the mouth aspect ratioreturn mar

头部姿态:每帧计算不同的角度,得到头部的姿态。

def getHeadTiltAndCoords(size, image_points, frame_height):focal_length = size[1]center = (size[1]/2, size[0]/2)camera_matrix = np.array([[focal_length, 0, center[0]], [0, focal_length, center[1]], [0, 0, 1]], dtype="double")dist_coeffs = np.zeros((4, 1))  # Assuming no lens distortion(_, rotation_vector, translation_vector) = cv2.solvePnP(model_points, image_points,camera_matrix, dist_coeffs, flags = cv2.SOLVEPNP_ITERATIVE)  # flags=cv2.CV_ITERATIVE)(nose_end_point2D, _) = cv2.projectPoints(np.array([(0.0, 0.0, 1000.0)]), rotation_vector, translation_vector, camera_matrix, dist_coeffs)#get rotation matrix from the rotation vectorrotation_matrix, _ = cv2.Rodrigues(rotation_vector)#calculate head tilt angle in degreeshead_tilt_degree = abs([-180] - np.rad2deg([rotationMatrixToEulerAngles(rotation_matrix)[0]]))#calculate starting and ending points for the two lines for illustrationstarting_point = (int(image_points[0][0]), int(image_points[0][1]))ending_point = (int(nose_end_point2D[0][0][0]), int(nose_end_point2D[0][0][1]))ending_point_alternate = (ending_point[0], frame_height // 2)return head_tilt_degree, starting_point, ending_point, ending_point_alternate

这就是我的特征提取过程中的样子。

是时候制作模型了!

由于我们已经完成了特征选择部分,我们不必构建复杂的模型。我将使用人工神经网络

import numpy as np
import sklearn
from sklearn import preprocessing
#from sklearn.datasets.samples_generator import make_blobs
#from sklearn.preprocessing import LabelEncoder, StandardScaler
import csv
import os
from tensorflow import keras
import random
from keras.models import Sequential
from keras.layers import Dense , Dropout, Activation, BatchNormalization
from keras import regularizers
importmatplotlib.pyplot as plt
#from keras.utils import plot_model
import sklearn
from sklearn.metrics import chaos_matrix
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
import pickle
from keras.utils import np_utils
from keras import optimizers
from keras.models import load_model

这是深度学习中最简单的模型的设计,但由于特征提取而有效。因为我们计算的是每分钟的瞌睡程度,所以要确保你将你的输入连接起来,然后传递给模型。

#designing the model
model=Sequential()
model.add(Dense(64, input_dim=6, activation='relu'))
model.add(Dropout(0.001))
model.add(Dense(64, input_dim=6, activation='relu'))
model.add(Dropout(0.001))
model.add(Dense(32, input_dim=6, activation='relu'))
model.add(Dense(16, input_dim=6, activation='relu'))
model.add(Dense(4, activation='softmax', use_bias=False))#compile the model
#adam = keras.optimizers.Adam(lr=0.01)
adam = keras.optimizers.Adam(lr=0.001)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy']) #fit the model
checkpoint = keras.callbacks.ModelCheckpoint(filepath="trained_models/DrowDet_model(output4).hdf5", period=1)
tbCallBack = keras.callbacks.TensorBoard(log_dir='./scalar', histogram_freq=0, write_graph=True, write_images=True)
history=model.fit(Xtrain, Ytrain, epochs=50, batch_size=256, callbacks=[checkpoint, tbCallBack], validation_data=(Xval,Yval))

使用准确性与验证准确性和训练损失与验证损失的模型性能。

超参数调优模型!我改变了学习率(0.01 -> 0.001),不同的优化器(RMSprop),时期数(20 -> 50)。

使用 Sklearn 的混淆矩阵,我在测试集上评估了模型,得到了 73% 的准确率和 89% 的训练准确率。再使用大约 4 个隐藏层,我在测试集上得到了大约 74% 的准确率,在训练数据集上得到了 93% 的准确率。

项目的 Github 链接:https://github.com/vraj1231/Driver-Drowsiness-Detection--Computer-Vision

☆ END ☆

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

扫描二维码添加小编↓

驾驶员嗜睡分类 - 深度学习相关推荐

  1. fastText、TextCNN、TextRNN……这里有一套NLP文本分类深度学习方法库供你选择 作者:机器人圈 / 微信号:ROBO_AI发表时间 :2017-07-28 图:pixabay

    fastText.TextCNN.TextRNN--这里有一套NLP文本分类深度学习方法库供你选择 「机器人圈」编译:嗯~阿童木呀.多啦A亮 这个库的目的是探索用深度学习进行NLP文本分类的方法. 它 ...

  2. OpenCV运行分类深度学习网络的实例(附完整代码)

    OpenCV运行分类深度学习网络的实例 OpenCV运行分类深度学习网络的实例 OpenCV运行分类深度学习网络的实例 #include <fstream> #include <ss ...

  3. 【HSI】高光谱的数据集分类深度学习实战及代码理解

    [HSI]高光谱的数据集分类深度学习实战及代码理解 文章目录 [HSI]高光谱的数据集分类深度学习实战及代码理解 一.配置文件编写 二.高光谱图像的处理 2.1图像数据变换 2.2 数据整合 2.3 ...

  4. 【文本分类】常见文本分类深度学习模型汇总

    在深度学习被广泛用于NLP之前,文本分类任务的常见pipeline为: (1)人工/半自动特征抽取:包括one-hot编码.count features.TF-IDF.词性/句法信息等等 (2)分类器 ...

  5. 毕业设计 - 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

    文章目录 1 前言 2 前言 3 数据集 3.1 良性样本 3.2 病变样本 4 开发环境 5 代码实现 5.1 实现流程 5.2 部分代码实现 5.2.1 导入库 5.2.2 图像加载 5.2.3 ...

  6. 【nlp】天池学习赛-新闻文本分类-深度学习1

    目录 1.FastText 1.1.FastText网络结构 1.2.基于fastText的文本分类 2.word2vec训练词向量及使用 2.1.用jieba对语料进行分词处理 2.2.用LineS ...

  7. 2.9 情感分类-深度学习第五课《序列模型》-Stanford吴恩达教授

    情感分类 (Sentiment Classification) 情感分类任务就是看一段文本,然后分辨这个人是否喜欢他们在讨论的这个东西,这是NLP中最重要的模块之一,经常用在许多应用中.情感分类一个最 ...

  8. 4.5 人脸验证与二分类-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 4.4 Triplet 损失 回到目录 4.6 什么是神经风格转换? 人脸验证与二分类 (Face Verification and Binary Classificatio ...

  9. 2.1 二元分类-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.7 总结习题 回到目录 2.2 Logistic 回归 二元分类 (Binary Classification) 这周我们将学习神经网络的基础知识,其中需要注意的是,当实 ...

最新文章

  1. WebSocket协议分析
  2. 如何看待矿池抽税激励社区开发者?如何看待EOS?——BCH极客大赛江卓尔专访
  3. 命令行下运行 java someClass.class出现 “错误:找不到或无法加载主类someClass ” 的解决方案
  4. 剑指offer之中判断二叉树是不是对称二叉树(递归和非递归实现)
  5. 广工android嵌入式系统试卷_嵌入式系统考试试题A及答案
  6. 防止arp***方法
  7. mysql in/no in/like
  8. 从400+节点ElasticSearch集群的运维中,我们总结了这些经验
  9. python求矩阵维度必须一致_python数据分析(二)--Numpy
  10. SpringAop通知
  11. 使用C#创建一个简单的Windows服务
  12. Keras——用Keras搭建RNN分类循环神经网络
  13. 帧数测试软件苹果,如何监视FPS(每秒帧数)在Mac OS X中进行石英调试 | MOS86
  14. 古体字与简体字对照表_简体字与繁体字对照表大全.pdf
  15. 有点意思!用Python 一键群发soul消息找对象
  16. python 公开课_Python入门公开课
  17. Windows下etc文件夹
  18. 创业圈里不讲武德,大厂高管也得挨市场的毒打
  19. CTS/ITS/GSI
  20. 京东购物车网页(静态)搭建

热门文章

  1. 浅析预算管理在建筑工程中的重要性
  2. 嵌入式开发要求的一些专业技能总结
  3. winsvr服务器C盘突然满了的处理方法
  4. 探索Unity 施加力的方式
  5. 标准化——python
  6. 电脑开机后台一堆,内存爆满,如何解决
  7. [FROM WOJ]#3775 次小生成树
  8. matlab画拜年,拜年送百福,鞭炮响起来!
  9. Cross-Site Scripting: DOM
  10. 微服务与领域驱动设计,架构实践总结