人脸属性变换 —— VAE

以下人脸变换都是由AI经过训练后生成:

小哥向你微微笑:
人脸属性变换 —— VAE_第1张图片
大叔秒变魅力高:
人脸属性变换 —— VAE_第2张图片
如花一起来相会:
人脸属性变换 —— VAE_第3张图片
鲜肉招展浪滔滔:
人脸属性变换 —— VAE_第4张图片
我要在唐朝,也许也是诗人吧。。。

言归正传,以上人脸转换是通过如下过程得到:

  1. 使用CelebA数据集训练一个VAE
  2. 使用第一步得到的VAE对训练集计算出属性向量,比如把所有男性人脸图片输入encoder,算出一个平均值,再把所有女性人脸输入encoder,算出一个平均值,两者的差就是男女属性的向量
  3. 把原图输入encoder,把得到的向量减去(如果向相反的方向变化就加上)属性向量,再输入到decoder,就得到了属性转换后的图片。

所有代码保存在我的github项目seasonyc/face_vae,里面对如何使用和源文件已经做了简短说明,此处不再赘述。因为有些文件是多个项目公用,所以一些代码可能并没有在VAE中使用。

为了方便处理CelebA数据集,项目使用tensorflow和tensorflow内置的Keras,tf.dataset API创建数据源,tf.keras创建网络结构并进行训练。创建数据源时,先使用dataset.cache()把所有图片源文件缓存在内存中,再实时解码和进行一些预处理得到每一个mini-batch,通过多使用一些内存来减少硬盘的访问,这样可以缩短一半的训练时间,另外这样还可以得到更平稳的GPU使用率。当然,我的电脑仍旧是机械寻道的硬盘,如果使用固态硬盘,也许并不需要这般操作。有关使用df.dataset创建高效流水线以及更全面的深度学习性能指南,请参考DenseNet性能分析。

使用VAE很难得到比较好的效果,参见破解VAE的迷思,所以还请读者关注本系列的第二篇——GAN。

你可能感兴趣的:(人工智能,深度学习与人工智能)