之前的文本生成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个点。
最后是删去一些低质量的模型。
对每个点云进行SVD分解,把最小的奇异值大于一定阈值的点云删去,这样可以删去扁平(flat)的点云。
对每个物体的渲染图片计算CLIP特征,并用CLIP特征进行聚类。作者发现一些聚类包含了低质量的模型,另一些聚类则包含高质量的模型。所以作者将这些聚类分到几个桶(bucket)中,这些桶分别包含质量不同的模型,并使用桶的加权混合作为最终的数据集。
合成视角图片生成(文本->图片)
合成视角图片生成的diffusion模型基于GLIDE。GLIDE是一个基于文本提示(text prompt)生成图片的模型。
这里使用原始数据集和3D渲染的图片数据集的混合finetune GLIDE。
因为3D数据集相对原始数据集而言较小,所以训练时,其中5%的图片从3D渲染数据集里采样,95%的图片从原始数据集里面采样。
为了保证之后总能采样到渲染器生成的图片而不是只有5%的概率采样到渲染器生成的图片,作者在3D渲染器的text prompt上添加一个特别的token表示这生成的是3D渲染器的图片。
点云扩散( 合成视角图片->1K点云)
这一步依然使用扩散模型。
点云被表示为
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
Σ。
点云上采样((1K点云+ 合成视角图片)->4K点云)
上采样模型的结构类似上面的点云扩散模型,只是输入多了低分辨率的点云。
为了生成4096个点,上采样模型基于低分辨率的1024个点,然后生成额外的3072个点。
为了让模型能区分低分辨率的点和上一步的噪声的点,模型对低分辨率的点和上一步的噪声的点使用不同的线性映射。
生成mesh(4K点云->mesh)
这一步是为了渲染相关的评测做的。将点云转换成mesh再渲染。
训练一个模型预测点云的有向距离场(signed distance field,SDF)。SDF是一个场,每个位置是一个有符号的数值,数值表示距离物体表面的最近距离,符号表示该位置是否在物体内部。SDF模型基于encoder-decoder transformer。encoder的输入是无序的点序列,输出是隐含表示序列。decoder输入是隐含表示序列和3D坐标,输出是SDF的值。
模型表示为
f
θ
(
x
)
f_\theta(x)
fθ(x),SDF表示为
y
y
y,训练的目标是weighted L1损失:
然后对SDF使用marching cubes算法(marching cubes算法的介绍 https://zhuanlan.zhihu.com/p/561731427)得到mesh。mesh的vertex的颜色则是通过寻找点云中最近的点的颜色来获得。