首页 🌀深度学习

一、人脸验证 VS 人脸识别

在这里插入图片描述

  • 验证:一对一关系匹配
  • 识别:数据库中存在多个数据,进行一对多的匹配
  • 人脸验证的准确率很高,不代表人脸识别准确率很高,错误率会被放大

二、one-shot学习

在这里插入图片描述
有一种考虑方式是仅仅训练几个员工的图片,但是会导致一个问题:每加入一个新员工,就需要重新训练整个网络,计算量太大。所以引入one-shot学习,简单来说,就是反馈需要识别的图像和数据库图像的差距。

相似性函数similarity function
$$d(img1,img2)=differences_{(img1,img2)}$$
$verification:$
$d\leq \tau,same$
$d>\tau,different$

在这里插入图片描述
将输入图片和数据库图片一一验证,计算出每个差距值d,差距最小的就是匹配的图片。

三、siamese网络架构

在这里插入图片描述
前面介绍了利用相似度一次性判断图片匹配与否,那么具体是用什么数值进行相似度计算呢?在DeepFace论文中提出了siamese网络,现在来看看原理。
在下图中,给出两个卷积神经网络结果,可以对任意两幅图进行比对。两幅图经过相同参数的卷积神经网络后,都会在全连接层输出一个向量。如果我们认为该网络输出的编码结果可以代表原图,那么计算这两次输出向量的差的范式,即可计算两幅图的差距。这便是DeepFace中siamese的核心思想。
在这里插入图片描述
其中向量差的范式即
$$d(x^{(i)},x^{(j)})=||f(x^{(i)})-f(x^{(j)})||_2^2$$

网络学习目标
在这里插入图片描述

四、Triplet损失

在这里插入图片描述

如果想通过训练网络参数得到优质的人脸图片编码,较好的一个方法就是三元组损失函数然后梯度下降法
三元组损失的意思就是:每次都会看三张图片,一张Anchor(A),一张Positive(P),一张Negative(N)
在这里插入图片描述
我们希望得到的目标是
在这里插入图片描述
移项后得到
在这里插入图片描述
考虑到做差为零的情况是无效的,所以加入一个超参数$\alpha$,使得两个范式的差小于0有效。
在这里插入图片描述
也称这个$\alpha$是 间隔。至于这个间隔应该怎么理解,接着往下看。
在这里插入图片描述
我们要得到的目标是上面这个不等式对吧,如果$d(A,P)=0.50,d(A,N)=0.51$,虽然满足不等式条件,但是,这个间距非常小,即$\alpha=0.01$很小,所以不利于很好的训练,所以要想拉大这个间距有利于训练,就需要设置更大的$alpha$,比如等于0.2。那么此时$d(A,P)=0.50,\alpha=0.2\Rightarrow d(A,N)=0.70.$

基于上述不等式,来定义三元组损失函数
$$L(A,P,N)=max(||f(A)-f(P)||^2-||f(A)-f(N)||^2,0)$$

分析一下这个式子,如果$||f(A)-f(P)||^2-||f(A)-f(N)||^2<=0$,则损失值为0,而网络不会关心负值是多少;如果$||f(A)-f(P)||^2-||f(A)-f(N)||^2>0$,则损失值取这个正数。
整个网络的代价函数就可以定义了:
$$J=\sum_{i=1}^m L(A^{(i)},P^{(i)},N^{(i)})$$

学到这里我们发现数据集中需要构造成对的三元组(A, P, N),假设10k张人脸图片中包含了1k个人,那么平均每个人有10张照片。如果某个人只有一张自己的人脸图片,那么系统无法训练。将训练好的系统应用到人脸识别中,就可以一次性识别某个人的人脸了(此时不需要给多张此人的人脸进去)。

数据集怎么样构造?遵守一个原则:A P是同一个人,A N是不同的人。但是由于N的随机性,A N很大概率差距很大,扔给网络训练好像不能学习到很有用的东西。所以选择难训练的三元组学习。
$$d(A,P)\approx d(A,N)$$
在这里插入图片描述
通过三元组损失函数进行梯度下降,可以优化网络参数,得到最佳的人脸图片编码

五、面部验证和二分类

在这里插入图片描述
三元组损失确实是学习训练人脸识别卷积神经网络参数的好方法,现在看看另一种方法:将人脸识别转化为二分类问题。
在这里插入图片描述
将输出的两个向量作为逻辑回归单元的输入,最后输出预测值$\widehat y$,如果人脸匹配则为1,不匹配则为0.(在之前做三元组损失的时候,我就在思考这个问题,能不能不计算三幅图之间的差距,那样好像显得过程很繁琐,能不能用二分类的方式直接得到0/1分类)
注意:上下两套卷积网络(比如用Siamese网络)的参数是共享的、绑定的。

$$\widehat y=sigmoid(\sum_{k=1}^{128} w_i |f(x^{(i)})_k-f(x^{(j)})_k|+b)$$

可以将$|f(x^{(i)})_k-f(x^{(j)})_k|$替换为
$$\frac{[f(x^{(i)})_k-f(x^{(j)})_k]^2}{f(x^{(i)})_k+f(x^{(j)})_k}$$

这一块称作 卡方平方相似度/卡方平方公式。

在这里插入图片描述
假如上面这幅图是需要验证的图片,下面那张图片是数据库中的图片。可以事先计算好数据库中的图片编码,当有需要验证的图片到来时,只需要计算上面网络的正向传播编码结果,然后输入逻辑回归,输出得到预测值0/1. 这就是预先计算方式来节省大量计算时间。

最后总结一下监督学习中的人脸二分类问题
输入的两张图片,通过Siamese卷积神经网络后得到人脸编码,通过逻辑回归得到预测值,其中训练过程是反向传播优化网络和逻辑回归中的参数。
在这里插入图片描述



文章评论

目录