本文正在参加juejin.cn/post/721068…, 分享了如何用AutoEncoder生成人脸,在本篇博客,依然围绕人脸来讨论。
如何从一张人脸自然地变换到另一张人脸,或者从年轻慢慢变老,使用AutoEncoder可以很容易实现这样的功能。
二、实现原理
AutoEncoder的目的是对输入进行编码,希望这个编码能够很好的还原原有数据。当AutoEncoder训练完成后,我们可以对任意的图像进行编码,这样就可以用一个低维的向量表示图片。
那这个低维向量有什么作用呢?假设我们使用AutoEncoder把图像编码成1024维的向量,通过修改该向量,就可以达到修改图像的效果,但是我们现在的问题是如何修改向量。
对于用人脸数据训练的AutoEncoder,如果我们胡乱修改编码向量,会导致Decoder解码的内容不像人脸。在今天的例子中,需要实现人脸的渐变效果。我们可以把人脸的渐变转换成向量的渐变,使用插值算法可以很简单的实现向量渐变。比如人脸A的向量为z1,人脸B的向量为z2,此时在z1和z2之间插值4个向量,然后把这几个向量用Decoder解码,得到的效果就是人脸渐变效果。
比如下面的图片,左上角和右下角的图像是用真实图像的向量解码出来的,而中间的图像则是通过插值算法生成的向量得到的图。即使性别不同也可以很自然的变换。
三、插值算法
插值算法有很多,这里选择最简单的线性插值。就是让向量z1每一个都等距离变换,直到变换成向量z2。插值的代码非常简单,具体如下:
def interpolate(x1, x2, num): """ x1:起始向量 x2:结束向量 num:最后需要得到的向量个数 """ result = torch.zeros((num, *x1.shape)) step = (x2 - x1) / (num - 1) for i in range(num): result[i] = x1 + step * i return result
这里可以简单测试一下,代码如下:
x1 = torch.Tensor([1, 0]) x2 = torch.Tensor([0, 1]) out = interpolate(x1, x2, 5) print(out)
输出结果如下:
tensor([[1.0000, 0.0000], [0.7500, 0.2500], [0.5000, 0.5000], [0.2500, 0.7500], [0.0000, 1.0000]])
可以看到,向量x1慢慢变成了向量x2。
四、代码实现
接下来就来实现人脸渐变的效果。这里需要用到之前训练的AutoEncoder模型,具体参考博客juejin.cn/post/721068…。 加载训练好的模型,配合插值算法实现人脸渐变。
import torch from torch.utils.data import DataLoader from torchvision.utils import make_grid import matplotlib.pyplot as plt # 加载数据集 dataloader = DataLoader( FaceDataset(data_dir='/home/zack/Files/datasets/img_align_celeba', image_size=64), batch_size=2 ) model = FaceAutoEncoder() model.load_state_dict(torch.load('../outputs/face_auto_encoder.pth')) model.eval() with torch.no_grad(): for idx, data in enumerate(dataloader): # 对人脸编码 encoded1 = model.encoder(data[0].reshape((1, 3, 64, 64))) encoded2 = model.encoder(data[1].reshape((1, 3, 64, 64))) # 对人脸编码进行插值 encoded = interpolate(encoded1[0], encoded2[0], 64) # 解码成人脸 outputs = model.decoder(encoded).reshape((64, 3, 64, 64)) outputs = make_grid(outputs, normalize=True) plt.imshow(outputs.numpy().transpose((1, 2, 0))) plt.show()
其中FaceAutoEncoder和FaceDataset是上一篇博客实现的两个类。下面是几组生成效果:
在测试中发现,使用训练数据中的图片可以得到比较好的效果,而使用额外图片效果则差一点。
“本文正在参加 人工智能创作者扶持计划”
使用AutoEncoder实现人脸渐变效果
释放双眼,带上耳机,听听看~!
本文介绍如何使用AutoEncoder和插值算法实现人脸渐变效果,讨论了实现原理、插值算法和代码实现。
本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。