吴恩达深度学习课程之第四门课 卷积神经网络 第四周 特殊应用:人脸识别和神经风格转换

本文参考黄海广主编针对吴恩达深度学习课程DeepLearning.ai 《深度学习课程 笔记 (V5.1 )》

第四周 特殊应用:人脸识别和神经风格转换( Special applications: Face recognition &Neural style transfer)

4.1 什么是人脸识别?(What is face recognition? )

首先,让我们了解一下人脸识别的一些术语。

在人脸识别的相关文献中,人们经常提到人脸验证(face verification)和人脸识别(facerecognition)。

    人脸验证问题,如果你有一张输入图片,以及某人的 ID 或者是名字,这个系统要做的是,验证输入图片是否是这个人。有时候也被称作 1 对 1 问题,只需要弄明白这个人是否和他声称的身份相符。

人脸识别问题比人脸验证问题难很多(整理者注:1 对多问题(1:𝐿)),为什么呢?假设你有一个验证系统,准确率是 99%,还可以。但是现在,假设在识别系统中,𝐿 = 100,如果你把这个验证系统应用在 100 个人身上,人脸识别上,你犯错的机会就是 100 倍了。如果每个人犯错的概率是 1%,如果你有一个上百人的数据库,如果你想得到一个可接受的识误差,你要构造一个验证系统,其准确率为 99.9%或者更高,然后才可以在 100 人的数据库上运行,而保证有很大几率不出错。事实上,如果我们有一个 100 人的数据库,正确率可能需要远大于 99%,才能得到很好的效果。

4.2 One-Shot 学习(One-shot learning)

人脸识别所面临的一个挑战就是你需要解决一次学习问题,这意味着在大多数人脸识别应用中,你需要通过单单一张图片或者单单一个人脸样例就能去识别这个人。大多数人脸识别系统都需要解决这个问题,因为在你的数据库中每个雇员或者组员可能都只有一张照。

有一种办法是,将人的照片放进卷积神经网络中,使用 softmax 单元来输出 4 种,或者说 5 种标签,分别对应这 4 个人,或者 4 个都不是,所以 softmax 里我们会有 5 种输出。但实际上这样效果并不好,因为如此小的训练集不足以去训练一个稳健的神经网络。而且,假如有新人加入你的团队,你现在将会有 5 个组员需要识别,所以输出就变成了6 种,这时你要重新训练你的神经网络吗?这听起来实在不像一个好办法。

所以要让人脸识别能够做到一次学习,为了能有更好的效果,你现在要做的应该是学习Similarity 函数。详细地说,你想要神经网络学习这样一个用d表示地函数,𝑒(img1,img2) = degree of difference between images,它以两张图片作为输入,然后输出这两张图片的差异值。如果放进两个长相差别很大的人的照片,它就输出一个很大的值。所以在识别过程中,如果这两张图片的差异值小于某个阈值𝜏,它是一个超参数,那么这时就能预测这两张图片是同一个人,如果差异值大于 τ,就能预测这是不同的两个人,这就是解决人脸验证问题的一个可行办法。

要注意在这过程中你是如何解决一次学习问题的,只要你能学习这个函数d,通过输入一对图片,它将会告诉你这两张图片是否是同一个人。如果之后有新人加入了你的团队,你只需将他的照片加入你的数据库,系统依然能照常工作。

现在你已经知道函数 d 是如何工作的,通过输入两张照片,它将让你能够解决一次学习问题。那么,下节视频中,我们将会学习如何训练你的神经网络学会这个函数 d

4.3 Siamese 网络(Siamese network)

上个视频中你学到的函数 d 的作用就是输入两张人脸,然后告诉你它们的相似度。实现这个功能的一个方式就是用 Siamese 网络,我们看一下。

你经常看到这样的卷积网络,输入图片𝑦 (1) ,然后通过一系列卷积池化和全连接层最终得到这样的特征向量(编号 1)。有时这个会被送进 softmax 单元来做分类,但在这个视频里我们不会这么做。我们关注的重点是这个向量(编号 1),加如它有 128 个数,它是

由网络深层的全连接层计算出来的,我要给这 128 个数命个名字,把它叫做f(x (1) )。你可以把f(x (1) )看作是输入图像x (1) 的编码,取这个输入图像(编号 2),在这里是 Kian 的图片,然后表示成 128 维的向量。

    建立一个人脸识别系统的方法就是,如果你要比较两个图片的话,例如这里的第一张(编号 1)和第二张图片(编号 2),你要做的就是把第二张图片喂给有同样参数的同样的神经网络,然后得到一个不同的 128 维的向量(编号 3),这个向量代表或者编码第二个图片,

我要把第二张图片的编码叫做f(x (2) )。这里我用x (1) 和x (2) 仅仅代表两个输入图片,他们没必要非是第一个和第二个训练样本,可以是任意两个图片。最后如果你相信这些编码很好地代表了这两个图片,你要做的就是定义d,将x (1) x (2)的距离定义为这两幅图片的编码之差的范数对于两个不同的输入,运行相同的卷积神经网络,然后比较它们,这一般叫做 Siamese网络架构。

怎么训练这个 Siamese 神经网络呢?不要忘了这两个网络有相同的参数,所以你实际要做的就是训练一个网络,它计算得到的编码可以用于函数 d ,它可以告诉你两张图片是否是同一个人。更准确地说,神经网络的参数定义了一个编码函数𝑔(𝑦 (𝑗) ),如果给定输入图像𝑦 (𝑗) ,这个网络会输出𝑦 (𝑗) 的 128 维的编码。你要做的就是学习参数,使得如果两个图片𝑦 (𝑗) 和𝑦 (𝑘)是同一个人,那么你得到的两个编码的距离就小。前面几个幻灯片我都用的是𝑦 (1) 和𝑦 (2) ,其实训练集里任意一对𝑦 (𝑗) 和𝑦 (𝑘) 都可以。相反,如果𝑦 (𝑗) 和𝑦 (𝑘) 是不同的人,那么你会想让它们之间的编码距离大一点。

如果你改变这个网络所有层的参数,你会得到不同的编码结果,你要做的就是用反向传播来改变这些所有的参数,以确保满足这些条件。

你已经了解了 Siamese 网络架构,并且知道你想要网络输出什么,即什么是好的编码。

但是如何定义实际的目标函数,能够让你的神经网络学习并做到我们刚才讨论的内容呢?在下一个视频里,我们会看到如何用三元组损失函数达到这个目的。

4.4 Triplet 损失(Triplet 损失)

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

我们看下这是什么意思,为了应用三元组损失函数,你需要比较成对的图像,比如这个图片,为了学习网络的参数,你需要同时看几幅图片,比如这对图片(编号 1 和编号 2),你想要它们的编码相似,因为这是同一个人。然而假如是这对图片(编号 3 和编号 4),你

会想要它们的编码差异大一些,因为这是不同的人

用三元组损失的术语来说,你要做的通常是看一个 anchor 图片,你想让 anchor 图片和 positive 图片(positive 意味着是同一个人)的距离很接近。然而,当 anchor 图片与 negative图片(negative 意味着是非同一个人)对比时,你会想让他们的距离离得更远一点。

定义了这些包括A、P和N图片的数据集之后,你还需要做的就是用梯度下降最小化我们之前定义的代价函数 J这样做的效果就是反向传播到网络中的所有参数来学习到一种编码,使得如果两个图片是同一个人,那么它们的d就会很小,如果两个图片不是同一个人,它们的d就会很大。这就是三元组损失,并且如何用它来训练网络输出一个好的编码用于人脸识别。

4.5 面 部 验 证 与 二 分 类 ( Face verification and binary classification )

Triplet loss 是一个学习人脸识别卷积网络参数的好方法,还有其他学习参数的方法,让我们看看如何将人脸识别当成一个二分类问题

 

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

处理人脸验证和人脸识别扩展为二分类问题,这样的效果也很好。我希望你知道,在一次学习时,你需要什么来训练人脸验证,或者人脸识别系统。

4.6 什么是神经风格转换?(What is neural style transfer?)

什么是神经风格迁移?利用右边照片的风格来重新创造原本的照片,右边的是梵高的星空,神经风格迁移可以帮你生成下面这张照片。

4.7 什么是深度卷积网络?(What are deep ConvNets learning? ) 

深度卷积网络到底在学什么?

假如你训练了一个卷积神经网络,是一个 Alex 网络轻量级网络,你希望将看到不同层之间隐藏单元的计算结果。

第一层的隐藏单元开始,假设你历遍了训练集,然后找到那些使得单元激活最大化的一些图片,或者是图片块。注意在第一层的隐藏单元,只能看到小部分卷积神经,如果要画出来哪些激活了激活单元,只有一小块图片块是有意义的,因为这就是特定单元所能看到的全部。你选择一个隐藏单元,发现有 9 个图片最大化了单元激活,你可能找到这样的 9 个图片块(编号 1),似乎是图片浅层区域显示了隐藏单元所看到的,找到了像这样的边缘或者线(编号 2),这就是那 9 个最大化地激活了隐藏单元激活项的图片块。

然后你可以选一个另一个第一层的隐藏单元,重复刚才的步骤,这是另一个隐藏单元,似乎第二个由这 9 个图片块(编号 1)组成。看来这个隐藏单元在输入区域,寻找这样的线条(编号 2),我们也称之为接受域。

对其他隐藏单元也进行处理,会发现其他隐藏单元趋向于激活类似于这样的图片。这个似乎对垂直明亮边缘左边有绿色的图片块(编号 1)感兴趣,这一个隐藏单元倾向于橘色,这是一个有趣的图片块(编号 2),红色和绿色混合成褐色或者棕橙色,但是神经元仍可以激活它。

以此类推,这是 9 个不同的代表性神经元,每一个不同的图片块都最大化地激活了。你可以这样理解,第一层的隐藏单元通常会找一些简单的特征,比如说边缘或者颜色阴影。

你已经在第一层的 9 个隐藏单元重复了这个过程好几遍,如果在深层的隐藏单元中进行这样的计算呢?卷积神经网络的深层部分学到了什么?在深层部分,一个隐藏单元会看到一张图片更大的部分,在极端的情况下,可以假设每一个像素都会影响到神经网络更深层的输出,靠后的隐藏单元可以看到更大的图片块,我还会画出和这页中的大小相同的图片块。

但如果我们重复这一过程,这(Layer 1 所示图片)是之前第一层得到的,这个(Layer2 所示图片)是可视化的第 2 层中最大程度激活的 9 个隐藏单元。我想解释一下这个可视化,这是(编号 2 所示)使一个隐藏单元最大激活的 9 个图片块,每一个组合,这是另一组(编号 2),使得一个隐藏单元被激活的 9 个图片块,这个可视化展示了第二层的 9 个隐藏单元,每一个又有 9 个图片块使得隐藏单元有较大的输出或是较大的激活。

在这页里很难看清楚,这些微小的浅层图片块,让我们放大一些,这是第一层,这是第一个被高度激活的单元,你能在输入图片的区域看到,大概是这个角度的边缘(编号 1)放大第二层的可视化图像。

有意思了,第二层似乎检测到更复杂的形状和模式,比如说这个隐藏单元(编号 1),它会找到有很多垂线的垂直图案,这个隐藏单元(编号 2)似乎在左侧有圆形图案时会被高度激活,这个的特征(编号 3)是很细的垂线,以此类推,第二层检测的特征变得更加复杂。

看看第三层我们将其放大,放得更大一点,看得更清楚一点,这些东西激活了第三层。再放大一点,这又很有趣了,这个隐藏单元(编号 1)似乎对图像左下角的圆形很敏感,所以检测到很多车。这一个(编号 2)似乎开始检测到人类,这个(编号 3)似乎检测特定的图案,蜂窝形状或者方形,类似这样规律的图案。有些很难看出来,需要手动弄明白检测到什么,但是第三层明显,检测到更复杂的模式。

下一层呢?这是第四层,检测到的模式和特征更加复杂,这个(编号 1)学习成了一个狗的检测器,但是这些狗看起来都很类似,我并不知道这些狗的种类,但是你知道这些都是狗,他们看起来也类似。第四层中的这个(编号 2)隐藏单元它检测什么?水吗?这个(编号 3)似乎检测到鸟的脚等等。

第五层检测到更加复杂的事物,注意到这(编号 1)也有一个神经元,似乎是一个狗检测器,但是可以检测到的狗似乎更加多样性。这个(编号 2)可以检测到键盘,或者是键盘质地的物体,可能是有很多点的物体。我认为这个神经元(编号 3)可能检测到文本,但是很难确定,这个(编号 4)检测到花。我们已经有了一些进展,从检测简单的事物,比如说,第一层的边缘,第二层的质地,到深层的复杂物体。

4.8 代价函数(Cost function)

要构建一个神经风格迁移系统,为生成的图像定义一个代价函数,通过最小化代价函数,可以生成想要的任何图像。

 

这里有个例子,假设你从这张内容图片(编号 1)和风格(编号 2)图片开始,这是另一张公开的毕加索画作,当你随机初始化G,你随机初始化的生成图像就是这张随机选取像素的白噪声图(编号 3)。接下来运行梯度下降算法,最小化代价函数J(G),逐步处理像素,这样慢慢得到一个生成图片(编号 4、5、6),越来越像用风格图片的风格画出来的内容图片。
在这段视频中你看到了神经风格迁移算法的概要,定义一个生成图片𝐻的代价函数,并将其最小化。

4.9 内容代价函数(Content cost function )

 4.10 风格代价函数(Style cost function )

那么图片的风格到底是什么意思呢?

比如你有这样一张图片,你可能已经对这个计算很熟悉了,它能算出这里是否含有不同隐藏层。现在你选择了某一层𝑚(编号 1),比如这一层去为图片的风格定义一个深度测量,现在我们要做的就是将图片的风格定义为l 层中各个通道之间激活项的相关系数

L层:

现在你将 l 层的激活项取出,这是个的激活项,它是一个三维的数据块。现在问题来了,如何知道这些不同通道之间激活项的相关系数呢?

为了解释这些听起来很含糊不清的词语,现在注意这个激活块,我把它的不同通道渲染成不同的颜色。在这个例子中,假如我们有 5 个通道为了方便讲解,我将它们染成了五种颜色。一般情况下,我们在神经网络中会有许多通道,但这里只用 5 个通道,会更方便我们理解。

为了能捕捉图片的风格,你需要进行下面这些操作:

1. 首先,先看前两个通道,前两个通道(编号 1、2)分别是图中的红色和黄色部分,那我们该如何计算这两个通道间激活项的相关系数呢?

举个例子,在视频的左下角在第一个通道中含有某个激活项,第二个通道也含有某个激活项,于是它们组成了一对数字(编号 1 所示)。然后我们再看看这个激活项块中其他位置的激活项,它们也分别组成了很多对数字(编号 2,3 所示),分别来自第一个通道,也就是红色通道和第二个通道,也就是黄色通道。现在我们得到了很多个数字对,当我们取得这
两个 的通道中所有的数字对后,现在该如何计算它们的相关系数呢?它是如何决定图片风格的呢?

红色的通道(编号 1)对应的是这个神经元,它能找出图片中的特定位置是否含有这些垂直的纹理(编号 3)

而第二个通道也就是黄色的通道(编号 2),对应这个神经元(编号 4),它可以粗略地找出橙色的区域

什么时候两个通道拥有高度相关性呢?如果它们有高度相关性,这幅图片中出现垂直纹理的地方(编号 2),这块地方(编号 4)很大概率是橙色的。

如果说它们是不相关的,又是什么意思呢?显然,这意味着图片中有垂直纹理的地方很大概率不是橙色的。
而相关系数描述的就是当图片某处出现这种垂直纹理时,该处又同时是橙色的可能性。

相关系数这个概念为你提供了一种去测量这些不同的特征的方法,比如这些垂直纹理,这些橙色或是其他的特征去测量它们在图片中的各个位置同时出现或不同时出现的频率。

图片的风格矩阵:

其中,[l]表示第l层隐藏层,k,k'分别表示不同通道,总共通道数为nc[l]。i,j分别b表示该隐藏层的高度和宽度。风格矩阵G[l]_kk'计算第l层隐藏层不同通道对应的所有激活函数输出和。G[l]_kk'的维度为nc[l]xnc[l]。若两个通道之间相似性高,则对应的G[l]_kk'较大;若两个通道之间相似性低,则对应的G[l]_kk'较小。

定义出J[l]style(S,G)的表达式:

定义完J[l]style(S,G)之后,目标是使用梯度下降算法,不断迭代修正G的像素值,使J[l]style(S,G)不断减小。值得一提的是,以上我们只比较计算了一层隐藏层。为了提取的“风格”更多,也可以使用多层隐藏层,然后相加,表达式为:

其中,λ[l]表示累加过程中各层J[l]style(S,G)的权重系数,为超参数。与content不同,content往往通过单层隐藏层即可获取,而style通过多层隐藏层得到会有更好的结果。最终的cost function为

使用梯度下降算法进行迭代优化,进而得到最终的神经风格转换图片。

 

4.11 一维到三维推广(1D and 3D generalizations of models)

什么是 3D 数据?与 1D 数列或数字矩阵不同,现在有了一个 3D 块,一个 3D 输入数据。以做 CT 扫描为例,这是一种使
用 X 光照射,然后输出身体的 3D 模型,CT 扫描实现的是它可以获取身体不同片段

当进行 CT 扫描时,可以看到人体躯干的不同切片(整理者注:图中所示为人体躯干中不同层的切片,附 CT 扫描示意图,图片源于互联网),本质上这个数据是 3 维的。

一种对这份数据的理解方式是,假设你的数据现在具备一定长度、宽度与高度,其中每一个切片都与躯干的切片对应。
如果你想要在 3D 扫描或 CT 扫描中应用卷积网络进行特征识别,你也可以从Convolutions in 2D and 1D里得到想法,并将其应用到 3D 卷积中。为了简单起见,如果你有一个 3D 对象,比如说是 14×14×14,这也是输入 CT 扫描的宽度与深度(后两个 14)。
再次提醒,正如图像不是必须以矩形呈现,3D 对象也不是一定是一个完美立方体,所以长和宽可以不一样,同样 CT 扫描结果的长宽高也可以是不一致的。为了简化讨论,我仅使用14×14×14 为例。

如果你现在使用 5×5×5 过滤器进行卷积,你的过滤器现在也是 3D 的,这将会给你一个10×10×10 的结果输出,技术上来说你也可以再×1(编号 1 所示),如果这有一个 1 的通道。这仅仅是一个 3D 模块,但是你的数据可以有不同数目的通道,那种情况下也是乘 1(编号2 所示),因为通道的数目必须与过滤器匹配。如果你使用 16 过滤器处理 5×5×5×1,接下来的输出将是 10×10×10×16,这将成为你 3D 数据卷积网络上的一层。

某种程度上 3D 数据也可以使用 3D 卷积网络学习,这些过滤器实现的功能正是通过 3D 数据进行特征检测。CT 医疗扫描是 3D 数据的一个实例,另一个数据处理的例子是可以将电影中随时间变化的不同视频切片看作是 3D 数据,可以将这个技术用于检测动作及人物行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Clark-dj

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

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

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

打赏作者

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

抵扣说明:

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

余额充值