我参加本次intel 黑客松 分享奖的评选。请为我助力吧!
intel OneAPI 黑客松 —— 基于intel Python 驾驶员疲劳检测方案
背景
驾驶疲劳是指驾驶人在长时间连续行车后,产生生理机能和心理机能的失调,而在客观上出现驾驶技能下降的现象。驾驶人睡眠质量差或不足,长时间驾驶车辆,容易出现疲劳。
根据国家相关部门统计的数字,全国平均每天发生的交通事故在5万起左右。每年因交通事故死亡的人数在10万人左右,也就是说每天平均要死亡300多人。
这300多人中可能有结伴去旅游的朋友,有负责异地往返送货的货车司机,有公司组织出差的打工人,还有返乡探亲的全家人等等…
本次黑客松,我计划实现一个基于intel Python 驾驶员疲劳检测方案
环境准备
Windows 10系统
DLib库安装
dlib是一个开源的机器学习库,具有一系列高性能的算法和工具,包括人脸检测、图像分割、目标检测、人脸关键点检测、人脸特征提取等。它包含了基于统计学的机器学习算法,如支持向量机(SVM)、回归、聚类和随机森林等,也包括深度学习算法,如卷积神经网络(CNN)、循环神经网络(RNN)和变分自编码器(VAE)等。
安装anconda python 3.9
直接从清华源下载(百度一下)点击anaconda
直接根据提示一步一步安装就好了。
配置conda的国内源
刚才勾选了Add Anaconda3 to my PATH environment variable 选项的同学。点击桌面的搜索框,输入CMD,打开命令行(没有勾选的同学,输入“Anaconda Prompt”)这一步可以直接百度,非常简单。
安装并验证DLib
conda install -c conda-forge dlib
直接在命令行输入:python回车,进入python环境。然后输入:import dlib 回车,没有任何报错和输出就是安装完毕了。
intel Python 及相关库安装
win环境下我们已经安装了conda,使用conda环境去下载对应包就可以了。这个官网有写,就不在阐述了。
驾驶员疲劳检测实现原理
车内驾驶员疲劳监测技术,本质上是在行驶过程中捕捉并分析驾驶员的生物行为信息,比如眼睛、脸部、心脏、脑电活动,等等的技术等等。然而心跳活动和脑电监测由于受接触的限制,没有在车内批量应用。当前最多被采用的疲劳检测手段是驾驶员驾车行为分析,即通过记录和解析驾驶员转动方向盘、踩刹车等行为特征,判别驾驶员是否疲劳。但是这种方式受驾驶员驾驶习惯影响极大。另一大类别的检测方法是:通过图像分析手段对驾驶员脸部与眼睛特征进行疲劳评估。
基于人脸表面特征的疲劳检测,主要分为三个部分,打哈欠、眨眼、点头。本实验从人脸朝向、位置、瞳孔朝向、眼睛开合度、眨眼频率、瞳孔收缩率等数据入手,并通过这些数据,实时地计算出驾驶员的注意力集中程度,分析驾驶员是否疲劳驾驶和及时作出安全提示。
视觉疲劳检测原理:因为人在疲倦时大概会产生两种状态: 眨眼:正常人的眼睛每分钟大约要眨动10-15次,每次眨眼大概0.2-0.4秒,如果疲倦时眨眼次数会增多,速度也会变慢。打哈欠:此时嘴会长大而且会保持一定的状态。因此检测人是否疲劳可以从眼睛的开合度,眨眼频率,以及嘴巴张合程度来判断一个人是否疲劳。
具体实现
1.眨眼计算疲劳
(1) 计算眼睛的宽高比
基本原理:计算 眼睛长宽比 Eye Aspect Ratio,EAR.当人眼睁开时,EAR在某个值上下波动,当人眼闭合时,EAR迅速下降,理论上会接近于零,当时人脸检测模型还没有这么精确。所以我们认为当EAR低于某个阈值时,眼睛处于闭合状态。为检测眨眼次数,需要设置同一次眨眼的连续帧数。眨眼速度比较快,一般1~3帧就完成了眨眼动作。两个阈值都要根据实际情况设置。
(2)当前帧两双眼睛宽高比与前一帧的差值的绝对值(EAR)大于0.2,则认为是疲劳
import cv2
# 定义眼睛宽度和高度的比例
ear = 0.2
# 定义同一次眨眼的连续帧数
consecutive_frames = 3
# 初始化前一帧的眼睛宽度和高度的比例为0
prev_ear = 0