卷积神经网络第四周 特殊应用:人脸识别和神经风格转换

4.1 什么是人脸识别
人脸验证face verification:输入一张人脸图片,验证输出与模板是否为同一人,是一对一问题。
人脸识别face recognition:输入一张人脸图片,验证输出是否为K个模板中的某一个,是一对多问题。
人脸识别更难。因为假设人脸验证系统的错误率是1%,那么在人脸识别中,输出分别与K个模板都进行比较,则相应的错误率就会增加,约K%。模板个数越多,错误率越大一些。

4.2 One-Shot learning
在这里插入图片描述
one-shot learning一次学习是指数据库中每个人的训练样本只包含一张照片,然后训练一个CNN模型来进行人脸识别。若数据库有4个人,则CNN模型输出softmax层就是5维的。
一次学习的问题一是每个人只有一张图片,训练样本少,构建的CNN网络不够健壮;二是若数据库增加另一个人,输出层softmax的维度就要发生变化,相当于要重新构建CNN网络,使模型计算量大大增加,不够灵活。
在这里插入图片描述
解决一次学习的办法是用相似函数similarity function。相似函数表示输入的两张图片的相似程度,用d(img1,img2)来表示。若d(img1,img2)较小,则表示两张图片相似;若d(img1,img2)较大,则表示两张图片不是同一个人。阈值如上图。
人脸识别问题是计算测试图片与数据库中K个目标的相似函数,取其中d(img1,img2)最小的目标为匹配对象。若所有的d(img1,img2)都很大,则表示数据库没有这个人。

4.3 Siamese network
在这里插入图片描述
我们将一张图片经过一般的CNN网络(包括CONV层,POOL层,FC层),最终的得到全连接层FC的f(x(1))看成是这张图片的编码encoding,表征了原始图片的关键特征。
这个网络结构我们称之为Siamese network。也就是说每张图片经过Siamese network后,由FC层每个神经元来表征。
建立Siamese network后,两张图片x(1)和x(2)的相似函数可由各自FC层f(x(1))和f(x(2))的差的范数来表示:
在这里插入图片描述
在这里插入图片描述
注意不同图片的CNN网络的结构和参数是一样的,我们的目标就是利用梯度下降算法,调整参数,使得属于同一个人的图片之间的d(x(1), x(2))很小,不同人图片之间的d(x(1), x(2))很大,具体的网络构建和训练参数方法我们下一节讲。

4.4 Triplet loss
在这里插入图片描述
构建人脸识别的CNN模型,需要定义合适的损失函数,这里我们将引入Triplet Loss
Triplet Loss需要每个样本包含三张图片:靶目标(Anchor)、正例(Positive)、反例(Negative)。
anchor和positive是同一个人的照片,anchor和negative是不同的人的照片。
我们希望在这里插入图片描述尽可能小,在这里插入图片描述尽可能大,如上图所示,超参数α(大于0)代表margin(举个例子,如d(A,P)=0.5,α=0.2,则d(A,N)>=0.7),合理的损失函数loss function L和对m组训练样本的代价函数cost function J定义如下图所示。
在这里插入图片描述
对于训练样本,要保证同一个人有多张照片,例如10k张照片包含1k个不同的人脸,则平均一个人10张照片。
然后就可以用梯度下降,优化CNN网络参数,让J不断减小。
在这里插入图片描述
同一组训练样本,A,P,N的选择尽可能不要使用随机选取方法。因为随机选择的A与P一般比较接近,A与N相差也较大,毕竟是两个不同人脸。这样的话,也许模型不需要经过复杂训练就能实现这种明显识别,但是抓不住关键区别。所以,最好的做法是人为选择A(anchor)与P(positive)相差较大(例如换发型,留胡须等),A与N相差较小(例如发型一致,肤色一致等)。这种人为地增加难度和混淆度会让模型本身去寻找学习不同人脸之间关键的差异,“尽力”让d(A,P)更小,让d(A,N)更大,即让模型性能更好。
下面给出一些A,P,N的例子:
在这里插入图片描述
现在许多商业公司构建的大型人脸识别模型都需要百万级别甚至上亿的训练样本。如此之大的训练样本我们一般很难获取。但是一些公司将他们训练的人脸识别模型发布在了网上,我们可以使用这些已经预训练的模型。

4.5 面部验证与二分类
在这里插入图片描述
除了使用triplet loss来训练参数来解决人脸识别问题之外,还可以使用二分类的方法。做法是将两个Siamese network组合在一起,将各自的编码层输出经过一个逻辑输出单元,该神经元使用sigmoid函数,输出1表示识别为同一个人,输出0表示不是一个人,如上图所示。
每组训练样本包含两张图片,每个Siamese network结构和参数完全一样,这样就把人脸识别问题转化成了一个二分类问题,引入逻辑输出层参数w和b,输出y hat的表达式见上图,参数wk和b都是通过梯度下降算法迭代得到的。
y hat还有一种表达方法,见上图绿色笔公式,也被称为χ方公式,也叫\χ方相似度。具体在论文中。

在训练好网络后,进行人脸识别的常规方法是测试图片与模板进行网络计算,编码层输出比较,计算逻辑单元。为了减少计算量,可以使用预计算的方法,在训练时就将数据库每个模板的编码层输出f(x)保存下来。因为编码层输出f(x)比原始图片数据量少很多,所以无需保存模板图片,只要保存每个模板的f(x)即可,节省存储空间。而且,测试过程中,无需计算模板的Siamese network,只要计算测试图片的Siamese network,得到f(x(i))直接与存储的模板f(x(j))进行下一步的逻辑输出单元计算即可,时间减小了接近一半。这种方法也可以用在上一节的triplet loss网络中。
在这里插入图片描述

4.6 什么是神经风格转换?
在这里插入图片描述
C(content)表示内容图片,S(style)表示风格图片,G(generated image)表示生成的图片。

4.7 什么是深度卷积网络?
在进行神经风格迁移之前,我们先来从可视化的角度看一下卷积神经网络每一层到底是什么样子?它们各自学习了哪些东西。
典型的CNN网络如下:在这里插入图片描述
首先来看第一层隐藏层,遍历所有训练样本,找出让该激活函数输出最大的9块图像区域;然后再找出该层的其他单元(不同的滤波器通道)激活函数输出最大的9块图像区域;最后共找9次,得到9 x 9的图像如下所示,其中每个3 x 3区域表示一个运算单元。
在这里插入图片描述可以看出,第一层隐藏层一般检测的是原始图像的边缘和颜色阴影等简单信息。
继续看CNN的更深隐藏层,随着层数的增加,捕捉的区域更大,特征更加复杂,从边缘到纹理再到具体物体。
在这里插入图片描述

4.8 代价函数
在这里插入图片描述
神经风格迁移生成图片G的cost function由两部分组成:C与G的相似程度和S与G的相似程度。
α,β是超参数,调整Jcontent(C,G)与Jstyle(S,G)的相对比重。
在这里插入图片描述
神经风格迁移的基本算法流程是:首先令G为随机像素点,然后使用梯度下降法,不断修正G的所有像素点,使得J(G)不断减小,从而使得G逐渐有C的内容与S的风格。

4.9 内容代价函数
在这里插入图片描述
我们先来看J(G)的第一部分Jcontent(C,G),它表示内容图片C与生成图片G之间的相似度。
使用的CNN网络是之前训练好的模型,例如Alex-Net。C,S,G共用相同模型和参数。首先,需要选择合适的层数ll来计算Jcontent(C,G)。根据上一小节的内容,CNN的每个隐藏层分别提取原始图片的不同深度特征,由简单到复杂。如果层数l太小,则G与C在像素上会非常接近,没有迁移效果;如果l太深,则G上某个区域将直接会出现C中的物体。因此,ll既不能太浅也不能太深,一般选择网络中间层。
然后比较C和G在l层的激活函数输出,公式如上图所示。l层的C与G的激活函数值越接近,Jcontent(C,G)越小,使用梯度下降迭代即可使其不断减小。

4.10 风格代价函数
在这里插入图片描述
什么是图片的风格?利用CNN网络模型,图片的风格可以定义为第l层隐藏层不同通道间激活函数的乘机(相关性correlation)。
在这里插入图片描述
例如我们选取第l层隐藏层,其各通道使用不同颜色标注,如上图所示。因为每个通道提取图片的特征不同,比如1通道(红色)提取的是图片的垂直纹理特征,2通道(黄色)提取的是图片的橙色背景特征。那么计算这两个通道的相关性大小,相关性越大,表示原始图片及既包含了垂直纹理也包含了该橙色背景;相关性越小,表示原始图片并没有同时包含这两个特征。也就是说,计算不同通道的相关性,反映了原始图片特征间的相互关系,从某种程度上刻画了图片的“风格”。在这里插入图片描述
接下来我们定义图片的风格矩阵style matrix,公式见上图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.11 一维到三维推广
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值