深度学习笔记(三十九)卷积网络特殊应用:人脸识别算法原理

一、人脸验证 VS 人脸识别

在这里插入图片描述

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

二、one-shot学习

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

相似性函数similarity function
d ( i m g 1 , i m g 2 ) = d i f f e r e n c e s ( i m g 1 , i m g 2 ) d(img1,img2)=differences_{(img1,img2)} d(img1,img2)=differences(img1,img2)
v e r i f i c a t i o n : verification: verification:
d ≤ τ , s a m e d\leq \tau,same dτ,same
d > τ , d i f f e r e n t d>\tau,different d>τ,different

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

三、siamese网络架构

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

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

四、Triplet损失

在这里插入图片描述

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

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

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

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

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

五、面部验证和二分类

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

y ^ = s i g m o i d ( ∑ k = 1 128 w i ∣ f ( x ( i ) ) k − f ( x ( j ) ) k ∣ + b ) \widehat y=sigmoid(\sum_{k=1}^{128} w_i |f(x^{(i)})_k-f(x^{(j)})_k|+b) y =sigmoid(k=1128wif(x(i))kf(x(j))k+b)

可以将 ∣ f ( x ( i ) ) k − f ( x ( j ) ) k ∣ |f(x^{(i)})_k-f(x^{(j)})_k| f(x(i))kf(x(j))k替换为
[ f ( x ( i ) ) k − f ( x ( j ) ) k ] 2 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} f(x(i))k+f(x(j))k[f(x(i))kf(x(j))k]2

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.zwX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值