当前位置:   article > 正文

NeRF-Diffusion系列文章阅读_nerf diffusion

nerf diffusion

前置知识

1)纹理
\quad 在计算机图形学领域,纹理是一种应用于三维模型表面的一种贴图技术,包括颜色、图案、光泽度、凹凸、透明度等属性。纹理可以是任何形式的图像,例如木纹、石纹、花纹、斑点、噪声、透明校准图等等。直白来说,可以将纹理看作一种包含多种属性的数据。
\quad 通过将纹理映射到三维模型的表面,就可以在渲染时模拟真实场景的细节和复杂度。纹理映射需要基于 UV 映射将三维表面映射到二维纹理图像上,以便于渲染引擎在渲染时正确的将纹理信息应用到模型表面上。
2)UV Map(UV映射)
\quad 在3D建模中,模型的表面通常是由一系列三角形或四边形组成的网格构成的。每个三角形或四边形的每个顶点都有一个坐标,这些坐标被称为“顶点坐标”。在UV映射过程中,每个三角形或四边形的每个顶点都会被分配一个对应的二维坐标,称为“UV坐标”。 这些UV坐标通常被表示为(u,v)坐标,类似于平面直角坐标系中的(x,y)坐标。UV坐标的范围通常是从0到1。
\quad 一旦将UV坐标分配给模型表面的每个顶点,就可以将纹理图案或图像映射到模型表面上,使其贴合到正确的位置。这样的一个过程,类似于将一块贴纸贴在3D模型上的过程。

3)Epipolar lines(极线)
\quad 极线是立体视觉和三维重建中的一个基本概念。它们在关联一个场景或物体的多个视图之间的对应点方面起着至关重要的作用,这些对应点通常是从立体摄像机设置中获得的。

\quad 在立体视觉中,用一对摄像机从不同的角度捕捉同一场景的两幅或两幅以上的图像。极线是一幅图像中的一个对应点在另一幅图像的图像平面上的投影,形成一条线。 这意味着对于一幅图像中的一个给定点,它在另一幅图像中的对应点将位于外极线上。

\quad 极线的关键特性是它们为图像之间的对应关系提供了一个搜索空间的约束。在两幅图像之间进行点匹配时,只需沿对应于一幅图像中给定点的对极线进行搜索,减少了搜索空间,提高了匹配效率。极线是立体匹配、特征对应、三维重建等多种任务的重要工具。通过利用极上几何,可以在不同视图中的点之间建立对应关系,这是恢复场景或物体三维结构的关键步骤。


《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】

1)动机

目前稀疏视角3D重建的方法,有两类:

  • 一类是比较经典的,基于重投影特征的神经渲染方法。这类方法考虑了几何一致性,但是不能生成unseen region,且在处理大视角变化是效果也差
  • 另一类是替代的,基于(概率)生成的方法。这类方法生成图片的质量更好,但是缺乏3D一致性(对于姿态准确)和重建真实性(看起来更真实)。

这篇文章发现,“几何一致性”和“概率图像生成”不需要进行权衡,它们可以在mode-seeking behavior进行互补。

稀疏视角重建时,NeRF可以通过利用data-driven priors快速地利用multi-view cues,从而实现稀疏重建,但是在 “large viewpoint changes”的情况下,他们会产生模糊的预测,无法在“sparse input views中观测不到的区域”处产生可信的内容。比如说,在下图的两张泰迪熊中,我们观测不到鼻子的内容,所以鼻子部分的内容就属于“sparse input views中观测不到的区域”,当NeRF要预测pose的view包含鼻子部分时,就会产生模糊的结果。“sparse input views中观测不到的区域”放在GeoNeRF中,就是将Geo view中的某一处映射到sparse input views中得到的是pseudo feature的情况(也正因为input views中是pseudo feature,所以NeRF无从参考,可能性就很多)。

  • 以下图中泰迪熊为例进行分析,产生这种情况的原因是NeRF没有考虑到输出中的不确定性。比如,泰迪熊的鼻子可能是红色的或黑色的,但NeRF通过减少推断为独立的像素级或点级预测,无法模拟这种变化。
    在这里插入图片描述
    针对上面的问题,这篇文章转而将稀疏重建问题变为建模所有可能图像的分布,即利用一个扩散模型对possible image的分布进行推断。但是,尽管概率图像合成方法允许生成更高质量的图像,它并不直接产生底层对象的3D表示。事实上,多个query views(独立)采样出的输出通常不能对应到一个一致的底层3D模型,例如,如果泰迪熊的鼻子在 context views 中是观察不到的,那么,一个采样的查询视图可能将它涂成红色,而另一个则会涂成黑色。 这种现象是因为概率图像生成方法缺乏3D一致性。

所以为了获取3D一致性的表征,作者提出了一个Diffusion Distillation技巧,将扩散模型预测的分布“distill”到到一个NeRF表征上,即用扩散模型预测分布来解决“NeRF不考虑输出中不确定性”的问题(减少模糊),用NeRF表征提供3D一致性(多视角对应目标一致)。其实,读到这里可以发现,在方法上,这篇文章与DreamFusion非常相似,都是蒸馏扩散模型的知识来监督NeRF的训练。

作者还注意到,条件扩散模型不仅能够采样novel view images,而且还能够(近似地)计算生成的图像的似然。为什么这么说?因为生成图像的似然是指在给定生成模型和参数的情况下,计算生成的图像与真实观测图像之间的概率或可能性,而条件扩散模型的训练是基于对数似然的最大化,这意味着模型在训练过程中会尝试最大化生成真实图像的概率。在这样的insight下,作者通过最大化NeRF渲染图像的基于扩散的似然,来优化NeRF。

这样的方式就导致了 mode-seeking optimization,即能像diffusion model那样生成高质量的图像,又可以保持NeRF的3D一致性。mode seeking的意思是指:比如,用两张消防栓图片合成的是消防栓场景,两张狗狗的图片合成的是狗狗的场景,而不会合成消防栓,所以使用的图片就对场景做出了选择,以后遇到训练集中没见过的类别,也能够做出正确的视角生成。

2)Related work
Instance-specific Reconstruction from Multiple Views. 尽管有些工作寻求减少input views,但是它们也不能够预测 unseen regions。

Single-view 3D Reconstruction. 预测 beyond the visible 的 3D geometry (and appearance) 的能力是单视图三维预测方法的一个关键目标。之前的方法追求在不同的3D表征上预测,比如体素、网格、神经表征等,但是由于输入是单一的图像,这从根本上限制了可以预测的细节。注意,novel view synthesis和reconstruction还是有区别的,前者要求是合成图像,后者要求重建出场景的3D结构或外貌。

Generalizable View Synthesis from Fewer Views. 泛化性的工作,一条线是基于feature re-projection,比如IBRNet、GPNR、FWD、PixelNeRF、NeRFormer等,这类方法保持了3D一致性,但是它们回归到均值,并不能产生感知上尖锐的输出;另一条线是将NVS看作是一个2D生成任务,比如ViewFormer、SRT、LFN等,这类工作生成的质量更好,但代价是更大的失真和3D一致性。在下表中,是目前方法的对比。需要注意的是,Generalization 和 Generate unseen是两种情况,Generalization指的是生成新的场景,Generate unseen指的是还生成当前场景,但是生成input views中unseen的regions
在这里插入图片描述

Concurrent work. 3DiM【ICLR’23】 提出了一种用于 image-conditioned 的新视图合成的二维扩散方法,与这篇文章的不同之处是没有推断出三维表示。Nerdi【CVPR’23】 更接近这篇工作,使用二维扩散模型作为single-view三维的指导,但在这种挑战性的环境下重建的结果更粗糙。Renderdiffusion【CVPR’23】 直接在3D space中学习扩散模型,与我们利用二维扩散模型来优化三维不同。

3)Approach
由于物体的某些方面可能没有被观察到,而且其几何形状难以精确推断,直接预测3D或 novel view 会导致不确定性区域的输出是难以置信的模糊。因此为了确保 plausible 和 3D-consistent 的预测,这篇文章采取了如下图所示的 two-step 方法。π是target view pose,C是reference view的(img, pose)。
在这里插入图片描述
首先,使用一个epipolar feature transformer (EFT,受启发于GPNR)作为特征提取器,在上下文为C的情况下获取π视角下的低分辨率特征y。紧接着,训练一个view-conditioned latent diffusion model (VLDM) 来建模 p ( x ∣ π , C ) p(x|π, C) p(xπ,C)

Epipolar Feature Transformer:该篇文章提出的这个EFT是基于GPNR的前馈网络g(r,C),它预测r视角下的图像每个像素点的color,通过沿着每个像素点在input views上的极线提取特征来实现。这里对GPNR中的网络进行了一些修改:将patch projection layer换成一个ResNet-18,并修改最后一层以同时预测颜色(g(·))和特征向量(h(·))。作者训练g(·)作为一个强的baseline,并将h(·)作为几何特征输入至VLDM中,也就是将EFT看作一个几何特征提取器。

虽然EFT可以直接预测novel views,但像素级预测机制不允许它建模潜在的概率分布,从而导致不确定性区域下的模糊均值搜索预测。

在这里插入图片描述
上图是VLDM的细节图,首先将target view image用一个encoder编码为latent z 0 z_0 z0作为ground truth,依次作为diffusion model的输出,然后将EFT输出的 geometry feature y作为反向过程的condition,以此来训练扩散模型,见下面公式。其实就是在latent space上训练一个diffusion model,之所以叫view condition diffusion model,就是从input view中抽取出一个 feature vector作为condition。
在这里插入图片描述
VLDM的预测结果可视化如下,对于不确定性的不可见区域,VLDM可以生成多种结果。
在这里插入图片描述
虽然能够通过VLDM在不确定性的unseen regions生成真实的高质量预测,但是这种方式不能输出一个3D表示。事实上,由于VLDM模拟了图像上的分布,从它采样的视图不能(也不应该!)对应于一个单一的底层3D解释,因为每个采样点的目标都是不一样的。

最终的训练过程如下:不是将VLDM预测的 z ^ 0 \hat{z}_0 z^0直接拿来与NeRF的输出相减作为损失,而是将NeRF的输出作为 z 0 z_0 z0,预测 z ^ 0 \hat{z}_0 z^0,这就是文章中所说的最小化负对数似然。
在这里插入图片描述

4)总结

这篇文章从“生成模型缺乏3D一致性,NeRF缺乏生成质量” 的角度来概述现在泛化性NeRF工作的角度很有道理,此外,本篇文章提出的EFT从reference views提取geometry vector 作为diffusion model 的condition也很有用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/326386
推荐阅读
相关标签
  

闽ICP备14008679号