当前位置:   article > 正文

MaterialGAN:从ProGAN,StyleGAN,StyleGAN2到MaterialGAN_material gan

material gan

MaterialGAN:从ProGAN,StyleGAN,StyleGAN2到MaterialGAN

前言

最近拜读SVBRDF生成模型MaterialGAN,文章基于StyleGAN2,然后写下这一系列的阅读笔记与心得。本文不会论述前面ProGAN到StyleGAN2的细节,旨在搞懂这一系列网络的各自解决的问题,以及各作者对这些问题如何设计解决方案

ProGan

论文: https://arxiv.org/abs/1710.10196
Git: https://github.com/akanimax/pro_gan_pytorch

问题一:生成高分辨率图像(例如,1024*1024)难点:一、高分辨率的图像更容易区分真假;二、采用当时最先进的GAN(例如,stackGAN,LapGan),必须增加网络深度,使得网络过于复杂,占用内存增大,minibatch必须减小,使得训练稳定性变差
回答一Progressive

  1. 从低分辨率图像开始,一步一步到高分辨率图像。假设我们的网络是一个低分网络,如何得到支持更高分辨率的网络:上采样,然后再套一层。这样可行吗?新加入的层权值仅仅处于初始化状态,直接训练同样会影响前面训练好的外层网络权重。
    在这里插入图片描述
  2. 利用线性插值方法,进行fade in,fade out来一步一步的训练新加入层的权重。在这里插入图片描述

问题二:在图像质量和图像多样性之间的Tradeoff
已有回答:inception score (Salimans et al., 2016), multi-scale structural similarity (MS-SSIM) (Odena et al., 2017; Wang et al., 2003), birthday paradox (Arora & Zhang,2017), and explicit tests for the number of discrete modes discovered (Metz et al., 2016).
回答二:增强细节技术 → \rightarrow Minibatch Standard Deviation、新的评估GAN生成结果的metric → \rightarrow 基于拉普拉斯特征金字塔的Wasserstein Distance SWD

Minibatch Standard Deviation:一,在整个minibatch的训练样本中计算特征在各自空间位置得标准偏差;二,计算这个标准偏差的平均值(a single value);三,将这个平均值通过复制和concatenate方法传播到该minibatch的所有位置,这样就形成了一个新的常量特征图。作者提到该方法可以插入到判别器的所有层,但最后一层之前是最有效的。
其他细节增强技术:1. unrolling the discriminator (Metz et al., 2016) to regularize its updates; 2. a “repelling regularizer” (Zhao et al., 2017) that adds a new loss term to the generator, trying to encourage it to orthogonalize the feature vectors in a minibatch; 3. The multiple generators of Ghosh et al. (2017)

基于拉普拉斯特征金字塔的Wasserstein Distance SWD:该特征可以提供多尺度统计上的相似度

其他:当判别器梯度过大时,信号强度在生成器和判别器都会增大,它们之间的不良竞争随之而来。提出一种阻止生成器参与这种竞争的方法。

  • 使得训练速度更加平均的初始化方法:基于He’s initializer (He
    et al., 2015)
  • 生成器中,在每个卷积层后对特征向量做基于单位长度的归一化(pixelwise):“local response normalization” (Krizhevsky et al., 2012)。作者提到这个归一化不会对结果产生很大的影响,但是却可以大大减少不良竞争。

参考资料:
【GANs学习笔记】(十八)LAPGAN、ProGAN、SRGAN
ProGan: Step by Step, better than better

StyleGAN

论文: https://arxiv.org/abs/1812.04948
Git: https://github.com/NVlabs/stylegan
问题: ProGAN与多数GAN一样,控制生成图像的特定特征的能力非常有限。这些属性相互纠缠,即使略微调整输入,会同时影响生成图像的多个属性。例如,改变输入图像的眼睛,得到的输出图像可能会脸型很不一样。如何解耦,以至于更方便编辑?
回答:基于风格的生成器 → \rightarrow Style-based Generator
在这里插入图片描述

  1. mapping network f f f:用一个多个全链接层的映射网络将latent code从空间 z ∈ Z z\in\mathcal{Z} zZ映射到耦合性低的空间 w ∈ W w\in\mathcal{W} wW,使得 W \mathcal{W} W空间的不同元素能控制不同特征。

  2. AdaIN A A A w w w通过AdaIN输入到生成器的每一层中。生成器的每一层的结构类似与风格迁移,但其缩放因子 y s , i y_{s,i} ys,i和平移因子 y b , i y_{b,i} yb,i是通过 w w w进行仿射变换得到的。 μ → m e a n \mu \rightarrow mean μmean , σ → v a r i a n c e \sigma\rightarrow variance σvariance在这里插入图片描述

  3. Noise B B B:为生成器的每一层加入Noise输入以增强随机细节。噪声是由高斯噪声组成的单通道图像,将一个噪声图像提供给合成网络的一个特征图。在卷积之后、AdaIN之前将高斯噪声加入生成器网络中。B使用可学习的缩放参数对输入的高斯噪声进行变换,然后将噪声图像广播到所有的特征图中(分别加到每个特征图上,每个特征图对应一个可学习的scale参数)。

作者设计生成器网络的心路历程:A ⇒ \Rightarrow 基于ProGAN的生成器,在CelebA-HQ和FFHQ上可以得到微小的提高,但是对于LSUN毫无效果;B ⇒ \Rightarrow 将生成器和判别器中的near-neighbor up/down方法改为bilinear up/downsampling( 2 n d 2^{nd} 2nd order binomial filter的低通滤波),从8*8开始像ProGAN一样进行progressive grow,用更多的数据,并且调节其他超参数;C ⇒ \Rightarrow 加入映射网络和AdaIn,发现latent code对第一层的卷积的输入变得无效;D ⇒ \Rightarrow 摒弃传统输入,将一个可学习的常数作为生成器的初始输入;E ⇒ \Rightarrow 引入noise;F ⇒ \Rightarrow 用混合正则化(mixing regularization)来减少相邻style之间的联系
在这里插入图片描述
风格混合插值:用两个latent codes z 1 , z 2 z_1,z_2 z1,z2 通过映射网络 f f f得到的 w 1 , w 2 w_1, w_2 w1w2进行插值

其他:两个量化插值质量和解耦效果的自动化方法
感知路径长度(Perceptual path length):纠缠越严重,对latent code进行插值在图像中产生非线性变化越明显。所以通过测量当在两个latent codes进行插值时图像的剧烈变化程度,可以反映隐空间的纠缠程度(特征分离程度)。定义:将两个latent codes之间的插值路径细分为小段,感知总长度定义为每段感知差异的总和。感知路径长度是这个和在无限细的细分下的极限,文中用latent sapce Z中所有可能端点(在路径中的位置)的平均感知路径长度来计算。
l Z = E [ 1 ϵ 2 d ( G ( f i n t e r p l o t a t i o n ( z 1 , z 2 ; t ) ) , G ( f i n t e r p l o t a t i o n ( z 1 , z 2 ; t + ϵ ) ) ) ] l_{\mathcal{Z}}=\mathbb{E}[\tfrac{1}{\epsilon^2}d(G(f_{interplotation}(z_1, z_2;t)),G(f_{interplotation}(z_1, z_2;t+\epsilon)))] lZ=E[ϵ21d(G(finterplotation(z1,z2;t)),G(finterplotation(z1,z2;t+ϵ)))]
其中 d d d使用基于感知的成对图像距离:两个VGG16 embeddings之间的差异,利用VGG16提取出图像的特征,在特征层面上计算距离。作者对 W \mathcal{W} W Z \mathcal{Z} Z分别采用不同的线性插值,因为 W \mathcal{W} W向量没有进行归一化。

线性可分性(linear separability):如果一个隐空间是充分解耦的,应该能够找到与每个变化因子对应的方向向量。作者提出了线性可分性来量化这种效果,测量通过线性超平面将latent space分割成两个不同的集合的程度,使每个集合对应于图像的特定的二元属性(比如男、女)。
①训练40个辅助分类器,分别对40个二元属性进行区分(每个分类器区分一个属性)。分类器与StyleGAN判别器结构相同。
②使用生成器生成200,000个图像,并使用辅助分类器进行分类,根据分类器的置信度对样本进行排序,去掉置信度最低的一半,得到100,000个已知类别的latent code
③对于每个属性,拟合一个线性SVM来预测标签-基于传统的隐空间点或基于样式的隐空间点w-并且根据这个超平面对这些隐空间点(512维,10000个点)进行分类。
④用条件熵 H ( Y ∣ X ) H(Y |X) H(YX)度量超平面将点划分为正确类别的能力,X是SVM预测的类别,Y是预先训练好的辅助分类器确定的类(作为真实类别);因此,根据SVM确定样本在超平面的哪一边,条件熵告诉我们需要多少额外的信息来确定样本的真实类别。直觉上,如果隐空间中的变化因子是耦合的(非线性的),那么用超平面来分离样本点将会更加困难(需要更多的额外信息),产生高的条件熵。较低的值表示易于分离(可分性好),因此解耦程度更大。 e x p ( ∑ i H ( Y i ∣ X i ) ) exp(\sum_i{H(Y_i|X_i)}) exp(iH(YiXi))

参考资料:
论文阅读-人脸生成_StyleGAN
StyleGAN-基于样式的生成对抗网络(论文阅读总结)
源码解释系列参考资料:
一 试用分享:模型下载、结果、系列链接
二 generate_figure.py
三 基于ResNet50构造StyleGAN的逆向网络,从目标图像提取特征码
四 提取真实人脸训练过程的优化:前一篇的训练细节
五 提取真实人脸特征码第二布:微调分享了一些思路(思路1不可行?)
六 真实人脸对应的特征码StyleGAN Encoder:建议下载源码对应该博文理解源码
七 应用
八 StyleGAN Encoder的align_images.py

StyleGAN2

论文: http://arxiv.org/abs/1912.04958
Git: https://github.com/NVlabs/stylegan2
问题:StyleGAN生成的图片还是会带来artifacts问题,例如头发等会出现明显的异常(水滴状异常);牙齿不会随着头部的转动而转动。
分析

  1. 水滴状异常。从64*64图像开始出现,分辨率越高越明显。特征图分析定位法:归一化操作。为什么出现?如果某个局部信号特别强(归一化操作中对训练数据的统计上频繁出现?),就会让生成器觉得这个信号是存在的,并且会将其转化为某一个特征出现在最后的结果上。去掉mean?
    在这里插入图片描述
  2. 渐进式增长的生成器在细节上似乎有很强的位置偏好。采用skip connection和Residual nets两个方案改进StyleGAN的合成阶段(不用进式增长的生成器)。
    在这里插入图片描述

参考资料:
英伟达StyleGAN2升级:生成图像质量更高,修复特征伪影
如果没有StyleGAN2,真以为初代就是巅峰了
源码解释系列参考资料:
一 试用分享:训练准备、结果、Encoder、系列链接
二 真实人脸投射和重构:训练指南、结果
三 StypleGAN2 Encoder 真实人脸投射和重构:训练指南、结果
四 StyleGAN2 Encoder
五 StyleGAN2 Encoder projector.py和project_images.py:介绍了整体流程
六 StyleGAN2 Encoder dataset_tool.py和dataset.py:数据加载
七 StyleGAN2 training_loop.py:训练图构建
八 用 StyleGAN2 生成印象派油画
九 StyleGAN2真实人脸重构四种方法

MaterialGAN

论文: https://shuangz.com/projects/materialgan-sa20/

  1. 通过数据增强过的svbrdf数据集训练一个基于StyleGAN2的网络,latent space W + ⊂ R 512 ∗ 14 W^+\subset R^{512*14} W+R51214
  2. 生成网络 G G G权重不变: G ( w + , ξ ) = θ ( a , n , r , s ) G(w^+,\xi)=\theta(a,n,r,s) G(w+,ξ)=θ(a,n,r,s), 其中 ξ \xi ξ是noise。对于拍摄图片 I = I 1 , I 2 , . . . , I k I=I_1, I_2, ..., I_k I=I1,I2,...,Ik, 已知光照 L i L_i Li, 优化其latent code w + w^+ w+.
    w ∗ = a r g m i n w ∑ i = 1 k L ( R ( G ( w + , ξ ) ; L i ) , I i ) w^*=argmin_{w}\sum^{k}_{i=1}\mathcal{L}(R(G(w^+,\xi);L_i), I_i) w=argminwi=1kL(R(G(w+,ξ);Li),Ii)
    其中, R ( θ ; L i ) R(\theta;L_i) R(θ;Li)是指在光照 L i L_i Li下,svbrdf参数 θ \theta θ渲染出来的图片。这样,我们就得到了 I I I的latent code和其对应的svbrdf参数
    在这里插入图片描述

算法输入
3 ∗ 3 3*3 33盏可以覆盖全部材质的灯下,拍摄的9张图片

算法效率
文章指出,第二步在Titan RTX GPU上每两分钟可以完成2000次迭代;一般情况,每个材质只需要约500次迭代就可以达到收敛

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号