4.4)深度卷积网络:人脸识别和神经风格转换
目录
5)Face Verification and Binary Classification
6)What is neural style transfer?
7)What are deep ConvNets learning?
11)1D and 3D generalizations f models
以下笔记是吴恩达老师深度学习课程第四门课第四周的的学习笔记:Face recognition & neural style transfer。笔记参考了黄海广博士的内容,在此表示感谢。
1)What is face recognition?
首先介绍一下人脸验证(Face Verification)和人脸识别(Face Recognition)的区别:
人脸验证:一般是一个一对一问题,只需要验证输入的人脸图像是否与某个已知的身份信息对应;
人脸识别:一个更为复杂的一对多问题,需要验证输入的人脸图像是否与多个已知身份信息中的某一个匹配。
一般来说,由于需要匹配的身份信息更多导致错误率增加,人脸识别比人脸验证更难一些。因为假设人脸验证系统的错误率是1%,那么在人脸识别中,输出分别与K个模板都进行比较,则相应的错误率就会增加,约K%。模板个数越多,错误率越大一些。
2)One-shot learning
人脸识别所面临的一个挑战是要求系统只采集某人的一个面部样本,就能快速准确地识别出这个人,即只用一个训练样本来获得准确的预测结果。这被称为One-Shot 学习。
有一种方法是假设数据库中存有 N 个人的身份信息,对于每张输入图像,用 Softmax 输出 N 种标签。然而这种方法的实际效果很差,因为过小的训练集不足以训练出一个稳健的神经网络;并且如果有新的身份信息入库,需要重新训练神经网络,不够灵活。
因此,我们通过学习一个 Similarity 函数来实现 One-Shot 学习过程。Similarity 函数定义了输入的两幅图像的差异度,其公式如下:
可以设置一个超参数 作为阈值,作为判断两幅图片是否为同一个人的依据。
3)Siamese network
实现 Similarity 函数的一种方式是使用Siamese 网络,它是一种对两个不同输入运行相同的卷积网络,然后对它们的结果进行比较的神经网络。
如上图示例,将图片 分别输入两个相同的卷积网络中,经过全连接层后不再进行 Softmax,而是得到特征向量
。这时,Similarity 函数就被定义为两个特征向量之差的 L2 范数:
值得一提的是,不同图片的CNN网络所有结构和参数都是一样的。我们的目标就是利用梯度下降算法,不断调整网络参数,使得属于同一人的图片之间d(x(1),x(2))很小,而不同人的图片之间d(x(1),x(2))很大。
相关论文:Taigman et al., 2014, DeepFace closing the gap to human level performance
4)Triplet Loss(重点)
Triplet 损失函数用于训练出合适的参数,以获得高质量的人脸图像编码。“Triplet”一词来源于训练这个神经网络需要大量包含 Anchor(靶目标)、Positive(正例)、Negative(反例)的图片组,其中 Anchor 和 Positive 需要是同一个人的人脸图像。
对于这三张图片,应该有:
其中, 被称为间隔(margin),用于确保不会总是输出零向量(或者一个恒定的值)。
Triplet 损失函数的定义:
其中,因为 的值需要小于等于 0,因此取它和 0 的更大值。
对于大小为m 的训练集,代价函数为:
通过梯度下降最小化代价函数。
在选择训练样本时,随机选择容易使 Anchor 和 Positive 极为接近,而 Anchor 和 Negative 相差较大,以致训练出来的模型容易抓不到关键的区别。因此,最好的做法是人为增加 Anchor 和 Positive 的区别,缩小 Anchor 和 Negative 的区别,促使模型去学习不同人脸之间的关键差异。
相关论文:Schroff et al., 2015, FaceNet: A unified embedding for face recognition and clustering
5)Face Verification and Binary Classification
除了 Triplet 损失函数,二分类结构也可用于学习参数以解决人脸识别问题。其做法是输入一对图片,将两个 Siamese 网络产生的特征向量输入至同一个 Sigmoid 单元,输出 1 则表示是识别为同一人,输出 0 则表示识别为不同的人。
Sigmoid 单元对应的表达式为:
其中, 和 b都是通过梯度下降算法迭代训练得到的参数。上述计算表达式也可以用另一种表达式代替:
其中,被称为
方相似度。
无论是对于使用 Triplet 损失函数的网络,还是二分类结构,为了减少计算量,可以提前计算好编码输出 f(x)并保存。这样就不必存储原始图片,并且每次进行人脸识别时只需要计算测试图片的编码输出。
6)What is neural style transfer?
神经风格迁移(Neural style transfer)将参考风格图像的风格“迁移”到另外一张内容图像中,生成具有其特色的图像。 一般用C表示内容图片,S表示风格图片,G表示生成的图片。
7)What are deep ConvNets learning?
想要理解如何实现神经风格转换,首先要理解在输入图像数据后,一个深度卷积网络从中都学到了些什么。我们借助可视化来做到这一点。 典型的CNN网络如下所示:
我们通过遍历所有的训练样本,找出使该层**函数输出最大的 9 块图像区域。可以看出,浅层的隐藏层通常检测出的是原始图像的边缘、颜色、阴影等简单信息。随着层数的增加,隐藏单元能捕捉的区域更大,学习到的特征也由从边缘到纹理再到具体物体,变得更加复杂。
相关论文:Zeiler and Fergus., 2013, Visualizing and understanding convolutional networks
8)Cost function(理解)
神经风格迁移生成图片G的cost function由两部分组成:C与G的相似程度和S与G的相似程度。
其中, 是用于控制相似度比重的超参数。
神经风格迁移的基本算法流程是:
首先令G为随机像素点,然后使用梯度下降算法,不断修正G的所有像素点,使得J(G)不断减小,从而使G逐渐有C的内容和G的风格,如下图所示。
相关论文:Gatys al., 2015. A neural algorithm of artistic style
9)Content cost function(重点)
上述代价函数包含一个内容代价部分和风格代价部分。我们先来讨论内容代价函数 ,它表示内容图片 C 和生成图片 G 之间的相似度。
的计算过程如下:
使用一个预训练好的 CNN(例如 VGG);
选择一个隐藏层 l来计算内容代价。l太小则内容图片和生成图片像素级别相似,l太大则可能只有具体物体级别的相似。因此,l一般选一个中间层;
设
为 C 和 G 在 l层的**,则有:
和
越相似,则
越小,方法就是使用梯度下降算法,不断迭代修正G的像素值。
10)Style cost function(重点)
什么是图片的风格?利用CNN网络模型,图片的风格可以定义成第l层隐藏层不同通道间**函数的乘积(相关性)。
例如我们选取第l层隐藏层,其各通道使用不同颜色标注,如下图所示。因为每个通道提取图片的特征不同,比如1通道(红色)提取的是图片的垂直纹理特征,2通道(黄色)提取的是图片的橙色背景特征。那么计算这两个通道的相关性大小,相关性越大,表示原始图片及既包含了垂直纹理也包含了该橙色背景;相关性越小,表示原始图片并没有同时包含这两个特征。也就是说,计算不同通道的相关性,反映了原始图片特征间的相互关系,从某种程度上刻画了图片的“风格”。
对于风格图像 S,选定网络中的第层,则相关系数以一个 gram 矩阵的形式表示:
其中,和
为第
层的高度和宽度;
和
为选定的通道,其范围为 1到
。
同理,对于生成图像 G,有:
因此,第 层的风格代价函数为:
如果对各层都使用风格代价函数,效果会更好。因此有:
其中,是用于设置不同层所占权重的超参数。
11)1D and 3D generalizations f models
之前我们处理的都是二维图片,实际上卷积也可以延伸到一维和三维数据。我们举两个示例来说明。
EKG 数据(心电图)是由时间序列对应的每个瞬间的电压组成,是一维数据。一般来说我们会用 RNN(循环神经网络)来处理,不过如果用卷积处理,则有:
输入时间序列维度:14 x 1
滤波器尺寸:5 x 1,滤波器个数:16
输出时间序列维度:10 x 16
而对于三维图片的示例,有
输入 3D 图片维度:14 x 14 x 14 x 1
滤波器尺寸:5 x 5 x 5 x 1,滤波器个数:16
输出 3D 图片维度:10 x 10 x 10 x 16