本周的内容主要围绕人脸识别展开,主要包括face verification、face recognition、neural style transfer。
4.1 What is face recognition?
首先来看看人脸识别领域的一些术语。如下图所示,分别说明了人脸确认和人脸识别的概念。人脸确认是个1对1的问题,而人脸识别比人脸确认更难,是个1对K的问题。如果人脸确认系统的正确率是99%,当我有100个人的时候,正确率并不会很高;此时,我们需要进一步提高人脸系统的正确率,比如提升至99.9%。
接下来的几节中,我们将构建face verification系统,它是人脸识别问题的一个组成部分。如果人脸确认系统的准确率足够高,那么我们可以直接将其作为人脸识别系统的一部分。
4.2 One-shot learning
人脸识别的挑战之一就是要解决one-shot学习问题,这意味着,对于大多数人脸识别应用,我们需要仅用一张图片来识别人脸。但如果每个人只有一张训练照片的话,深度学习算法是不可能工作好的。我们先来通过一个例子说明下什么是one-shot,然后再来讨论如何定位这个问题。
假如我们有一个数据库,里面是四个雇员的人脸图像。系统所做的事情就是,尽管对每个人都只见过一张图片,但还是要识别出这个人在不在我的数据库中,如果在,指出是谁;如果不在,告诉我们。因此,one-shot学习问题指从一个样例中学习识别人脸。因此,可以尝试的一种方法是:将一张人脸图像输入到ConvNet中,最后使用softmax来输出 y^ ,但是这样网络的工作效果并不好,因为训练集太少了,对于深度学习网络来说,这是远远不够的。并且,一旦有新人加入团队,又要重新训练网络,这样的话,这个方法并不是一个好方法。
取而代之的是,我们学习一个similarity function(相似性方程),我们想神经网络可以学习一个函数 d ,输入是两张图像,输出是两张图像的差异度。如果两张图像是同一个人的,我们希望输出值较小;如果两张图像是不同的人,我们希望输出值较大。因此,我们可以设置一个超参数阈值
下节将介绍如何训练神经网络来学习函数
4.3 Siamese network
函数 d 的工作是输入两张人脸图像,然后告诉我们它们的差异度。一个好的实现方法是使用Siamese network。
如下图所示。我们将图像
那么,怎么训练这个Siamese network呢?神经网络的参数决定了输入 x 的编码
那么,我们如何定义目标函数,最终得到我们想要的参数呢?
4.4 Triplet loss训练方法之一
一种学习上述神经网络参数的方法是,定义triplet loss,并利用梯度下降法更新参数。下面进行详述。
为了应用triplet loss,我们需要比较图像对。如下图所示,每次需要3张图片,分别是anchor、positive、negative。如下图中蓝色笔迹所示,当 f(A) 、 f(P) 、 f(N) 均为0,或 f(A) 、 f(P) 、 f(N) 均相等时,仍然满足下图中蓝色笔迹的不等式,为了防止这种情况的发生,我们加一个大于0的超参数 α ,如绿色笔迹所示,称其为margin,它的大小决定了 d(A,P) 与 d(A,N)