以下人脸变换都是由AI经过训练后生成:
小哥向你微微笑:
大叔秒变魅力高:
如花一起来相会:
鲜肉招展浪滔滔:
我要在唐朝,也许也是诗人吧。。。
言归正传,以上人脸转换是通过如下过程得到:
- 使用CelebA数据集训练一个VAE
- 使用第一步得到的VAE对训练集计算出属性向量,比如把所有男性人脸图片输入encoder,算出一个平均值,再把所有女性人脸输入encoder,算出一个平均值,两者的差就是男女属性的向量
- 把原图输入encoder,把得到的向量减去(如果向相反的方向变化就加上)属性向量,再输入到decoder,就得到了属性转换后的图片。
所有代码保存在我的github项目seasonyc/face_vae,里面对如何使用和源文件已经做了简短说明,此处不再赘述。因为有些文件是多个项目公用,所以一些代码可能并没有在VAE中使用。
为了方便处理CelebA数据集,项目使用tensorflow和tensorflow内置的Keras,tf.dataset API创建数据源,tf.keras创建网络结构并进行训练。创建数据源时,先使用dataset.cache()把所有图片源文件缓存在内存中,再实时解码和进行一些预处理得到每一个mini-batch,通过多使用一些内存来减少硬盘的访问,这样可以缩短一半的训练时间,另外这样还可以得到更平稳的GPU使用率。当然,我的电脑仍旧是机械寻道的硬盘,如果使用固态硬盘,也许并不需要这般操作。有关使用df.dataset创建高效流水线以及更全面的深度学习性能指南,请参考DenseNet性能分析。