注:拉到最后有视频版哦~
我结合我的方向,给大家介绍一下 GAN 方面的一些应用,因为我是做人脸的,大部分的应用都会在人脸上
在讲论文前,我们先来回顾下 PGGAN 和 stylegan,我今天讲的三篇论文都是基于这两个网络的
PGGAN 是一个渐进式的网络,主要的创新是能产生高清的图片。开始的时候 GAN 的网络非常浅,只能学习低分辨率(4×4)的图片生成,随着训练进行,我们会把 GANs 的网络层数逐渐加深,进而去学习更高分辨率的图片生成,最终不断的更新 GANs,从而能学习到 1024×1024 分辨率的图片生成。
PGGAN 虽然能生成高清的图片,但是仍然存在一些缺陷,由于其直接逐级生成图片,我们没有对每一级增添控制,即输入是一个随机的噪声,直接输出一张图片,这导致我们也无法获知网络在每一级的分辨率上学到的是什么,即网络对生成图像的控制非常有限。换句话说,这些特性是互相关联的,因此尝试调整一下输入,哪怕是一个值,通常也会同时影响多个特性。
在 PGGAN 的基础上,出现了 stylegan,大致介绍下 Stylegan 的结构,Stylegan 的生成器包括两部分,映射网络和合成网络,映射网络的输入是随机向量,输出是中间向量
可以看到 PGGAN 和 Stylegan 之间的对比,Stylegan 合成网络和 PGGAN 结构差不多,在每个分辨率的层替换 Norm 为样式模块 AdaIN,起到一个 style 特征融合的作用,这里的 style 不是从图像中得到的,而是从中间向量变换后得到的
它有两个比较重要的模块,第一个是映射网络,映射网络的目标是将输入向量编码为中间向量。这是一个非常重要的过程,因为使用输入向量来控制视觉特征的能力是非常有限的,从宏观来看,输入的随机向量一定会去遵循训练集的概率分布。例如,如果戴眼镜的人的图像在训练集中更常见,那么更多的输入值将会被映射到该特征,这一现象被称为特征纠缠。然而,通过使用另一个神经网络,该模型可以使得生成的中间向量不必遵循训练数据的分布,当然其实肯定还是有点关系的。同时,这种做法也能有效减少特征之间的相关性。举个例子,如果中间向量是充分解耦合的,那么中间向量会像图中所示一个维度对应一个特征,假设中间向量的第一维对应的特征是眼镜,那么如果将这个维度调大,生成的图片就能戴上眼镜,而其他特征都不发生变化,这种现象我们称其为解耦合。
第二个是样式模块,它将映射网络创建的编码信息 w 传输到生成的图像中。在 StyleGAN 特殊的网络结构影响下,不同层的模块所融合的特征都是不同的,有点类似于通道的 attention 机制,突出这一层应该学习的 style,抑制不该学习的 style
然后是我今天要讲的几篇论文,第一篇是 Image2stylegan,主要想法是讲一张图片嵌入到 stylegan 的隐空间去
第二篇是 image2stylegan++,主要是进一步的嵌入质量优化和一些应用
第三篇是 interfacegan,主要讲 pggan 和 stylegan 的语义分析
image2stylegan
首先讲一篇 iccv2019 的论文
这篇文章提出的背景是 GAN 近年来呢,发展非常的快,有很多能产生高质量,且高分辨率图片的 GAN,比如我上次介绍的 PGGAN,和 StyleGAN
提出的动机是基于 GAN 的一个基本特点,就是输入是随机的噪声,然后 GAN 经过学习把这个噪声转换到另外的一个 domain,比如生成的一些图片,但是总是生成随机的图片意义不大,如果能够在现有的图片上进行图片编辑,各种的意义会更大。其实就是 stylegan 输入不可控,现在要控制它
本文的研究目标有三个
第一个是如何为一张图片找到他对应的 latent code,其实就是把图片嵌入到 latent space 中,latent code 可以理解成隐空间编码,可能一听到这个 latent code 大家不是很明白,这个 latent code 就是右边这个 stylegan 的网络图中的,红框框起来的三个部分,分别是输入 z,中间向量 w 和输入合成网络每一层的中间向量 w+,维度是普通的中间向量的 18 倍,这三个名字可能要大家记一下,后面要提到无数次
第二个研究目标是这些 latent code 有什么特征,或者说特性
第三个研究目标是用上面两个目标,能做出什么样的应用
然后来讲本文的方法,针对提出的研究目标,文章首先说,要找到 latent code
抽象来说,文章使用 StyleGAN 的 latent code 来控制人脸的生成。如果把生成器的反向过程看作是一个 encode 过程,那么输入一张真实的图片,在 StyleGAN 的 latent 空间中必定存在一个 latent code 与这张真实图片对应。虽然我们无法保证 StyleGAN 的生成图片的分布域涵盖这个世界上所有人的人脸图片,但是由于 StyleGAN 的生成基于分级控制特征,并且训练集 FFHQ 的人种、性别、年龄等各种样式的人脸都比较丰富,因此我们可以在生成的图片的分布中找到一张与现实人脸无比接近的人脸,并最终计算出其在 latent space 中对应的向量。如果能找到这个向量,并且对向量做一些改动,就能对人脸进行一定的编辑,求这个向量的方法称为嵌入算法,前面说的 latent code 就是我们要求的嵌入向量
具体来说,这个方法的本质就是一个梯度下降,
本方法将初始化一个随机向量 z,这个向量通过生成器后生成图片,一开始肯定和目标的嵌入图片相差很大,我们可以定义一个 loss 来衡量生成图片和目标图片的差别。本文中,定义的 loss 为生成图片与目标图片的感知 loss 和像素 loss。其中感知误差是使用在 imagenet 上 pretrain 的 VGG16 提取的特征层面的距离。像素误差为简单均方误差,就是 MSE
接着,这个 loss 通过梯度下降回传去对初始化的向量 z 进行调整,最终我们会找到能生成和原图相似度很高的图片他对应的向量 z
对于这个方法,我们先对 loss 做一个消融实验,第一列是目标图片,第二列只用了 MSE 的均方误差,第三列用的 VGG 中一个层的 loss,第四列是第二列和第三列 loss 的相加,第五列是 vgg 中 cov1—2 到 cov4——2 这些层的 loss,第六列是第二列和第五列的 loss 相加,实验结论就是用感知 loss 和 MSE 的 loss 相加能最大程度保证嵌入图片的质量
然后我们讨论一下,对于 stylegan 来说,到底嵌入哪里
在前面的 latent code 已经介绍了,stylegan 中有三个地方可以称为 latent code,分别是输入,中间向量 w 和输入合成网络每一层的中间向量 w+,在图中的位置就是这些位置
然后来看实验的效果,z 就不实验了,因为 z 本来就是非常耦合的空间,就算嵌入了也没用
第二列,第三列分别是嵌入 latent space w 和 w+ 的效果,实验结论就是嵌入 w+ 的效果是最好的
然后对于 w 的初始化,文章也有一个实验,就是分别使用平均的 w 和随机编码做了一个对比试验,平均的 w 大家可能忘了,平均 w 是一个平均脸,这个是我上次讲 stylegan 的时候,在截断模块里提到的,是为了保证生成图片不会随机到某个没采样过的地方,使得生成的图片很差
在这里,右边的图可以看到对于人脸的嵌入来说,平均 w 的初始化效果好于随机初始化,但是对于其他的非人脸图像,随机初始化的效果会更好
在表中,L 表示梯度下降的 loss,最后一列表示嵌入结果和平均 w 的距离,这也在定量的层面验证了初始化的结论
然后是对嵌入算法的压力测试,可以看到,随着迭代的进行,其实图片是不断的在丢失很细小的特征的,比如这个奥巴马的皱纹随着迭代的进行慢慢变没了,也可能是算法收敛到了一个局部最优值的结果,可以说,这个算法是一个能用的,好的嵌入算法,但不是完美的嵌入算法
接下来,说一下 Stlyegan 的 latent space 的一些性质,首先是他的一个泛化性,有点惊讶的是,文章的 stylegan 模型,是在人脸中 train 出来的,但是嵌入猫,狗,还有画,汽车,居然也能成功
接下来,文章测试了仿射变换对嵌入算法鲁棒性的影响,发现嵌入算法对仿射变换非常敏感,尤其是平移,会导致嵌入算法鲁棒性大大下降,这个也告诉我们,在用这个嵌入算法之前,要进行一次人脸对齐
另外,文章还测试了嵌入算法对遮挡的鲁棒性,将图片的眼睛,鼻子,嘴巴等部分盖住,发现算法是对遮挡鲁棒的,而且这进一步说明了 stylegan 这个网络学到的特征是分离的,不会互相影响,也不会迫使图像修复
这篇文章的最后,讲一下应用
第一个是图片的变换,我们对两张图片用嵌入算法,拿到两张图片的 latent code,然后对两个 code 进行线性融合,lambda 的系数从 0 到 1 线性增大,发现图片呈现语义的光滑变化,然后这只对人脸的图片起作用,其他的图片没有效果
第二个应用是风格转换,简单来说,就是把 w1 的低层 code 拿出来,覆盖掉 w2 的低层 code,换句话说就是和 w2 的高层 code 组合起来,就能发现生成的图片呈现风格迁移的效果
这个风格转换和上一次讲的 stylegan 的风格转换很像,上一次也是,source 图像,就是 w1,去覆盖掉目标图像,也就是 w2 的某些层,从出来的效果,就可以发现网络较浅层控制性别,3d 姿态,表情;中层控制头发样式,眼镜闭合;高层控制颜色
第三个应用是表情迁移,方法是取 3 个 code,w1 是目标图像的 latent code,w2 对应于一个图像的中性表达,而 w3 对应这张图片于更独特的表达式,如微笑,恶心的表情
文章发现在 w+ 层面,独特表达式 减掉 中性表达,可以求得一个变化向量,在目标图片的 code 上加上一定权重的变化向量,就可以对目标图像进行语义的表情的迁移
总结一下,文章的结论是提出了一个有用但不是最好的嵌入算法,并且探究了嵌入向量在语义层面对图像进行编辑的可能
当然文章还有不足的地方,首先是图像变化的广泛研究,可以多试一下,探究下更多的可能性,另外也是我很头疼的地方,就是算法的速度,这个在 future 中细讲,另外就是在视频帧中进行运用
image2stylegan++
这篇文章比较有意思,比较重应用,他自己在 YouTube 上说自己中了 cvpr2020,但是现在好像还没在 cvpr 的榜里找到他(的确中了 cvpr2020)
这篇论文是在之前那篇论文上进行改进的,背景还是 GAN 的迅速发展,动机是一个好的嵌入算法有很多应用的地方
然后本文的研究目标主要分三点,第一是如何提高嵌入质量,第二是如何优化局部和全局的嵌入,第三是一些应用
然后讲一下研究的方法,文章的方法和上一篇的思想是一样的,还是梯度下降,算法结构差不多,还是嵌入 w+ 空间,对于如何提高嵌入质量,文章的创新加入了噪声,这个在我上次讲的 stylegan 中提到了,w 存储图片的大部分信息,噪声 n 存储一些随机信息,也就是一些细节,同时考虑 w 和 n,就能得到更加精确,更加高质量的嵌入图片
要优化的目标函数是这样的,总体来看就是一个 style 的 loss,一个逐像素 mse 的 loss,还有一个感知的 loss,这个 loss 会在后面拆成 4 个模块讲
为了评价嵌入质量好坏,文章给出了一个指标叫峰值信噪比,大致意思就是这个值越大越好,图像的质量越高
我们反过来看,先研究优化 loss 的策略,为了得到更高质量的图片,我们要回归两个值,w 和 n,这就衍生出两个优化方式,第一种是同时优化 w 和 n,第二种是分开优化
先看第一种优化策略,图 a 是目标图片,图 b 是是用感知 loss 和 mse 的 loss 同时优化 w 和 n,可以看到图 b 丢失了很多细节的信息,图 c 是只用 mse 的 loss 同时优化 w 和 n,可以看到图 c 嵌入的效果是很好的,但是这个有什么问题呢,我们把图 c 的噪声 n 采样出来得到图 d,发现图 d 其实存储了图像的大部分信息,这意味着 w 存储的信息减少了,这和我们的初衷就不符合了,原则上应该是像 stylegan 中的一样,n 只存储一些很细节的信息,比如上面的图,头发的一些微小的扰动。然后图 e 是用不同的 loss 优化 w 和 n,出来的效果还行,然后这张图片的峰值信噪比的值 33.3db
然后讲一下分开优化的,就是先优化 w,此时把噪声 n 固定住。把 w 优化差不多了,把 w 固定住,再去优化噪声 n。
在图中也可以看到,这样的策略出来的结果如图 c,效果会比较好,峰值信噪比是 39.5 比较高的,比同时优化策略的高
同时,还有一个想法,就是迭代的思想,就是优化 w,优化 n,再优化 w,优化 n,这样循环,文章发现这样其实不行,在图 c 上迭代优化 w,峰值信噪比会有一个大的下降,从 39.5 直接跌到 20 了,这就是说明迭代优化不会提高图片的质量,也证明分开优化过程中,仅仅优化 w,n 一次就行了
另外文章还提出了一个激活向量操作的方法,简单来说就是已经拿到了 latent code w 和噪声 n,在做 forward 生成图片的时候,把某一层拿出来,具体的操作在后面说
然后到这里,开始具体讲一下 loss 和应用方面,文章提出了四个模块,我先快速过一下,然后这个 masked 在应用里具体说
第一个模块是固定噪声 n 时候,优化 w 的 loss
第二个模块是固定 w 时候,优化 n 的 loss
第三个模块是一个做风格转移的 loss
第四个模块是用两个激活向量在指定区域空间交叉的操作
ok 上面几个模块太抽象了,现在来看文章提出的 6 个应用
第一个是高质量的图像嵌入
这个和前面说的是一样的,先优化 w,再优化 n
具体来说,优化 w 的时候,用的第一个模块,没有掩码就是全部是 1,这个 loss 和上一篇论文 image2stylegan 是一样
优化 n 时候的 loss,就是只用 mse 的 loss,同样也没掩码
然后来看效果,第二列只优化了 w,峰值信噪比是比较低,优化 w 和 n 后,峰值信噪比提高了,这也符合我们的直观感受,第三列效果比第二列好
第二个是图像的交叉融合,这个算法写的很复杂,但其实本质就是用一个 mask 去融合两个图片,有点像就是直接图片拼接太不自然了,用这个方法就是可以平滑过渡一下他们之间的连接部分,M-blur 是在 mask 上加高斯平滑
第三个是图像修复,这个其实很神奇,因为如果在嵌入的时候,只考虑 1~9 和 17,18 层的 w 的嵌入,其他层的 w 还是随机的,发现能修复图片,而且相比第三列的方法,也就是部分卷积的修复,直观上效果会更好
第四个应用是人工的涂鸦编辑,这个有点像美颜化妆,在嵌入的时候只考虑 4~6 层的嵌入,再加一个 MSE 的 loss,起到的作用就是能把人工的一些涂鸦操作结合进原图,起到 markup 的操作
第五个应用是风格的迁移,这个和图片的 crossover 其实差不多,只不过是把 loss 换了一个,出来效果就是能在保证语义的同时,把另外图片的风格转过来,比如图片中,如果直接用 crossover,其实出来的效果就是直接平滑连接起来,左半边脸不会有研究的,但是用这个方法,出来的效果还是保留了语义
第六个应用是,特征的迁移,这个不同于风格的迁移,这个操作简单来说就是已经拿到了 base 图片和特征图片的 latent code w 和噪声 n,在做 forward 生成图片的时候,把特征图片的某一层拿出来,这里是第四层,按 mask 加入到 base 图片中,就能做到特征的迁移,比如把奥巴马加胡子,把一个女人的下巴变掉等等
总结一下,这篇文章的结论是在 image2stylegan 的基础上改进了嵌入算法,使得保留更多的细节,更高质量
此外就是能根据嵌入算法衍生出很多应用,可以做一个人脸编辑的软件
当然文章还有不足,第一个其实挺有意思的,因为现在很多基于 stylegan 的论文,都不是自己训 stylegan 的,因为 gan 太难训了,要出一个不错的效果太难了,所以很多论文都在用官方的 pretrain model,或者说一些有很多卡的机构发出来的一些 pretrain model,然后在上面做应用和模型的研究,我觉得这也是一个趋势
第二个就是和上一篇文章一样,在视频帧中的操作,这篇文章也没有解决这个问题
interfacegan
这篇文章是港中文的周博磊老师团队发的 cvpr2020 论文
文章的背景还是 GAN 能生成高质量的图片,有很多应用
动机呢是为什么 GAN 能经过学习把这个噪声转换到另外的一个 domain 呢?中间有什么语义信息?
文章的目标是探究如何在人脸合成的 GAN 的隐空间中编码不同的语义
首先,先来回顾一下上次讲的 pggan 和 stylegan,图中的是他们的网络结构,可以注意一下他们的三个输入接口,PGGAN 的 z,StyleGAN 的 z 和 w
这篇文章的所有研究,都基于一个假设,就是在 GAN 的隐空间中,对于任意一对特征,在空间存在把他们分离开的平面,从 SVM 角度来说,因为有分离的平面,故会有一个支持向量,向量垂直于平面,文章中把这个向量理解成这个平面的法线,法线指引了特征变化的方向
然后呢,文章主要研究 5 个特征,分别是姿态,微笑,年龄,性别和眼镜
首先,用 ResNet 在 CelebA 数据集上训练出模型,使得模型能对 5 个特征进行分类,这个是先验的用来打标签的
然后,生成 5 个训练集,数据来自 pggan 或者 stylegan 网络用随机输入生成的 50 万张图片,然后上一页 ppt 训好的 resnet 打标签,每个特征选出置信度最高和最低的 10k 数据当训练集
对每一个特征,用这些数据,分别 train 一个 SVM 分类器,测试的结果在下面的表里,对于每个特征有的 20k 的数据,训练和验证的比例是 7:3。ALL 数据是新生成的 40k 的数据,专门做测试用
发现 3 个空间里,从验证和测试集上的分类准确率来看,stylegan 的 z 空间最差,stylegan 的 w 空间最好
然后,因为每个特征都 train 了一个 svm,那么对于每个特征,我们都有一个分离平面,在这里,选出每个特征离平面最远的两个点和在平面上的点,通过生成器的效果在右图可以看到,可以发现,抛去生成的质量不说,离平面最远的两个点的确在对应的特征上倍分开了,这也证明了分离平面的确有效
讲完了隐空间的分离原理,我们来看下如何在隐空间上进行操作,我们观察到,通过求解一个二分类问题来得到分离平面,这个平面的法向量就指导了这个特征的变化方向,于是在这个特征方向上移动潜在代码也会产生连续变化,从图中可以看到
此外,虽然在训练中缺乏足够的极端姿势的数据,但网络还是能够想象出侧面脸应该是什么样的,比如说眼镜、姿态
这些实验结果表明 GAN 的生成并不是我们想的那么随机,而是从潜在空间学习一些可解释的语义
另外,是隐空间的距离效应,实验发现,在分离面的旁边随着法向量移动,起到的效果还是很不错的,但是移动的距离一大,就变了一个人了,对此,作者的解释是,在训练时候,这些原理分离面的样本很难被采样到,于是就很难被学习到
讲完了单特征的隐空间操作,为了解决,或者说减缓上面的距离效应,作者又提出了有条件的操作
首先,研究下不同特征之间的一个相关性,提出用两种方式去进行度量
第一种是对两个特征法向量之间求 cos 距离,返回 0~1 的值,这个和人脸识别的意思应该差不多一样,第二个是相关性系数
对于这个相关性系数,文章用随机噪声合成了 500k 的数据,每张图片用之前的 resnet 进行处理,这样就能得到对 5 个特征的 5 个分数,每张图片有 5 个分数,最后得到一个 500k*5 的矩阵,相关性系数就是这个矩阵列与列之间的协方差除以他们各自的标准差的乘积
然后这两个表是 PGGAN 对应空间的法线 cos 距离和相关性系数,可以看到这两个表的结果,是强相关的,可以看到姿态和微笑这两个向量,几乎是和其他向量都是正交的,但是性别,年龄和眼镜却看起来有点耦合,猜测是训练数据的问题,很可能数据中有很多男性老人且戴着眼镜的数据,这些结果是 PGGAN 的,也是符合我们上一次讲的适合对他的评价,特征耦合很严重
然后再来看 stylegan 的表,可以看到,对于 z 空间,和之前的一样,年龄、性别、眼镜耦合很严重,这个符合我们对他的认识,否则就凸显不出哪个解耦合的映射网络的作用了
对于 w 空间,可以看到,都是正交的,这也符合我们对他的认识,毕竟是解耦合了
但是,吃惊的是,stylegan 生成的图像,还是耦合的,和 pggan 的结果一样,说明在 pggan 那里的输入的隐空间编码和输出图片的一致性,在 stylegan 这里,不成立
然后呢,我们反过来看,既然两个特征的法向量是耦合的,就是不正交的,那么我是不是有一种方法可以让她正交起来,这个就是在这个空间上有条件的操作,其实也很简单,就是在立体几何上,用这个式子,其实就是一个锐角三角形的一个垂线。这就是为了防止隐空间的编码移动的过程中改变多个属性的情况出现,具体来说请从要更改的属性 n1 中减去您不想更改的属性 n2 在 n1 上的投影分量,生成一个新矢量,用他就可以生成仅更改了一个属性的图像,其实就是属性的屏蔽
我们在对比最明显的 stylegan 的 z 和 w 空间上进行操作,第一行是 w 空间向年龄的法向量移动,第二行是 z 空间向年龄的法向量移动,第三行是在屏蔽掉眼镜属性的过程中向年龄的法向量移动
然后可以看到,效果最好的是第三行,第一行比第二行略好,为什么 w 失效了呢,因为前面的表里已经证明了,w 空间的向量都是正交的,都是正交了,再这样减来减去,其实就没有用,我对此的猜测呢,是经过了映射网络之后的 w,的确在这个 cos 距离的评价指标上解耦合了,可能这个 w 在某个程度上还是没有很好的被分开的
最后一个部分,就是在真实图片上的编辑,就是嵌入,这个我在讲的第一篇提到了,其实,嵌入算法分两种,第一种就是我在第一篇论文中讲的,就是梯度下降去调
第二种是一种叫 VAE 的东西,本质是自编码器,把一堆真实样本通过编码器网络变换成一个理想的数据分布,然后这个数据分布再传递给一个解码器,得到一堆生成样本,生成样本与真实样本足够接近的话,就训练出了一个自编码器模型,仔细想一下这个是不是有点像没有判别器的的 GAN
然后回到实验,比如一张周老师的照片,经过上述两种不同嵌入的方法,然后再通过 pggan 和 stylegan 的生成器,就能生成嵌入的图片,可以看到,其中 stylegan 的特征和细节保留的最好,最真实,自编码器呢可以看到在 pggan 上出来的效果很差,这也证明了他的一个通病,就是泛化能力不太好
然后在上一页生成的图像上,向微笑的法向量的方向进行移动和远离,从出来的效果看,文章提出的这个方法的确可以改变真实人脸的属性
最后文章的结论是解释了 gan 的隐空间的语义
然后根据语义,可以对图片做一些编辑
然后一些没解决的问题,比如 stylegan w+ 空间,进一步解耦合
GAN的人脸应用