What is face recognition?
Face verification vs. Face recognition
Face verification人脸校验问题,指的是,如果输入某个人的照片,以及名字或ID,系统的任务是,校验输入的照片是否是他自称的那个人。
而Face recognition人脸识别问题要比校验问题复杂得多。假设有一个校验系统,它能达到99%的正确率,如果假设用这个系统来实现数据库里100个人的识别任务,现在就有100种犯错的几率,每个人判断错误的概率是1%。如果你有一个100人的数据库,并且你希望有一个可接受的误差,你可能需要一个有99.9%,甚至更高准确率的识别系统,才能将它应用到100个人的数据库,仍然有很大几率识别错误。
One Shot Learning 单样本学习问题
在单样本学习问题中,你必须从一个样本中学习,就可以做到能认出这个人。大多数人脸识别系统都需要做到这样,因为你的数据库中,可能只有一张员工的照片,可以尝试的一种方法是,输入这个人的照片,到ConvNet,使得它通过softmax,输出一个标签y,这些输出分别对应于上述4个人的一个或都不是,这就是softmax的5个输出,但这个效果不好,因为如果只有这样一个小的训练集,不足以用来训练出一个可以解决这个人物的足够robust的神经网络。如果新进了员工,又重新训练加一个输出,每次进新人都要再训练ConvNet
Learning a "similarity" function学习一个相似性函数,需要用一个神经网络来学习一个函数,表示为d,能对其输入的两个图像img1,img2,输出两个图像之间的差异程度。如果这两张照片是同一个人,希望输出一个小数字,如果是不同的人,输出很大的数。因此,在识别的事件,如果它们之间的差异程度小于一个阈值,tau,这是一个超参数,则可推断是同一个人,如果输出大于tua,则预测是两个不同的人。
Siamese Network
输入一张图片,,经过一系列 的卷积和池化以及全连接层,最后得到了一个特征向量,有时候会把它输入到一个softmax层中,去做分类,但在此,我们专注在这个向量本身,比如说有128个数,由神经网络深处的某个全连接层计算而来,就是该图片的编码。
第二张图片,输入到同一个网络,得到一个不同的128个数字组成的向量,这就是第二张图片的编码。
接下来定义是这两张图片的编码之间差的范数
这种方法,用两个完全相同的卷积神经网络对两张不同的图片进行计算,比较两者的结果,又是称之为孪生网络(Siamese Network)架构。
要做的是训练神经网络,使得它计算的编码可以生成一个函数d来告诉你这两张照片是否为同一个人。更细致的说,是要训练神经网络的参数使得如果输入的两张图片是同一个人,他们编码的差距就会小,如果是不同的人,差距就会大。可以做的是使用反向传播来更改所有这些参数以确保满足这些条件。
Triplet Loss
为了学习神经网络的参数并以此获得一个优良的人脸图片的编码,有一种方法是定义一个引用了梯度下降的三元组损失函数(Triplet Loss). 如下图,前两张图片是同一个人,希望它们编码相对类似,而后两张照片,希望它们的编码十分不同,因为这是不同的人。
在三元组损失的术语当中,Anchor照片是参照,而Postive和Negative照片与Anchor照片进行对比。将一直查看三张照片,希望在训练时,使编码的神经网络中的参数获得以下性质,需要将Anchor照片的编码减去正例照片的编码,希望这个差的平方很小,小于等于Anchor照片与负例照片的编码之间差距的平方。可以将d想象为距离方程。
将式子做一些改变,
有一种情况会使式子的条件轻易得到满足,就是把每一项都学习为0,0减去0,仍然得到0,可以永远满足这个式子的条件。所以,为了确保神经网络不会为所有编码都一直输出0,为了确保它不会把这些编码训练得和其他任何一张照片的编码完全相同,调整这个式子加上一个,也称为margin,这是另一个超参数,这样的话就会防止神经网络输出退化解。
举个例子,如果,,差别很小时,🦁的条件是满足不了的,即使的确会小于等于0,这还不够好,因为想要远远大于,具体来说,想要0.7或更大的数字。
调整的大小,使两者之间的差距可以达到这个超参数alpha的值,这就是margin的用途。
给定三张照片,定义为A,P,N,分别代表Anchor照片,正例照片和负例照片。
在这里定义损失函数
只要前一项小于0,那么损失值便为0,若前一项大于0,则会获得一个大于0的损失值,所以通过尝试使这个最小化,对应的结果使这一项或等于或小于0.
而神经网络中整体损失函数可以是一套训练集中不同三元组对应的损失的总和。加入你有一个训练集,其中包含1000个不同的人组成的10000张照片,你需要做的是用这100000张照片去生成这样的三元组,然后用这种损失函数训练使用梯度下降的学习算法,而该损失函数是定义在从训练集中抽取的图片上的三元组。
如何正确选择三元组来组成你的训练集呢?
现在的问题是,如果随机选择A,P,N,并使AP为相同的人,而AN为不同的人,那么这个约束函数将非常容易得到满足,随机选出的AN之间的差异会远大于AP之间的差异。那么神经网络无法从中学习很多,所以要建立一个训练集,使训练起来比较有难度。
具体来说,相对难训练的三元组,使与相当接近。这样一来,学习算法需要跟努力的使右边的值增加或是左边的值减少,这样才能使左右差距的alpha有意义。选择这样的三元组的效果是增强你的学习算法的效率,如果你随机选择三元组,那么三元组会是非常简单的,梯度下降将如发做任何事。因此只能通过有难度的三元组来使梯度下降,能做到把这两项的距离分得更开。
定义完三元组照片后,训练后,用梯度下降来最小化损失函数,这随后会扩散并影响到神经网络里的所有参数,从而学习这样一个编码,使得当两张照片是同一个人时,这两张照片的d会很小,当人不同时,d的值会很大,这就是所谓的三元组算是,以及训练神经网络来学习一个人脸识别的编码的方法。
Face Verification and Binary Classification
Triplet Loss 是一种学习用于人脸识别的ConvNet的参数的好办法,还有一种方法可以用来学习这些参数,当作一种直接的二元分类问题。运用Siamese网络让它们都计算这些128维的embeddings(just an example),然后将这些输入到一个逻辑回归单元后做出预测,如果这两个人是同一个人,目标结果会输出1,如果不是同一个人,结果会输出0. 所以,这是一种将人脸识别当作二元分类的方法。
最终的逻辑单元做的是输出,最终输出的128个元素的图片编码,套入以下函数中
是图像的编码,下标k表示这个输出向量的第k个元素,将两个不同编码之间的逐个元素差的绝对值之和,然后加上w权重和b,就像正常的逻辑回归单元一样,然后将会在这128个特征上训练出恰当的权重,用来判断这两张照片是否为同一个人。学会预测是0还是1.
需要注意的是,你训练的神经网络,不同的图片编码时,用的都是相同的网络,相同的参数。如果有新员工进来,可以用这个卷积神经网络来计算出编码,得到其编码,很职位预编码(precompute),这种预计算的概念,可以节约相当大的计算量。
总结:当创建了一个包含多对图片的训练集时,当目标标识是1,意味着这一对图片来自同一个人,当目标标识是0时,意味着这一对图片来着不同的人,然后你用反向传播,不同的图片对来训练神经网络。