文章目录
- 前置知识
- 《Latent-NeRF for Shape-Guided Generation of 3D Shapes and Textures》【CVPR'23】
- 《NeRDi: Single-View NeRF Synthesis with Language-Guided Diffusion as General Image Priors》【CVPR'23】
- 《SparseFusion: Distilling View-conditioned Diffusion for 3D Reconstruction》【CVPR'23】
前置知识
1)纹理
\quad
在计算机图形学领域,纹理是一种应用于三维模型表面的一种贴图技术,包括颜色、图案、光泽度、凹凸、透明度等属性。纹理可以是任何形式的图像,例如木纹、石纹、花纹、斑点、噪声、透明校准图等等。直白来说,可以将纹理看作一种包含多种属性的数据。
\quad
通过将纹理映射到三维模型的表面,就可以在渲染时模拟真实场景的细节和复杂度。纹理映射需要基于 UV 映射将三维表面映射到二维纹理图像上,以便于渲染引擎在渲染时正确的将纹理信息应用到模型表面上。
2)UV Map(UV映射)
\quad
在3D建模中,模型的表面通常是由一系列三角形或四边形组成的网格构成的。每个三角形或四边形的每个顶点都有一个坐标,这些坐标被称为“顶点坐标”。在UV映射过程中,每个三角形或四边形的每个顶点都会被分配一个对应的二维坐标,称为“UV坐标”。 这些UV坐标通常被表示为(u,v)坐标,类似于平面直角坐标系中的(x,y)坐标。UV坐标的范围通常是从0到1。
\quad
一旦将UV坐标分配给模型表面的每个顶点,就可以将纹理图案或图像映射到模型表面上,使其贴合到正确的位置。这样的一个过程,类似于将一块贴纸贴在3D模型上的过程。
《Latent-NeRF for Shape-Guided Generation of 3D Shapes and Textures》【CVPR’23】
Paper: 链接
Code: https://github.com/eladrich/latent-nerf
Author: Tel Aviv University
1)动机:
dream fusion开创了2d扩散模型引导nerf生成的先河,但是其使用的是Imagen,或使用stable diffusion进行复现,庞大的资源开销是不可忽视的一个问题。此外,虽然文本能够通过预训练模型的桥梁给与3D语义上的指导,但是这种方式内在上缺乏对3D结构的约束和指导。所以这篇文章想做的事情有两个:
- 在隐空间上进行扩散过程,即引入基于潜空间的diffusion模型(LDM),使NeRF生成的图像为一个latent-code,然后stable-diffusion在这个latent-code上执行。(在隐空间上操作使得计算量更小,采样也更方便,Stable-diffusion模型也是一个LDM模型。)
- 在生成过程中给予形状的指导,即在生成过程中引入两种指导:Sketch-shape,Latent-Paint。
因此,这篇文章的主要贡献是:以往使用预训练扩散模型进行text-to-3d的工作中,文本只能提供语义的指导,在shape-guidance上缺失,所以这篇文章主要做的是为text-to-3d任务中引入两种shape-guidance。并且为了提高计算效率,作者通过结合NeRF+LDM在隐空间上实现这一过程。即用户先使用sketch-shape定义初始的几何,然后使用Latent-NeRF基于prompt来细化形状和引入纹理。
2)相关工作:
最开始的text-to-3d的工作是基于CLIP提供guidance,这一类工作以DreamFields为代表。在DreamFields出现之前,有篇文章叫CLIPMesh也是利用CLIP的guidance,DreamFields也借鉴了这个思想,但是是用NeRF来表征3D目标而不是用显式的三角网络。
在DreamFields后,CLIPNeRF对于一个condition(e.g., text or image. 也可以称prompt),使用CLIP转换为embedding,然后分别经过两个linear输出
z
s
z_s
zs和
z
a
z_a
za分别来控制形状和外貌。具体地,
z
s
z_s
zs输入至最开始的NeRF decoder输入来控制密度σ的生成(形状),
z
a
z_a
za输入至最后一个阶段控制颜色的生成(外貌,纹理)。最后渲染出的图像不仅用GT来监督,还用CLIP loss来监督。
在预训练扩散模型火爆之后,这一系列的工作逐渐开始使用预训练扩散模型(Imagen/Stable-diffusion)作为guidance,最初的文章是DreamFusion,它提出了SDS损失,后续的工作都是基于SDS来做的。
这里对SDS(Score Distillation Sampling)做一个回顾。SDS的过程是: 对于NeRF渲染出的一个视角的图像,往里加入noise后输入至预训练扩散模型,然后扩散模型的目的是预测往这个图像里加入的噪声。最后,预测到的噪声和往图像里加的噪声被用来计算每个像素的梯度。然后,这个梯度反向传播至NeRF中来更新3D NeRF模型。
预训练扩散模型(Stable-diffusion)其实就是一个扩散模型反向过程的U-Net,对于从标准正态分布中采样的一个噪声ε,可以在给定一个text prompt y的条件下生成想要的图像,这个预测的图像可以用t个时间步不断往ε中添加的噪声来表示。
因此更细节来讲,SDS的过程是,对于NeRF渲染出的一个图像,使用扩散模型的正向过程不断往里加噪声,使其最终变成一个标准正态分布噪声。正向过程中的这t个噪声就代表了NeRF渲染出的这个图像。而预训练扩散模型的作用是在给定一个text prompt y的条件下,对于从标准正态分布中采样的一个噪声,预测到想要的图像,这个图像可以用t个时间步不断往最初噪声中添加的噪声来表示。也就是在SDS的过程中,正向过程的噪声代表NeRF预测出的图像(将rendering image离散化),反向过程预测到的噪声代表预训练扩散模型认为text prompt y对应的图像(我们以这个作为GT),将这两个做差就是我们的loss就是我们的 L S D S L_{SDS} LSDS。
3)Latent-NeRF
Latent-NeRF与DreamFusion中SDS的训练过程一样,只不过NeRF生成的不是一个color和一个density,而是4个pseudo-color通道和一个density。这四个pseudo-color构成了一个隐空间图像z(64644),或者说latent color image,然后使用stable-diffusion重建这个latent code z,这样做的好处是计算效率高。注意这个过程不像DreamFusion中对NeRF产生的color和density还要渲染一下才能得到image,Latent-NeRF的输出就是latent color image,可以无需渲染直接丢进Stable-diffusion中。
虽然在latent space上训练后Latent-NeRF可以生成latent texture image,但是如何将Latent-NeRF在latent space上生成的code(color image)转换为RGB空间也是很关键的,因为我们想要的其实是RGB Image。
为了实现这一点,作者借鉴了github的一个项目<Decoding latents to rgb without upscaling>,它证明了:一个线性映射对于将4个通道的latent super pixel转换为RGB颜色是足够的,通过下面这个转换矩阵即可实现。
这个矩阵中的值是通过大量自然图像的RGB-latent pairs计算出来的。因此为了将latent-code转换为RGB,作者使用一个使用上面矩阵中的值初始化的线性层来进行转换。如果想要实现RGB细化的时候,再按照一下流程训练就行了。
4) Sketch-Shape Guidance
上面是Latent-NeRF的计算方式,但是作者想做的还有一件事,就是引入Shape guidance。这里引入的第一个guidance是Sketch-Shape Guidance,就是在训练时不仅输入text prompt,还输入一个3D mesh作为shape guidance。这个有点像Blended latent diffusion一样为网络添加shape guidance。
那么一个问题就是,这个3D mesh如何用呢?
最理想的出发点是,希望Latent-NeRF的输出密度与sketch-shape的密度相一致。此外,我们也希望新的NeRF有能力创建新的细节和几何图形,匹配输入文本提示并提高形状的保真度。以此,为了实现这种宽松的约束条件,作者鼓励NeRF的输出的每个点的密度与这个点在sketch-shape上的winding-number(平面上的闭曲线关于某个点的卷绕数(Winding number),是一个整数,它表示了曲线绕过该点的总次数。就是对每个点,都可以计算它的winding number)相匹配,但是对于表面(边界)附近的点,权重要相对更小,这样是为了鼓励网络产生新的几何图形。这样的监督方式可以形式化为下面这个损失:
其中,点p与3D sketch mesh的surface的距离,
σ
S
σ_S
σS是一个控制损失宽容程度的超参数,
σ
S
σ_S
σS值越低表示对NeRF输出的密度(形状)的约束越紧,也就是要求输出的结果越像Sketch-shape。
下图是训练过程。首先初始化一个大小为 H × W × 4 的随机潜在纹理图像,其中 H 和 W 可以根据所需的纹理粒度选择,实验中设置为 128。然后使用UV map映射到3D sketch mesh上。然后在每次score distillation的过程中,使用可微分渲染器对网格进行渲染,得到一个64 × 64 × 4的特征图,然后使用SDS的损失对z进行计算梯度,但注意不是将损失反向传播到NeRF的MLP参数,而是通过可微渲染器反向传播来优化深层纹理图像(H × W × 4)。最后在推理阶段,为了得到最终的RGB纹理图像,简单地将潜在的纹理图像通过解码器转换为RGB值,以获得更大的高质量RGB纹理。
《NeRDi: Single-View NeRF Synthesis with Language-Guided Diffusion as General Image Priors》【CVPR’23】
这篇文章主要做的是: single-view 3D reconstruction。
本文指出从单个视角进行重建的任务仍具有 挑战性,因为这是一个ill-posed问题,即从2D图像到3D场景的一对一对应关系并不存在。然而现在的大多数工作都尝试通过重建的方式来解决这个问题,即通过输入的image来优化NeRF的参数。但是这种方式需要带相机姿态的多视角图像作为监督,但是这样的方式在许多情况下是不可行的,比如互联网图像或非专业用户使用移动设备捕获的图像。最近有些工作通过使用具有新视角的对抗性损失和自我一致性的无监督训练尝试来放宽这样的约束,但是这些方法仍需要测试集遵循训练集的分布,导致泛化性有限,对未见类别的泛化性较差。
但是,尽管single view从2d到3d的映射对计算机很困难,但是对于人类而言却并不难。这是因为人类通过日常观察获得了关于3D世界的知识,并形成了一种对事物应该是什么样子和不应该是什么样子的常识。给定一个特定的图像,人类可以迅速将先验知识用于这张图象的推断上,这使得人类能够熟练地解决ill-posed的感知问题,如单视图三维重建。 也就是说,人们是因为长时间积累下来的先验知识才能更好地完成推断,所以说先验知识其实是很重要的,所以这篇文章也希望借助这样的先验知识,所以用到了stable-diffusion。
这篇文章提出的方法如下。对于一个图像,如何提供先验知识,这里使用并用GPT-2为每个图像生成标题(语义caption
s
0
s_0
s0,文本caption
s
∗
s_*
s∗)。然后将NeRF的生成z和caption s=[
s
0
s_0
s0,
s
∗
s_*
s∗]一同输入至stable-diffusion中进行训练。相当于拿prior caption的当作stable-diffusion的condition来监督z?
上面场景的分布其实就是多个视角下的分布。
《SparseFusion: Distilling View-conditioned Diffusion for 3D Reconstruction》【CVPR’23】
TODO: 这篇文章具有泛化性