专栏首页企鹅号快讯教你快速使用OpenCV/Python/dlib进行眨眼检测识别!

教你快速使用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。

本文来自企鹅号 - AI讲堂媒体

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 红包照片客户端开发那些事

    2016除夕夜,微信除了摇一摇抢红包,同时还带来了另外一个新玩法——红包照片,而据说很多人也都卖命晒出了珍藏多年的照片! ? 猴年除夕活动已经落下帷幕,回头来看...

    微信终端开发团队
  • iOS图像处理系列 - 双重曝光技术的GPUImage实现

    多重曝光是一种拍摄技法,不过为了烘托气氛,常常选择这种技法,多重曝光技术一般用来拍摄双影或多影照片。可以拍摄出魔术般无中生有的效果,这也正是它的独具魅力之处,所...

    天天P图攻城狮
  • 微信支付人脸智慧时尚店开幕 AI化身导购

    作者:腾讯科技 今日,微信支付、腾讯社交广告与绫致时装集团达成合作,全国首次推出人脸智慧时尚店。微信支付智慧零售行业解决方案通过人脸识别AI技术及精准推荐算法,...

    企鹅号小编
  • 机器学习进阶系列

    本文为博主原创文章,未经博主允许不得转载。有问题可以加微信:lp9628(注明CSDN)。

    MachineLP
  • 头条官方给不了的圣诞帽,Python和OpenCV给你

    随着圣诞的到来,大家纷纷@今日头条给自己的头像加上一顶圣诞帽。当然这种事情用很多P图软件都可以做到。但是作为一个学习图像处理的技术人,还是觉得我们有必要写一个程...

    企鹅号小编
  • iOS基于GPUImage的图像形变设计(复杂形变部分)

    在上一部分,我们介绍了两种简单形变的GPUImage实现方式,包括自定义FragmentShader,和自定义顶点数组。这一部分,我们将介绍更为复杂的一些图像形...

    天天P图攻城狮
  • 基于Python的人脸识别库,离线识别率高达99.38%!

    -欢迎 原文该项目是要构建一款免费、开源、实时、离线的网络 app,支持组织者使用人脸识别技术或二维码识别所有受邀人员。有了世界上最简单的人脸识别库,使用 Py...

    企鹅号小编
  • 微信小程序之生物识别

    1、如有遇到新问题,可以在下方留言或者加QQ群437729329 进行咨询。 2、版权说明:该文章为小程序社区(www.wxapp-union.com/)版主T...

    极乐君
  • 基于深度学习的行人重识别研究综述

    AI 科技评论按:本文为浙江大学罗浩为 AI 科技评论撰写的独家稿件,得到了作者本人指点和审核,在此表示感谢。 前言:行人重识别(Person Re-ident...

    企鹅号小编
  • Github近期最有趣的10款机器学习开源项目

    ? 来源:PaperWeekly 本文共900字,建议阅读6分钟。 本文为你罗列近期Github上十大有趣的机器学习开源项目。 -01- Face Rec...

    数据派THU

扫码关注云+社区

领取腾讯云代金券