之前的文本生成3D模型的方法生成一个模型需要多块GPU跑好几个小时,该文章提出的方法生成一个3D模型只需要单GPU1-2分钟。
该文章生成的3D模型的质量并不是当下最好的,但是生成速度很快,因此在现实中很有意义。
从文本生成3D模型的过程分为三步:
- 用一个text-to-image的diffusion model生成一个合成视角的图片。
- 用一个diffusion model生成低分辨率的3D点云(1024个点)。
- 用一个diffusion model从低分辨率的3D点云生成高分辨的3D点云(4096个点)。
数据集
数据集包含7百万个格式不一,质量不一的3D模型。
使用Blender从20个随机的视角渲染(render)3D模型。
对于每一个模型,Blender标准化模型到一个bounding cube里,并使用标准的灯光设置。
接下来是通过物体渲染的图片将物体转为带颜色的点云。
先使用深度图像计算每个像素点的对应的点来生成稠密的点云,然后使用farthest point sampling(FPS)算法生成均匀的4K个点。
合成视角图片生成
合成视角图片生成模型基于GLIDE模型。
使用原始数据集和3D渲染的图片数据集的混合finetune GLIDE模型。
训练的数据,其中5%的图片从3D渲染数据集里采样,95%的图片从原始数据集里面采样。
为了保证之后总能采样到渲染器生成的图片而不是只有5%的概率采样到渲染器生成的图片,该方法在3D渲染器的text prompt上添加一个特别的token表示这生成的是3D渲染器的图片。
点云扩散
点云被表示为
K
×
6
K \times 6
K×6的tensor,
K
K
K是点的数量,6是
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)和
(
R
,
G
,
B
)
(R,G,B)
(R,G,B)。每一个数值都被标准化到
[
−
1
,
1
]
[-1,1]
[−1,1]。
本论文使用transformer-based模型来预测
ϵ
\epsilon
ϵ和
Σ
\Sigma
Σ,模型的输入是图片,时间
t
t
t和带噪声的点云
x
t
x_t
xt。
将带噪声的点云通过线性映射成
K
×
D
K \times D
K×D,时间映射成
1
×
D
1 \times D
1×D。
图片则是使用CLIP模型最后一层的输出(
256
×
D
′
256 \times D'
256×D′),再使用线性映射将其映射到
256
×
D
256 \times D
256×D。
最后输入模型的context的形状是
(
K
+
257
)
×
D
(K+257)\times D
(K+257)×D。如图所示,取模型输出的后
K
K
K个,将其映射到K个点的
ϵ
\epsilon
ϵ和
Σ
\Sigma
Σ。
点云上采样
上采样模型的结构类似上面的点云扩散模型,只是输入多了低分辨率的点云。
为了生成4096个点,上采样模型基于低分辨率的1024个点,然后生成额外的3062个点。
为了让模型能区分低分辨率的点和上一步的噪声的点,模型对低分辨率的点和上一步的噪声的点使用不同的线性映射。
生成mesh
使用基于regression的方法预测点云的有向距离场(signed distance field,SDF),然后dui SDF使用marching cubes算法得到mesh。mesh的vertex的颜色则是通过寻找点云中最近的点的颜色来获得。