美文网首页
人脸识别简介

人脸识别简介

作者: WhistleCai | 来源:发表于2019-06-19 18:25 被阅读0次
    人脸识别.gif

    随着Iphone X发布,革命性的取消了TouchID(指纹识别),而添加了更酷的 FaceID(人脸识别) 模块,FaceID 不仅仅简单的运用在解锁上,还可以在支付,表情等场景中应用,给开发者带来更酷更丰富的应用。

    下面将带着大家揭秘下这项黑科技的原理。

    一、如何识别出来人脸?

    人脸配准用到的 68点

    为了达到定位五官关键点的目的,我们将使用一种面部特征点估计(face landmark estimation)的算法,这一算法的基本思路是找到68个人脸上普遍存在的点(称为特征点, landmark)。

    下巴轮廓17个点 [0-16]
    左眉毛5个点 [17-21]
    右眉毛5个点 [22-26]
    鼻梁4个点 [27-30]
    鼻尖5个点 [31-35]
    左眼6个点 [36-41]
    右眼6个点 [42-47]
    外嘴唇12个点 [48-59]
    内嘴唇8个点 [60-67]

    有了这68个点,我们就可以轻松的知道眼睛和嘴巴在哪儿了,后续我们将图片进行旋转,缩放和错切,使得眼睛和嘴巴尽可能的靠近中心。现在人脸基本上对齐了,这使得下一步更加准确。

    最常见的人脸配准的应用就是人脸贴图了。


    人脸贴图

    二、人脸识别流程

    人脸识别是由一系列的几个相关问题组成的:

    • 首先找到一张图片中的所有人脸。
    • 对于每一张脸来说,无论光线明暗或面朝别处,它依旧能够识别出是同一个人的脸。
    • 能够在每一张脸上找出可用于他人区分的独特之处,比如眼睛多大,脸有多长等等。
    • 最后将这张脸的特点与已知所有人脸进行比较,以确定这个人是谁。
    第一步:找出所有的面孔

    很显然在人脸识别的流程中,得首先找到图片中的人脸。我们在使用手机或相机拍照时都会有人像模式,它能轻松的检测出人脸的位置,帮助相机快速对焦。

    当前一种主流的人脸检测方法就是HOG(Histogram of Oriented Gradients)方向梯度直方图,一种能够检测物体轮廓的算法。

    首先我们把图片灰度化,因为颜色信息对于人脸检测而言没什么用。

    我们分析每个像素以及其周围的像素,根据明暗度画一个箭头,箭头的指向代表了像素逐渐变暗的方向,如果我们重复操作每一个像素,最终像素会被箭头取代。这些箭头被称为梯度(gradients),它们能显示出图像从明亮到黑暗流动的过程。

    如果分析每个像素就太过于繁琐与细节化了,为此我们将图像分割成16x16像素的小方块。在每个小方块中,计算出每个主方向有多少个剃度(有多少指向上,指向右上,指向右等)。然后用指向性最强的那个方向箭头来代替原来那个小方块。

    HOG图像

    最终结果,我们把原始图像转换成一个非常简单的HOG表达形式,它可以很轻松的捕获面部的基本结构。

    为了在HOG图像中找到脸部,我们需要做的是,与已知的一些HOG图案比较,找出看起来最相似的部分。这些HOG图案都是从其他面部训练数据中提取出来的。

    第二步:脸部的不同姿势

    我们已经找出了图片中的人脸,那么如何鉴别面朝不同方向的人脸呢?
    对于电脑来说朝向不同的人脸是不同的东西,为此我们得适当的调整扭曲图片中的人脸,使得眼睛和嘴总是与被检测者重叠。

    第三步:给脸部编码

    我们还有个核心的问题没有解决, 那就是如何区分不同的人脸。

    最简单的方法就是把我们第二步中发现的未知人脸与我们已知的人脸作对比。当我们发现未知的面孔与一个以前标注过的面孔看起来相似的时候,就可以认定他们是同一个人。

    对于计算机分别不同的人,实际上最准确的方法是让计算机自己找出他要收集的测量值。深度学习比人类更懂得哪些面部测量值比较重要。

    所以,解决方案是训练一个深度卷积神经网络,训练让它为脸部生成128个测量值。

    每次训练要观察三个不同的脸部图像:

    • 加载一张已知的人的面部训练图像
    • 加载同一个人的另一张照片
    • 加载另外一个人的照片

    然后,算法查看它自己为这三个图片生成的测量值。再然后,稍微调整神经网络,以确保第一张和第二张生成的测量值接近,而第二张和第三张生成的测量值略有不同。

    庆幸的是 OpenFace 上面的大神已经做完了这些,并且他们发布了几个训练过可以直接使用的网络,感谢开源精神。

    这128个测量值是什么鬼?

    其实我们不用关心,这对我们也不重要。我们关心的是,当看到同一个人的两张不同照片时,我们的计算机能得到几乎相同的数值。

    第四步:从编码中找出人的名字

    最后一步实际上是最简单的一步,我们需要做的是找到数据库中与我们的测试图像的测量值最接近的那个人。

    如何做呢,我们利用一些现成的数学公式,计算两个128数值的欧氏距离。

    人脸识别-8.png

    这样我们得到一个欧式距离值,系统将给它一个认为是同一个人欧氏距离的阀值,即超过这个阀值我们就认定他们是 同 (失) 一 (散) 个 (兄) 人 (弟)。

    三、人脸识别涉及的十个关键技术

    1、人脸检测(Face Detection):是检测出图像中人脸所在位置的一项技术

    人脸检测算法的输入是一张图片,输出是人脸框坐标序列(0个人脸框或1个人脸框或多个人脸框)。一般情况下,输出的人脸坐标框为一个正朝上的正方形,但也有一些人脸检测技术输出的是正朝上的矩形,或者是带旋转方向的矩形。

    常见的人脸检测算法基本是一个“扫描”加“判别”的过程,即算法在图像范围内扫描,再逐个判定候选区域是否是人脸的过程。因此人脸检测算法的计算速度会跟图像尺寸、图像内容相关。开发过程中,我们可以通过设置“输入图像尺寸”、或“最小脸尺寸限制”、或“人脸数量上限”的方式来加速算法。

    人脸检测

    2、人脸配准(Face Alignment):是定位出人脸上五官关键点坐标的一项技术

    人脸配准算法的输入是“一张人脸图片”加“人脸坐标框”,输出五官关键点的坐标序列。五官关键点的数量是预先设定好的一个固定数值,可以根据不同的语义来定义(常见的有5点、68点、90点等等)。

    人脸配准

    人脸配准结果举例(右图中的绿色点位人脸配准结果)

    3、人脸属性识别(Face Attribute):是识别出人脸的性别、年龄、姿态、表情等属性值的一项技术

    一般的人脸属性识别算法的输入是“一张人脸图”和“人脸五官关键点坐标”,输出是人脸相应的属性值。人脸属性识别算法一般会根据人脸五官关键点坐标将人脸对齐(旋转、缩放、扣取等操作后,将人脸调整到预定的大小和形态),然后进行属性分析。

    常规的人脸属性识别算法识别每一个人脸属性时都是一个独立的过程,即人脸属性识别只是对一类算法的统称,性别识别、年龄估计、姿态估计、表情识别都是相互独立的算法。但最新的一些基于深度学习的人脸属性识别也具有一个算法同时输入性别、年龄、姿态等属性值的能力。

    人脸属性识别

    人脸属性识别过程(最右侧文字为属性识别结果)

    4、人脸提特征(Face Feature Extraction):是将一张人脸图像转化为一串固定长度的数值的过程

    这个数值串被称为“人脸特征(Face Feature)”,具有表征这个人脸特点的能力。

    人脸提特征过程的输入也是 “一张人脸图”和“人脸五官关键点坐标”,输出是人脸相应的一个数值串(特征)。人脸提特征算法都会根据人脸五官关键点坐标将人脸对齐预定模式,然后计算特征。

    近几年来,深度学习方法基本统治了人脸提特征算法,这些算法都是固定时长的算法。早前的人脸提特征模型都较大,速度慢,仅使用于后台服务。但最新的一些研究,可以在基本保证算法效果的前提下,将模型大小和运算速度优化到移动端可用的状态。

    人脸提特征

    人脸提特征过程(最右侧数值串为“人脸特征”)

    5、人脸比对(Face Compare):是衡量两个人脸之间相似度的算法

    人脸比对算法的输入是两个人脸特征(注:人脸特征由前面的人脸提特征算法获得),输出是两个特征之间的相似度。人脸验证、人脸识别、人脸检索都是在人脸比对的基础上加一些策略来实现。相对人脸提特征过程,单次的人脸比对耗时极短,几乎可以忽略。

    基于人脸比对可衍生出人脸验证(Face Verification)、人脸识别(Face Recognition)、人脸检索(Face Retrieval)、人脸聚类(Face Cluster)等算法。

    人脸比对

    人脸对比过程(右侧的相似度为人脸比对输出的结果)

    6、人脸验证(Face Verification):是判定两个人脸图是否为同一人的算法

    它的输入是两个人脸特征,通过人脸比对获得两个人脸特征的相似度,通过与预设的阈值比较来验证这两个人脸特征是否属于同一人(即相似度大于阈值,为同一人;小于阈值为不同)。

    人脸验证

    人脸验证过程说明(最右侧“是同一人”为人脸验证的输出)

    7、人脸识别(Face Recognition):是识别出输入人脸图对应身份的算法

    它的输入一个人脸特征,通过和注册在库中N个身份对应的特征进行逐个比对,找出“一个”与输入特征相似度最高的特征。将这个最高相似度值和预设的阈值相比较,如果大于阈值,则返回该特征对应的身份,否则返回“不在库中”。

    人脸识别

    人脸识别过程(右侧身份“jason”为人脸识别结果)

    8、人脸检索:是查找和输入人脸相似的人脸序列的算法

    人脸检索通过将输入的人脸和一个集合中的所有人脸进行比对,根据比对后的相似度对集合中的人脸进行排序。根据相似度从高到低排序的人脸序列即使人脸检索的结果。

    人脸检索

    人脸检索过程(右侧绿框内排序序列为检索结果)

    9、人脸聚类(Face Cluster):是将一个集合内的人脸根据身份进行分组的算法

    人脸聚类也通过将集合内所有的人脸两两之间做人脸比对,再根据这些相似度值进行分析,将属于同一个身份的人划分到一个组里。

    在没有进行人工身份标注前,只知道分到一个组的人脸是属于同一个身份,但不知道确切身份。

    人脸聚类

    人脸聚类过程(右侧绿框内按身份的分组结果为聚类结果)

    10、人脸活体(Face Liveness):是判断人脸图像是来自真人还是来自攻击假体(照片、视频等)的方法

    和前面所提到的人脸技术相比,人脸活体不是一个单纯算法,而是一个问题的解法。这个解法将用户交互和算法紧密结合,不同的交互方式对应于完全不同的算法。比如点头、摇头、眨眼等等。

    人脸识别流程回顾:

    • 使用HOG找出图片中所有人脸的位置。
    • 计算出人脸的68个特征点并适当的调整人脸位置,对齐人脸。
    • 把上一步得到的面部图像放入神经网络,得到128个特征测量值,并保存它们。
    • 与我们以前保存过的测量值一并计算欧氏距离,得到欧氏距离值,比较数值大小,即可得到是否同一个人。

    四、参考链接

    https://blog.csdn.net/zhangbijun1230/article/details/81092223
    http://www.code4app.com/thread-5983-2-1.html
    https://blog.csdn.net/LEON1741/article/details/81358974
    https://www.cnblogs.com/usa007lhy/p/3529563.html
    https://www.cnblogs.com/zhehan54/p/6727590.html
    https://www.cnblogs.com/zhehan54/p/6727606.html
    https://blog.csdn.net/leon1741/article/details/81358466

    相关文章

      网友评论

          本文标题:人脸识别简介

          本文链接:https://www.haomeiwen.com/subject/reqfqctx.html