Face Recognition人脸识别

1. Face verification && Face recognition

人脸验证:验证输入图片中的那个人是否与他声称的身份相符,也被称作1对1问题。

人脸识别:从一个大量人脸数据库中找到匹配输入图片中的那个人。如果你有一个上百人的数据库,你想得到一个可接受的识别误差,那么我们就需要构造一个验证系统,用于验证人脸识别的准确度,当准确率达到99.9%或更高时才可以在100人的数据库上运行而保证有很大几率不出错。

构造一个人脸验证作为基本模块,如果准确率够高,就可以把它用在识别系统上。人脸识别之所以难,是因为要解决one-shot(一次学习)问题。

2. One-shot Learning

在绝大多数人脸识别应用中,我们需要通过单单一张图片或者单单一个人脸样例,就能去识别这个人,one-shot learning就是解决这个问题的。

假设我们训练这样的人脸识别模型:将数据库中所有人的人脸图片都输入到神经网络中进行训练,使用softmax输出人数量+1个标签,分别来对应前面的这些人或者非数据库中人脸,所以会有人数量+1中输出。但实际上这样效果不好,因为如此小的训练集,不足以去训练一个稳健的神经网络。而且当你有新人需要加入到数据库中,我们需要重新训练神经网络模型,这种做法肯定是不可取的。

所以要让人脸识别能够做到一次学习,为了能有更好的效果,我们现在要做的是学习 Similarity函数

我们需要神经网络学习这样一个用d表示的函数,它以两张图片作为输入,然后输出这两张图片的差异值。如果你放进同一个人的两张照片,我们希望它能输出一个很小的值。如果放进两个长相差别很大的人的照片,我们希望它输出的值很大。所以在识别过程中,如果这两张图的差异值小于某个阈值t,它是一个超参数,那么这时就能预测这两张图片是同一个人;如果差异值大于t,那么就能预测这是不同的两个人。这就是解决人脸验证的一个可行办法。

只要你能学习这个函数d,通过输入一对图片,它将会告诉你这两张照片是否是同一个人。如果之后有新的人脸加入到数据库中,系统依然能照常工作。这样我们就通过函数d解决了one-shot学习问题。

3. Siamese network

实现函数d的这个功能的一个方式就是用Siamese网络。

输入图片x^{(1)},然后通过一系列卷积、池化、全连接层,最终得到这样的特征向量(有时候会送进softmax单元来做分类,但是在这里我们不这么做)。我们重点关注的是那个最后的全连接层向量,我们假设它有128个数,它是由深层网络的全连接层计算出来的,我要给这128个数命名为f(x^{(1)}),你可以把f(x^{(1)})看作是输入图像x^{(1)}的编码。所以我们取这个输入图像,然后表示成一个128维的向量。、

建立一个人脸识别系统的方法就是,如果你要比较两个图片的话,例如这里的x^{(1)}x^{(2)},我们需要将x^{(2)}继续输入进有同样参数的同样的神经网络,然后得到一个不同的128维的向量,这个向量代表输入图像x^{(2)}的编码f(x^{(2)})

这里我们认为这两个编码结果都能能够很好地代表这两张图片,我们要做的就是定义d,将x^{(1)}x^{(2)}的距离d定义为两幅图片的编码之差的范数。所以对于两个不同的输入,运行相同的卷积神经网络,然后比较它们,这一般叫做Siamese网络架构。这里提到的很多观点,都来自于DeepFace这篇论文。

如何训练这个Siamese神经网络?我们实际要做的是训练一个网络,它计算得到的编码可以用于函数d,函数d的结果告诉我们两张照片是否是同一个人。更准确度的说,神经网络的参数定义了一个编码函数f(x^{(i)})。如果给定输入图像x^{(i)},这个网络会输出x^{(i)}的一个128维的编码。我们要做的是学习参数,使得如果两个图片是x^{(i)}x^{(j)}是同一个人,那么你得到的两个编码的距离就小;当是不同人的时候,编码的差距就越大。

接下来我们会用到三元组损失函数来训练上面神经网络的参数!

4. Triplet loss

要想通过学习神经网络的参数来得到优质的人脸图片编码,方法之一就是定义三元组损失函数然后应用梯度下降。

为了应用三元组损失函数,我们需要比较成对的图像,我们希望相似人的编码差异较小,不同人的编码差异较大,用三元组损失的术语来说,你要做的通常是看一个anchor图片,你想让anchor图片和positive图片的编码差异较小,anchor图片和Negative的图片编码差异较大。这就是为什么叫做三元组损失,它代表你通常会同时看三张图片,你需要看anchor图片,positive图片、negative图片,这里把这三个图片简写成APN。把这些写成公式的话,你想要的是网络的参数或者编码能够满足以下特性,即

anchor图片编码减去positive图片编码,我们希望这个数值很小,准确说让它们距离的平方小于等于 anchor图片编码减去negative图片编码的平方。

我们将这个式子做一下变化,再考虑极端情况下左侧相减结果都是0,然后0\leqslant0,为了阻止网络出现这种情况,我们需要修改右侧这个目标,也就是说不能刚好小于等于0,应该是相当小于0,所以左侧应该小于一个负的α值(α是另一个超参数),这个就可以阻止网络输出无用的结果。我们对式子做变化移到左边去,这个α也叫作间隔(margin)。间隔参数α的作用是拉大了anchor和positive图片对和anchor与negative图片对之间的差距。

三元组损失函数的定义基于三张图片A、P、N,A和P是同一个人,A和N是不同人。  

我们对前面图片的式子进行变换,损失函数就变成了取最大值。只要第一项小于0,那么损失函数就是0.所以我们只要保证第一项小于等于0,那么这个例子的损失就是0。另一方面如果这个大于0,然后你取它们的最大值,这样你就会得到一个正的损失值,通过最小化这个损失函数,达到的效果就是使这部分成为0或者小于等于0。只要这个损失函数小于等于0,网络不会关心它负值有多大。

上面这是一个三元组定义的损失, 整个网络的代价函数应该是训练集中这些单个三元组损失的总和。假设你有一个包含1000个不同人脸的总共10000张图片的训练集,你要做的是取这10000张图片然后生成这样的三元组,然后训练你的学习算法,对这种代价函数用梯度下降,这个代价函数就是定义在你数据集里的这样的三元组图片上。注意,为了定义三元组的数据集,你需要成对的A和P,即同一个人的成对的图片。

当训练完这个系统之后,你可以应用到你的一次学习问题上,对于你的人脸识别系统,可能你只有想要识别的某个人的一张照片,但对于训练集,你需要确保有同一个人的多个图片,至少是你训练集里的一部分人。这样就有了成对的anchor和positive图片了。

5. Face verification and binary classification 

Triple loss 三元组是一个学习人脸识别卷积网络参数的好方法,还有其他学习参数的方法。这里我们将人脸识别当做一个二分类问题。

另一个训练神经网络的方法是选取一对神经网络,选取Siamese网络,使其同时计算这些嵌入(比如说128维的嵌入),然后将其输入到逻辑回归单元,然后进行预测。如果是相同的人,那么输出是1,若是不同的人,则输出是0。这就把人脸识别问题转换为一个二分类问题。训练这种系统时,可以替换triple loss的方法。

最后的逻辑回归单元是怎么处理的?输出\hat{y}会变成比如说sigmoid函数输出。相比前面直接放入这些编码,这里我们将这一对128维的每一维元素差值的绝对值都计算出来,就想做普通的逻辑回归一样,你将在这128个单元上训练合适的权重,用来预测两张图片是否是同一个人。这是一个很合理的方法来学习预测0或1。

在这个学习公式中,我们输入是一对图片,这是你的训练输入x,输出y是0或1,取决于你的输入是否是相似图片。与之前类似,我们在训练一个Siamese网络,意味着上面这个神经网络拥有的参数和下面神经网络参数相同。

这里我们假设我们需要添加一张新图片到数据库中,我们可以提前将该图片输入到神经网络中获取其128维的特征编码。当我们输入一个新图片来识别时,我们可以直接使用上方的卷积网络输出新图片编码与之前计算好的编码直接进行比较,然后输出预测值\hat{y}。这种预先计算的思想可以节省大量的计算。这个预训练的工作将人脸识别当作一个二分类问题,也可以用在triplet损失函数上。

总结一下,把人脸验证当作一个监督学习,创建一个只有成对图片的训练集,不是三个一组,而是成对的图片,目标标签y是1,表示同一个人;目标标签y是0,表示图片中是不同的人。利用不同的成对图片,使用反向传播算法,去训练神经网络,训练Siamese神经网络。这种处理人脸验证和识别拓展为二分类问题的效果也很好。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值