教你快速使用OpenCV/Python/dlib进行眨眼检测识别!

摘要: 图像识别的新思路:眼睛纵横比,看看大牛如果用这种思路玩转识别眨眼动作!

今天我们来使用面部标志和OpenCV 检测和计算视频流中的眨眼次数。为了构建我们的眨眼检测器,我们将计算一个称为眼睛纵横比(EAR)的指标,由Soukupová和Čech在其2016年的论文“使用面部标志实时眼睛眨眼检测”中介绍。

今天介绍的这个方法与传统的计算眨眼图像处理方法是不同的,使用眼睛的长宽比是更为简洁的解决方案,它涉及到基于眼睛的面部标志之间的距离比例是一个非常简单的计算。

用OpenCV,Python和dlib进行眼睛眨眼检测

我们的眨眼检测实验分为四个部分:

第一步,我们将讨论眼睛的纵横比以及如何用它来确定一个人是否在给定的视频帧中闪烁。

第二步,我们将编写Python,OpenCV和dlib代码来执行面部标志检测和检测视频流中的眨眼。

第三步,基于代码,我们将应用我们的方法来检测示例摄像头流中的眨眼以及视频文件。

最后,我将通过讨论改进我们的眨眼检测器的方法来结束。

1.了解“眼睛纵横比”(EAR)

我们可以应用面部标志检测来定位脸部的重要区域,包括眼睛,眉毛,鼻子,耳朵和嘴巴:

这也意味着我们可以通过了解特定脸部的索引来提取特定的脸部结构:

在眨眼检测方面,我们眼睛结构感兴趣。

每只眼睛由6个(x,y)坐标表示,从眼睛的左角开始,然后围绕该区域的其余部分顺时针显示:

基于这个描述,我们应该抓住重点:这些坐标的宽度和高度之间有一个关系。

Soukupová和Čech在其2016年的论文“使用面部标志实时眼睛眨眼检测”的工作,我们可以推导出反映这种关系的方程,称为眼睛纵横比(EAR):

其中p1,...,p6是2D面部地标位置。

这个方程的分子是计算垂直眼睛标志之间的距离,而分母是计算水平眼睛标志之间的距离,因为只有一组水平点,但是有两组垂直点,所以进行加权分母。

为什么这个方程如此有趣?

我们将会发现,眼睛的长宽比在眼睛张开的时候大致是恒定的,但是在发生眨眼时会迅速下降到零。

使用这个简单的方程,我们可以避免使用图像处理技术,简单地依靠眼睛地标距离的比例来确定一个人是否眨眼。

为了更清楚地说明,看下面的图:

在底部图中绘出了眼纵横比随时间的视频剪辑的曲线图。正如我们所看到的,眼睛纵横比是恒定的,然后迅速下降到接近零,然后再增加,表明一个单一的眨眼已经发生。

2.用面部标志和OpenCV检测眨眼(代码篇)

请打开一个新文件并将其命名为detect_blinks.py。插入以下代码:

要访问磁盘上的视频文件(FileVideoStream)或内置的网络摄像头/ USB摄像头/Raspberry Pi摄像头模块(VideoStream),我们需要使用imutils库,它可以使OpenCV更容易工作。

如果您的系统上没有安装 imutils,请确保使用以下命令安装/升级:

pip install --upgrade imutils

注意:如果您正在使用Python虚拟环境(OpenCV安装教程),请确保使用workon命令首先访问您的虚拟环境,然后安装/升级imutils。

例外的是dlib库,如果您的系统上没有安装dlib,请按照我的dlib安装教程配置您的机器。

接下来,我们将定义eye_aspect_ratio函数:

这个函数接受单一的参数,即给定的眼睛面部标志的(x,y)坐标 。

A,B是计算两组垂直眼睛标志之间的距离,而C是计算水平眼睛标志之间的距离。

最后,将分子和分母相结合,得出最终的眼睛纵横比。然后将眼图长宽比返回给调用函数。

让我们继续解析我们的命令行参数:

detect_blinks.py脚本需要一个命令行参数,然后第二个是可选的参数:

1.--shape-predictor:这是dlib的预训练面部标志检测器的路径。

2.--video:它控制驻留在磁盘上的输入视频文件的路径。如果您想要使用实时视频流,则需在执行脚本时省略此开关。

我们现在需要设置两个重要的常量,您可能需要调整实现,并初始化其他两个重要的变量。

当确定视频流中是否发生眨眼时,我们需要计算眼睛的长宽比。

如果眼睛长宽比低于一定的阈值,然后超过阈值,那么我们将记录一个“眨眼” -EYE_AR_THRESH是这个阈值,我们默认它的值为 0.3,您也可以为自己的应用程序调整它。另外,我们有一个重要的常量,EYE_AR_CONSEC_FRAME,这个值被设置为 3,表明眼睛长宽比小于3时,接着三个连续的帧一定发生眨眼动作。

同样,取决于视频的帧处理吞吐率,您可能需要提高或降低此数字以供您自己实施。

接着初始化两个计数器,COUNTER是眼图长宽比小于EYE_AR_THRESH的连续帧的总数,而 TOTAL则是脚本运行时发生的眨眼的总次数。

现在我们的输入,命令行参数和常量都已经写好了,接着可以初始化dlib的人脸检测器和面部标志检测器:

dlib库使用一个预先训练的人脸检测器,该检测器基于对用于对象检测的定向梯度直方图+线性SVM方法的修改。然后,我们初始化的实际面部标志预测值predictor。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180108A0C61500?refer=cp_1026

扫码关注云+社区