一、人脸验证 VS 人脸识别
- 验证:一对一关系匹配
- 识别:数据库中存在多个数据,进行一对多的匹配
- 人脸验证的准确率很高,不代表人脸识别准确率很高,错误率会被放大
二、one-shot学习
有一种考虑方式是仅仅训练几个员工的图片,但是会导致一个问题:每加入一个新员工,就需要重新训练整个网络,计算量太大。所以引入one-shot学习,简单来说,就是反馈需要识别的图像和数据库图像的差距。
相似性函数similarity function
将输入图片和数据库图片一一验证,计算出每个差距值d,差距最小的就是匹配的图片。
三、siamese网络架构
前面介绍了利用相似度一次性判断图片匹配与否,那么具体是用什么数值进行相似度计算呢?在DeepFace论文中提出了siamese网络,现在来看看原理。
在下图中,给出两个卷积神经网络结果,可以对任意两幅图进行比对。两幅图经过相同参数的卷积神经网络后,都会在全连接层输出一个向量。如果我们认为该网络输出的编码结果可以代表原图,那么计算这两次输出向量的差的范式,即可计算两幅图的差距。这便是DeepFace中siamese的核心思想。
其中向量差的范式即
网络学习目标
四、Triplet损失
如果想通过训练网络参数得到优质的人脸图片编码,较好的一个方法就是三元组损失函数然后梯度下降法。
三元组损失的意思就是:每次都会看三张图片,一张Anchor(A),一张Positive(P),一张Negative(N)
我们希望得到的目标是
移项后得到
考虑到做差为零的情况是无效的,所以加入一个超参数,使得两个范式的差小于0有效。
也称这个是 间隔。至于这个间隔应该怎么理解,接着往下看。
我们要得到的目标是上面这个不等式对吧,如果,虽然满足不等式条件,但是,这个间距非常小,即很小,所以不利于很好的训练,所以要想拉大这个间距有利于训练,就需要设置更大的,比如等于0.2。那么此时
基于上述不等式,来定义三元组损失函数
分析一下这个式子,如果,则损失值为0,而网络不会关心负值是多少;如果,则损失值取这个正数。
整个网络的代价函数就可以定义了:
学到这里我们发现数据集中需要构造成对的三元组(A, P, N),假设10k张人脸图片中包含了1k个人,那么平均每个人有10张照片。如果某个人只有一张自己的人脸图片,那么系统无法训练。将训练好的系统应用到人脸识别中,就可以一次性识别某个人的人脸了(此时不需要给多张此人的人脸进去)。
数据集怎么样构造?遵守一个原则:A P是同一个人,A N是不同的人。但是由于N的随机性,A N很大概率差距很大,扔给网络训练好像不能学习到很有用的东西。所以选择难训练的三元组学习。
通过三元组损失函数进行梯度下降,可以优化网络参数,得到最佳的人脸图片编码。
五、面部验证和二分类
三元组损失确实是学习训练人脸识别卷积神经网络参数的好方法,现在看看另一种方法:将人脸识别转化为二分类问题。
将输出的两个向量作为逻辑回归单元的输入,最后输出预测值,如果人脸匹配则为1,不匹配则为0.(在之前做三元组损失的时候,我就在思考这个问题,能不能不计算三幅图之间的差距,那样好像显得过程很繁琐,能不能用二分类的方式直接得到0/1分类)
注意:上下两套卷积网络(比如用Siamese网络)的参数是共享的、绑定的。
可以将替换为
这一块称作 卡方平方相似度/卡方平方公式。
假如上面这幅图是需要验证的图片,下面那张图片是数据库中的图片。可以事先计算好数据库中的图片编码,当有需要验证的图片到来时,只需要计算上面网络的正向传播编码结果,然后输入逻辑回归,输出得到预测值0/1. 这就是预先计算方式来节省大量计算时间。
最后总结一下监督学习中的人脸二分类问题
输入的两张图片,通过Siamese卷积神经网络后得到人脸编码,通过逻辑回归得到预测值,其中训练过程是反向传播优化网络和逻辑回归中的参数。