基于opencv的疲劳检测系统(UI界面,附下载链接和安装部署步骤,代码含详细注释)

疲劳现象出现在日常生活的各种场合,在驾驶环境中对于疲劳的检测尤为重要。

本文基于opencv和dlib模型及头部姿态估计的方法实现实时疲劳检测,采用摄像头实时采集头部视频资料,利用OperCV实现人脸检测,通过dlib模型可以提取出人脸的68个器官特征点,先利用EAR算法和AR算法可以区分出眼部和嘴部的行为状态,根据实验合理设置阈值判断疲劳行为,再利用头部姿态估计的方法,根据俯仰角和滚转角信息综合判断疲劳状态。

1、基本原理

(1)整体流程

疲劳检测系统基于驾驶员面部图像处理来研究驾驶员状态的实时系统。首先挖掘出人在疲劳状态下的表情特征,然后将这些定性的表情特征进行量化,提取出面部特征点及特征指标作为判断依据,再结合实验数据总结出基于这些参数的识别方法,最后输入获取到的状态数据进行识别和判断。
在这里插入图片描述

  • 系统模块初始化:界面功能初始化、模型加载
  • 图像采集:打开摄像头或者导入视频文件
  • 人脸跟踪与检测:使用dlib.get_frontal_face_detector() 获得脸部位置检测器,实现人脸检测跟踪
  • 面部关键点提取:使用dlib.shape_predictor获得脸部特征位置检测器,68个关键点
  • 疲劳检测判断:从眨眼频率(眼部关键点)、打哈欠(嘴巴开合角度)、头部摆动打盹(头部三维姿态)三个角度进行判断

(2)dlib介绍

dib是一种基于C++编程语言的、开源的、跨平台的工具包,利用在C++中创建复杂的程序来解决实际中的机器学习工具和算法。目前,dib 模型已广泛运用于工业和学术创新,包括机器人、安防系统、监控识别设备,嵌入式设备和复杂的高 性能计算环境。dib 中包含许多模块,主要有机器学习、深度学习和图像处理。本文研究的内容主要是dib中的图像处理模块用于人脸特征点提取的头部姿态估计, 相比于目前用于检测的tesorlow和PyToud两大数据库而言,dib 模型在于图像处理以及特征点提取、对比等方面有更大的优越性和通用性。因此dib模型常运用于人脸检测领域。

dlib模型中的特征点提取包含SURF算法和HOG算法。SURF算法(全称: SpeededUp Robust Features)是一种改良的SIFT算子,在保持原算子的优良性能基 础上,改良了其计算复杂、耗时的缺点,主要针对的是角点计算;HOG算法 (Histogram of Oriented Gradient,方向梯度直方图)主要捕获轮廓信息,并对获得的图像进行灰度化处理,并校正来降低图片阴影和光照造成的噪声影响。本实验对于面部特征点提取采用的是面部轮廓信息,因此采用HOG算法对于面部特征点的提取。HOG特征提取的流程如下,首先对于图像灰度化处理后Gamma压缩和归化图像,目的是为了减少光照对于实验的影响,然后在进行统计,先将cell里的梯度进行直方图统计,组合成一个block,作为HOG的特征,并进行归一化处理,进一步减少光照对于图像的影响。

(3)面部关键点提取

我们的脸有几个可以识别的特征,比如眼睛、嘴巴、鼻子等等。当我们使用DLib算法检测这些特征时,我们实际上得到了每个特征点的映射。该映射由68个点(称为地标点)组成,可识别以下特征:
在这里插入图片描述
颚点= 0–16
右眉点= 17–21
左眉点= 22–26
鼻点= 27–35
右眼点= 36–41
左眼点= 42–47
口角= 48–60
嘴唇分数= 61–67

(4)基于EAR算法的眨眼频率检测

EAR算 法(Eye Aspect Ratio,EAR) 是Soukupová等于2016年提出的一种用于检测眨眼频率的算法。它是通过定位眼睛和眼睑的轮廓来计算眼睛的长宽比,其具体计算公式如下所示:
在这里插入图片描述
人脸左眼的坐标为36 ~ 41,右眼的坐标为42 ~ 47。将左、右眼的坐标分别对应为
P1 ~ P6,其睁眼状态与闭眼状态的分布如下图所示。
在这里插入图片描述
当人的眼睛处于睁开状态时,EAR的值会在一定范围内发生变化,当人的眼睛处于闭合状态时,EAR的值会迅速下降,理论上当人处于闭眼状态时EAR的值将为0。正常情况下,人的眨眼速度是较快的,一般完成一次眨眼动作需要1 ~ 3帧;而在疲劳状态下,眨眼速度会降低,眨眼频率会增加。当EAR的值迅速下降至某一阈值之下,又迅速上升至这一阈值之上,则判断为一次眨眼,若在1 min内眨眼的频率明显高于其他情况下,则判定为疲劳驾驶。其中包含的EAR变化的阈值、正常情况下1 min内眨眼的频率都要根据实际情况来确定。在检测过程中,分别计算左、右眼的长宽比(EAR值),对其求平均值,得到最终的EAR值。本系统通过实验,将EAR的阈值设定为0.2,即当EAR的值迅速低于0.2,又迅速升至0.2以上时,即判定为眨眼。通过查
阅相关文献得知,正常情况下,人1 min内眨眼的次数为15 ~ 20次,因此本系统设定当1 min内眨眼频率超过20次时,即判定为疲劳驾驶,立即发出警报提醒。

(5)基于MAR算法的打哈欠频率检测

基于MAR算法的打哈欠频率检测,其原理与上述眨眼频率检测类似,通过Dlib与OpenCV获取嘴部关键节点,利用人脸关键点图中的51、53、57、59的纵坐标,49、55的横坐标,其中49、55坐标分别对应M1、M4,51、53、57、59坐标分别对应M2、M3、M4、M5,来计算嘴部的张开程度,即嘴部的长宽比(MAR),其计
算公式如下式所示。
在这里插入图片描述
正常情况下(说话或者哼歌),嘴张开的时间较短,且程度较小,但是在疲劳状态下,驾驶员会出现打哈欠的行为,嘴张开的时间增长,且程度增大。通常情况下,人说话时嘴巴的连续张开时间不会超过3 s,因此本系统将MAR值从小于阈值到大于阈值,再从大于阈值到小于阈值,并且持续时间超过3 s的过程记为一次打哈欠过程。本文通过对1 000多张打哈欠的照片进行统计得到的阈值0.75作为判断阈值,其准确率达到了97.5%。同时设定当1 min内打哈欠次数超过3次时,即判定为疲劳驾驶,立即发出警报提醒。

(6)基于头部姿态的打盹检测

在真实驾驶环境中,驾驶员的头部姿态估计主要运用于判断驾驶员是否处于疲劳打瞌睡状态,以保证安全,减少事故。在利用预训练的人脸关键点检测模型获得人脸图像关键点位置的基础上对驾驶员头部姿态进行估计,需将以世界坐标系表示的 3D 人脸坐标映射到以图像坐标系表示的2D关键点坐标,转换原理如下图所示。
在这里插入图片描述
在上图中,从左自右依次为相机坐标系、图像坐标系、成像平面坐标系和世界坐标系。由于系统是通过相机提取人脸图像,因此需要首先将世界坐标系映射到相机坐标系或者说是将坐标系与摄像机对齐,其中世界坐标系中的x轴和y轴与图像的x轴和y轴对齐,正z轴与摄像机的光轴对齐,坐标系转换公式为
在这里插入图片描述
式中:R 为旋转矩阵;T 为平移矩阵。从相机坐标系到图像坐标系之间的转换其实
是一种透视变换,在透视变换的过程中产生了一个成像平面坐标系,其中成像平面在相机坐标系中的深度为焦距f,转换关系为
在这里插入图片描述
成像平面坐标系通过下式映射到图像坐标系中
在这里插入图片描述
式中:mx , my 为每个图像方向的像素比例因子;s为传感器的倾斜因子;x0 , y0为光轴和像素平面的交叉点。
最终将上边公式相结合,得到图像坐标系与世界坐标系的映射关系:
在这里插入图片描述
式中:矩阵K为摄像机参数矩阵,通过相机标定的方法可以获取相机的内参矩阵。

本文通过使用张正友提出的相机标定方法进行标定,首先准备一张角点为6 × 4的棋盘,对棋盘图片的角点和亚像素角点信息进行提取,最后标定函数使用这些点生成矩阵,并且生成一个畸变系数矢量,用于消除相机的径向畸变,最终输出的相机内参矩阵为
在这里插入图片描述
在 3DMM获取到世界坐标系中心位置后,得到像素坐标位置和相机的内参便可以利用旋转矩阵R和平移矩阵得到驾驶员头部的欧拉角:
在这里插入图片描述

2、安装步骤

(1)使用环境

Win10、Python3.6、anaconda3、wxFromBuilder

(2)安装指令

首先安装anaconda3,然后安装python3.6环境
conda create -n fatigue python=3.6
conda activate fatigue
运行下列指令,其中dlib-19.8.1-cp36-cp36m-win_amd64.whl在下载链接代码的安装包文件夹里。
同时运行安装包文件夹中的wxFormBuilder_v3.6.2.exe。

pip install wxPython
pip install scipy 
pip install Imutils 
pip install opencv-python==3.4.1.15 
pip install matplotlib
pip install Pyqt5 
pip install dlib-19.8.1-cp36-cp36m-win_amd64.whl

(3)相关模块

  • Opencv:图像处理。
  • Dlib:一个很经典的用于图像处理的开源库,shape_predictor_68_face_landmarks是一个用于人脸68个关键点检测的dat模型库,使用这个模型库可以很方便地进行人脸检测,并进行简单的应用。
  • Numpy:基于Python的n维数值计算扩展。
  • Imutils :一系列使得opencv 便利的功能,包括图像旋转、缩放、平移,骨架化、边缘检测、显示。
  • matplotlib 图像(imutils.opencv2matplotlib(image)。
  • wx: 可视化UI界面
import dlib                     # 人脸识别的库dlib(单独安装)
import numpy as np              # 数据处理的库numpy
import cv2                      # 图像处理的库OpenCv
import wx                       # 构造显示界面的GUI
import wx.xrc
import wx.adv
# import the necessary packages
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 # 数据处理的库 numpy
import argparse
import imutils
import datetime,time
import math
import os

3、实现步骤

安装好环境后,运行python main_UI.py即可启动界面系统。
运行eye_detecting.py单独基于眨眼频率进行疲劳检测。
运行mouth_detecting.py单独基于眨眼频率和打哈欠进行疲劳检测。
运行node_detecting.py单独基于头部姿态进行疲劳检测。
运行main.py基于眨眼频率、打哈欠和头部姿态进行检测,无界面。
运行注意:存在self.predictor = dlib.shape_predictor()的代码需要修改为自己的路径,这里用相对路径有时候会报错,因此建议根据自己的实际情况改为绝对路径。

(1)基于wx的UI界面设计

在这里插入图片描述
在这里插入图片描述

(2)眨眼检测

在这里插入图片描述

(3)打哈欠检测

在这里插入图片描述

(4)点头打瞌睡检测

在这里插入图片描述

4、演示图片

在这里插入图片描述
在这里插入图片描述

5、下载链接

6、小结

由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。

参考链接:https://zhuanlan.zhihu.com/p/630081998

  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值