人脸识别:基础

人脸识别是一种计算机视觉技术,它使计算机能够从图像中预测一个人的身份。这篇文章介绍整体的人脸识别技术。我们将不深入任何特定算法的细节,但将理解人脸识别的本质。

1.人脸识别与人脸验证对比

许多人认为人脸识别和人脸验证是不同的问题,同时也有许多人认为它们是相同的。答案是,两者背后的思路是相同的,只是应用领域是不同的。 正如名称所提示的那样,人脸验证是尝试对一个人进行身份验证。例如,你可以使用你的脸解锁你的智能手机,但其他人不能。这是1对1的比较。 一个人脸识别系统在已知的人脸数据库中寻找该人,并试图预测该人是谁。这是1对多的比较。如果这个人不在数据库里,这意味着我们以前从未见过这个人。因此,您可以将它们添加到数据库中,或者简单地说他/她是一个不认识的人。这可用于监视,考勤系统等。

简单说,人脸识别用于判断这是谁,人脸验证用于判断这是张三吗。

2、人脸识别:基本的直觉和历史

 人类如何识别面孔?我们不会分析图像的每个像素。我们尝试识别面部的独特特征,并与我们已经认识的人的特征做对比。例如,我们可以只看脸的上部区域,然后判断这是不是特朗普。如果我们还不认识这个人,我们会试着记住这个人的独特特征,下次我们便会认识他。

 

电脑能做同样的事吗?它不能仅仅比较两个图像的部分区域。如果您比较原始像素强度,即使是视角或光照的视觉变化也足以破坏比较结果。计算机需要一些更有意义和更健壮的东西作为比较要素。 受到人类视觉系统的启发,计算机视觉研究人员试图提出不同的特征,以有效地描述每个人脸上的独特性。最简单的特征可以是人脸像素强度的均值和方差,人脸的横宽比等。有数百篇发表的论文提出了不同的特征。

                                                                          统计启发式提取人脸特征 

一些著名的算法,如特征脸、Fischer Faces、LBPH,试图应用数学技巧(如PCA、LDA、直方图等),通过从人脸中提取最有用的信息(特征)并消除冗余信息,以更紧凑的形式表示人脸。

                                                              使用LBP直方图提取特征

随着深度学习的到来,这些人工提取的特征已经落伍了,研究人员现在已经交由CNNs为他们找到合适的特征。我们将在下一节中更详细地讨论这种方法。 这一切都是为了找到一套好的特征来表征脸,然后它可以像区分苹果和橘子一样简单。

3.基于深度学习的现代人脸识别

我们需要学习一个高维特征空间,它能够区分不同人的脸。一旦我们有了一个训练有素的模型,我们就可以使用它为每个人脸生成独特的特征。最后,我们可以比较新面孔的特征和已知面孔的特征来识别人。 如果我们想在已知面孔的数据库中添加一个新的人,我们只需生成特征并将其添加到数据库中。这个过程叫做登记。

3.1.训练一个人脸识别模型

如上所述,人脸识别系统中最重要的部分是建立一个训练有素的模型,可以区分两个不同的人的面孔。让我们更详细地了解训练过程,并讨论面部识别中使用的各种术语。

生成人脸表示或人脸编码

卷积神经网络(CNN)是非常好的特征提取器[1]。他们查看图像的小部分,并使用多层卷积来生成可靠的特征,以区分视觉上不同的对象。请参考我们的帖子了解更多关于CNN的信息。 第一步是使用输入的人脸图像来生成一个简洁清晰的人脸表示。假设我们有一个CNN,它以人脸图像作为输入,并产生一个包含“n”个数字的数组作为输出。我们称这个数组为编码,因为人脸现在只使用这个数组进行表征。我们可以将n=2的情况可视化,如下所示。

 

上图描述了为每幅图像生成的编码,并显示了它们在二维特征空间中的外观(通常,n=128)。图上显示的点被称为人脸嵌入,因为它们现在嵌入在特征空间中。 对于未经训练的网络,为同一人的图像(I1 & I2)生成的人脸嵌入可能接近,也可能不接近,如上图所示。它甚至可能更接近另一个人(J1)。这些嵌入将为数据库中的每个人脸图像生成。

 

学习人脸嵌入空间

训练模型的目的是学习一个很好的特征空间,其中绿色点聚集在一起,彼此靠近,远离红色点,反之亦然。因此,范爷的所有面部嵌入都将彼此接近,远离神仙姐姐的面部嵌入。

Embedding Space

 

但是网络该如何训练呢?

神经网络训练过程中,我们需要告诉网络它的表现如何,以便它能够在下一次迭代中做得更好。因此,我们定义了一个损失度量,它作为网络的指标,评估网络当前完成任务的质量。在此必须指出,我们希望实现的目标是: 使同一人的面部嵌入更近。 把不同人的嵌入分离的更远。 所以,我们一次看3张照片。考虑到我们以前的例子,I1和J1是不同的人的图像及其嵌入如图所示。现在,当网络为I2生成嵌入时,它介于I1和I2之间。损失度量应该告诉网络,减少I1和I2之间的距离,并增加I2和J1之间的距离。这是在神经网络训练过程中通过向后传播实现的。

这种损失度量被完全正确地称为三重损失,是最广泛使用的面部识别损失度量之一。 因此,以CNNs作为特征提取器,以三重态损失作为损失度量,网络应该能够学习一个人脸嵌入空间,其中同一个人的人脸被聚集在一起,不同人的人脸被分离。 

如果对三重损失的原理感兴趣,可以参考如下链接,由于常用的深度学习库都已经实现了各类损失函数(pytorch、tensorflow等),即使不清楚细节,也不影响使用。

参考:Triplet-Loss原理及其实现

3.2.推断-识别新的人脸图像

一旦对网络进行训练,并为训练图像生成了特征嵌入空间,我们就可以放心地使用它来预测新面孔的身份。

从上图可以看出,对于一个新的人脸图像,我们通过使用模型得到了一个人脸嵌入A。再说一次,所谓人脸嵌入,就是一个高维空间的点。接下来,我们需要计算该人脸嵌入与数据库中所有其他人脸嵌入的距离。假如数据库中张三的人脸嵌入最接近人脸嵌入A ,那么这个新的人脸图像就是张三。用于这种比较的最常见的距离度量是L2距离,它就是n维空间中2个点之间的欧几里德距离。 在这个例子中,我们可以看到,由新的人脸图像生成的人脸嵌入更接近属于范爷的绿色点。因此,我们可以预测,新面孔也是范爷。 

3.3如何优化推断时间?

上一节讲到将新的人脸嵌入与数据库中的每个嵌入进行比较,但是有比这种更好的推理方法。人们可以使用机器学习技术来训练一个模型,使用这些人脸嵌入作为输入。让我们简要讨论两种这样的算法。

支持向量机 (SVM)

我们可以用SVMS训练一个多类分类器,以人脸嵌入为输入,每个类将对应一个不同的人。每当我们想对一个新的人脸嵌入进行分类时,我们就可以将它与支持向量进行比较,并预测新人脸所属的类。 这将在很大程度上降低计算成本,因为您不必将新的嵌入与数据库中的数百或数千个嵌入进行比较。要了解更多关于SVM的信息,请参阅我们关于SVM的帖子。

K临近值(k-NN)

虽然支持向量机方法更快,但它有一个缺点。支持向量机是一种参数机器学习方法,这意味着如果将一个新的人添加到数据库中,旧的参数可能无法工作,因此我们需要重新训练支持向量机模型。如果有非参数方法呢?是的!k-NN算法.就是。最近邻分类器是最简单的机器学习算法之一,它不会在推理时对距离进行蛮力计算。对于每个新的点,它只是比较k-最近的邻居,并采用多数投票方案作出决定。 例如,考虑如下所示的嵌入。如果我们使用k=5,则将蓝色点(新嵌入)与其邻居进行比较,并从其中5个中获得多数票。三个邻居投票给红色类,两个投票给绿色类。因此,最后的预测将是红色的!

k-NN explanation

                              使用k-NN(k=5)的多数票预测新点为红色类

3.4.录入新人

到目前为止,我们已经看到嵌入空间是如何使用人脸数据库生成的。但是如果我们想在数据库中添加一个新的人会发生什么呢?我们需要再训练一次神经网络模型吗?——no。这相当简单。 我们可以使用相同的模型为新人创建嵌入。由于模型已经经过训练,而且这是一个不同的人,因此生成的嵌入将远离数据库中其他人的嵌入。我们只是相应地更新已知面孔的数据库就行了。

由于数据库现在已经更新,我们可以用与上面描述的相同的方式进行推理。

 

 参考链接:https://www.learnopencv.com/face-recognition-an-introduction-for-beginners/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值