在生产人脸的同时,我们希望可以控制人脸的属性,不同的latent code可以得到不同的人脸,当确定latent code变化的具体方向时,该方向上不同的大小对应了图像上某一个具体变化的不同幅度。为了达到这个目的,设计了Path legnth regularization,这个正则化的公式如下:
def calc_pl_lengths(styles, images):
device = images.device
num_pixels = images.shape[2] * images.shape[3]
pl_noise = torch.randn(images.shape, device=device) / math.sqrt(num_pixels)
outputs = (images * pl_noise).sum()
pl_grads = torch_grad(outputs=outputs, inputs=styles,
grad_outputs=torch.ones(outputs.shape, device=device),
create_graph=True, retain_graph=True, only_inputs=True)[0]
return (pl_grads ** 2).sum(dim=2).mean(dim=1).sqrt()
这一步里面的self.pl_mean就对应公式中的滑动平均的a。
self.pl_mean的更新方式如下:
采用0.99的动量进行滑动平均:
styleGAN使用Progressive growth会有一些缺点。如下图,当人脸左右偏转的时候,牙齿没有偏转:
也就是说,人来鸟的一些细节,如牙齿、眼珠等位置比较固定,没有根据人脸的偏转而变化,造成这种现象是因为采用了Progressive growth训练的方式。Progressive growth来自PGGAN,是先训练低分辨率,等训练稳定后,再加入高议层的分辨率进行训练,等训练稳定后再增加分辨率,即每一种分辨率都会去输出结果,这会导致输出频率较高的细节。
使用Progressive growth的原因是高分辨率图像生成需要的网络比较大比较深,当网络过深的时候不容易训练,但是skip connection可以解决网络深度的训练问题。因此出现了下面的三种使用了skip connection的结果,并且StyleGAN2对三种结构的效果进行了实验评估:
左边的就是类似Unet的对应分辨率的skip connection,也叫是MSG-GAN的研究。然后图b是将图片转换成3通道的RGB图像,然后在做上下采样的连接。而图c则是采用类似残差链接的方式。
可以看到,判别器使用residual模式效果号,所以其实output skip或者residual两种方式好像都还可以。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有