吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换

1. What is face recognition什么是人脸识别

  • 活体检测(liveness detection):确认是否为一个活人,区别于照片。
  • 人脸验证(face verification):提供一个人的照片以及名字或ID,验证这个人的照片和名字是否对应。为1:1问题;
  • 人脸识别(face recognition):有一个含有k个人信息的数据库,输入一个人的照片,确认他是不是数据库中的一个。为1:k问题。

一般在人脸验证的基础上进行人脸识别,所以人脸验证的准确率对人脸识别至关重要,后面就重点讲人脸验证。

2. One Shot Learning

在人脸识别中,要求只输入一张图片就能识别出这个人是谁,而在深度学习在只有一个样例的时候表现并不好,也就是你只有所有员工的单张照片,而期望训练模型,能够很好的识别任何一个人,如果来了新员工怎么办?重新训练模型么?
答案就是one shot learning!

相似函数(similarity function)

相似函数表示两张图片的相似程度,用d(img1,img2)来表示。若d(img1,img2)较小,则表示两张图片相似;若d(img1,img2)较大,则表示两张图片不是同一个人。
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
如图,若要判断一个人是不是数据库里的,那么就用这个人的照片和数据库里面的照片一一计算相似函数,若相似函数都比较大则表示不是数据库里的人。如果新来一个员工,那么往数据路里面添加一张照片就可以了。

3. Siamese Network

用于实现相似函数计算的网络
主要思想是用卷积神经网络CNN计算图片的特征,利用特征计算相似函数,具体做法如下:
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
即CNN计算到全连接层之后不进行softmax分类,而是利用全连接层的数据作为该图像的编码(encoding),用于计算和其他图像的相似函数。

4. Triplet Loss三元损失函数

如何获得质量较好的图片的编码呢?
方法之一就是定义一个三元损失函数,然后应用梯度下降。
Triplet Loss需要每个样本包含三张图片:目标(Anchor)、正例(Positive)、反例(Negative),这就是triplet名称的由来,后面简称为A、P,N。
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
如图A和P是同一个目标,其相差应该较小,A和N相差应该较大,即:

||f(A)f(P)||2<=||f(A)f(N)||2

||f(A)f(P)||2||f(A)f(N)||2<=0

但是若所有输出都是0,也满足上式,而这对我们来说确实一个不能接受的结果,所以为了避免这一情况,添加一个margin间隔α,它的含义类似于SVM里面的间隔,也就是说目标和正样本之差要比目标和负样本之差至少小α,通常α=0.2
||f(A)f(P)||2||f(A)f(N)||2+α<=0

损失函数 loss function:
l(A,P,N)=max(||f(A)f(P)||2||f(A)f(N)||2+α,0)

成本函数 cost function:

J=i=1ml(A(i),P(i),N(i))

由于计算需要A和P,所以同一个人需要有多张照片,如每人10张,如果每人只有一张照片则无法使用此方法。
值得注意的是,如果任意选择A,P,N那么有些N和A差异很大,对算法贡献就较小,所以需要选择d(A,P)d(A,N) 这样的三元组,才能让梯度下降尽最大努力去优化算法,以区分相似的人,如人为选择A与P相差较大(例如换发型,留胡须,戴眼镜等),A与N相差较小(例如发型一致,肤色一致等)

5. Face Verification and Binary Classification

定义三元损失函数是一个学习人脸识别卷积网络参数的好方法,这里介绍另外一种方法:将人脸识别问题转化为二分类问题。
做法是将两个siamese网络组合在一起,将两个网络的编码输入到一个逻辑回归单元,然后进行预测,输出1则表示识别为同一人,输出0则表示识别为不同人。结构如下:
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
每组训练样本包含两张图片,两个siamese网络结构和参数完全相同,获得两个图像的编码f(x(i))f(x(j))之后,将编码输入逻辑回归单元得到分类结果。图中给出了y^的两种计算方式,其中参数wi,b需要通过梯度下降迭代获得,f(x(i))k表示图像x(i)的第k个编码.
Precompute预计算:为了减少计算量,可以使用预计算的方式,先训练获得每幅照片的编码f(x) 保存下来,而不保存原照片,这样数据量就会大大减少,既节约存储空间,又加快了算法速度。如果有新来的员工,那么训练其照片得到编码,将编码保存到数据库即可。

6. What is neural style transfer神经风格转换

在本章第一周的卷积神经网络的课程中提到过神经风格转换,这是一个非常有趣的应用,它将一张图片的风格“迁移”到另外一张图片中,可以用于对图片艺术化,如图:
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
为了简化描述,用C代表内容content图像,S表示风格style图像,G表示生成generate图像。
为了实现神经风格迁移,需要观察卷积网络在不同层(深层、浅层)提取的特征,下一节讲卷积网络各层之间的细节。

7. What are deep ConvNets learning

本节讲卷积网络的深层具体做了什么。
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
如上图,首先看第一层隐藏层,遍历所有训练样本,找出让该层**函数输出最大的9块图像区域;然后再找出该层的其它单元(不同的滤波器通道)**函数输出最大的9块图像区域;最后共找9次,得到9 x 9的图像如下所示,其中每个3 x 3区域表示一个运算单元。可以看出,第一层隐藏层一般检测的是原始图像的边缘、颜色、阴影等简单信息。
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
可以看到随着层数的增加,捕捉的区域更大,特征更加复杂,从边缘到纹理再到具体物体
神经网络的浅层主要完成的是提取图片的某个特征,如形状、颜色等,越深层的隐藏单元就表示越大块的图像,即越深层的隐藏单元捕捉的图像特征越复杂。

8. Cost Function神经风格迁移的损失函数

cost function由两部分组成:内容损失函数(C与G的相似程度)和风格损失函数(S与G的相似程度),即:

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

生成神经风格迁移图片的流程如下:
1. 确定输出图像大小,并随机初始化各像素值;
输入图像:
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
初始化输出图像G:
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
2. 用梯度下降算法最小化J(G)来不断更新输出图像: G:=GGJ(G)
结果如图:
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换

9. Content Cost Function

本节讲述如何计算Jcontent(C,G)
首先,需要选择合适的层数l来计算,CNN的每个隐藏层分别提取原始图片的不同深度特征,由简单到复杂。如果l太小,则G与C在像素上会非常接近,没有迁移效果;如果l太深,则G上某个区域将直接会出现C中的物体。因此,l既不能太浅也不能太深,一般选择网络中间层;
然后选择一个预训练的卷积模型,如VGG或其他;
a[l](C)a[l](G) 表示内容图像和生成图像在l层的**值,如果两幅图像对应的**值越相近,那么就表示两幅图像相似度越高。

Jcontent(C,G)=12||a[l](C)a[l](G)||2

10. Style Cost Function

什么是风格?如何定义?如何量化表示呢?
例如我们选取第l层隐藏层,其各通道使用不同颜色标注,如下图所示。因为每个通道提取图片的特征不同,比如1通道(红色)提取的是图片的垂直纹理特征,2通道(黄色)提取的是图片的橙色背景特征。那么计算这两个通道的相关性大小,相关性越大,表示原始图片包含垂直纹理的地方,有很大概率是橙色的;相关性越小,表示原始图片同时包含的概率月底。也就是说,计算不同通道的相关性,反映了原始图片特征间的相互关系,从某种程度上刻画了图片的“风格”。
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
选定好l,接下来定义风格矩阵:
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
e diagonal elements such as GiiGii also measures how active filter ii is. For example, suppose filter ii is detecting vertical textures in the image. Then GiiGii measures how common vertical textures are in the image as a whole: If GiiGii is large, this means that the image has a lot of vertical texture.
a表示**值,i对应图像高度,j对应图像宽度,k对应图像信道,首先计算风格图片各信道两两之间的风格矩阵,这里直接用对应**值之积表示,然后计算输出图片两两信道间的风格矩阵,损失函数就是两幅图像风格矩阵的差值,这里用F范数,即对应元素差值的平方和,至此,计算了某一层l的风格损失函数。
吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
若选择了多层,那么把各层的风格损失函数加权相加,就是总的风格损失函数。如上图λ 是各层的权重。
最后将风格损失函数和内容损失函数,带入神经风格损失函数,然后利用梯度下降优化输出图像。

11. 1D and 3D Generalizations

  • 1D数据的卷积
    吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换
    如图一维心电图数据14x1(1表示信道)经5x1的filter卷积,获得10x1的卷积结果,如果用16个5x1的filter卷积则获得10x16卷积图像,对其进行卷积的话filter的信道需要跟其保持一致,如5x16的filter或3x16的filter,用32个5x16的filter进行卷积,获得卷积图像6x32。

  • 3D数据的卷积
    吴恩达《深度学习-卷积神经网络》4--特殊应用人脸识别和神经风格转换

如图,对14x14x14x1(1是信道数目)的三维数据,用16个5x5x5x1的filter进行卷积,得到卷积结果为10x10x10x16,第二层卷积对其用32个5x5x5x16(注意这里的信道数目要与输入图像保持一致)卷积,得卷积结果6x6x6x32。