本文来自于网易云课堂
什么是人脸识别
one shot
人脸识别面临的一个挑战是你必须要解决一次学习问题。这意味着在绝大多数人脸识别应用中你需要通过单单一张图片就能去识别这个人。但是在历史上,当只有一个训练样例时,神经网络的学习并不好。
假设你的数据库中有4张员工的图片。现在假如说有个人来到了办公室并且她想通过带有人脸识别系统的栅门。现在,系统需要做的就是仅仅通过一张员工的图片来识别前面的这个人就是这个员工。不在数据库中的人机器应该能识别出。一种方法是将图片放到CNN中,输出softmax,如果有4个图片,那么softmax就是5。但这样效果并不好,因为一个4个样本的数据并不能训练出一个好的网络。而且如果有新人加入到你的团队,这时候你还要重新训练网络吗?这听起来不像是一个好办法。
而让系统运行良好的方法是学习similarity函数。具体来说是学习两个图片的差异值,差异值越小说明两个图片很相似。这是解决人类验证的一个可行的方法。
Siamese网络
实现d函数的一个方式是使用Siamese网络,这个网络没有最后的softmax层,而是使用全连接层,里面有128个参数,通过将图片喂给网路就可以得到128个参数,然后对比这128个参数即可,这些参数可以认为是图像的编码。那么如何训练这个网络呢?实际要做的就是训练一个网络,它计算的编码可以用于函数d,来告诉你图片上是不是两个人。更准确的说,神经网络的参数定义了一个编码函数f(xi),如果给定输入图像xi,这个网络会输出128维的编码,你要做的就是学习参数,使得如果两张图片是同一个人,那么两个编码的距离最小。
triplet
要想通过学习神经网络的参数来学到优质的人脸图片编码,方法之一就是定义三元组损失函数然后应用梯度下降。为了应用三元组损失函数,你需要比较成对的图像。为了学习网络的参数,你需要同时看几幅图像,比如第一对,你想让他们距离近一点而第二对你想让他们距离远一点(positive表示一个人而positive表示两个人),这样两对中共有3个图片。利用三元组损失术语来说,你要做的通常是看一个anchor图片,你想让anchor与positive距离近一点,anchor与positive距离远一点。
这里要注意,有一种情况可以满足这个表达式但是没用处,就是把所有的东西都学成0,如果f总是学成0,这个表达式恒成立。如果所有的f都是一个0向量,那么也总能满足这个方程。所以为了确保输出不总是0,也为了确保它不会把所有的编码都设置成相等的,我们需要修改这个目标,也就是让目标小于0,也就是引入另一个超参数
α
α
,使的两个距离差小于0-
α
α
,按照惯例,我们习惯上写+
α
α
。它也叫做间隔(margin)
下面给出三元组损失函数的定义:
面部验证与二分类
另一个训练神经网络的方法是选取一对神经网络使其同时计算这些嵌入,然后同时将其输入到逻辑回归单元,然后进行预测,如果是相同的人,则输出为1,如果不同,则输出为0。这就把人脸识别问题转换成2分类问题。