新视角合成
我们在 NeRF 章节中看到了,给定大量图像,我们可以生成物体的三维表示。但有时我们只有少量图像,甚至只有一张。新视角合成 (NVS) 是一系列方法,用于从新的相机角度生成与一组图像合理一致的视图。一旦我们拥有了一组大型且一致的图像,我们就可以使用 NeRF 或类似算法构建 3D 表示。
最近开发了许多用于此任务的方法。但是,它们可以分为两大类 - 那些生成中间三维表示(从新视角渲染)的方法,以及那些直接生成新图像的方法。
一个关键的难点在于,这项任务几乎总是欠定的。例如,对于一个标志背面的图像,正面可能有很多不同的东西。同样,物体的一部分可能被遮挡,物体的一部分位于另一部分的前面。如果模型被训练直接预测(回归)看不见的部分,并使用损失来惩罚重建保留视图中的错误,那么当不清楚应该是什么时,模型必然会预测一个模糊的灰色区域,如 NerfDiff 中所述。这促使人们对使用生成式扩散模型产生了兴趣,这些模型能够从看不见区域的多个合理可能性中进行采样。
这里我们将简要讨论两种方法,它们代表了这两类。 PixelNeRF 直接从输入图像预测场景的 NeRF。 Zero123 采用 Stable Diffusion 潜在扩散模型直接生成新视图,而无需中间 3D 表示。
PixelNeRF
PixelNeRF 是一种直接从一个或多个图像生成 NeRF 参数的方法。换句话说,它将 NeRF 调整到输入图像。与原始 NeRF 不同,原始 NeRF 训练一个 MLP,将空间点映射到密度和颜色,PixelNeRF 使用从输入图像生成的特征。
图像来自:PixelNeRF
该方法首先将输入图像通过卷积神经网络 (ResNet34),将来自多个层的特征双线性上采样到与输入图像相同的分辨率。
与标准 NeRF 一样,新视图是通过体积渲染生成的。但是,NeRF 本身具有稍微不寻常的结构。在每个查询点在渲染的体积中,找到输入图像中对应的点(通过使用输入图像相机变换进行投影))。然后通过双线性插值找到该点的输入图像特征,。与原始 NeRF 一样,查询点进行位置编码并与观察方向连接。NeRF 网络由一组 ResNet 块组成;输入图像特征通过线性层,并添加到前三个残差块开始处的特征中。然后还有两个残差块来进一步处理这些特征,然后输出层将通道数减少到四个(RGB+密度)。当提供多个输入视图时,这些视图在前三个残差块中独立处理,然后在最后两个块之前对特征进行平均。
原始 PixelNeRF 模型是在 ShapeNet 数据集的一组相对较小的渲染上训练的。该模型使用一个或两个输入图像进行训练,并尝试从新的相机角度预测单个新视图。损失是渲染的和预期的新视图之间的均方误差。每个物体类别(例如,飞机、长凳、汽车)都分别训练了一个模型。
结果(来自 PixelNeRF 网站)
图像来自:PixelNeRF
PixelNeRF 代码可在 GitHub 上找到
相关方法
在ObjaverseXL论文中,PixelNeRF 在一个更大的数据集allenai/objaverse-xl上进行了训练。
Zero123(或 Zero-1-to-3)
Zero123 采用了一种不同的方法,它是一个扩散模型。它不是试图生成三维表示,而是直接从新视角预测图像。该模型采用单张输入图像,以及输入和新视角方向之间的相对视角变换。它试图从新视角方向生成一个合理且三维一致的图像。
Zero123 基于稳定扩散架构构建,并通过微调现有权重进行训练。
然而,它增加了一些新的变化。该模型实际上从稳定扩散图像变化的权重开始,该模型使用输入图像的 CLIP 图像嵌入(最终隐藏状态)来调节扩散 U-Net,而不是文本提示。但是,这里这些 CLIP 图像嵌入与输入和新视图之间的相对视角变换连接在一起。(此视角变化以球面极坐标表示。)
其余架构与稳定扩散相同。但是,在输入降噪 U-Net 之前,输入图像的潜在表示会与噪声潜在表示按通道连接。
要进一步探索此模型,请参阅实时演示
相关方法
3DiM - X-UNet 架构,在输入和噪声帧之间进行交叉注意力。Zero123-XL - 在更大的 objaverseXL 数据集上训练。另见稳定 Zero 123
Zero123++ - 生成 6 个新的固定视图,位于相对于输入视图的固定相对位置,并在输入和生成图像之间进行参考注意力
< > GitHub 更新