paper:https://arxiv.org/abs/2111.12077
code:https://github.com/google-research/multinerf
project:https://jonbarron.info/mipnerf360/
MipNeRF360是在NeRF++和MipNeRF的基础上进行的扩展,利用NeRF++提出的远景参数化技巧和MipNeRF的低通滤波思想同时实现了无界场景的高质量渲染与抗锯齿。
使用位置集成编码对沿射线方向的圆锥台区间计算位置编码的均值和方差
γ
(
μ
,
Σ
)
=
{
[
sin
?
(
2
?
μ
)
exp
?
(
?
2
2
?
?
1
diag
?
(
Σ
)
)
cos
?
(
2
?
μ
)
exp
?
(
?
2
2
?
?
1
diag
?
(
Σ
)
)
]
}
?
=
0
L
?
1
\gamma(\boldsymbol{\mu}, \boldsymbol{\Sigma})=\left\{\left[\begin{array}{l} \sin \left(2^{\ell} \boldsymbol{\mu}\right) \exp \left(-2^{2 \ell-1} \operatorname{diag}(\boldsymbol{\Sigma})\right) \\ \cos \left(2^{\ell} \boldsymbol{\mu}\right) \exp \left(-2^{2 \ell-1} \operatorname{diag}(\boldsymbol{\Sigma})\right) \end{array}\right]\right\}_{\ell=0}^{L-1}
γ(μ,Σ)={[sin(2?μ)exp(?22??1diag(Σ))cos(2?μ)exp(?22??1diag(Σ))?]}?=0L?1?
参考之前的文章:【论文阅读笔记】NeRF+Mip-NeRF+Instant-NGP
根据一阶泰勒展开,可以将高斯函数的变换进行线性近似:
f
(
x
)
≈
f
(
μ
)
+
J
f
(
μ
)
(
x
?
μ
)
f(\mathbf{x}) \approx f(\boldsymbol{\mu})+\mathbf{J}_{f}(\boldsymbol{\mu})(\mathbf{x}-\boldsymbol{\mu})
f(x)≈f(μ)+Jf?(μ)(x?μ)
J
f
(
μ
)
\mathbf{J}_{f}(\boldsymbol{\mu})
Jf?(μ)是在
μ
\boldsymbol{\mu}
μ处的
f
f
f的雅可比矩阵,
f
(
μ
,
Σ
)
=
(
f
(
μ
)
,
J
f
(
μ
)
Σ
J
f
(
μ
)
T
)
f(\boldsymbol{\mu}, \boldsymbol{\Sigma})=\left(f(\boldsymbol{\mu}), \mathbf{J}_{f}(\boldsymbol{\mu}) \boldsymbol{\Sigma} \mathbf{J}_{f}(\boldsymbol{\mu})^{\mathrm{T}}\right)
f(μ,Σ)=(f(μ),Jf?(μ)ΣJf?(μ)T)
这在功能上等同于经典的扩展卡尔曼滤波器,其中
f
f
f是状态转移模型。我们选择的
f
f
f如下所示的契约:
contract
?
(
x
)
=
{
x
∥
x
∥
≤
1
(
2
?
1
∥
x
∥
)
(
x
∥
x
∥
)
∥
x
∥
>
1
\operatorname{contract}(\mathbf{x})=\left\{\begin{array}{ll} \mathbf{x} & \|\mathbf{x}\| \leq 1 \\ \left(2-\frac{1}{\|\mathbf{x}\|}\right)\left(\frac{\mathbf{x}}{\|\mathbf{x}\|}\right) & \|\mathbf{x}\|>1 \end{array}\right.
contract(x)={x(2?∥x∥1?)(∥x∥x?)?∥x∥≤1∥x∥>1?
这种设计与 NDC 具有相同的动机:远处的点应该按比例分布到视差(逆距离)而不是距离。
我们的场景参数化的二维可视化如上图所示。我们定义了一个契约(contract)算子(方程式10,用箭头表示),它将坐标映射到半径为2的球体(橙色区域),其中半径为1的点不受影响(蓝色区域)。我们将这个契约操作应用于欧几里得3D空间中的mip-NeRF高斯函数(灰色椭圆),类似于卡尔曼滤波器的作用,产生了我们的收缩高斯函数(红色椭圆),其中心保证位于半径为2的球体内。契约算子的设计结合我们根据视差线性间隔选择射线间隔的方式,意味着从位于场景原点的相机发出的射线在橙色区域具有等距离的间隔。
在NERF中,射线距离是通过从近平面和远平面均匀采样来完成。然而,如果使用NDC参数化,这种均匀间隔的样本序列实际上是在逆深度(视差)中均匀间隔的。当相机仅朝一个方向面对时,这种设计决策非常适合无界场景,但不适用于所有方向上无界的场景。因此,我们将明确地以视差线性采样我们的距离 t(有关此间距的详细动机,请参见 [Local Light Field Fusion: Practical View Synthesis with Prescriptive Sampling Guidelines、])。为了根据视差参数化射线,我们定义了欧氏射线距离t和“归一化”射线距离s之间的可逆映射:
s
?
g
(
t
)
?
g
(
t
n
)
g
(
t
f
)
?
g
(
t
n
)
,
t
?
g
?
1
(
s
?
g
(
t
f
)
+
(
1
?
s
)
?
g
(
t
n
)
)
s \triangleq \frac{g(t)-g\left(t_{n}\right)}{g\left(t_{f}\right)-g\left(t_{n}\right)}, t \triangleq g^{-1}\left(s \cdot g\left(t_{f}\right)+(1-s) \cdot g\left(t_{n}\right)\right)
s?g(tf?)?g(tn?)g(t)?g(tn?)?,t?g?1(s?g(tf?)+(1?s)?g(tn?))
通过设置 g ( x ) = 1 / x g(x) = 1/x g(x)=1/x并构建均匀分布在 s s s空间中的射线样本,我们生成t距离在视差中线性分布的射线样本。这提供了映射到 [ t n , t f ] [tn, tf] [tn,tf] 的“归一化”射线距离 s ∈ [ 0 , 1 ] s \in [0, 1] s∈[0,1]。
从NeRF MLP(黑色)发出的直方图(t, w)和建议MLP(黄色和橙色)发出的两组直方图(t, w)的可视化,用于来自我们的数据集自行车场景的每条射线在训练过程中。下面我们用固定的 x 和 y 轴可视化整个光线,但上面我们裁剪两个轴以更好地可视化场景内容附近的细节。直方图权重绘制为积分为 1 的分布。 (a) 在训练开始时,所有权重都相对于射线距离 t 均匀分布, (b, c)随着训练的进行,NeRF 权重开始集中在表面上,提案权重在这些 NeRF 权重周围形成一种包络。
我们的正则化器抑制了“漂浮物”(漂浮在空间中的半透明材料片段,这在深度图中很容易识别),并防止背景中的表面“塌陷”到相机的现象(如 (a) 左下角所示)。原始版本的NeRF的噪声注入方法只部分消除了这些伪影,降低了重建质量(注意远处树深度缺乏细节)。
我们的正则化器在由参数化每条射线的(归一化)射线距离 s 和权重 w 集定义的阶跃函数方面有一个直接的定义:
L
dist?
(
s
,
w
)
=
∫
?
∞
∞
∫
w
s
(
u
)
w
s
(
v
)
∣
u
?
v
∣
d
u
d
v
w
s
(
u
)
=
∑
i
w
i
1
[
s
i
,
s
i
+
1
)
(
u
)
\mathcal{L}_{\text {dist }}(\mathbf{s}, \mathbf{w})=\int_{-\infty}^{\infty} \int_{\mathbf{w}_{\mathbf{s}}}(u) \mathbf{w}_{\mathbf{s}}(v)|u-v| d_{u} d_{v} \\ \mathbf{w}_{\mathbf{s}}(u)=\sum_{i} w_{i} \mathbb{1}_{\left[s_{i}, s_{i+1}\right)}(u)
Ldist??(s,w)=∫?∞∞?∫ws??(u)ws?(v)∣u?v∣du?dv?ws?(u)=i∑?wi?1[si?,si+1?)?(u)
简单理解就是为了让单一射线上的权重分布更接近于脉冲阶跃函数
?
L
dist?
\nabla \mathcal{L}_{\text {dist }}
?Ldist??的可视化,作为s和w的函数在一个阶跃函数上。我们的损失函数鼓励每个射线尽可能紧凑,方法有:1)最小化每个间隔的宽度,2)将远距离的间隔拉近,3)将权重集中到一个间隔或附近的少数几个间隔,4)在可能的情况下将所有权重推向零(例如当整个射线未被占用时)。
由于 ws(·) 在每个区间内都有一个常数值,正则化可重写为:
L
dist?
(
s
,
w
)
=
∑
i
,
j
w
i
w
j
∣
s
i
+
s
i
+
1
2
?
s
j
+
s
j
+
1
2
∣
+
1
3
∑
w
i
2
(
s
i
+
1
?
s
i
)
\begin{aligned} \mathcal{L}_{\text {dist }}(\mathbf{s}, \mathbf{w}) & =\sum_{i, j} w_{i} w_{j}\left|\frac{s_{i}+s_{i+1}}{2}-\frac{s_{j}+s_{j+1}}{2}\right|+\frac{1}{3} \sum w_{i}^{2}\left(s_{i+1}-s_{i}\right) \end{aligned}
Ldist??(s,w)?=i,j∑?wi?wj?
?2si?+si+1???2sj?+sj+1??
?+31?∑wi2?(si+1??si?)?
第一项最小化所有区间中点对之间的加权距离(使得区间越来越小),第二项最小化每个单独区间的加权大小(使得不同区间的w越来越小)
使用具有 4 层和 256 个隐藏单元的proposal MLP 和具有 8 层和 1024 个隐藏单元的 NeRF MLP,这两者都使用 ReLU 内部激活和密度
τ
\tau
τ的 softplus 激活。我们使用 64 个样本对每个提议 MLP 进行两个阶段的评估和重采样以产生 (
s
^
0
\hat{s}^0
s^0,
w
^
0
\hat{w}^0
w^0) 和 (
s
^
1
\hat{s}^1
s^1,
w
^
1
\hat{w}^1
w^1),然后使用 32 个样本评估 NeRF MLP 的一个阶段以产生 (s, w)。我们最小化以下损失:
L
recon?
(
C
(
t
)
,
C
?
)
+
λ
L
dist?
(
s
,
w
)
+
∑
k
=
0
1
L
prop?
(
s
,
w
,
s
^
k
,
w
^
k
)
\mathcal{L}_{\text {recon }}\left(\mathbf{C}(\mathbf{t}), \mathbf{C}^{*}\right)+\lambda \mathcal{L}_{\text {dist }}(\mathbf{s}, \mathbf{w})+\sum_{k=0}^{1} \mathcal{L}_{\text {prop }}\left(\mathbf{s}, \mathbf{w}, \hat{\mathbf{s}}^{k}, \hat{\mathbf{w}}^{k}\right)
Lrecon??(C(t),C?)+λLdist??(s,w)+k=0∑1?Lprop??(s,w,s^k,w^k)
对于
L
r
e
c
o
n
=
(
x
?
x
?
)
2
+
?
2
?with?
?
=
0.001
\mathcal{L}_{recon}=\sqrt{\left(x-x^{*}\right)^{2}+\epsilon^{2}} \text { with } \epsilon=0.001
Lrecon?=(x?x?)2+?2??with??=0.001
场景设置:在捕获过程中,通过固定相机曝光设置、最小化光照变化和避免移动物体来防止光度变化,我们不打算探索“在野外”照片集合 [NeRF in the Wild: Neural Radiance Fields for Unconstrained Photo Collections ]
尽管 mip-NeRF 360 显着优于 mip-NeRF 和其他先前的工作,但它并不完美。可能会遗漏一些薄的结构和精细细节,例如自行车场景中的轮胎辐条(图 5)或倾倒场景中的叶子上的静脉(图 7)。如果相机远离场景的中心,视图合成质量可能会下降。而且,与大多数类似 NeRF 的模型一样,恢复场景需要对加速器进行几个小时的训练,排除了设备上的训练。
一些有意思的点
###非轴对齐编码
在从proposal权重
w
^
\hat w
w^重新采样射线区间之前,我们通过将这些权重提升到某个幂次来退火这些权重。在N个训练步骤中,在第n步我们计算:
W
^
n
∝
W
^
b
n
/
N
(
b
?
1
)
n
/
N
+
1
\hat{\mathbf{W}}_{n} \propto \hat{\mathbf{W}}^{\frac{b n / N}{(b-1) n / N+1}}
W^n?∝W^(b?1)n/N+1bn/N?
"退火"是指通过对权重进行幂次操作来调整它们的值。这个操作的目的是在训练过程中逐渐降低权重的影响力,以便更好地控制采样的过程。 但这个权重是谁,我在研究下代码(ToDo)
在对每个建议直方图( t ^ , w ^ \hat t,\hat w t^,w^)进行重新采样之前,我们会稍微"膨胀"它们。这样做可以减少混叠伪影,可能是因为建议MLP只使用与输入像素对应的射线进行监督训练,因此其预测可能仅适用于特定角度——从某种意义上说,建议网络存在旋转混叠伪影。通过扩大建议MLP的区间,我们有助于抵消这种混叠伪影。为了膨胀直方图(?s,?w),我们首先计算?p,其中?pi = ?wi / (?si+1 ? ?si),这给我们一个概率密度,其积分为1,而不是和为1的直方图。然后,我们通过计算来膨胀这个概率密度: