【深度学习】4.4特殊应用:人脸识别和神经风格转换

什么是人脸识别?

人脸识别通常会用到活体检测,此项技术确认你是一个活人,它可以使用监督学习来实现,去预测是不是一个真人。

人脸识别的一些术语:
人脸验证:如果有一张输入图片,以及某人的ID或者名字,这个系统要做的是验证输入图片是否是这个人,有时候也被称作1对1问题。
人脸识别:比人脸验证更难,准确率要求更高。

之后介绍的是:构造一个人脸验证作为基本模块,如果准确率够高,就可以把它用在识别系统上。

One-Shot学习

人脸识别所面临的一个挑战就是:需要解决“一次学习”问题,这意味着在绝大多数人脸识别应用中,需要通过一张图片或者一个人脸样例就能去识别这个人。
在这里插入图片描述
有一个方法就是将人的照片放进卷积神经网络CNN中,使用softmax单元来输出5种标签分别对应这四个人和四个人都不是。但是这种效果并不好,而且如果有新的成员加入,此时会有6种输出,又要重新训练神经网络了。
所以要让人脸识别能够做到一次学习,应该学习Similarity函数。想要神经网络学习一个用d表示的函数,它以两张图片作为输入,然后输出这两张图片的差异值。
在这里插入图片描述
如果放进同一个人的两张照片,希望这个函数能输出一个很小的值;如果放进两个长相差别很大的人的照片,它就输出一个很大的值。所以在识别过程中,如果这两张图片的差异值小于等于某个阈值τ(这是一个超参数),就能预测这两张图片是同一个人;如果差异值大于τ,就能预测这是不同的两个人。
要将它应用于识别任务,要做的就是拿新的图片,用d函数去比较这两张图片;再让它和数据库中的第二张图片比较。通过计算,最终可以完成识别任务。如果某个人不在数据库中,通过函数d将他们的照片两两进行比较,d对所有的比较都输出一个很大的值,这就证明这个人并不是数据库中4个人的其中一个。

解决一次学习问题只需要学习函数d,通过输入一对图片,让它判断这两张图片是否是同一个人【输入两张人脸,输出它们的相似度】。如果之后有新人加入了团队,只需要将他的照片加入数据库中即可。

Siamese网络

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

下面这个卷积网络经常可以看到:
在这里插入图片描述
输入图片x(1),然后通过一系列卷积、池化和全连接层,最终得到特征向量,有时这个特征向量会送进softmax单元来做分类。
假如这个特征向量有128个数,它是由网络深层的全连接层计算出来的,叫它f(x(1)),可以看作是输入图像x(1)的编码。
建立一个人脸识别系统的方法就是:把第二张图片喂进有同样参数的同样的神经网络,然后得到一个不同的128维的向量,这个向量f(x(2))代表第二个图片的编码。
在这里插入图片描述
定义d(x(1), x(2)) = ||f(x(1))-f(x(2))||,
对于两个不同的输入,运行相同的卷积神经网络,然后比较它们,这就叫做Siamese网络架构。

这两个网络有相同的参数,所以训练Siamese网络实际要做的就是训练一个网络。它计算得到的编码可以用于函数d,然后会输出两张图片是否是同一个人的结果。
更准确地说,神经网络的参数定义了一个编码参数f(x(i)),如果给定输入图像x(i),这个网络会输出x(i)的一个128维的编码。我们要做的就是学习参数,使得如果两个图片x(i)和x(j)是同一个人,那么得到的两个编码的距离就小;如果x(i)和x(j)是不同的人,那么想让它们之间的编码距离大一点。
如果改变这个网络所有层的参数,就会得到不同的编码结果,需要做的就是用反向传播来改变这些所有的参数以确保满足这些条件。

Triplet损失

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

为了应用三元组损失函数,需要比较成对的图像。
在这里插入图片描述
希望anchor图片和positive图片(positive意味着是同一个人)的距离很接近,anchor图片和negative图片的距离离得更远一点。所以需要同时看三张图片,需要看anchor图片、positive图片和negative图片,将其简写成A P N。
将这些写成公式,想要的是网络的参数或者编码能满足以下特性:
d(A, p) = ||f(A)-f(P )||2 ≤ ||f(A)-f(N )||2 = d(A, N),其中f(A)为anchor图片的编码,d可以看作是距离函数。
对上述表达式做一些小的改变:
||f(A)-f(P )||2 - ||f(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
α也叫间隔(margin)参数,它至少为0.2。

三元组损失函数的定义基于三张图片A P N,损失函数L(A, P, N) = max[ ||f(A)-f(P )||2 - ||f(A)-f(N )||2 + α, 0],只要能使左边那个式子≤0,达到目标,损失函数的值都会为0.那么通过损失函数最小化,可以使左边那部分小于等于0。
整个网络的代价函数J为训练集中这些单个三元组损失的总和:
在这里插入图片描述
对于人脸识别系统,可能只有想要识别的某个人的一张照片;但对于训练集,需要确保有同一个人的多个图片。

为了 构建数据集,需要尽可能选择难训练的三元组A P N,即应选择d(A, p)很接近d(A, N)的三元组,这样还可以增加学习算法的计算效率。

(在深度学习领域,如果研究一个特定的某某领域,通常会将系统命名为“某某网络”或者“深度某某”,比如人脸识别通常会有叫人脸网络、深度人脸的算法)

总结:
训练三元组损失需要把训练集做成很多三元组;定义了这些包括A P和N图片的数据集之后,需要用梯度下降最小化前面定义的代价函数J,这样可以反向传播到网络中的所有参数来学习到一种编码,使得如果两张图片是同一个人,它们的d就会很小,否则就会很大。

面部验证与二分类

另一个训练神经网络的方法是选取一对神经网络Siamese网络,使其同时计算这些特征向量的嵌入,然后将其输入到逻辑回归单元,进行预测。如果是相同的人,输出1;若是不同的人,输出0。这样就把人脸识别问题转换为一个二分类问题。
在这里插入图片描述
训练这种系统,可以替换三元组损失的方法。

把人脸验证当作一个监督学习,创建一个只有成对图片的训练集,目标标签1表示一对图片是一个人,目标标签0表示图片中是不同的人。利用不同的成对图片,使用反向传播算法去训练siamese神经网络。

什么是神经风格转换?

在这里插入图片描述
其中,C表示内容图像,S表示风格图像,G表示生成的图像。

深度卷积网络在学什么?

在这里插入图片描述
假设训练了一个卷积神经网络,是一个Alex网络,轻量级网络。希望看到不同层之间隐藏单元的计算结果,可以这样做:
从第一层的隐藏单元开始,遍历所有训练集,但只能看到小部分卷积神经,其中只有一小块图片块激活了激活单元,是有意义的。然后可以选择另一个第一层的隐藏单元,重复之前的步骤。

代价函数

(通过最小化代价函数,可以生成想要的任何图像。)
在这里插入图片描述
为了实现神经风格迁移,需要定义一个关于G的代价函数J(G),用来评判某个生成图像的好坏。将使用梯度下降法去最小化J(G),以便于生成图像G。
代价函数J(G)定义为两个部分,第一部分被称为内容代价Jcontent(C, G),这是一个关于内容图片和生成图片的函数,它是用来度量生成图片G的内容与内容图片C的内容有多相似;第二部分为一个风格代价函数Jstyle(S, G),这是一个关于S和G的函数,用来度量图片G的风格和图片S的风格的相似度。也就是说,令J(G) = αJcontent(C, G) + βJstyle(S, G),其中,α和β是两个超参数,用来确定内容代价和风格代价两者之间的权重。

对于代价函数J(G),为了生成一个新图像,需要随机初始化生成图像G,它可能是100×100×3(3表示RGB通道),或者500×500×3,或者其他。然后更新G为G-dJ(G)/dG,实际上这个步骤更新的是图像G的像素值。

内容代价函数

风格迁移网络的代价函数:
在这里插入图片描述
假设用隐含层l来计算内容代价,如果l是个很小的数(比如1),那么代价函数就会使生成图片像素上非常接近内容图片;实际上隐含层l不会选的太浅,也不会太深,通常l会选择在网络的中间层。
然后用一个预训练的卷积模型,比如VGG网络,或者其他的网络。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值