工作概括#

输入一张 RGB 图像,在不到 1 秒内,通过一个前馈网络直接预测一个 3DGS 场景,允许从输入视角附近生成清晰的新视图。

输出表示:双层高分辨率 3D Gaussian#

SHARP 没有使用球谐函数来建模视角相关颜色,因为球谐系数会显著增大输出规模。每个高斯只输出一个 RGB 颜色。每个三维高斯由 14 个属性表示:

属性维度含义
Position3三维中心位置
Scale3三个方向上的尺度
Rotation4四元数旋转
Color3RGB 颜色
Opacity1不透明度
总计14---

输入图像会调整为 1536×15361536 \times 1536,Gaussian 输出分辨率是输入的一半: 每个像素位置输出两层 Gaussian,

N=2×768×768=1,179,648N = 2 \times 768 \times 768 = 1,179,648

也就是每张图片生成约118 万个 Gaussian。

这里的“两层”:

  • 第一层主要描述输入图像中直接可见的表面;
  • 第二层可以描述部分遮挡区域、边缘后方内容,以及透明、反射等难以由单一深度表达的现象。

模型架构分析#

SHARP 包含 7 个模块,其中 4 个是可学习的模块:
1.预训练的编码器(图中的 Image Encoder),用来做特征提取
2.深度解码器(图中的 Depth Decoder),用来输出两个不同的深度层
3.深度调整模块(图中的 Depth Adjustment)
4.高斯解码器(图中的 Gaussian Decoder),用于优化所有的高斯特征

图中的三个蓝色模块都是可微的,最终渲染图像可以计算损失并做梯度回传。 image

1. 模块一:Image Encoder#

SHARP 使用预训练的 Depth Pro 作为 Image Encoder,输入图像为:

I∈R3×H×W,H=W=1536.I \in \mathbb{R}^{3 \times H \times W}, \qquad H = W = 1536.

Image Encoder 输出四个不同分辨率的特征图:

(f1,f2,f3,f4)=ϕenc(I).(f_1, f_2, f_3, f_4) = \phi_{\mathrm{enc}}(I).

Depth Pro 的编码部分包含两条路径:
低分辨率全图编码器:处理缩小后的完整图像,负责全局场景理解(训练时解冻)。
图像块编码器:处理高分辨率局部 patch,负责细节提取(训练时冻结)。

2. 模块二:Depth Decoder#

SHARP 使用的 Depth Decoder 基于 DPT(Depth Prediction Transformer)。它接收四个多尺度特征:

D^=ϕdec(f1,f2,f3,f4).\hat{D} = \phi_{\mathrm{dec}}(f_1, f_2, f_3, f_4).

与普通 Depth Pro 不同,作者复制了最后的输出卷积层,使其输出两个深度通道:

D^∈R2×H×W.\hat{D} \in \mathbb{R}^{2 \times H \times W}.

可以写为:

D^=[D^(1),D^(2)].\hat{D} = \left[ \hat{D}_{(1)}, \hat{D}_{(2)} \right].

其中:

  • D^(1)\hat{D}_{(1)}:第一层深度,主要表示可见表面;
  • D^(2)\hat{D}_{(2)}:第二层深度,用于补充遮挡边界、次级表面和复杂成像效果。

深度解码器约有 20M 参数,训练时完全解冻。

为什么要搞两层深度,并解冻参数?

作者认为普通单目深度模型的目标与新视图合成并不完全一致。对于玻璃、镜面、反射物体、透明表面、模糊或细小结构等,“物理上的深度”不一定是生成最佳新视图所需要的深度。也就是说,模型学到的不是传统意义上的几何深度,而是更适合将图像转换成可渲染 3D Gaussian 的深度结构。

3. 模块三:Depth Adjustment#

在训练中引入 Depth Adjustment 模块是为了解决这样的问题:

同一张单目图像可能对应多种合理的三维结构。单目深度网络通常倾向于输出某种“平均解”,但平均深度在新视图渲染时可能产生重影、纹理撕裂、边缘错位、浮空等问题。

该模块是一个约 2M 参数的小型 U-Net。训练时,它同时接收:

  • 网络预测的逆深度 D^−1\hat{D}^{-1};
  • 训练数据中的真实逆深度 D−1D^{-1}。

然后预测一个逐像素尺度图:

S∈RH×WS \in \mathbb{R}^{H \times W}

调整后的双层深度为:

Dˉ=S(D^,D)⊙D^\bar{D}=S(\hat{D},D)\odot\hat{D}

这里可以把 SS 理解为一个空间变化的深度缩放因子。理想情况下:

S(p)≈1S(p)\approx1

只有当预测深度中的歧义确实影响新视图合成时,调整模块才应该偏离 1。

该模块只在训练时使用真实深度,因此不会构成推理时的信息泄漏。推理时没有真实深度,因此作者直接将它替换为恒等映射:

S=1,Dˉ=D^S = 1,\qquad \bar{D}=\hat{D}

它的作用不是成为最终推理流程的一部分,而是帮助网络在训练阶段获得更容易优化的监督信号。论文将这一思想类比为条件 VAE 的后验网络。C-VAE 的后验利用真实答案解释任务中的歧义;SHARP 的调整模块利用真实深度产生一个受限制的尺度图,通过强正则化,迫使这个尺度图只携带“解决歧义所需的最少信息”。最终,主干深度网络会逐渐学会吸收这些修正。

正则化具体如下,作者对尺度图使用两类约束:

1.要求尺度接近 1:

Lscale=Ep[∣S(p)−1∣].L_{\mathrm{scale}} = \mathbb{E}_{p} \left[ |S(p)-1| \right].

2.要求尺度图在多个尺度上平滑:

L∇scale=∑k=16Ep∈Ωk[∣∇S↓k(p)∣].L_{\nabla \mathrm{scale}} = \sum_{k=1}^{6} \mathbb{E}_{p\in\Omega_k} \left[ \left| \nabla S_{\downarrow k}(p) \right| \right].

所以调整模块不能任意“抄写”真实深度,只能做幅度较小且空间平滑的校正。

4. 模块四:Gaussian Initializer#

深度预测完成后,SHARP 会先通过一个非学习模块 Gaussian Initializer 生成“基础高斯”作为初始化。先把输入图像和双层深度从 1536×15361536×1536 降到 768×768768×768,其中RGB 使用平均池化,深度使用最小池化。然后按下面的规则初始化 Gaussian:

1.位置初始化:将每个深度像素反投影到一个归一化三维空间中。

μ(i,j)=[iDˉ′(i,j)jDˉ′(i,j)Dˉ′(i,j)]\mu(i,j) = \begin{bmatrix} i\bar{D}'(i,j)\\ j\bar{D}'(i,j)\\ \bar{D}'(i,j) \end{bmatrix}

2.尺度初始化:Gaussian 尺度与深度成正比。

s(i,j)=s0Dˉ′(i,j).s(i,j)=s_0\bar{D}'(i,j).

3.颜色初始化:颜色直接来自输入图像。

c(i,j)=I′(i,j).c(i,j)=I'(i,j).

4.旋转初始化:单位四元数。

c(i,j)=I′(i,j).c(i,j)=I'(i,j).

5.不透明度初始化

α=0.5.\alpha=0.5.

5. 模块五:Gaussian Decoder#

该模块预测残差,用于精修初始化的 Gaussian。

Gaussian Decoder 接收:

  • 多尺度图像特征 (f1,…,f4)(f_1,\dots,f_4);
  • 输入图像 II;
  • 预测的双层深度 D^\hat{D}。

输出所有 Gaussian 属性的修正量:

ΔG=ϕgauss(f1,f2,f3,f4,I,D^).\Delta G = \phi_{\mathrm{gauss}} (f_1,f_2,f_3,f_4,I,\hat{D}).

输出形式为:

ΔG∈R14×2×768×768.\Delta G \in \mathbb{R}^{14 \times 2 \times 768 \times 768}.

其中包含:

ΔG={ΔGpos,ΔGscale,ΔGrot,ΔGcolor,ΔGα}.\Delta G = \{ \Delta G_{\mathrm{pos}}, \Delta G_{\mathrm{scale}}, \Delta G_{\mathrm{rot}}, \Delta G_{\mathrm{color}}, \Delta G_{\alpha} \}.

Gaussian Decoder 采用 DPT 风格的多尺度解码结构,但作者将最后一个上采样模块替换成了专门的高维预测头。该模块约有 7.8M 参数,从头训练。

6. 模块六:Gaussian Composer#

这个模块是解决修正量具体如何作用于基础高斯。作者针对不同属性,先映射到适合优化的无约束空间,再加入残差,最后经过激活函数映射回合法范围:

Gattr=γattr(γattr−1(G0,attr)+ηattrΔGattr).G_{\mathrm{attr}} = \gamma_{\mathrm{attr}} \left( \gamma_{\mathrm{attr}}^{-1}(G_{0,\mathrm{attr}}) + \eta_{\mathrm{attr}}\Delta G_{\mathrm{attr}} \right).

其中:

  • γattr\gamma_{\mathrm{attr}}:属性特定的激活函数;
  • γattr−1\gamma_{\mathrm{attr}}^{-1}:将初始化值映射到激活前空间;
  • ηattr\eta_{\mathrm{attr}}:控制残差幅度的缩放系数。

7. 模块七:Gaussian Renderer#

可微分的高斯渲染器,高速渲染得到图像。

训练#

端到端训练整个网络。先用合成数据训练,然后进行自监督微调。

自监督微调用的方法是“视图交换”:
1.用第一阶段模型从真实图像生成 3D Gaussian;
2.从稍微偏移的视角渲染一个伪新视图;
3.将这个伪新视图作为新的网络输入;
4.把原始真实图像作为目标新视图。