人脸应用在计算机视觉体系中占很大一块,在深度学习火起来之前,基于传统机器学习的人脸应用就已经很成熟了,有很多商用应用场景。本文用一个可以实际运行的Demo来说明人脸应用中常见的技术概念,包含‘人脸检测’、‘人脸对比’、‘人脸表征检测(五官定位)’、‘眨眼检测’、‘活体检测’以及‘疲劳检测’。
源码:公众号上
人脸检测
严格来讲,人脸检测只包含对照片中的人脸进行定位,人脸检测只获取照片中人脸的矩形方框(Left、Top、Right、Bottom),再没有其他的内容。现如今网上大部分“人脸检测”概念模糊,包含的东西很多,比如除了刚才说的定位,还包括后面要说的人脸对比,这个严格上讲是错的。
人脸对比
当你使用人脸检测技术发现图片(视频帧)中包含一个人脸,那么如何判断该人脸是谁呢?这个就是我们常见的人脸授权应用,将一个人脸与数据库的其他人脸进行对比,看它与数据库中已有人脸哪个最相似。传统机器学习中,人脸对比过程需要先提取人脸特征编码,寻找一个特征向量来代替原有人脸RGB图片,再通过计算两个人脸特征向量距离来判断人脸是否相似(传统机器学习中的特征工程可以参考上一篇文章)。如果距离小于某值,则认为是同一个人脸,反之亦然。
上图显示传统机器学习方法中人脸对比的过程,过程相对来说比较复杂,需要提取合适的特征向量,该特征对原RGB人脸图片有一定代表性。基于深度学习的方式去做人脸对比就相对来说简单很多,可以直接是一个端到端的流程:
当然也有的做法是先通过神经网络提取人脸特征,然后再用传统机器学习的方式去训练类似SVM模型去做分类。
人脸表征检测(五官定位)
一般人脸应用使用前面说到的‘人脸检测’、‘人脸对比’两种技术就足够了,比如人脸打卡、人脸自动马赛克、人脸开锁等应用。但是更复杂的一些人脸应用只有人脸检测和对比是不够的,比如后面要说的活体检测、疲劳检测等场景。这些时候不仅要判断人脸的位置(矩形方框),还需要检测出人脸五官位置,比如眉毛形状、眼睛区域、鼻子位置、嘴巴位置等等,有了五官位置数据之后,我们就可以基于这些数据做一些更复杂的应用了,比如实时判断视频中的人是否眨眼、是否闭眼、是否说话、是否低头抬头等等。下图为人脸表征检测得到的结果:
上图显示通过机器学习提取到一张人脸表征的68个点,分别为:
(1)左眉毛5个点
(2)右眉毛5个点
(3)左眼睛6个点
(4)右眼睛6个点
(5)鼻梁4个点
(6)鼻尖5个点
(7)上嘴唇/下嘴唇20个点
(8)下巴17个点
我们可以通过下标(python中可以使用切片)快速获取对应的坐标点,该坐标点代表脸部表征在原输入图片中的实际位置(像素单位)。
眨眼检测
对视频每帧做人脸表征检测,得到视频每帧画面中人脸五官的位置数据后,我们可以通过分析人眼区域(六个点组成一个闭合的椭圆形)的闭合程度来判断是否发生眨眼,那么如何衡量每个眼睛的闭合程度呢?根据前人研究:可知,通过每只眼的6个点即可判断眼睛的闭合程度: