今天读一篇NeurIPS2024的文章,FreeSplat: Generalizable 3D Gaussian Splatting Towards Free-View Synthesis of Indoor Scenes Reconstruction,该文章提出的方法能够从长序列输入重建几何一致的 3D 场景以实现自由视角合成,作者来自NTU。
项目地址:FreeSplat
文章目录
Abstract
3DGS的generalization能力较弱,现有方法主要局限于窄范围视角的插值,无法有效定位 3D 高斯点,导致难以实现自由视角合成。FreeSplat提出了:
- 低成本的跨视角特征聚合 (Low-cost Cross-View Aggregation),通过在相邻视角间构建自适应代价体 (adaptive cost volume),并采用多尺度特征聚合来增强特征匹配。
- 像素级三元组融合 (Pixel-wise Triplet Fusion, PTF),用于消除多视角重叠区域的冗余高斯点,并聚合跨视角的特征。
- 自由视角训练策略 (Free-View Training, FVT),在不同数量的输入视角下进行训练,以确保模型在更广视角范围内生成稳定的视图。
实验表明,FreeSplat在新视角合成质量和深度估计精度方面均达到了SOTA,同时推理更高效,并有效减少冗余的高斯点,使得无需深度先验即可进行前向大场景重建。
1 Introduction
主要挑战:
- 3D 高斯点的全局定位问题:现有方法的监督主要依赖在视角内插值,这常常导致3D高斯点定位不准确,如果要渲染的是更外面的视角,就容易出现floating现象。
- 冗余高斯点问题:进一步的,多视角信息通常通过简单的concatenation进行融合,导致在重叠区域产生冗余高斯点。
- 长序列输入的计算成本:由于跨视角匹配的计算成本随序列长度增加,现有方法难以处理长序列输入,影响泛化能力。
基于上面提出的问题,论文的贡献如下:
- 提出低成本跨视角特征聚合 (Low-cost Cross-View Aggregation),构建自适应代价体进行特征匹配,提高长序列输入下的计算效率。
- 提出像素级三元组融合 (Pixel-wise Triplet Fusion, PTF),减少重叠区域的冗余 3D 高斯点,并有效聚合跨视角特征。
- 得益于前两个高效的模块减轻了资源开销,我们提出自由视角训练策略 (Free-View Training, FVT),在不同数量的输入视角上进行训练,而不需要局限于只能输入两三个视角。这样,我们可以提高模型泛化性。
2 Related Work
介绍一些相关工作,包括新视角合成这个任务、该任务的generalization问题,还有室内scene reconstruction。
3 Preliminary
介绍3D-GS与generalizable 3D-GS。
4 Our Methodology
4.1 Overview
核心目标是提高3DGS的泛化能力,使其能够处理长序列输入并支持自由视角合成。为此,本文提出了两个关键模块:
- Low-cost Cross-View Aggregation:
- 通过构建adaptive cost volume进行高效特征匹配。
- 采用multi-scale feature aggregation来增强3D高斯点的全局定位能力。
- Pixel-wise Triplet Fusion:
- 在像素级对齐多视角3D高斯点,减少重叠区域的冗余点云。
- 使用轻量级 GRU进行跨视角特征融合,提高3D高斯点的准确性。
整体流程如下:
- 从输入的稀疏图像序列提取特征。
- 在相邻视角之间构建cost volume并进行深度估计。
- 通过unprojection将图像特征转换为gaussian triplets。
- 采用PTF模块逐步融合局部和全局高斯点,并去除冗余。这样我们就可以在latent feature space中融合冗余3D gaussians并且在decoding之前就结合多视角gaussian features。
- 最终,解码高斯点的参数,并渲染新的视角图像。
4.2 Low-cost Cross-View Aggregation
4.2.1 Efficient 2D Feature Extraction
- 给定输入的稀疏图像序列
{
I
t
}
t
=
1
T
\{I_t\}_{t=1}^{T}
{It}t=1T,首先提取多尺度特征:
F e t = CNN ( I t ) F m t = CNN m ( I t ) F_e^t = \text{CNN}(I_t) \\ F_m^t = \text{CNN}_m(I_t) Fet=CNN(It)Fmt=CNNm(It)
其中:- F e t F_e^t Fet 是multi-scale embeddings
- F m t F_m^t Fmt是matching feature
- 区别于PixelSplat和MVSplat:
- 现存的方法依赖基于Transformer的特征提取,计算量大。
- 我们的FreeSplat采用纯CNN进行高效特征提取,提高计算效率。
4.2.2 Adaptive Cost Volume
- 目标:利用相机位姿信息,在任意长度的输入视角之间构建cost volume。
- 步骤:
- 选择 N 个最近的相邻视角 { I t n } n = 1 N \{I^{t_n}\}_{n=1}^{N} {Itn}n=1N。
- 定义 K 个虚拟深度平面
{
d
k
}
k
=
1
K
\{d_k\}_{k=1}^{K}
{dk}k=1K,其中:
d k ∈ [ d near , d far ] d_k \in [d_{\text{near}}, d_{\text{far}}] dk∈[dnear,dfar] - 将相邻视角的特征投影到深度平面
d
k
d_{k}
dk上:
F ~ m t n , k = Trans ( P t n , P t ) F m t n \tilde{F}_m^{t_n, k} = \text{Trans}(P^{t_n}, P^t) F_m^{t_n} F~mtn,k=Trans(Ptn,Pt)Fmtn
其中, Trans ( P t n , P t ) \text{Trans}(P^{t_n}, P^t) Trans(Ptn,Pt)是视角 t n t_{n} tn到 t t t的transformation matrix。 - 计算cost volume,
F
c
v
t
∈
R
K
×
H
4
×
W
4
F_{cv}^{t} \in \mathbb{R}^{K \times \frac{H}{4} \times \frac{W}{4}}
Fcvt∈RK×4H×4W:
F cv t ( k ) = f θ ( ( 1 N ∑ n = 1 N cos ( F m t , F ~ m t n , k ) ) ⊕ ( 1 N ∑ n = 1 N F ~ m t n , k ) ) F_{\text{cv}}^t(k) = f_{\theta} \left(( \frac{1}{N} \sum_{n=1}^{N} \cos(F_m^t, \tilde{F}_m^{t_n, k})) \oplus (\frac{1}{N} \sum_{n=1}^{N} \tilde{F}_m^{t_n, k}) \right) Fcvt(k)=fθ((N1n=1∑Ncos(Fmt,F~mtn,k))⊕(N1n=1∑NF~mtn,k))
其中:- cos ( ⋅ , ⋅ ) \cos(\cdot, \cdot) cos(⋅,⋅)计算余弦相似度
- ⊕ \oplus ⊕代表特征concatenation
-
f
θ
(
⋅
)
f_{\theta}(\cdot)
fθ(⋅)是一个
1
×
1
1 \times 1
1×1CNN映射到维度1
在这里,前面算的是每个matching feature在不同深度假设下和current view的特征的相似度,然后求平均,后面算的是相邻视角特征本身转到当前视角后的值,再平均。然后把这些信息拼接再卷积。
4.2.3 Multi-Scale Feature Aggregation
- 目标:增强代价体的全局感受野,提升3D高斯点的准确性。
- 方法:
- 使用多尺度 U-Net++ 结构。先Encode代价体,然后与多尺度特征拼接,再交给U-Net++融合,upsample到full resolution并得到depth candidates map和gaussian triplet map:
F agg t = U-Net ( E n c ( F cv t ) , { F s t } ) F_{\text{agg}}^t = \text{U-Net}(Enc(F_{\text{cv}}^{t}), \{F_s^t\}) Faggt=U-Net(Enc(Fcvt),{Fst}) - 通过Softmax 预测深度。第一步得到了得到深度的candidates map
D
c
t
∈
R
K
×
H
×
W
D_{c}^{t} \in \mathbb{R}^{K \times H \times W}
Dct∈RK×H×W和Gaussian triplet map
F
l
t
∈
R
C
×
H
×
W
F_{l}^{t} \in \mathbb{R}^{C \times H \times W}
Flt∈RC×H×W,再使用Sfotmax操作:
D t = ∑ k = 1 K softmax ( D c t ) k ⋅ d k D^t = \sum_{k=1}^{K} \text{softmax}(D_c^t)_k \cdot d_k Dt=k=1∑Ksoftmax(Dct)k⋅dk - 然后,pixel-align的
F
l
t
F_{l}^{t}
Flt通过unprojection得到3D 高斯三元组:
{ μ l t , ω l t , f l t } \{\mu_l^t, \omega_l^t, f_l^t\} {μlt,ωlt,flt}
其中, μ l t ∈ R 3 × H W \mu_l^t \in \mathbb{R}^{3 \times HW} μlt∈R3×HW是高斯中心, ω l t ∈ R 1 × H W \omega_l^t \in \mathbb{R}^{1 \times HW} ωlt∈R1×HW是(0,1)之间的权重, f l t ∈ R ( C − 1 ) × H W f_l^t \in \mathbb{R}^{(C-1) \times HW} flt∈R(C−1)×HW是Gaussian triplet features。
- 使用多尺度 U-Net++ 结构。先Encode代价体,然后与多尺度特征拼接,再交给U-Net++融合,upsample到full resolution并得到depth candidates map和gaussian triplet map:
4.3 Pixel-wise Triplet Fusion
4.3.1 Pixel-wise Alignment
- 目标:以前的方法pixel-align会导致重叠区域有很多冗余高斯,并且最多也只使用opacity来简单结合多视角下相同区域的高斯。我们想要匹配local和global 3D高斯点。
- 方法:
- 将全局高斯点投影到当前视角。给定Gaussian triplets
{
μ
l
t
,
f
l
t
}
t
=
1
T
\{\mu_l^t, f_l^t\}_{t=1}^{T}
{μlt,flt}t=1T,我们从
t
=
1
t=1
t=1开始,我们把3D的高斯中心
μ
g
t
−
1
∈
R
3
×
M
\mu_g^{t-1} \in \mathbb{R}^{3 \times M}
μgt−1∈R3×M投影到该视角:
p g t = { x g t , y g t , d g t } = P t μ g t − 1 p_g^t = \{x_{g}^{t}, y_{g}^{t}, d_{g}^{t}\} =P^t \mu_g^{t-1} pgt={xgt,ygt,dgt}=Ptμgt−1
其中 { x g t , y g t , d g t } \{x_{g}^{t}, y_{g}^{t}, d_{g}^{t}\} {xgt,ygt,dgt}是projected 2D坐标和深度。 - 寻找像素级匹配。现在我们要处理当前图像的局部高斯了。我们希望回答一个问题:
当前图像的这个局部高斯点,是不是和一个全局高斯点在同一个像素位置?
对于第 i i i个local Gaussian,坐标为 [ x l t ( i ) , y l t ( i ) ] [x_l^t(i),y_l^t(i)] [xlt(i),ylt(i)],深度为 d l t ( j ) d_{l}^{t}(j) dlt(j),我们找到intra-pixel global projection:
S t i = { j ∣ [ x g t ( j ) ] = x l t ( i ) , [ y g t ( j ) ] = y l t ( i ) } S_t^i = \{ j | [x_g^t(j)] = x_l^t(i), [y_g^t(j)] = y_l^t(i) \} Sti={j∣[xgt(j)]=xlt(i),[ygt(j)]=ylt(i)}
其中 [ ⋅ , ⋅ ] [\cdot, \cdot] [⋅,⋅]是rounding操作。这是查找在同一个像素位置的全局高斯点,取整是因为像素位置必须是整数(图像像素)。 - 根据深度阈值选择最近的匹配。找出深度最近的匹配点,如果深度差异不超过一个阈值:
m i = arg min j ∈ S t i ∣ d g t ( j ) − d l t ( i ) ∣ , if ∣ d l t ( i ) − min j ∈ S t i d g t ( j ) ∣ < δ ⋅ d l t ( i ) m_i = \arg\min_{j \in S_t^i} \left| d_g^t(j) - d_l^t(i) \right|, \quad \text{if } \left| d_l^t(i) - \min_{j \in S_t^i} d_g^t(j) \right| < \delta \cdot d_l^t(i) mi=argj∈Stimin dgt(j)−dlt(i) ,if dlt(i)−j∈Stimindgt(j) <δ⋅dlt(i)
其中 δ \delta δ是ratio threshold。这一步是为了避免错误匹配远近不同的点。
那么,valid correspondence就是:
F t = { ( i , m i ) ∣ i = 1 , . . . , H W ; m i ≠ ∅ } \mathbf{F^{t}} = \{(i,m_{i})|i=1,...,HW;m_{i}\neq \emptyset\} Ft={(i,mi)∣i=1,...,HW;mi=∅}
这个集合表示:当前高斯点 i i i和全局高斯点 m i m_{i} mi是同一个 3D点的两个版本,我们准备融合它们。
- 将全局高斯点投影到当前视角。给定Gaussian triplets
{
μ
l
t
,
f
l
t
}
t
=
1
T
\{\mu_l^t, f_l^t\}_{t=1}^{T}
{μlt,flt}t=1T,我们从
t
=
1
t=1
t=1开始,我们把3D的高斯中心
μ
g
t
−
1
∈
R
3
×
M
\mu_g^{t-1} \in \mathbb{R}^{3 \times M}
μgt−1∈R3×M投影到该视角:
4.3.2 Gaussian Triplet Fusion
- 目标:融合那些被判定为“同一个3D点”的高斯三元组,减少冗余、保留跨视角信息。
- 方法:
- 几何中心融合(更新高斯中心)。给定一个pair
(
i
,
m
i
)
∈
F
t
(i,m_{i}) \in \mathbf{F^{t}}
(i,mi)∈Ft,我们计算它们的中心坐标的加权求和,并更新融合后的权重
ω
\omega
ω,权重更新体现“观测次数累加”的含义,这个点被看到得越多,越重要:
μ g t ( m i ) = ω l t ( i ) μ l t ( i ) + ω g t − 1 ( m i ) μ g t − 1 ( m i ) ω l t ( i ) + ω g t − 1 ( m i ) \mu_g^t(m_i) = \frac{\omega_l^t(i) \mu_l^t(i) + \omega_g^{t-1}(m_i) \mu_g^{t-1}(m_i)}{\omega_l^t(i) + \omega_g^{t-1}(m_i)} μgt(mi)=ωlt(i)+ωgt−1(mi)ωlt(i)μlt(i)+ωgt−1(mi)μgt−1(mi)
ω g t ( m i ) = ω l t ( i ) + ω g t − 1 ( m i ) \omega_{g}^{t}(m_{i}) = \omega_{l}^{t}(i) + \omega_{g}^{t-1}(m_{i}) ωgt(mi)=ωlt(i)+ωgt−1(mi) - 特征融合(使用轻量级 GRU)。不同视角下看到的点会有不同特征,我们希望融合这些信息:
f g t ( m i ) = GRU ( f l t ( i ) , f g t − 1 ( m i ) ) f_g^t(m_i) = \text{GRU}(f_l^t(i), f_g^{t-1}(m_i)) fgt(mi)=GRU(flt(i),fgt−1(mi))
把“当前局部点的特征”当作输入,把“历史上的全局特征”当作 GRU 的 hidden state,从而得到新的融合特征。
- 几何中心融合(更新高斯中心)。给定一个pair
(
i
,
m
i
)
∈
F
t
(i,m_{i}) \in \mathbf{F^{t}}
(i,mi)∈Ft,我们计算它们的中心坐标的加权求和,并更新融合后的权重
ω
\omega
ω,权重更新体现“观测次数累加”的含义,这个点被看到得越多,越重要:
4.3.4 Gaussian Primitives Decoding
根据Triplets获得渲染所需的参数:
Σ
,
α
,
s
=
M
L
P
d
(
f
g
T
)
\Sigma, \alpha, s = MLP_{d}(f_{g}^{T})
Σ,α,s=MLPd(fgT)
而高斯中心
μ
=
μ
g
⊤
\mu = \mu_{g}^{\top}
μ=μg⊤。
4.4 Training
4.4.1 Loss Functions
- 采用 均方误差 (MSE) + LPIPS 感知损失:
L = λ 1 ∣ ∣ C render − C gt ∣ ∣ 2 + λ 2 LPIPS ( C render , C gt ) L = \lambda_1 ||C_{\text{render}} - C_{\text{gt}}||^2 + \lambda_2 \text{LPIPS}(C_{\text{render}}, C_{\text{gt}}) L=λ1∣∣Crender−Cgt∣∣2+λ2LPIPS(Crender,Cgt)
其中:- λ 1 = 1 \lambda_1 = 1 λ1=1, λ 2 = 0.05 \lambda_2 = 0.05 λ2=0.05
4.4.2 Free-View Training
- 随机选择2-8个视角进行训练,以确保不同数量的视角均能泛化。补充材料中写了实际采用这个策略训练的时候是4个视角训练,而测试时构建cost volume是使用相邻的8个视角。
- 训练时优化高斯点的全局定位,提高模型在长序列输入下的稳定性。
5 Experiments
在室内数据集上实验,主要与pixelSplat和MVSplat做了比较。
- 在ScanNet上测试NVS效果,除了测试2/3视角之外,当输入long sequence(10 views)时,FreeSplat的表现依旧不错。
- 对比了新视角的深度估计的结果。
- 在Replica上做了zero-shot测试验证泛化性能。
- 在补充材料中,也在pixelSplat和MVSplat使用的re10k和acid数据集上做了对比。
整体来说这篇文章的实验做得很充分。