最新的3D Content Generative Models (2025.5)

3D Content Generative Models with Larger Scale

几何讨论班xbj学长的talk

一些防止忘记的东西

ViT/DiT: 分patch,然后用transformer

VAE:

\[\mathcal{L}_{KL}(\mathcal{N}(\mu,\sigma)|\mathcal{N}(0,1)) = -\frac{1}{2}(1+\log(\sigma^2)-\mu^2-\sigma^2) \]

VAE原理是encode成一个近似高斯的分布,采样后decode;优化对数似然的证据下界,由两部分构成:重建误差和KL loss

rectified flow:

\[% 向量场建模:学习一个速度函数 v_theta \frac{d x_t}{d t} = v_\theta(x_t, t) \\ % 训练目标:使速度 v(x_t, t) 逼近数据点方向 \mathcal{L}_{\text{RF}} = \mathbb{E}_{x_0, t, \epsilon} \left[ \left\| v_\theta(x_t, t) - \frac{x_0 - x_t}{1 - t} \right\|^2 \right] \\ % 如果将 ODE 显式写出,可以表示为: x_0 = x_t + \int_t^1 v_\theta(x_s, s) \, ds \]

DreamFusion

使用二维的扩散模型,从二维扩散模型里面借助一些先验知识来辅助进行3d生成

对每个三维物体创建nerf,然后从 nerf 的 density 里面提出 normal,从 normal 里面重建出 mesh 表面,再随机打一个光照,用 nerf 的体渲染方式进行渲染,得到一个 rendering 的图片,并对这个 rendering 图片加添加噪声。添加完噪声之后送到一个预训练好的2d的 diffusion model 里面。让 model 来预测出所添加的噪声是多少,然后将这个二维模型预测出的噪声和它真实添加噪声来计算一个 loss

根据扩散模型的训练目标,预测噪声的误差其实就代表了图像在“生成路径”上的偏离。

这就像说:扩散模型希望图像往哪个方向去才能更接近一个好图像?

所以,DreamFusion 反向传播这个差值,等于是在说:

「你当前渲染的图像偏离了扩散模型对‘理想图像’的期望,这个方向的误差就是你应该优化的方向。

缺点:速度慢、会跟2d的图像过于接近,从而会有过饱和颜色的产生

Score Distiallation Sampling (SDS)

\[\nabla_\theta \mathcal{L}_{DF}(\theta) = \frac{{\partial}}{\partial\theta}\|\hat{\epsilon}_{\theta}(x_t,y,t) - \epsilon_t\|^2 \\= 2(\hat{\epsilon}_{\theta}(x_t,y,t) - \epsilon_t)\frac{\partial \hat{\epsilon}_{\theta}(x_t,y,t)}{\partial x_t} \frac{\partial x_t}{\partial \theta} \]

其中y是文字prompt,由于计算成本忽略 Noise Predictor Jacobian 中间这一项,得

\[\nabla_{\theta}\mathcal{L}_{SDS}(\theta) = 2(\hat{\epsilon}_{\theta}(x_t,y,t) - \epsilon_t) \frac{\partial x_t}{\partial \theta} \]

SDFusion

把prompt加到denoise的网络里

LAS-Diffusion

双阶段的生成,利用稀疏体素降低计算的开销

只在shapenet上进行的试验,只能生成简单的物体

3DShape2VecSet

把三维物体压缩到VecSet上,是一个很好的表达,后面的大规模的模型很多都用了这个

具体来说,用一组Latent向量来表示一个三维物体,在查询时通过这些向量来得到查询点的occupancy值:

  1. 之前的方法有全局编码一个向量,但难以编码形状细节;
  2. 也有单独记录三维坐标和对应的向量,并通过线性插值来获取坐标依赖的Latent向量;
  3. 本方法用网络编码空间信息,不explicitly表示出来(cross attention来获取插值权重)

KL regularization block

\(C\) 维压缩到 \(C_0\) 维:用两个线性层得到 \(C_0\) 个均值和方差(VAE),再从中采样,训练时加上KL loss,这是为了后面的diffusion生成

Shape Decoding

此外为了增加expressivity,额外给这些latent向量过几遍self-attention,查询时用上面提到的cross attention获取空间中查询点的occupancy

Generation

diffusion生成在KLblock后得到的latent vector,也就是VAE的分布

CLAY

根据学长讲的,跟vecset的区别是transformer堆叠的非常非常大(1.5B),导致效果很好,且可以生成mesh和纹理,以及各种下游的应用

Hunyuan3D 2.0

DiT-几何生成,Paint-纹理生成

ShapeVAE

优化Vecset的采样点,在边缘信息丰富的地方增加额外采样来计算Latent tokens

此外,把occupancy改成sdf,loss也改成sdf的mseloss

Hunyuan3D-DiT

使用flux的架构,堆叠了一些Double Stream Block和Single Stream Block来预测噪声

Hunyuan3D-Paint

使用multiview渲染的路线,把三维物体在多视角下进行渲染得到渲染它的 normal 和 depth,然后把 normal 和 depth 送进一个网络里面来生成它的多视角纹理图

设计了一种贪心策略,用尽可能少的视角来覆盖整个三维物体

FlashVDM

混元2.5还没有开源,可能用了这篇文章的技术

VDM - Vecset Diffusion Model,对Vecset进行加速

首先Vecset生成有四个步骤:

  1. Image Encoding,通过图片得到一个latent code
  2. Diffusion Sampling,通过这个图片的信息从噪声denoise出若干个latent tokens
  3. VAE Decoding,通过计算查询点和latent token之间的attention,decode出三维模型
  4. Marching Cube计算出mesh表面

现有的模型(2.0)里1和4的占用时间很少,2和3比较慢,FlashVDM为此做了一些改进:

decoder的加速

  1. 所有的计算改成Fp8,用torch.compile进行了计算图的优化

  2. query查询点太多,先查询一部分点,如果这些点的邻域的sdf符号发生了变化,说明这个点是在物体表面附近的,那么再在这个点周围找一些点来查询,通过这种层级式的 volume decoding 来加速 decode 的进程

  3. Adaptive KV Selection

    作者发现大多数的查询点只对少部分的latent token查询的cross attention是正的,其余都是0

    从统计上来看,一共3000多个token,对一个查询点真正有用的最多也就1000个,说明attention是有局部性的

    作者设计了kv connection:把一个大的volume切分成一些小块,然后每个小块采样少量点去查询,只保留这些查询中分数最高的Top K个token来算cross attention,小块可以并行加速

  4. 把decoder进行轻量化处理,减小MLP深度等等参数

diffusion的加速

consistency Distillation

核心思想是希望从噪声最大的地方直接预测出x0,因此定义一个一致性模型,能够在任意地方都预测相同的x0

定义teacher model是我们训练好的DiT,希望蒸馏出一个student model能够进行上面的操作,用以下的Loss进行训练:

\[\mathcal{L}_{CFD}(\theta) = \mathbb{E}\left[d\left(f_{\theta}(x_{t_n},t_n), f_{\theta^-}(\hat{x}_{t_{n+1}}^{\phi},t_{n+1})\right)\right] \]

\(d\) 是一个距离函数;左边的 \(f_{\theta}\) 是训练的student model,右边的 \(f_{\theta^-}\) 是regular copy of student model named as target model;右边里面的\(\hat{x}_{t_{n+1}}^{\phi}\) 是用teacher model得到的下一个时间步的预测

Stablizing Target Model
  1. 首先把student model初始化为guidance distillation得到的model(直接和Rand CFG模型进行蒸馏训练,\(\mathcal{L}_{GD} = d(u_{\theta}^t, u_{\phi}^t)\)

  2. target model采用EMA

    \[\theta^{EMA}_t = \alpha \theta^{EMA}_{t-1} + (1-\alpha)\theta_{t-1} \]

    \(\alpha\) 一般很大

  3. \(d\) 设为Huber loss,因为它在误差较大时为线性,更不敏感

  4. 采用一种multi-stage-multi-phase的策略(Phased consistency models ICLR2024),a single-phase finetuning is performed after five phases pretraining

Adversarial Finetuning

在latent space里直接进行一个Adversarial learning,使用 hinge loss 让 ground truth \(x_0\)和去噪后的\(x_0^{t_n} = f_{\theta}(z_{t_n}, t_n)\) 尽量接近,但注意并不直接用x0进行discrimination,而是在latent后面接上输出T/F的classification head,也就是用需要比较的两项所产生的latent进行区分和Loss计算。

TripoSG

也是使用的vecset,并且diffusion生成latent code的模型;diffusion的去噪模型使用U-ViT网络,大概是一个Unet,里面是self-attention和与image prompt进行的cross attention;此外在Unet的最后6个decoder中采用了 MoE 技术,8个expert每次激活两个和一个shared expert,把参数量从1.5B提升到4B。

Trellis3D

使用的latent是:

\[\mathcal{z} = \{(z_i,p_i)\}_{i=1}^L, z_i \in \mathbb{R}^C, p_i\in\{0,1,\cdots, N-1\}^3 \]

也就是在每个\(z_i\)向量上,额外定义这个向量在哪个voxel上被激活,\(z_i\)也就是这个voxel附近的 local latent(一共\(N^3\)个voxel,但\(p_i\)在物体表面上)。作者的意图是通过\(p\)来表示粗略的物体表面,再通过每个\(p_i\)上的latent表示一些精细细节。

接着进行一个multiview aggression,大概是通过在随机几个方向上的投影图的dino feature,传递到每个像素对应空间中的voxels,再通过取空间中的平均得到active voxel对应的feature,然后训练VAE encoder和decoder,计算重建Loss和KL loss。

生成通过rectified flow,先生成空间中的点集 \(p\) ,这部分也用了一个简单的VAE把\(N^3\)的occupancy映射到\(D^3*C\)的latent空间,作者说由于\(p\)只是粗略的3D表示,这样的压缩是几乎无损的。然后生成sparse voxels上的latent,这部分作者通过一种\(2^3\)的压缩方式提升了效率

关于3D Editing with Structured Latents,作者说通过保留sparse voxel的结构,只进行第二阶段的text-prompt生成,就可以在保留大概结构的同时改变表面的细节。此外,还可以通过删掉一部分点来比如去一条胳膊等等,这个模型相比vecset的最大优势也就是可以在局部做编辑。

TripoSF

也是用的稀疏体素;核心创新点在于VAE,通过放置任意角度和位置的相机(包括物体内部)和只激活部分voxel加入了一个Render Loss,这样可以使物体内部的重建结果更精准,而且放大的视角的渲染让重建细节更精准;DiT和Trellis一样

Conclusion

  1. Multiview Diffusion model和SDS已被完全弃用,主要用Sparse voxel和Vecset
  2. VAE很重要
  3. 纹理生成to be explored
  4. 是否能把双阶段的生成模型融合成一阶段(误差累积问题)
  5. Sparse voxel相比Vecset更好的保存了3D模型的结构性,但是用sparse transformer不好训练
posted @ 2025-05-18 01:12  lcyfrog  阅读(104)  评论(0)    收藏  举报