人脸属性变换 —— VAE

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

小哥向你微微笑:
在这里插入图片描述
大叔秒变魅力高:
在这里插入图片描述
如花一起来相会:
在这里插入图片描述
鲜肉招展浪滔滔:
在这里插入图片描述
我要在唐朝,也许也是诗人吧。。。

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

  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

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
VAE是一种生成模型,用于学习输入数据的潜在分布,并从中生成新的样本。它由一个编码器网络和一个解码器网络组成。编码器将输入图像映射为潜在空间中的两个向量,即均值向量z_mean和对数方差向量z_log_var。解码器则将潜在向量z解码为重建图像。 在Python中实现VAE的伪代码如下: ```python # VAE编码器网络 from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras import backend as K from tensorflow.keras.models import Model img_shape = (28, 28, 1) batch_size = 16 latent_dim = 2 input_img = keras.Input(shape=img_shape) x = layers.Conv2D(32, 3, padding='same', activation='relu')(input_img) x = layers.Conv2D(64, 3, padding='same', activation='relu', strides=(2, 2))(x) x = layers.Conv2D(64, 3, padding='same', activation='relu')(x) = layers.Conv2D(64, 3, padding='same', activation='relu')(x) shape_before_flattening = K.int_shape(x) x = layers.Flatten()(x) x = layers.Dense(32, activation='relu')(x) z_mean = layers.Dense(latent_dim)(x) z_log_var = layers.Dense(latent_dim)(x) # VAE解码器网络 z = layers.Input(shape=(latent_dim,)) x = layers.Dense(np.prod(shape_before_flattening[1:]), activation='relu')(z) x = layers.Reshape(shape_before_flattening[1:])(x) x = layers.Conv2DTranspose(32, 3, padding='same', activation='relu', strides=(2, 2))(x) x = layers.Conv2D(1, 3, padding='same', activation='sigmoid')(x) reconstructed_img = x # 构建VAE模型 encoder = Model(input_img, z_mean, z_log_var) decoder = Model(z, reconstructed_img) vae_output = decoder(encoder(input_img)) vae = Model(input_img, vae_output) # 定义损失函数和训练过程 def vae_loss(input_img, vae_output): reconstruction_loss = keras.losses.binary_crossentropy(input_img, vae_output) reconstruction_loss *= img_shape[0] * img_shape[1] kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var) kl_loss = K.sum(kl_loss, axis=-1) kl_loss *= -0.5 vae_loss = K.mean(reconstruction_loss + kl_loss) return vae_loss vae.compile(optimizer='adam', loss=vae_loss) vae.fit(train_images, train_images, batch_size=batch_size, epochs=epochs) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值