深度学习(18):人脸识别、风格转换
人脸识别 fave recognition
人脸验证 fave verification
人脸验证指的是给出一张人脸图片,再给出一个目标ID,我们来确认图片是否属于这个ID
人脸识别 face recognition
人脸识别指的是给出一张人脸图片,已知一组ID,判断这张图片是否属于这一组ID中的一个
任务难点:往往在实际应用中,我们数据库中一个人只有1张图片,数据较少。(训练时需要一个人有多个图片)
siamese network
本质上是利用神经网络对人脸图片进行编码。
我们定义两张图片的差距d(a,b)是其编码差值的范数(各项平方和)。我们希望同一个人的图片差距小,不同人的图片差距大。
Triplet loss
为了利用每个人较少的数据集训练网络,我们可以利用Triplet loss损失函数。
计算Triplet loss,我们需要三个图片:图片A,正例图片P,反例图片N
L(A,P,N)=max(d(A,P)- d(A,N)+ alpha,0)
可以看出我们想要正例差距与反例差距之间的差值要大于alpha
因此适当选取三元组A,P,N可以帮助我们训练模型
转换为二分类问题
除了利用Triplet loss进行训练之外,我们还可以将识别问题转化为二分类问题。
此时我们的训练集不再是单个图片,而是一个个图片对,我们的输出变成了判断两张图片是否为1个人:
我们将两张图片输入到相同的网络中得到各自的编码,再利用一个sigmoid就可以求出输出。
在实际应用中,可以预先计算出数据库中的图片编码,不必每次都进行计算。
图片风格转换
利用原图C和风格图片S,我们想得到内容像C但是风格像S的G
为了完成图片风格转换,我们需要做到两点:
1.图片和原来内容得差不多
2.图片的风格要偏向目标图片
我们通过观察卷积神经网络的结构可以看出。每一层的**函数都对应图片某个特点。对于第一层,每一个神经元只能获得图片的一小部分信息(受限于过滤器大小)抓到的特点简单。而随着网络深度的加深,神经元的信息量会逐渐增大,后面的神经元甚至可以接收到全图信息,抓到的特点就复杂。
内容代价函数
该代价函数主要是为了满足G要长得像C。我们的操作时,将C、G喂到同一个网络中,取出某个中间层的**函数作为输出,通过两组输出差距的范数得到代价。选择的中间层越靠前,C和G的各个像素值都不会差太多。而选择的中间层靠后,C和G就只剩神似了。因此要选择适当的中间层。
风格代价函数
图片的风格和各个特点的相关性有关(浅显理解:每个竖线都是橘色的,这就是一种风格)。因此我们要做的是,将S、G喂到神经网络,对于每一层神经元,计算各个通道之间的相关性(gram矩阵),期望最小化S、G对应的gram矩阵之间的差距,以达到风格相近。
整体代价函数是以上两部分的线性组合。