【人脸识别项目一】:眨眼检测

项目背景

眨眼检测是我在卓朗科技实习期间做的第二个项目,这个项目做了大概一个多月的时间,从2019/7/21到2019/8/28才算基本完成眨眼检测的算法模型。眨眼检测主要用于上班的打卡软件上,有的打卡软件上有人脸识别,通过眨眼识别可以防止有人通过照片冒充人脸欺骗打卡软件,另一方面也可以通过眨眼拍照增加用户与打卡产品的互动性,使员工的打开过程更加方便。

项目过程

dlib关键点检测

  • 眨眼的定义
    要想通过计算机识别眨眼过程,那就需要将眨眼的过程转化位数据的变化,通过检测这些数据变化来判断是否眨眼。人在眨眼的过程,眼睛的长度和高度的比值会不断发生变化的,闭眼的时候这个比值就打,睁眼的时候这个比值就小,暂且将这个比值称为ear。
    睁眼
    睁眼
    闭眼
    在这里插入图片描述

  • 解决方案
    通过python的dlib库可以检测人脸和预测关键点,dlib库可以预测人脸的框是个正方形的,在这个正方形框的基础上通过predict类可以检测到人脸的68个关键点。
    在这里插入图片描述
    通过dlib预测的眼部周围的关键点,就可以计算出ear,通过眼角的两个关键点可以计算出眼睛的长度,通过上下眼皮的关键点可以计算出上下眼皮的距离,然后这两者一比就得到了ear。
    由于个体差异,不同人的眼睛大小和形状有着一定差异,单纯的计算ear就会显得不太合理,所以在进行眨眼检测的时候,要先计算出这个人的ear的均值,然后再计算当前帧的ear与这个均值的比值。当这个比值大于某个设定的阈值时,判断位眨眼。

  • 检测过程
    dlib的detector检测人脸 > predictor预测关键点 > 计算ear和mean_ear的比值 > 与阈值比较

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(PREDICTOR_PATH)

生成 predictor 需要预先训练好的模型。该模型可在 dlib sourceforge repository 下载。

https://sourceforge.net/projects/dclib/files/dlib/v18.10/shape_predictor_68_face_landmarks.dat.bz2/download…

  • 新的问题
    直接凭借这自己的经验来定当前帧的ear和ear均值的比值的阈值有些把问题简化,需要训练一个机器学习模型,收集不同人的数据,进行科学分类
  • 解决方法
    录制不同人的睁眼和闭眼的视频,采集他们的ear和ear的均值(近10帧),然后放到SVM中进行分类。用训练好的模型和dlib收集上来的实时数据来检测眨眼。
  • 处理过程
    dlib的detector检测人脸 > predictor预测关键点 > 计算ear和mean_ear > 输入SVM > 输出结果

mtcnn + dlib + svm

  • 问题
    dlib检测人脸的速度比较慢,导致在检测人眼的过程中有漏检的现象,捕捉不到眨眼的那一瞬间。
  • 解决方案
    提高模型的检测速度,dlib检测人脸的过程耗时最长,将检测人脸的模型换位mtcnn,dlib的预测模型不变。mtcnn的预测的人脸框是长方形的,和dlib的不同,但人脸的关键点预测是基于dlib的,所以需要将mtcnn的人脸框通过回归矩阵和偏移量转化为dlib的人脸框,然后再进行关键点检测。回归矩阵和偏移量通过建立线性回归模型就可以得到,模型的输入是mtcnn预测框的位置和五个关键点,输出是长度位三的向量,代表dlib的左上角位置和正方形的边长。
  • 数据
    得到回归矩阵和偏移量需要自己收集数据建立模型,收集不同人的数据,每个人都分别用mtcnn和dlib检测,记录mtcnn的检测结果和dlib的检测结果,然后将这两个模型的结果放到线性回归模型里,模型的输入是mtcnn的数据,输出是dlib的数据,模型训练好以后,在检测时输入mtcnn的数据就能得到dlib的预测框。
  • 运行过程
    mtcnn检测人脸 > 线性回归出dlib的框 > dlib预测关键点 > 计算ear和mean_ear > 输入SVM > 输出结果

mtcnn + pytorch图片分类

  • 问题
    能否通过不计算ear的方法进行眨眼检测

  • 解决方案
    收集睁眼和闭眼的数据进行图像分类,训练出检测睁闭眼的分类器。训练出回归眼部位置的线性回归模型。

  • 数据
    1.人眼部的图片是首先要收集的数据
    在这里插入图片描述
    2.收集回归眼部位置的线性回归模型所用的的数据
    mtcnn每个眼睛会预测一个关键点,这个关键点在眼镜的中间位置,计算这个关键点到明mtcnn框的上下左右的水平和垂直距离。这四个距离是模型的输入,输出为眼睛的左上和右下的点,这个需要自己通过dlib已有的关键点或者其他规则进行标注,收集好输入和对应的输出,就可以训练出来回归眼部位置的线性回归模型了。
    在这里插入图片描述

  • 运行流程
    mtcnn检测人脸 > 通过找到眼部位置 > 将眼部图片输入到图片分类模型 > 输入结果

  • 遇到问题
    将图片进行分类容易受到各种因素的影响,比如光照强度,遮挡等等各种因素的影响,需要在训练的时候准备大量的数据,比如带眼镜的和不带眼镜的,有遮挡的和没遮挡的,强光下的和暗光下的,非常受影响。数据收集全面还是非常难的。也可以训练出一个分三类的分类器,前两类是睁闭眼,第三类为随机类。如果眼部区域受到遮挡则会被分到第三类。

mtcnn + pytorch回归关键点

  • 问题探索
    dlib是预测脸部的68个点,而我们计算ear时只用到眼部点的数据,有些浪费计算资源。所以可以训练个回归眼部关键点的模型。
  • 解决方案
    收集眼部的图片以及眼部关键点的数据,建立卷积加全连接层的模型。然后计算ear
  • 数据收集
    WFLW数据集标注了人脸的98个点,将WFLW的眼部图片和眼部数据提取出来,(注意:提取出来的眼部左边时关于原图,需要减去左上角的坐标,使坐标变成是对应提取出来的眼部图片的),收集WFLW上的数据也是通过mtcnn,因为WFLW上的图片中不止有一个人,然后每张图片只有一个或者两个被标注关键点。需要先通过mtcnn检测出每张图片中脸的检测框,然后看关检点数据是否在这个候选框上,如果在的话就将这张人脸的眼部区域和对应的眼部关键点提取出来。
    在这里插入图片描述
  • 模型
    训练回归关键点的深度学习模型需要把关键点的坐标归一化,因为收集上来的图片大小不一,输入到模型之前需要resize。模型预测的是眼部关键点的相对位置。模型输入乘以原图的宽和高就得到了关键点的在原图的实际位置。
    在这里插入图片描述
    还需要训练一个SVM模型。svm模型的训练数据来自上面回归关键点产生的数据。svm输入的特征分别是ear,mean_ear,ear/mean_ear。后来发现输入这样的数据特征之间相似性比较高,于是输入特征改成log(ear),log(mean_ear)。
  • 运行过程
    mtcnn检测人脸 > 线性回归找到眼部位置 > 将眼睛区域的图像传入回归关键点模型 > 计算log(ear)和log(mean_ear)输入到svm > 输出结果
  • 遇到问题
    回归关键点的模型输入的图片是三通道到,在正常白光的环境下预测比较准确,但在比较柔和的黄光或其他颜色光线下关键点的预测就会不灵敏。
    -解决方案
    将模型的输入图片由三通道改为单通道,输入图片变成单通道的灰度图,就不会受外界的光线颜色的影响。灰度图就需要亮度高一些,不然轮廓看不清。将比较暗的原图转化成灰度图的话,灰度图就会很难看出眼部的轮廓。所以需要进行一下数据增广,分别增广像素值是原图0.4倍和0.5倍的训练数据,这样训练出来的模型,就可以处理像素值较低的灰度图了。(在训练模型或者预测的时候,读取图片是读取成灰度图就行了,不需要将原图也保存成灰度图)
    在这里插入图片描述

损失函数

在这里插入图片描述
红色曲线代表的是当损失函数用mse时模型每次迭代R-squared的变化,蓝色曲线代表的是当损失函数用标准化的mse时模型每次迭代R-squared的变化,这两个模型的训练使用的数据都是单通道的图片,绿色曲线代表的是当损失函数用标准化的mse时且输入数据时三通道时模型每次迭代R-squared的变化。
这三条曲线基本上都在迭代30次后出现过拟合现象,标准化的mse曲线变化比较平稳,丹单纯的mse曲线的变化波动最大。

项目总结

做眨眼检测这个项目一共用了很多的方法,同时需要了解这个行业公开的数据集和框架,然后是利用好深度学习和机器学习这两个比较重要的工具。每个方法都有它好的一面和坏的一面 ,很难找到一个方法来避免所有的问题。眨眼检测这个项目看似简单,但做到百无一漏或者达到上级的要求还是很困难的。接到这个项目的第二天我就基本上能用dlib检测出眨眼了,但是出现的问题也很多,后来换方法,一直修修改改搞了一个多月,虽然比刚开始的效果好了很多,但是仍然有需要改进的地方。我无法保证在任何环境下都能百分百的检测出眨眼,但百分之九十九还是有的。

  • 11
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值