吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

Part 1:人脸识别

4.1 什么是人脸识别?

  • 人脸验证: 输入图片,验证是不是 A
  • 人脸识别: 有一个库,输入图片,验证是不是库里的一员

人脸识别难度更大,要求准确率更高,因为1%的人脸验证错误在人脸识别中会被放大很多倍。

4.2 One-Shot 学习

对于人脸识别系统,通常我们数据库里仅存储着每个人的一张照片,我们需要用这一张照片来实现该人的识别,这个问题就是one shot 问题。

人脸识别系统需要识别出是否是库中K个人之一,或者不在库中。

对于one shot learning 问题:只有单个样本,不足以训练一个稳健的卷积神经网络来进行不同人的识别过程。而且,在有新的样本成员加入的时候,往往还需要对网络进行重新训练。所以我们不能以传统的方法来实现识别系统。

Similarity 函数:图片两两对比差异

  • d(img1, img2):两幅图片之间的差异度
  • 输入:两幅图片
  • 输出:两者之间的差异度
  • 如果 < 0.5 (阈值可调),则输出“same”;
  • 如果 > 0.5(阈值可调),则输出“different”

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

将输入的人脸图片与数据库中所拥有的图片成对输入Similarity函数,两两对比,则可解决one shot problem。如果有新的人加入团队,则只需将其图片添加至数据库即可。

4.3 Siamese 网络

Siamese 可以实现上文的Similarity 函数

利用同样的卷积神经网络训练两种不同的图片x1, x2分别得到一个多维向量f(x1)和f(x2), 然后比较这两个向量的距离

||f(x1)f(x2)||22

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

训练目标:训练神经网络满足相近图片距离小,相远图片距离远

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

4.4 Triplet 损失

如何通过学习神经网络的参数,得到优质的人脸图片的编码?方法之一就是定义 Triplet 损失函数,并在其之上运用梯度下降。

选取三张图片

  • Anchor (A): 目标图片;
  • Positive(P):与Anchor 属于同一个人的图片;
  • Negative(N):与Anchor不属于同一个人的图片。

目标:同一个人的图片差距小,不同人的图片差距大

L(A,P,N)=max(||f(A)f(P)||||f(A)f(N)||+αmargin,0)

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

如果随机选择图片,有很大概率直接满足上述条件,学习不到任何知识。

所以我们应该选择难度大的图片(d(A,P) 约等于 d(A,N))来训练神经网络,这样学习速度快,效果好,

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

训练集需要多对数据,应用时可以解决One-Shot的问题

对于大型的人脸识别系统,常常具有上百万甚至上亿的训练数据集,我们并我容易得到。所以对于该领域,我们常常是下载别人在网上上传的预训练模型,而不是从头开始。

4.5 面部验证与二分类

人脸识别的方法有很多,除了上节的“Triplet 损失”,还可以利用二分类的方法。

如4.3讨论的,可以成对比较两张图片的编码,是同一个人的输出1表示same, 不是同一个人的输出0表示different。

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

  • 两张图片的神经网络结构和参数完全一致。
  • 训练时同一个人的照片输出1,不同人的照片输出0
  • 最后的sigmoid层次:输入两个128维的向量,输出二分类:
    y^=σ(k=1128wi|f(x(i)k)f(x(j)k)|+b)

    |f(x(i)k)f(x(j)k)|=(f(x(i)k)f(x(j)k))f(x(i)k)2+f(x(j)k)2
  1. 没有必要在每次有人进入识别区后都把数据库的所有图片都计算一遍128维向量。
  2. 事先把库里所有的图片的128维向量计算好即可
  3. 有人识别时仅需要对新图片计算128维向量
  4. 然后与之前计算好的库里图片的128维向量比较即可,节省计算成本和时间。

Part 2:神经风格转换

4.6 什么是神经风格转换?

将内容图像和风格图像融合生成新的图像

  • C: Content
  • S: Style
  • G: Generated image

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

4.7 深度卷积网络在学什么?

依次对各个层进行如下操作:

  • 在当前层挑选一个隐藏单元;
  • 遍历训练集,找到最大化地**了该运算单元的图片或者图片块;
  • 对该层的其他运算单元执行操作。

1. 浅层的图片看到的图片块越小,只能识别一些纹理和边缘阴影等

2. 越深层的图片可以看到的图片块越大,可以识别到一些复杂的事物

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

4.8 代价函数

风格迁移的目标是由内容图片C和风格图片S,生成最终的风格迁移图片G。

定义代价函数

J(G)=αJcontent(C,G)+βJstyle(S,G)

  • J_content(C, G): 代表生成图片G的内容和内容图片C的内容的相似度
  • J_style(S, G): 代表生成图片G的内容和风格图片S的内容的相似度
  • alpha, beta: 两个超参数用来表示以上两者之间的权重

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

执行步骤:

  • 随机初始化生成图片G,如大小为(100, 100, 3);
  • 使用梯度下降算法最小化上面定义的代价函数 J(G), ;

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

4.9 内容代价函数

  • 假设我们使用隐藏层l来计算内容代价(生成的图像内容与l层相似,太浅为纹理,太深太具体,所以选中层)
  • 使用一个预训练的卷积网络。(如,VGG或其他
  • 计算内容图片C和生成图片G的**值之间的相似度(向量差的平和和)

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

4.10 风格损失函数

  • 对比图片l层神经网络上各个通道之间的相关性
  • 首先计算风格矩阵(Style/Gram Matrix)K通道**函数与K’通道**函数的乘积在宽x高的加和
  • S与G的相关性为两个风格矩阵的差的平方和在所有不同通道上的加和

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

内容代价函数和风格代价函数前面的归一化可以加也可以不加,因为总体的代价函数前面有权重系数。

如果对各层都使用风格代价函数,那么会让结果变得更好(此时要给相关性加上各层的系数lambda)。

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

4.11 二维到一维和三维的推广

我们学习的2D的卷积运算也适用于1D和3D的情况。

2D to 1D

  • 如心电图扫描
  • 1D数据只有宽没有高,卷积核再一维的宽上进行扫描
  • 通常一维数据我们使用循环神经网络处理,用卷积神经网络的情况较少

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记

2D to 3D

  • 如CT扫描,电影等
  • 3D数据不只有宽和高,还有深(),卷积核在3D立体上进行扫描
  • 注意3D图片深度与通道的区分,通道是图像像素的深度,不是这里的立体图像块的深度

吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 人脸识别和神经风格转换--课程笔记