头图来源 | 陈荻
文字来源 | Jack Cui
推送 | 吴优
人脸乃人之门面,在这看「颜」的时代,「颜」即正义。
出门前,都会特意看看自己的脸打扮得是否满意,而没有人会特意看看自己的脚趾窝是否干净。
生活中,人脸是人们关注的重点。技术上,人脸同样也是研究者关心的话题。
颜值高低,相貌美丑,喜怒哀乐,爱恨情仇,尽在其中。
人脸识别、人脸检测、情绪分析、人脸搜索、人脸比对、颜值评分,这琳琅满目的人脸技术,逐渐走进人们的生活。
仪表堂堂也好,样貌平平也罢,每个人脸的背后,都有一段段岁月,一段段风光,还有那独一无二的人生。
但,你有没有想过,你看到的一张人脸,可能从未存在于这个世界。
「This person does not exist.」
曾经风靡一时的 StyleGAN,给人们带来很多震撼,逼真的肖像,你根本分不清,哪张图片是算法生成的。
有人还特意用 StyleGAN v2 做了一个酷炫的网站,随机生成百变的人脸。
你每刷新一次网页,它都会给你一张随机生成的人脸肖像。
https://thispersondoesnotexist.com/
最近,刚刚开源,并被 CVPR 2020 顶级会议收录的 ALAE 才是。
ALAE 是一种新型自编码器,全名叫「Adversarial Latent Autoencoder」。
它与 StyleGAN 一样,都是一种无监督方法。不同的是,ALAE 采用的是自编码器(AE),StyleGAN 采用的是生成对抗网络(GAN)。
ALAE 不仅可以随机生成肖像,它甚至可以编辑生成肖像的人脸属性。
你可以改变图像中人脸的性别、年龄、笑容、发质,也可以改变他们的性感程度、丰满程度、嘴唇和鼻子的大小等等。
没错,这是 ALAE 生成的人脸,我们可以调整肖像的性别,看下她的“亲兄弟”可能张什么样?
当然,这属性也不能调节的太“过”,容易出“事故”。
算法原理、环境搭建、算法测试,一条龙服务,尽在下文!
自编码器是一种能够通过无监督学习,学到输入数据高效表示的人工神经网络。
输入数据的这一高效表示称为「编码」,其维度一般远小于输入数据,使得自编码器可用于降维。
更重要的是,自编码器可作为强大的「特征检测器」,应用于深度神经网络的预训练。
此外,自编码器还可以随机生成与训练数据类似的数据,这被称作「生成模型」。
编码(就是输入数据的高效表示)是自编码器在一些限制条件下学习恒等函数的副产品。
· 40, 27, 25, 36, 81, 57, 10, 73, 19, 68
· 50, 25, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20
但仔细观察就会发现,第二组数字是有规律的:偶数后面是其二分之一,奇数后面是其三倍加一(这就是著名的hailstone sequence)。
如果识别出了这一模式,第二组数据只需要记住这两个规则、第一个数字、以及序列长度。如果你的记忆能力超强,可以记住很长的随机数字序列,那你可能就不会去关心一组数字是否存在规律了。
所以我们要对自编码器增加约束来强制它去探索数据中的模式。
记忆、感知、和模式匹配的关系在 1970s 早期就被 William Chase 和 Herbert Simon 研究过。
他们发现国际象棋大师观察棋盘5秒,就能记住所有棋子的位置,而常人是无法办到的。
但棋子的摆放必须是实战中的棋局(也就是棋子存在规则,就像第二组数字),棋子随机摆放可不行(就像第一组数字)。
象棋大师并不是记忆力优于我们,而是经验丰富,很擅于识别象棋模式,从而高效地记忆棋局。
和棋手的记忆模式类似,一个自编码器接收输入,将其转换成高效的内部表示,然后再输出输入数据的类似物。
自编码器通常包括两部分:encoder(也称为识别网络)将输入转换成内部表示,decoder(也称为生成网络)将内部表示转换成输出。
如下图所示,左侧为象棋大师的记忆模式,右侧为一个简单的自编码器。
ALAE 将生成器 G 和判别器 D 分别分解成两个网络:F、G 和 E、D。
同时,参考 StyleGAN,设计了 StyleALAE,也就是我们用于生成人物头像的那块网络结构。
要想更详细的了解 ALAE 的原理,那就得“啃”论文了。
https://arxiv.org/pdf/2004.04467.pdf
这里就不堆公式了,容易看困。
https://github.com/podgorskiy/ALAE
git clone https://github.com/podgorskiy/ALAE
环境搭建,强烈建议使用 Anaconda,无论你是做爬虫也好,还是做深度学习算法也罢,选它准没错!
Anaconda 是一个针对 Python 的开源的包、环境管理器,用了它,安装各种第三方库,一切都变得很简单,再也不必为 pip 安装缺少依赖而头疼。
Anaconda 的使用,这里就不多介绍了,毕竟本文不是针对 conda 使用的教程,不懂的读者,可以搜搜 Anaconda 的安装和使用教程。
首先,你的机器必须有 GPU,并配置好 GUDA 和 cuDNN。
安装 CUDA 需要去官网,找到 NVIDIA 官网,找匹配机器显卡的 CUDA 安装。
https://developer.nvidia.com/cuda-downloads
比如,我的系统是 Windows,显卡是 RTX 2060 super。那么,我就可以下载并安装 CUDA10。
安装好 CUDA 后,可以在 Anaconda 环境中,直接安装 cuDNN。
需要注意的是,ALAE 运行需要图形界面,所以如果是 Linux 系统,需要是 Ubuntu 这类有操作界面的。
一个标准的开源项目,都有会 requirements.txt,这里有你需要安装的依赖说明。
可以看到,这个项目是使用 pytorch 1.3.0 以上的版本,还用了很多 numpy、sklearn 这些常规库。
这些都很好安装,只需要使用 conda install 安装即可,也可以用 pip install 安装。
这里面有一个“坑”,就是安装 bimpy,bimpy 是 ALAE 运行的图形界面,需要一些系统环境的依赖。
https://github.com/podgorskiy/bimpy
Windows 需要安装 MSVC 14.0,我已放到我的百度云(提取码:vjw9 ):
https://pan.baidu.com/s/1BbM5jeTc2b7OxYzsxQK3mw
安装好 MSVC 14.0 后,就可以顺利安装 bimpy。
sudo apt-get install mesa-common-dev libxi-dev libxinerama-dev libxrandr-dev libxcursor-dev
深度学习算法,怎么能少得了 「pre-trained model」。
如果配置了 VPN,采用全局模式,可以直接从 Google Drive 或 备用源下载预训练模型。
python training_artifacts/download_all.py
可以看到,一共需要下载 7 个 model。如果不能从 Google Drive 下载,会通过 亚马逊 AWS 服务器下载。
但遗憾的是,国内从 AWS 下载可能仅 10 KB。
我把这些 model 上传到了我的百度云(提取码:in5l):
https://pan.baidu.com/s/19GFKLTWu00jB3Qp4lsyAYw
一共有 4 种预训练模型,bedroom、celeba、celeba-hq256、ffhq,这是针对 4 种数据集的模型。
预训练模型下载好,放到 training_artifacts 下对应的文件夹内即可。
至此,预训练模型准备完毕。在工程目录,使用如下命令,即可运行项目:
python interactive_demo.py -c ffhq
-c 后接的参数就是选择哪个模型,一共有 bedroom、celeba、celeba-hq256、ffhq 四种可选。
结果就是一小条,这是 bimpy 窗口大小的设置问题。
运行一次 interactive_demo.py 之后,工程目录下会生成一个 imgui.ini 文件。
修改 Size 大小到 1500,1024 即可。
选择的图片是输入图片,可以理解为「初始化模板」,ALAE 算法会根据「初始化模板」的特征,随机生成一个人物图片。
现有的模板库里,都是外国人,咱们可以自己选一些中国名人的头像,裁剪成 1024 * 1024 的图片。
比如我将刘亦菲的头像,放到了 dataset_samples/faces/realign1024x1024 目录下。
这样算法就可以用刘亦菲的头像作为「初始化模板」,随机生成一个人物图片。
点击「Display Recontruction」生成人物头像。