0. 前言
首先明确几个概念:
- 人脸检测:是指图片中是否存在人脸,若存在则返回人脸在图中的位置坐标
- 人脸验证:验证即验证是否为某人,比如FaceID解锁,手机不需要得出你是谁的结论,只需要验证你是否和手机预存录入的人脸是同一个人。同样使用身份证近火车站,身份验证时是完成你的脸和身份证上的脸是否为同一人。
- 人脸识别:人脸识别则是要得出你是谁。比如上班人脸打卡机,需要预先将你和你同事的人脸录入进数据库储存,上班时打卡机会将你的脸和数据库中的人脸数据对比,得出你是谁
综上,人脸验证时验证你是否是预先定义的人,而人脸识别是识别你是谁。
其次,关于人脸识别的技术,随着深度学习的到来,曾经的手工制作特征已经退居二线,所以当前更多关注深度学习来实现人脸识别。
1. 原理初识
人脸识别系统的工作流程
- Transform:人脸对齐,需要将人脸眼睛位置标准化(大家按同样标准站好,才好对比)
- Crop:无疑,只保存人脸部分。
- Deep Neural Network:深度神经网络,个人理解是提取图片特征,再以特征为依据拼接出128维向量来表示图片
1.1 个人对维度的理解
在2维坐标系中,每一个数据用2个数字表示;3维坐标系中,每一个数据用3个数字表示。同时在这些坐标中,类似的数据在坐标中的位置是比较靠近的。
以二维坐标为例,以下图片展示对于具有离心率和颜色两个特征的椭圆在二维坐标中的分布:
在该坐标系中,每个数据有两个数字(即两个特征)表示,他们根据各自特征散布在坐标系中。
事实上人脸识别输出的128维向量(也即128个数字)代表着每一个人脸数据拥有128个特征,根据这128个特征散布在128维坐标系中。
1.2 如何进行人脸的对比?
从上面的二维坐标系中可以看出,对于相似的两个椭圆(比如形状和颜色相似)通常是邻近的,也即是邻近的椭圆通常是比较相似的。如果我们要识别一个新椭圆,只需要知道新椭圆距离谁最近,就大致能猜出该椭圆的性质和颜色了。
同理,在人脸坐标系中,相似的人脸应该是邻近的,不相似的人脸应该是远离的。对于待检测的人脸,只需要知道在128维坐标系中距离哪个人脸近,就能够大致判断待检测的人脸是谁的人脸了。
1.3 那么如何度量两者之间的距离?
在坐标系中度量两者间的距离,最简单直接的就是欧几里得距离:
这个公式就是中学学的两点之间的距离公式,只不过在人脸坐标系中,扩展到i
扩展到128。如果得到了待识别的人脸F
,则计算F和数据库中所有人脸的距离,得到待识别人脸和数据库中所有人脸的距离,找到距离最小的,也就找到了待检测人脸的用户信息。为了保证精度,我们一般会给这个最小距离设置阈值,只有当阈值低于某个值(也即两个人脸很近很近时,才认为时同一个人,否则就认为数据库中未找到),才认为两张脸来自同一个人
2. 人脸嵌入空间
实际上,人脸所在坐标系更专业的称呼维人脸嵌入空间,而训练一个深度模型就是学习到一个人脸到嵌入空间(坐标系)的映射,即学到一个好的特征空间。
在训练时,我们希望来自同一个人的脸在嵌入空间中应当是靠拢的,不同人的人脸在嵌入空间中应当时远离的。下图中同颜色的表示来自同一个人的人脸:
3. 损失函数
在训练网络时,我们需要定义一种损失函数来表示当前网络的性能,这个损失函数的设计要实现以下目标:
- 能拉近同一人的人脸
- 将其他人的人脸推得更远
图一是网络开始时映射的,但是不符合我们期望的同类近,异类远的映射规则,我们定义的损失将指示网络减少同类的距离并增加异类间的距离。
该损失被称为“三重损失”,是人脸识别中使用最广泛的损失度量标准之一。
因此,使用CNN作为特征提取器并使用三元组损失作为损失度量,网络应该能够学习将同一个人的面孔聚在一起并且将不同个人的面孔分开的面部嵌入空间。
4. 识别新的面孔图像
下图很典型:
左图是训练好的人脸识别模型,新图像在经过模型推理后得到128维向量坐标,在特征空间中的位置如右图,可以看出此时新图像距离红点集群更近,表示新图像和红点集群的图像是同一个人。“更近”则是通过欧几里得距离计算得到的,也称为L2距离,回见1.3节。
5. 注册新人脸到数据库
由于我们训练好的模型会将同一人脸映射到同一区域,不同人脸映射到不同区域,所以新添加的人脸自然与以前的人是不一样的,会被映射到新的一块区域,故并不用改变之前的人脸数据:
所以注册的新人脸只需要将产生的128维向量添加到数据库即可,方便快捷。
5. 引用