最近看了不少论文,大致了解了一下3D-aware GAN的发展,这篇感觉比较有意思,拿来写一写

Introduction

3D-aware GAN可以生成连续视图的图像,但是分辨率往往不高,因为NeRF结构的限制,高分辨率图像的生成需要很大的计算成本。而StyleGAN作为高分辨率2D图像生成中极为先进的方法,将StyleGAN用于3D连续视图的生成也是理所应当的事情

在之前的组会上我讲过一篇运用StyleGAN生成3D高分辨率连续视图的论文,还有之前的SURF-GAN,两者对StyleGAN有着不同的应用方式,而这次的StyleSDF则提出了不同于以上两者的方法

Method

上图为流程图,一个SDF Volume Renderer模块负责生成特征图、低分辨率图片、以及3D的网格图,然后将生成的特征图输入到StyleGAN中生成高分辨率的图像,从高斯分布随机采样zz,输入到一个映射网络中生成SDF模块的latent code,然后再通过一个映射网络生成StyleGAN的latent code

该论文主要设计的部分就是这个SDF模块,该模块的输入包括想要查询的三维坐标xx以及观察的方向vv,生成对应的密度σ(x)\sigma(x)、颜色c(x,v,w)c(x,v,w)、特征f(x,v,w)f(x,v,w),为方便表示之后将latent code ww省略

其中密度并不是直接生成的,而是先生成一个d(x)d(x),这个数值表示的意义是三维坐标xx与人像表面的边界的距离,d(x)为负数就说明点在边界内部,为正数就说明点在边界外部,使用以下公式将其计算成密度

σ(x)=Kα(d(x))=1αSigmoid(d(x)α)\sigma(x) = K_{\alpha}(d(x)) = \frac{1}{\alpha}\cdot Sigmoid(\frac{-d(x)}{\alpha})

因为Sigmoid函数的存在,当d(x)d(x)为负数时密度会趋近于1,为正数时会趋近于0

计算出密度后,用以下公式渲染出低分辨率图片以及特征图

C(r)=tntfT(t)σ(r(t))c(r(t),v)dtC(r)=\int_{t_n}^{t_f}T(t)\sigma(r(t))c(r(t),v)dt

F(r)=tntfT(t)σ(r(t))f(r(t),v)dtF(r)=\int_{t_n}^{t_f}T(t)\sigma(r(t))f(r(t),v)dt

其中,T(t)=exp(tntσ(r(s))ds)其中,T(t)=\exp(-\int_{t_n}^{t}\sigma(r(s))ds)

上式中,光线r并没有像其他方法一样进行随机采样,而是先采样一个偏移项δU[0,tftnN]\delta\sim \mathcal U[0,\frac{t_f-t_n}{N}],并按照以下公式采样NN个点

ti=tftnNi+δ,wherei{0,...,N1}t_i=\frac{t_f-t_n}{N}\cdot i+\delta, where\,\,\,\,i\in\{0,...,N-1\}

分层采样会添加随机的偏移量从而引入随机的噪声,而我们的采样方式保证了积分间隔的长度相同,从而消除了噪声

将latent code输入到网络中的方式与StyleGAN类似,使用一个三层MLP将latent code映射为放缩和偏移参数γi,βi\gamma_i,\beta_i,激活层使用了和π\pi-GAN一样的SIREN

ϕi(x)=sin(γi(Wix+bi)+βi),i{0,...,7}\phi_i(x)=sin(\gamma_i(W_i\cdot x+b_i)+\beta_i), \,\,\,i\in\{0,...,7\}

Loss

除了对抗损失外,该文另外设置了三个损失

Pose Alignment Loss

判别器除了判断真假,同时还预测图片的相机参数(ϕ,θ)(\phi,\theta),对于两个角度都计算以下损失

Lview={(θ^θ)2ifθ^θ1θ^θotherwise\mathcal L_{view}= \begin{cases} (\hat\theta-\theta)^2\,\,\,\,if|\hat\theta-\theta|\leq1\\ |\hat\theta-\theta|\,\,\,\,\,\,\,\,otherwise \end{cases}

Eikonal Loss

这个损失文中的解释是确保了学习到的SDF在物理上是有效的,应该作用就是保证函数d(x)d(x)是线性的,与现实保持一致

Leik=Ex(d(x)21)2\mathcal L_{eik}=\mathbb E_{\mathbf x}(||\nabla d(\mathbf x)||_2-1)^2

Minimal Surface Loss

Lsurf=Ex(exp(100d(x)))\mathcal L_{surf}=\mathbb E_{\mathbf x}(\exp(-100|d(\mathbf x)|))

文中解释没太看懂,鼓励三维网络以最小的过零体积来描述场景,以防止在场景中形成虚假的和不可见的表面

Result

这几个方法我基本都看了一遍,总体上看该方法确实更好一些,三维网格也更清晰,但是感觉缺少一些细节。上图中的结果是使用同一个latent code得到的

定量实验结果,分数不错,但是好像是不如我之前组会讲的那一篇同会议的方法eg3d,但是那个方法确实计算成本更高,训练也需要更多资源,毕竟要从头训一个StyleGAN

高低分辨率图片的对比

结论

之所以写这一篇是因为eg3d是同年同会议的方法而且比这个方法分数要高

而且在3D网格图上效果也要更好

但是eg3d要从头训练StyleGAN,且StyleGAN可以直接生成一个神经辐射场,从生成的辐射场可以直接渲染成各个方向的图片。而这个方法则是训练一个可以生成不同图片的神经辐射场,只是给NeRF添加了一个latent code来控制生成图片的样式,然后再用预训练好的StyleGAN生成高分辨率图片,两者是有本质不同的

所以这个方法还有可以提升的地方,比如3D网格的精细度,还有分数也可以追赶。而且这个方法的低分辨率图像是经过StyleGAN进行超分的,视图一致性应该也不如eg3d。需要进一步研究是否可以吸取eg3d的优势,使StyleSDF得到改进