paper-reading5

paper-reading about 3D scene generation

Gaussian splatting

Training-free Camera Control for Video Generation

主要流程为,根据一张输入图片合成几张遵循特定视角轨迹的图片,之后喂给一个预训练的视频生成模型。

model explicit camera motion in point cloud space

通过点云表示3D信息。

点云初始化

给定一张输入图片,先使用单目深度估计模型(Zoedepth)得到深度图,再根据RGBD数据和相机参数生成初始点云。

其中I为RGB值,D为深度值,K为相机内参,P为相机外参。

相机运动建模

相机运动被建模为相机外参的序列{}。

多视角渲染

根据给定的相机运动,对每个位姿进行渲染。

在这个过程中需要进行一些优化

点云更新

初始点云在一些区域会有空缺,所以需要更新。
每渲染一张新视角的图片,对图片进行修复(inpainting),之后用新图像对点云进行更新。

深度优化

估计深度的模型只会估计相对深度,所以视角改变后会有误差。按如下公式进行优化:

其中是修复后的图片,是修复后的深度图。

camera-controllable video generation with the guidance of noise layout prior

就是将多视角图片加噪后作为初始噪声执行去噪过程。

ViewDiff: 3D-Consistent Image Generation with Text-to-Image Models

以文字或图片为输入,生成多视角图片(含背景)

主要创新点为在unet中增加了跨帧注意力层和一个Projection Layer。

跨帧注意力层

W是预训练的用于特征投影(feature projection)的权重矩阵,h是输入图像的特征。

还需要告诉网络每张图像的相机位姿

是相机矩阵 的一个embedding
是相机焦距和像主点(principal point)的embedding
是图像RGB值的均值方差

对KV也有类似改变。

Projection Layer

跨帧注意力层可以产生3D一致的图片,但是物体不是精确地遵循特定的相机姿态,因此需要一个Projection Layer。

根据输入图片以及相机位姿分别合成体素,之后进行合成,refinement,rendering得到输出的特征。

simple diffusion: End-to-end diffusion for high resolution images

讲了几个在生成高分辨率图像时的技巧:

Adjusting Noise Schedules

weight function

对于通常的 schedule,最初适用的分辨率为32*32或64*64,但对于高分辨率图像如512*512,这个scheduler加的噪声不够多,会导致去噪过程只有很小的时间窗去决定图像的全局结构。

为什么高分辨率加的噪声不够呢?

在unet中,图像需要经过下采样来获得低分辨率的feature map,假设使用的是average pooling,从128到64,有

则下采样后方差变小了4倍

可以进一步推广

解决方案是,以某一个分辨率为基准,对于高分辨率的图像,乘一个系数增大SNR。

ReconFusion: 3D Reconstruction with Diffusion Priors

由两部分组成:新视图生成3D重建

新视图生成

条件指导

关键是如何把输入图像作为条件指导unet去噪。

  1. 对输入图像的高级语义信息,使用CLIP编码并通过cross attention输入进unet中
  2. 对于相对相机姿态和几何信息,使用PixelNeRF,渲染一个目标视角的feature map,空间分辨率与图像的latents一致,然后沿着channel维度与noisy latent连接,输入进unet中。

feature map:CNN的中间产物,储存着图像的特征信息。

相较于把输入图像的latents直接连接到unet的输入,并将相对相机变换作为向量连接到CLIP embeddings,文中的方法有更好的效果。

loss设计

使用Diffusion loss

其中是噪声,是unet的输出,是时间步,是输入图像的CLIP embeddings,是PixelNeRF的输出feature map。

此外对于PixelNeRF的参数也有一个loss:

其中是PixelNeRF的输出,是目标图像的下采样。这种loss鼓励 PixelNeRF重建RGB 目标图像,有助于避免因无法利用 PixelNeRF 输入而产生的不良局部极小值。

3D重建

loss设计

使用NeRF储存3D信息。
对于输入的视角(仅应用于现有的视角,不用于新合成的视角),有一个重建损失:

此外,考虑从未观测到的视角优化NeRF
对于一个新视角,先用NeRF渲染一张图片,encode后加噪得到,接着使用前一步训练的扩散模型去噪后decode获得,最终loss为:

是perceptual distance LPIPS

实验中发现这个loss比SDS效果好。

CAT3D: Create Anything in 3D with Multi-View Diffusion Models

主要有两个阶段:

  1. 以输入视图和目标视图的摄像机姿势为条件,通过一个多视图的latent diffusion model生成一组合成视图。
  2. 根据生成的多视图进行鲁棒的3D重建(使用NeRF作为表示)。

Stage 1: Multi-View Diffusion Model

  1. 与video latent diffusion models类似的结构,但把time embedding替换为camera pose embedding。
  2. 通过3D-attention引入condition条件,从而不需要先前的PixelNeRF和CLIP image embedding。
  3. 类似于simple diffusion,把预训练的图像模型微调成多视角模型,数据的维度上升,SNR也应该相应降低,对于N个target images,shift the log SNR ratio by log(N)
  4. 使用与latents大小一致的张量表示相机光线称为raymap。将摄像机姿态作为低维向量嵌入对域内样本效果很好,但与raymap相比,通用性较差。
  5. 对于3D物体重建,轨道相机轨迹(orbital camera trajectory)是有效的,但是对于3D场景重建,视图需要完全覆盖场景,且取决于场景中的物体,对不同的场景特点设计不同的轨迹是必要的。
    1. orbital paths of different scales and heights around the center scene
    2. forward facing circle paths of different scales and offsets
    3. spline paths of different offsets
    4. spiral trajectories along a cylindrical path, moving into and out of the scene.
  6. 3D自注意力比因式分解的2D+1D注意力效果更好,但是会产生更多的计算,所以只对较小的feature map使用。

Stage 2: Robust 3D Reconstruction with NeRF

标准的NeRF需要完全3D一致的照片作为输入,而模型生成的多视角图片不完全满足3D一致性,因此需要调整NeRF,使其对不一致的输入具有鲁棒性。

使用Zip-NeRF,做出两个改变:

  1. 加入一个perceptual loss(LPIPS)衡量被渲染的图像和输入图像的差异。与光度重建损失(photometric reconstruction loss)相比,LPIPS 强调渲染图像与观测图像之间的高级语义相似性,而忽略了低级高频细节中潜在的不一致性。
  2. 根据与被观测到的视角的距离,给不同的生成视角赋予不同的loss权重。

CameraCtrl: Enabling Camera Control for Text-to-Video Generation

相机参数表示

相机内外参

主要涉及三个坐标系:世界坐标系,相机坐标系,成像平面坐标系

世界坐标系(w)到相机坐标系(c)

主要涉及相机的旋转和平移

,称为相机的外参

相机坐标系(c)到成像平面坐标系

为相机的内参

从成像平面坐标系到实际图片的坐标系也需要缩放和平移

plücker coordinates

直接把KE喂进模型不是一个好的选择,一方面是平移矩阵T在大小上没有限制,另一方面模型很难把这些值与像素对应,所以使用plücker coordinates。

对图像坐标系的每一个点,其plücker embedding为

可以代表像素在物理坐标系中的位置,因此,plücker 嵌入对视频帧的每个像素都有一定的几何解释,可以更详细地描述摄像机的姿态信息。此外,plücker 嵌入中每项的取值范围更加均匀,这有利于模型的学习过程

轨道表达

可以用一个plücker embedding sequence 来代表一个视频中相机的移动