论文带读——3D Neural Field Generation using Triplane Diffusion

论文带读——3D Neural Field Generation using Triplane Diffusion

————YssssMikey

Tips: 我会基本上几天更新一篇论文引读,一般是AIGC模型——3D+Diffusion方向每日在Arxiv上新发布的最新Paper来导读,喜欢支持的伙伴可以支持关注点赞哦!!对于文章中可能出现的错误和建议可以在评论区打出(本人也只是刚入AIGC方向的小朋友)
在这里插入图片描述

Summary

提出直接使用SOTA 2D diffusion model1来生成triplane,使扩散模型来控制生成的神经场。本文对训练数据(Shapenet meshes) 转换为连续占用字段2并分解为一组axis-aligned triplane feature representations(轴向三平面特征表示)。在实验中,3D训练场景都有2D特征平面表示,这样可以直接在这些表示上直接训练现有的2D扩散模型。

Key in this paper approach:

Key to our approach is our treatment of well-fit triplanes in a shared latent space as ground truth data for training our diffusion model. We show that the latent space of these triplanes is grounded spatially in local detail, giving the diffusion model a critical inductive bias for 3D generation. Our approach gives rise to an expressive 3D diffusion model.

将共享latent space中well-fit triplanes作为ground truth来处理,这些在latent space的triplanes在局部细节上是基本grounded的,这样就使扩散模型在3D生成上有较好的归纳偏置


Intro

提出一种基于神经场的扩散框架来用于3D表示学习。主要步骤分为以下两部分:

  • 3D 场景的训练集被分解为一组per-scene triplane features (每个场景的三平面特征) & a single , shared feature decoder(单一且共享的特征编码器)

  • 在如上的这些三平面上训练2D diffusion model,训练后的diffusion model可以在推理时用于生成新的3D场景

这样将三平面→多通道2D image,就可将生成与渲染分开,有利于直接使用SOTA 2D diffusion的backbone.

在这里插入图片描述

上图是denoising process.展示了在推理过程中的迭代去噪功能,以及通过联合学习MLP decode三平面噪声得到的形状。(将三平面特征→多通道特征图像)

3D 场景表示:使用神经场将场景表示为连续函数可以很好的扩展场景复杂性。最初的NERF是只使用单一的、大型的MLP来表示整个场景。后面主要的改进是利用局部函数学习,或使用混合显式-隐式表示,使用小的MLP来进行推理,且在局部场景细节表现的更好。本文采用的是EG3D介绍的混合三平面表示,但为了与去噪框架兼容做了一些调整。

对于现在存在的工作single-latent,只是利用3D解码器将场景表示从1D转换到了3D,而未直接进行3D扩散,这样就失去了归纳偏置而效果较差。


Contribution

  • 提出了利用2D diffusion model backbone并且有内置3D归纳偏置的框架来用于三维场景的扩散,

  • 该方法有能力生成高保真和多样化的3D场景,有余SOTA 3D GANs


Method

在这里插入图片描述

Pipeline :

  • Step-1: 用trained DDPM将latent noise→feature maps,再将它转换成三平面表示

  • Step-2: 用局部条件occupancy Net将三平面(相加 F x y + F x z + F y z F_{xy}+F_{xz}+F_{yz} Fxy+Fxz+Fyz)解码为最终的神经场

Triplane Diffusion Framework(三维形状的神经场扩散NFD):
  • Representing a 3D Scene using a Triplane

    使用occupancy fields 的3D场景表示,这样的神经场的输出是二进制的,来表明在对象的内部还是外部,并且M=1.

    Triplane representation:是一种混合的显-隐式的神经场网络架构; 其使用三个二维特征平面 f x , f y , y z ∈ R N × N × C f_x,f_y,y_z \in R^{N×N×C} fx,fy,yzRN×N×C (每个fearture的维度是**​ N × N × C N×N×C N×N×C)和一个轻量级decoder(MLP)——解释平面特征。

    通过将3D坐标投影到每个轴向平面( x − y , x − z , y − z x-y,x-z,y-z xy,xz,yz),查询和聚合各自的特征,并利用 M L P ϕ MLP_\phi MLPϕ 解码上述处理过的feature (通过求和来进行特征聚合)

    N F ( x ) = M L P ϕ ( f x y ( x ) + f y z ( x ) + f x z ( x ) ) NF(x)=MLP_\phi(f_{xy}(x)+f_{yz}(x)+f_{xz}(x)) NF(x)=MLPϕ(fxy(x)+fyz(x)+fxz(x))

    MLP和feature planes可以联合优化来表示shape的occupancy field

  • Representing a Class of objects with triplanes

    将shape dataset→triplane dataset,这样就可以在learned feature planes上训练扩散模型。

    但是要注意的点:不能对每个对象进行训练一个三平面,因为MLP和特征平面是联合学习的,所以为了将数据集中每个对象的MLP推广到有扩散模型生成的triplane,我们应当为多个对象联合优化特征平面,并使用一个shared across all objectsdecoder.

    上述联合优化的效果:联合优化得到的feature planes和一个MLP能够解释任何三平面,在推理时也可以利用这个MLP来解码我们模型生成的特征平面

    在训练过程:

    • J:每个对象J个点坐标

    • I:包含I个对象的dataset

    • N F ( i ) ( x j ( i ) ) NF^{(i)}(x_j^{(i)}) NF(i)(xj(i)): 每个点的预测占位值(occupancy values)

    • O j ( i ) O_j^{(i)} Oj(i): ground truth 占位值

    • x j ( i ) x_j^{(i)} xj(i) : 第i个场景的第j个点

    在训练过程中,J=10M,其中5M个点在整个体积中均匀采样,5M个点在物体表面附近采样,以下是训练目标(每个点的预测占位值和ground truth的占位值之间的L2 loss):

    L N A I V E = ∑ i I ∑ j J ∥ N F ( i ) ( x j ( i ) ) − O j ( i ) ∥ 2 \mathcal{L}_{\mathrm{NAIVE}}=\sum_{i}^{I} \sum_{j}^{J}\left\|_{\mathrm{NF}^{(i)}}\left(\mathbf{x}_{j}^{(i)}\right)-\mathrm{O}_{j}^{(i)}\right\|_{2} LNAIVE=iIjJNF(i)(xj(i))Oj(i)2

  • Training a Diffusion Model for Triplane Features中:

    L D D P M = E t , f 0 , ϵ [ ∥ ϵ − ϵ θ ( α ˉ t f 0 + 1 − α ˉ t ϵ , t ) ∥ 2 ] \mathcal{L}_{\mathrm{DDPM}}=\mathbb{E}_{t, \mathbf{f}_0, \boldsymbol{\epsilon}}\left[\left\|\boldsymbol{\epsilon}-\boldsymbol{\epsilon}_\theta\left(\sqrt{\bar{\alpha}_t} \mathbf{f}_0+\sqrt{1-\bar{\alpha}_t} \boldsymbol{\epsilon}, t\right)\right\|^2\right] LDDPM=Et,f0,ϵ[ϵϵθ(αˉt f0+1αˉt ϵ,t)2]

    f 0 ~ q ( f 0 ) f_0 ~q(f_0) f0q(f0) :数据分布中抽取的随机样本

    f T ~ N ( f T ; 0 , I ) f_T ~N(f_T;0,I) fTN(fT;0,I) :纯高斯噪声组成的三平面特征图,分T步逐步去噪

    f 0... T ∈ R N × N × 3 C f_{0...T}∈ R^{N ×N ×3C} f0...TRN×N×3C :三平面特征(在扩散模型中将三个三平面特征堆叠到一个图像中)

  • Regularizing Triplanes for Effective Generalization

    简单的利用(a shared triplane decoder + a dataset of triplane features),在从这些三平面特征上训练一个扩散模型后进行推理得到的shape具有人工制品的嫌疑。

    因此,文章中在优化过程中对三平面特征进行了正则化

    • 其在loss中加入了权重为 λ 1 \lambda_1 λ1 的TV(total variation)正则项**来使三平面特征的分布更类似于自然图像的manifold流型。

    • 对特征平面归一化,加入了在权值为 λ 2 \lambda_2 λ2 的三平面特征上包含L2正则项**来抑制离群值

    • 加入一个显式密度正则项EDR,从体积中采样一组随机点,用随机向量 ω \omega ω 来抵消这些点,用MLP来计算他们的均方误差 E D R ( N F ( x ) , ω ) = ‖ N F ( x ) − N F ( x + ω ) ‖ 2 2 EDR (NF (x), ω) =‖NF (x)−NF (x + ω)‖_2^2 EDR(NF(x)ω)=NF(x)NF(x+ω)22 ——上述的目的是来学习smooth outside-of-shape volume

    因此最终的训练Loss如下:

    L = ∑ i N ∑ j M ∥ N F ( i ) ( x j ( i ) ) − o j ( i ) ∥ 2 + λ 1 ( T V ( f x y ( i ) ) + T V ( f x z ( i ) ) + T V ( f y z ( i ) ) ) + λ 2 ( ∥ f x y ( i ) ∥ 2 + ∥ f y z ( i ) ∥ 2 + ∥ f x z ( i ) ∥ 2 ) + EDR ⁡ ( N F ( x j ( i ) ) , ω ) \begin{aligned} \mathcal{L}=\sum_{i}^{N} \sum_{j}^{M} &\left\|\mathrm{NF}^{(i)}\left(\mathbf{x}_{j}^{(i)}\right)-\mathrm{o}_{j}^{(i)}\right\|_{2} \\ &+\lambda_{1}\left(\mathrm{TV}\left(\mathbf{f}_{x y}^{(i)}\right)+\mathrm{TV}\left(\mathbf{f}_{x z}^{(i)}\right)+\mathrm{TV}\left(\mathbf{f}_{y z}^{(i)}\right)\right) \\ &+\lambda_{2}\left(\left\|\mathbf{f}_{x y}^{(i)}\right\|_{2}+\left\|\mathbf{f}_{y z}^{(i)}\right\|_{2}+\left\|\mathbf{f}_{x z}^{(i)}\right\|_{2}\right) \\ &+\operatorname{EDR}\left(\mathrm{NF}\left(\mathbf{x}_{j}^{(i)}\right), \boldsymbol{\omega}\right) \end{aligned} L=iNjMNF(i)(xj(i))oj(i)2+λ1(TV(fxy(i))+TV(fxz(i))+TV(fyz(i)))+λ2(fxy(i)2+fyz(i)2+fxz(i)2)+EDR(NF(xj(i)),ω)

  • Sampling Novel 3D Shape

    推理过程中shape的无条件生成分为两个Steps

    • 从训练的扩散模型中采样三平面(与从扩散模型中采样图像是相同的)

      f t − 1 = 1 α t ( f t − 1 − α t 1 − α ˉ t ϵ θ ( f t , t ) ) + σ t ϵ \mathbf{f}_{t-1}=\frac{1}{\sqrt{\alpha_t}}\left(\mathbf{f}_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \boldsymbol{\epsilon}_\theta\left(\mathbf{f}_t, t\right)\right)+\sigma_t \boldsymbol{\epsilon} ft1=αt 1(ft1αˉt 1αtϵθ(ft,t))+σtϵ

      去噪过程的最后结果是归一化的三平面特征图像分布中的一个样本 f 0 f_0 f0,然后对其进行反归一化,并将生成的特征分割为 f x y , f y z , f x z f_{xy},f_{yz},f_{xz} fxy,fyz,fxz ,生成一组三平面特征

    • 查询神经场并提取meshes

      将上述得到的三平面特征与pre-trained的MLP相结合来查询神经场,再用marching cubes algorithm进行提取mesh


Conclusion:

提出了3D-Aware diffusion model,使用2D diffusion 的backbone来生成三平面特征,将强大的2D diffusion model和3D物体进行连接。与现有的3d-aware模型相比大大提高了生成对象的质量和多样性。

limitations: 生成速度很慢,这样的慢采样同DDPM的问题一样

Future works:

  • 文章中是利用生成occupancy fields的方法,但实际上可以扩展到用三平面表示的任何类型的神经场

  • 本文做的是无条件生成,但可以将其调整到文本、图像或其他输入

  • 对于慢采样问题,可以用更有效的采样器[参考Elucidating the Design Space of Diffusion-Based Generative Models]来解决,实现适时合成的效果


  1. 文章使用的是ADM(Improved Denoising Diffusion Probabilistic Models) ↩︎

  2. 可以去看看Occupancy Networks: Learning 3D Reconstruction in Function Space ↩︎

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是用 PINN 求解二阶 Diffusion 方程的 PyTorch 代码: ```python import torch import numpy as np import matplotlib.pyplot as plt # 定义求解区域的左右边界 x_left = 0.0 x_right = 1.0 # 定义时间和空间步长 delta_t = 0.001 delta_x = 0.05 # 定义神经网络的输入维度和隐藏层维度 input_dim = 2 hidden_dim = 10 # 定义神经网络的输出维度 output_dim = 1 # 定义 Diffusion 方程的初始条件和边界条件 def u_init(x): return np.sin(np.pi * x) def u_left(t): return 0.0 def u_right(t): return 0.0 # 定义神经网络模型 class PINN(torch.nn.Module): def __init__(self): super(PINN, self).__init__() self.fc1 = torch.nn.Linear(input_dim, hidden_dim) self.fc2 = torch.nn.Linear(hidden_dim, hidden_dim) self.fc3 = torch.nn.Linear(hidden_dim, output_dim) def forward(self, x, t): # 拼接时间和空间坐标作为神经网络的输入 xt = torch.cat([x, t], dim=1) h1 = torch.tanh(self.fc1(xt)) h2 = torch.tanh(self.fc2(h1)) out = self.fc3(h2) return out # 定义 PINN 的损失函数 def pinn_loss(model, x_left, x_right, delta_t, delta_x): # 定义空间和时间的网格 x = torch.linspace(x_left, x_right, int((x_right - x_left) / delta_x) + 1).unsqueeze(1) t = torch.linspace(0, 1, int(1 / delta_t) + 1).unsqueeze(1) # 计算模型在内部网格点上的预测值 x_internal = x[1:-1] t_internal = t[1:-1] u_internal = model(x_internal, t_internal) # 计算模型在左右边界上的预测值 u_left_boundary = model(x_left, t_internal) u_right_boundary = model(x_right, t_internal) # 计算初始条件和边界条件的损失 init_loss = torch.mean((model(x, torch.zeros_like(x)) - u_init(x)) ** 2) left_boundary_loss = torch.mean((u_left_boundary - u_left(t_internal)) ** 2) right_boundary_loss = torch.mean((u_right_boundary - u_right(t_internal)) ** 2) # 计算 Diffusion 方程的残差 u_x = torch.autograd.grad(u_internal, x_internal, grad_outputs=torch.ones_like(u_internal), create_graph=True)[0] u_xx = torch.autograd.grad(u_x, x_internal, grad_outputs=torch.ones_like(u_x), create_graph=True)[0] f = u_xx - (1 / delta_t) * (u_internal - u_init(x_internal)) # 计算残差的损失 residual_loss = torch.mean(f ** 2) # 计算总的损失 loss = init_loss + left_boundary_loss + right_boundary_loss + residual_loss return loss # 初始化神经网络模型和优化器 model = PINN() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练神经网络模型 for i in range(10000): optimizer.zero_grad() loss = pinn_loss(model, x_left, x_right, delta_t, delta_x) loss.backward() optimizer.step() if i % 1000 == 0: print("Iteration {}, Loss = {}".format(i, loss.item())) # 使用训练好的神经网络模型进行预测 x_test = torch.linspace(x_left, x_right, 101).unsqueeze(1) t_test = torch.linspace(0, 1, 1001).unsqueeze(1) u_test = model(x_test, t_test).detach().numpy() # 绘制预测结果 X, T = np.meshgrid(x_test, t_test) plt.pcolormesh(X, T, u_test, cmap='coolwarm') plt.colorbar() plt.xlabel("x") plt.ylabel("t") plt.title("PINN Solution to Diffusion Equation") plt.show() ``` 这段代码中,首先定义了求解区域的左右边界、时间和空间步长等参数,然后定义了 Diffusion 方程的初始条件和边界条件,以及神经网络模型和损失函数。在训练神经网络模型时,使用了 Adam 优化器,最后使用训练好的模型进行预测,并绘制了预测结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值