论文笔记Point·E: A System for Generating 3D Point Clouds from Complex Prompts

之前的文本生成3D模型的方法生成一个模型需要多块GPU跑好几个小时,该文章提出的方法生成一个3D模型只需要单GPU1-2分钟。
该文章生成的3D模型的质量并不是当下最好的,但是生成速度很快,因此在现实中很有意义。
在这里插入图片描述

从文本生成3D模型的过程分为三步:

  1. 用一个text-to-image的diffusion model从文本提示生成一幅合成视角的图片。
  2. 用一个diffusion model将合成视角图片生成低分辨率的3D点云(1024个点)。
  3. 用一个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的颜色则是通过寻找点云中最近的点的颜色来获得。

猜你喜欢

转载自blog.csdn.net/icylling/article/details/128399847