使用dlib,OpenCV和Python进行人脸识别—人眼瞌睡识别

前期文章我们分享了如何使用python与dlib来进行人脸识别,以及来进行人脸部分的识别,

如下图,dlib人脸数据把人脸分成了68个数据点,从图片可以看出,人脸识别主要是识别:人眉,人眼,人鼻,人嘴以及人脸下颚边框,每个人脸的部位都有不同的数据标签从1-68

当我们识别出人脸的这68个点,可以通过访问不同的数据点来检测到人脸的部分数据

· 口可以访问 [48,68] 。

· 右眉可以访问 [17,22]。

· 左眉可以访问 [22,27] 。

· 右眼可以访问 [36,42]。

· 左眼 可以访问 [42,48]。

· 鼻可以访问 [27,35]。

· 下巴边框可以访问 [0,17]

通过访问不同的数据点,来进行人脸上的部位检测,要想对人眼瞌睡检测,首先我们检测到人眼,下图可以看出人眼有6个数据点




python face_recognition检测人脸的位置 python人脸定位_数据


通过这6个数据点,可以来定位人眼的6个数据点的坐标,从下图可以看出当人眼睁眼时,人眼上的6个数据点的坐标与人眼闭眼时的数据点坐标不完全一样,通过计算6个数据点的坐标差异,便可以通过距离的计算来判断人眼是否闭眼了,通过设置一个阈值,当人眼闭眼的时间超过阈值时,我们定义为这个人已经瞌睡了,此方案用于高速行驶的司机特别有效,以便检查司机师傅是否瞌睡了,若瞌睡了,可以发生报警等措施来叫醒司机,避免大量的车祸的发生


python face_recognition检测人脸的位置 python人脸定位_人脸识别_02


根据Soukupová和Čech在2016年的论文《 使用面部地标进行实时眼睛眨眼检测》,我们可以得出一个反映这种关系的方程,称为眼睛纵横比(EAR):


python face_recognition检测人脸的位置 python人脸定位_人脸识别_03


当检测到人眼时,通过实时计算人眼的纵横比,当人眼纵横比突然变小时,便可以通过此值来判断人眼闭眼了,通过设置的阈值来判断是否人眼瞌睡了

OK,有了以上的基本知识,就开始代码


python face_recognition检测人脸的位置 python人脸定位_数据_04


导入第三方库(1-9行)

定义一个函数,来计算人眼纵横比

计算两组 垂直 眼界标之间的距离(第13和14行)

计算水平眼界标之间的距离 (15行)

最终利用计算公式计算眼睛纵横比(16行)


python face_recognition检测人脸的位置 python人脸定位_实时计算_05


定义人眼纵横比阈值(19行,根据自己人眼大小来设置)

定义闭眼检查帧的次数(20行)

加载人脸检测与68点数据模型(26-27行)

获取左右人眼的坐标参数值(30-31)


python face_recognition检测人脸的位置 python人脸定位_数据_06


从摄像头中获取视频帧(34-35行)

从视频中获取图片帧进行人脸数据点检测(37-45行,本段代码是上期文章分享的内容,不再详细注释)


python face_recognition检测人脸的位置 python人脸定位_人脸识别_07


提取人眼坐标,来计算人眼纵横比(55-60行)

可视化人眼(62-65行)

通过计算出的人眼纵横比来跟设置的阈值来进行对比


python face_recognition检测人脸的位置 python人脸定位_人眼定位python代码_08


当计算的人眼纵横比小于阈值时记录一次,当连续超过50次检测到人眼纵横比小于阈值时说明人眼已经瞌睡(60-64行)

在视频上显示人眼的阈值(69-70行)

最后显示在视频中


python face_recognition检测人脸的位置 python人脸定位_人眼定位python代码_09