简介
主页:https://liuyuan-pal.github.io/NeuRay/
黄色:输入视图
绿色:测试视图
蓝色:物体表面
(a)无遮挡情况下,局部图像特征在表面点上是一致的。
(b)由于遮挡,表面点的局部图像特征不一致。
©非表面点的局部图像特征不一致。
由于特征的一致性,传统方法可以正确地为(a)中的曲面点分配较大的密度。但是,当(b)和©的特征不太一致时,这些方法要正确确定密度是比较困难的。也就是说,空间的一个点,由于遮挡原因导致从不同输入视图得到的信息不一致。
因此,关键的挑战是如何估计一个看不见的场景的可见性。这是一个先有鸡还是先有蛋的问题,因为能见度的估计需要知道表面位置,而估计的能见度是为了在辐射场建设中更好地估计表面。为了打破这种循环,应用多视图立体(MVS)算法,如cost volume construction或patch-match stereo,来重建场景几何形状,然后从重建几何形状中提取NeuRay的像素对齐特征向量。最后,将NeuRay应用于能见度的计算,以改进辐射场的构造。
为了降低计算复杂度,在NeuRay中使用累积分布函数(Cumulative Distribution Function, CDF)直接参数化可见性,避免了沿射线的密度累积,只需要 N 个网络正向传递就可以计算所有 N 个输入视图的可见性。
贡献点
- 在不进行特定场景优化的情况下,已经产生了令人满意的渲染结果,大大优于其他泛化方法
- 与其他泛化模型相比,对NeuRay进行微调可以获得更好的结果,并且获得比NeRF更好的渲染质量
可以在NeuRay的帮助下通过缓存输入视图上的特征和预测粗糙的表面位置来加快渲染,渲染一个800 × 600大小的图像需要花费约3秒
实现流程
从输入视图构建 on-the-fly 辐射场,通过体绘制合成测试视图图像。首先对测试射线上的点进行采样,然后聚合输入视图的局部特征,确定采样点的alpha值和颜色,最后通过体绘制的方法积累颜色,计算输出颜色。在输入视图上构造NeuRay来预测样本点的可见性,从而允许在这些样本点上进行遮挡感知特征聚合。
输入一个已知相机姿态的场景的 N 个输入视图,目标是在任意新的测试视图上渲染图像
Volume rendering
从测试视图发射的摄像机射线称为测试射线,其参数化为 p(z) = o+zr , z∈
R
+
R^+
R+,其中 o 为摄像机中心的起点,r 为射线的单位方向向量,采样
K
t
K_t
Kt 点
{
p
i
≡
p
(
z
i
)
∣
i
=
1
,
…
,
K
t
}
\{p_i ≡ p(z_i) | i = 1,…, K_t\}
{pi≡p(zi)∣i=1,…,Kt},随着
z
i
z_i
zi 沿射线的增加。该相机射线的相关像素的颜色表示为
c
∈
R
3
c∈R^3
c∈R3 是像素的渲染颜色,
c
i
∈
R
3
c_i∈R^3
ci∈R3 是采样点
p
i
p_i
pi 的颜色,
h
i
h_i
hi∈R 是光线在深度
z
i
z_i
zi 之前没有被任何深度遮挡,并且击中范围为
(
z
i
,
z
i
+
1
)
(z_i, z_{i+1})
(zi,zi+1) 的曲面的概率。
α
i
α_i
αi 是深度范围
(
z
i
,
z
i
+
1
)
(z_i, z_{i+1})
(zi,zi+1) 内的 α 值
Occlusion-aware radiance field construction
Radiance field construction on-the-fly
与 NeRF 学习特定场景的神经辐射场相比,泛化渲染方法通过聚集局部特征动态构建辐射场,给定射线上三维点
p
i
∈
R
3
p_i∈R^3
pi∈R3,泛化渲染方法首先通过 CNN 提取输入视图上的特征,然后通过在该点上聚合输入视图上的特征
其中
f
i
,
j
f_{i,j}
fi,j 是投影在第 j 个输入视图上的样本点
p
i
p_i
pi 的局部图像特征,M 是将来自不同视图的特征聚合在一起产生特征
f
i
f_i
fi 的网络。然后,由其他网络从聚合特征
f
i
f_i
fi 中解码出这个点
p
i
p_i
pi 的alpha值
α
i
α_i
αi 和颜色
c
i
c_i
ci
Occlusion-aware construction
与以往方法一样,该方法也能实时地构建辐射场,预测了一个可见性项
v
i
,
j
v_{i,j}
vi,j,表示第 j 个输入视图对于遮挡感知特征聚合的这个3D点
p
i
p_i
pi 是可见的或不可见的
聚合网络 M 能够关注聚合特征
f
i
f_i
fi 中的可见视图,减少了不可见视图的干扰
NeuRay representation
给定从输入视图发射的摄像机射线(称为输入射线),NeuRay能够预测可见性函数 v(z),该函数指示深度为 z 的点对该输入射线可见或不可见。
在每个输入视图上,NeuRay用一个可见性特征映射
G
∈
R
H
×
W
×
C
G∈R^{H×W ×C}
G∈RH×W×C表示,设
g
∈
R
C
g∈R^C
g∈RC 为 G 上给定输入射线的对应特征向量,将从 g 上计算该输入射线的可见性 v(z),那么可见性函数 v(z) 应在 z 上不递增且 0≤v(z)≤1
NeuRay在每个输入视图上都包含一个可见性特征映射G。G的每一个特征向量 g 都可以被MLP解码为 logistics distribution 的混合。该分布说明了从 g 的位置发射的输入射线的可见性函数 v(z), 是深度 z 之后曲线下的面积。
Visibility from occlusion probability
用累积密度函数(CDF) t(z) 表示可见性函数 v(z) = 1−t(z)
其中混合
N
l
N_l
Nl 个 logistics distributions,
μ
i
μ_i
μi 为第 i 个 logistics distributions 的均值,
σ
i
σ_i
σi 为标准差,
w
i
w_i
wi 为混合权重,
∑
i
w
i
=
1
\sum_i w_i = 1
∑iwi=1,S(·) 为 sigmoid 函数。
所有参数 [ μ i , σ i , w i ] [μ_i, σ_i, w_i] [μi,σi,wi]= F (g) 通过MLP F从特征 g 中解码,t(z) 是一个非递减的CDF,因此 1−t(z) 是一个有效的可见性函数。
t(z)实际上对应的是一个遮挡概率,即输入射线在深度 z 之前被遮挡,称之为对应的概率密度函数(PDF)命中概率密度。能见度 v(z) 实际上是在 z 之后PDF曲线下的面积。一般情况下,射线只会击中一个表面,所以一个 logistics distributions 就足够了。然而,当光线击中半透明表面或表面边缘时,使用混合的 logistics distributions 可以提高性能。
或者,可以用NeRF类密度参数化可见性。然而,使用这种策略计算可见性的计算量太大。在这个公式中,直接用MLP φ 从 g 解码密度d(z) = φ(z;g)。为了计算可见性 v(z),需要先对 z k < z z_k < z zk<z 的 K r K_r Kr 深度 { z k } \{z_k\} {zk} 采样,计算它们的密度 d ( z k ) d(z_k) d(zk) 和对应的alpha值 α k = 1 − e x p ( − R e L U ( d k ) ) α_k =1−exp(−ReLU(d_k)) αk=1−exp(−ReLU(dk)) ,最后得到可见性 v ( z ) = ∏ k = 1 K r ( 1 − α k ) v(z) = \prod^{K_r}_{k=1}(1−α_k) v(z)=∏k=1Kr(1−αk) 。虽然这个公式是一个有效的可见性函数,但它在计算上是不切实际的,因为它需要 K r K_r Kr 次 φ 的计算来计算输入视图对某个点的可见性
Generalize with NeuRay
在不可见场景中渲染时, 从cost volume construction或patch-match stereo中提取可见性特征图 G。在每个输入视图上构建成本卷时, 使用它的 N s N_s Ns 个相邻输入视图来构建一个 H × W × D 大小的成本卷。然后在成本卷上应用一个CNN,生成该输入视图的可见性特征映射 G ∈ R H × W × C G∈R^{H×W ×C} G∈RH×W×C。
或者,也可以直接从patch-match stereo估计的深度图中提取特征图 G,其中估计的大小为 H × W 的深度图经过一个CNN处理,生成可见性特征图 G。
- 在输入视图上,通过 MVS 算法估计cost volumes 或者 depth maps,CNN使用它们预测可见性特征图 G。
- 可见性特征映射用于计算输入视图到3D点的可见性 v i , j v_{i,j} vi,j
- 对于3D点,将输入视图中的局部特征 f i , j f_{i,j} fi,j 与可见性 v i , j v_{i,j} vi,j 结合起来,以计算这些点的alpha值和颜色。
- 体渲染应用于累积alpha值和颜色来合成图像。
整个渲染框架可以在训练场景上进行预训练,然后直接应用于不可见的场景进行渲染。为了预训练渲染框架,在训练场景中随机选择一个视图作为测试视图,并使用其他视图作为输入视图来渲染所选的测试视图
c 为预测颜色,
c
g
t
c_{gt}
cgt 为真实颜色
Finetune with NeuRay
渲染框架可以在特定场景上进一步微调,以在该场景上获得更好的渲染质量。在给定的场景中,随机选择一个输入视图作为伪测试视图,并使用其他输入视图呈现伪测试视图进行训练。此外,增加NeuRay的可训练参数和一致性损失。
在对场景进行微调时,每个输入视图上,构造的 constructed cost volume 或者( the estimated depth map) 与 可见性特征图 G 之间的一个中间特征图
G
’
∈
R
H
×
W
×
C
G’∈R^{H×W ×C}
G’∈RH×W×C 作为该输入视图的 NeuRay 的可训练参数,把 G’ 之前的卷积层称为初始化网络,把 G’ 和 G 之间的卷积层称为可见性编码器。
参数 G’ 不是从头开始训练,而是由初始化网络使用构造的代价体积或估计的深度图进行初始化,然后,丢弃初始化网络,对 G’ 及其他网络参数进行优化调优
使 G’ 可训练并将可见性编码器应用于可训练的 G’ 上,可以提高可见性预测,因为可见性编码器中的卷积层在 G’ 上关联邻近像素的特征向量,这些邻近像素通常具有相似的可见性。
除了渲染损失,还在微调中使用一致性损失。由于构建的亮度场和 NeuRay 的可见性都描述了场景的几何形状,可以在微调时加强它们之间的一致性。具体来说,在微调中,在伪测试射线上采样点
p
i
≡
p
(
z
i
)
p_i≡p(z_i)
pi≡p(zi),并计算从构造的辐射场中采样点的命中概率
h
i
h_i
hi 。同时,伪测试视图也是一个输入视图,在这个输入视图上有一个NeuRay表示来解码这个伪测试射线的分布 t(z)。基于 t(z),在每个采样点
p
i
p_i
pi 上计算一个新的命中概率
h
~
i
\tilde{h}_i
h~i
其中
z
i
z_i
zi 是点的深度。因此,可以强制
h
~
i
\tilde{h}_i
h~i 和
h
i
h_i
hi 之间的一致性来构造一个损失
CE是交叉熵损失。
对特定场景进行优化可以细化网络参数,以更好地聚合特征,从而更好地构建场景上的辐射场。进一步加入NeuRay的可训练参数和一致性损失,使渲染框架能够细化NeuRay表示,带来更好的遮挡推断,显著提高了渲染质量
Speeding up rendering with NeuRay
在一条测试射线上,大多数采样点 p i p_i pi 的命中概率 h i h_i hi 几乎为零,因此不影响输出颜色。然而,大部分计算都浪费在这些空点的特征聚合上。一个粗略的碰撞概率 h ^ i \hat{h}_i h^i 可以直接从NeuRay用很少的计算。然后,只在 h ^ i \hat{h}_i h^i 较大的点周围采样很少的细点进行特征聚合。
为了计算测试射线上定义的命中概率
h
^
i
\hat{h}_i
h^i,首先在输入射线上定义深度范围
(
z
0
,
z
1
)
(z_0, z_1)
(z0,z1) 中的alpha值
α
ˉ
\bar{α}
αˉ
然后,我们计算样本点
p
i
p_i
pi上的
h
^
i
\hat{h}_i
h^i
其中
z
i
,
j
z_{i,j}
zi,j 是第 j 个输入视图上的点的深度,
l
i
=
z
i
+
1
−
z
i
l_i = z_{i+1}−z_i
li=zi+1−zi 是点
p
i
p_i
pi 与测试射线上的后续点
p
i
+
1
p_{i +1}
pi+1 之间的距离。
h
^
\hat{h}
h^ 的计算非常快,因为它只涉及输入视图上 t(z) 的简单组合。
效果