深度学习(十八):人脸验证(face verification)和人脸识别(face recognition)

这是一系列深度学习的介绍,本文不会涉及公式推导,主要是一些算法思想的随笔记录。
适用人群:深度学习初学者,转AI的开发人员。
编程语言:Python
参考资料:吴恩达老师的深度学习系列视频
吴恩达老师深度学习笔记整理
深度学习500问
笔记下载:深度学习个人笔记完整版

人脸验证(face verification)和人脸识别(face recognition)

深度学习(十八):人脸验证(face verification)和人脸识别(face recognition)_第1张图片
人脸验证问题:如果你有一张输入图片,以及某人的ID或者是名字,这个系统要做的是,验证输入图片是否是这个人。有时候也被称作1对1问题,只需要弄明白这个人是否和他声称的身份相符。

人脸识别问题:是1对多问题,比人脸验证问题难很多,为什么呢?假设你有一个验证系统,准确率是99%,还可以。但是现在,假设在识别系统中,如果你把这个验证系统应用在100个人身上,人脸识别上,你犯错的机会就是100倍了。如果每个人犯错的概率是1%,如果你有一个上百人的数据库,如果你想得到一个可接受的识别误差,你要构造一个验证系统,其准确率为99.9%或者更高,然后才可以在100人的数据库上运行,而保证有很大几率不出错。事实上,如果我们有一个100人的数据库,正确率可能需要远大于99%,才能得到很好的效果。

One-Shot学习(One-shot learning)

人脸识别所面临的一个挑战就是你需要解决一次学习问题,这意味着在大多数人脸识别应用中,你需要通过单单一张图片或者单单一个人脸样例就能去识别这个人。所以在一次学习问题中,只能通过一个样本进行学习,以能够认出同一个人。

有一种办法是,将人的照片放进卷积神经网络中,使用softmax单元来输出4种,或者说5种标签,分别对应这4个人,或者4个都不是,所以softmax里我们会有5种输出。但实际上这样效果并不好,因为如此小的训练集不足以去训练一个稳健的神经网络。而且,假如有新人加入你的团队,你现在将会有5个组员需要识别,所以输出就变成了6种,这时你要重新训练你的神经网络。

所以要让人脸识别能够做到一次学习,为了能有更好的效果,你现在要做的应该是学习Similarity函数
深度学习(十八):人脸验证(face verification)和人脸识别(face recognition)_第2张图片

Siamese 网络(Siamese network)

上面提到函数d的作用就是输入两张人脸,然后告诉你它们的相似度。实现这个功能的一个方式就是用Siamese网络,
深度学习(十八):人脸验证(face verification)和人脸识别(face recognition)_第3张图片
建立一个人脸识别系统的方法就是,如果你要比较两个图片的话,例如这里的第一张(编号1)和第二张图片(编号2),你要做的就是把第二张图片喂给有同样参数的同样的神经网络,然后得到一个不同的128维的向量(编号3),这个向量代表或者编码第二个图片,我要把第二张图片的编码叫做f(x(2))。

这些编码很好地代表了这两个图片,你要做的就是定义d.如上图所示,是两者编码之差的范数。对于两个不同的输入,运行相同的卷积神经网络,然后比较它们,这一般叫做Siamese网络架构
深度学习(十八):人脸验证(face verification)和人脸识别(face recognition)_第4张图片
怎么训练这个Siamese神经网络呢?我们需要做的就是学习网络的参数,使输入是同一个人的图像时,两者的差的范数很小,当输入不是同一个人的时候,两者的差的范数很大。

个人的理解,Siamese 网络的作用就类似于NLP中的词嵌入,即如何用向量来表征输入图像。

Triplet 损失

目标函数:Triplet损失,是三元组损失函数。一个基准图像Anchor,一个正类图像Positive,一个负类图像Negative,定义三元组损失函数然后应用梯度下降。
深度学习(十八):人脸验证(face verification)和人脸识别(face recognition)_第5张图片
深度学习(十八):人脸验证(face verification)和人脸识别(face recognition)_第6张图片
这是一个三元组定义的损失,整个网络的代价函数应该是训练集中这些单个三元组损失的总和。假如你有一个10000个图片的训练集,里面是1000个不同的人的照片,你要做的就是取这10000个图片,然后生成这样的三元组,然后训练你的学习算法,对这种代价函数用梯度下降,这个代价函数就是定义在你数据集里的这样的三元组图片上。
深度学习(十八):人脸验证(face verification)和人脸识别(face recognition)_第7张图片
如果你只有每个人一张照片,那么根本没法训练这个系统。当然,训练完这个系统之后,你可以应用到你的一次学习问题上,对于你的人脸识别系统,可能你只有想要识别的某个人的一张照片。但对于训练集,你需要确保有同一个人的多个图片,至少是你训练集里的一部分人,这样就有成对的Anchor和Positive图片了。

如何选择三元组

如果你从训练集中,随机地选择A、P和N,遵守A和P是同一个人,而A和N是不同的人这一原则。有个问题就是,如果随机的选择它们,那么这个约束条件d(A,P)+a<=d(A,N)很容易达到,因为随机选择的图片,A和N比A和P差别很大的概率很大。所以为了构建一个数据集,你要做的就是尽可能选择难训练的三元组A、P和N。具体而言,d(A,P)+a<=d(A,N)满足的条件下,你的A、P和N的选择使得d(A,P)很接近d(A,N),即d(A,P)约等于d(A,N)。

人脸识别的思路

  1. 构建三元组进行训练,根据Triplet损失训练出最优的Siamese神经网络
  2. 将人脸库中的图像经过Siamese神经网络,得到编码后的f(x)值,存入数据库
  3. 检测时输入新的人脸图像,得到编码值,与数据库中的值进行比较,小于等于alpha,则匹配成功;否则,匹配失败

你可能感兴趣的:(深度学习,计算机视觉)