赞
踩
眨眼检测是我在卓朗科技实习期间做的第二个项目,这个项目做了大概一个多月的时间,从2019/7/21到2019/8/28才算基本完成眨眼检测的算法模型。眨眼检测主要用于上班的打卡软件上,有的打卡软件上有人脸识别,通过眨眼识别可以防止有人通过照片冒充人脸欺骗打卡软件,另一方面也可以通过眨眼拍照增加用户与打卡产品的互动性,使员工的打开过程更加方便。
眨眼的定义
要想通过计算机识别眨眼过程,那就需要将眨眼的过程转化位数据的变化,通过检测这些数据变化来判断是否眨眼。人在眨眼的过程,眼睛的长度和高度的比值会不断发生变化的,闭眼的时候这个比值就打,睁眼的时候这个比值就小,暂且将这个比值称为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的方法进行眨眼检测
解决方案
收集睁眼和闭眼的数据进行图像分类,训练出检测睁闭眼的分类器。训练出回归眼部位置的线性回归模型。
数据
1.人眼部的图片是首先要收集的数据
2.收集回归眼部位置的线性回归模型所用的的数据
mtcnn每个眼睛会预测一个关键点,这个关键点在眼镜的中间位置,计算这个关键点到明mtcnn框的上下左右的水平和垂直距离。这四个距离是模型的输入,输出为眼睛的左上和右下的点,这个需要自己通过dlib已有的关键点或者其他规则进行标注,收集好输入和对应的输出,就可以训练出来回归眼部位置的线性回归模型了。
运行流程
mtcnn检测人脸 > 通过找到眼部位置 > 将眼部图片输入到图片分类模型 > 输入结果
遇到问题
将图片进行分类容易受到各种因素的影响,比如光照强度,遮挡等等各种因素的影响,需要在训练的时候准备大量的数据,比如带眼镜的和不带眼镜的,有遮挡的和没遮挡的,强光下的和暗光下的,非常受影响。数据收集全面还是非常难的。也可以训练出一个分三类的分类器,前两类是睁闭眼,第三类为随机类。如果眼部区域受到遮挡则会被分到第三类。
红色曲线代表的是当损失函数用mse时模型每次迭代R-squared的变化,蓝色曲线代表的是当损失函数用标准化的mse时模型每次迭代R-squared的变化,这两个模型的训练使用的数据都是单通道的图片,绿色曲线代表的是当损失函数用标准化的mse时且输入数据时三通道时模型每次迭代R-squared的变化。
这三条曲线基本上都在迭代30次后出现过拟合现象,标准化的mse曲线变化比较平稳,丹单纯的mse曲线的变化波动最大。
做眨眼检测这个项目一共用了很多的方法,同时需要了解这个行业公开的数据集和框架,然后是利用好深度学习和机器学习这两个比较重要的工具。每个方法都有它好的一面和坏的一面 ,很难找到一个方法来避免所有的问题。眨眼检测这个项目看似简单,但做到百无一漏或者达到上级的要求还是很困难的。接到这个项目的第二天我就基本上能用dlib检测出眨眼了,但是出现的问题也很多,后来换方法,一直修修改改搞了一个多月,虽然比刚开始的效果好了很多,但是仍然有需要改进的地方。我无法保证在任何环境下都能百分百的检测出眨眼,但百分之九十九还是有的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。