赞
踩
论文链接:NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
渲染出同一场景不同视角下的的图像。
根据同一场景的若干张不同视角的图片,重构出这个场景的3D表示,在推理的时候就可以根据输入的视角,合成该视角下的图像。
输入:同一场景的若干张不同视角的照片
输出:该场景在新视角下的图像
多视角生成有很多方法,例如使用图形学中的方法,根据已有的图片,推理出场景中光源位置、强度,场景中物体的几何属性,物体材质的特性(反射率,折射率)等,整个建模难度会变得很大。
NeRF没有这么做,而是采用了体渲染的建模方法。
体渲染属于整个渲染技术的分支,它的目的主要是为了解决云、烟、果冻这类非刚性物体的渲染建模,可以简单理解为是为了处理密度较小的非固体的渲染。当然进一步推广到固体的渲染也说的通,而 NeRF 也是这样做的。
为了建模这种非刚性物体的渲染,体渲染把气体等物质抽象成一团飘忽不定的粒子群。光线在穿过这类物体时,其实就是光子在跟粒子发生碰撞的过程。
核心思想:把物体看作一团可以自发光的粒子,这些粒子具有颜色C,密度σ两个属性。使用现有的照片对体空间内粒子的密度和颜色进行预测,保存这些信息。在渲染其他视角时,使用这些信息(粒子的密度,颜色)进行推理,就能得到新视角下该场景的照片。
因此NeRF要解决的问题就两个:
1. 如何通过现有的照片得到空间中密度与颜色的分布。
2. 如何利用这些数据,得到任意角度的照片。
先解决问题2,如何在已知空间中粒子密度与每个粒子颜色的情况下,计算从某个角度看过去的颜色?
从某一点看过去,这一点的颜色应该由达到这一点的光线上累积的颜色决定,如下图:(想象每条光线是由一个个小球组成的,最终这些小球都打到像素上形成该点在这个视角下的颜色)
用数学语言描述就是:
其中,σ(s)表示s处的密度;C(s)表示s处的颜色值;沿着视线的方向,前面的粒子密度大的话可能会阻挡后面的粒子对最终颜色的贡献,因此,积分时需乘以T(s),T(s)表示透明度,或者当前粒子的可见程度,T(s)是σ(s)的一个表达式。
NeRF中构建了一个神经网络F(θ),输入为当前照片中,每个像素点看过来的角度,以及射线上采样点的坐标;输出为采样点上的颜色与密度。利用上面的公式,通过预测的颜色C’,使用MSE(C’-C)作为损失进行训练。
这里要注意一点,一个采样点的密度只跟空间坐标有关,但它的颜色是与观察角度有关的,因为要考虑到高光和阴影的情况。一个物体从不同的角度看过去,高光点与阴影是有变化的。
整个网络的输入有两个,一个是粒子在三维空间内的坐标(3维),另一个是视角(3维,单位向量),输出为RGB值与密度值(4维)。
直接在神经网络中输入坐标与角度信息只有6维数据,训练效果并不好,其原因是输入的信息粒度太粗,可能无法提取到一些比较细微的差别。比如对于同一点,不同角度看过去,这个角度值的变化可能并不大,但是看到的颜色差别很大。
为了提取到高频信息,需要对输入进行增强。NeRF采用了位置编码的方法,将3维空间位置坐标使用正弦余弦进行编码,增强后输入变为
(
x
,
y
,
z
)
=
(
x
,
y
,
z
,
s
i
n
(
2
0
,
x
)
,
s
i
n
(
2
0
,
y
)
,
s
i
n
(
2
0
,
z
)
,
c
o
s
(
2
0
,
x
)
,
c
o
s
(
2
0
,
y
)
,
c
o
s
(
2
0
,
z
)
,
s
i
n
(
2
1
,
x
)
,
s
i
n
(
2
1
,
y
)
,
s
i
n
(
2
1
,
z
)
,
c
o
s
(
2
1
,
x
)
,
c
o
s
(
2
1
,
y
)
,
c
o
s
(
2
1
,
z
)
.
.
.
s
i
n
(
2
n
−
1
,
x
)
,
s
i
n
(
2
n
−
1
,
y
)
,
s
i
n
(
2
n
−
1
,
z
)
,
c
o
s
(
2
n
−
1
,
x
)
,
c
o
s
(
2
n
−
1
,
y
)
,
c
o
s
(
2
n
−
1
,
z
)
(x,y,z)=(x,y,z,sin(2^0,x),sin(2^0,y),sin(2^0,z),cos(2^0,x),\\cos(2^0,y),cos(2^0,z),sin(2^1,x),sin(2^1,y),sin(2^1,z),cos(2^1,x),\\cos(2^1,y),cos(2^1,z)...sin(2^{n-1},x),sin(2^{n-1},y),sin(2^{n-1},z),\\cos(2^{n-1},x),cos(2^{n-1},y),cos(2^{n-1},z)
(x,y,z)=(x,y,z,sin(20,x),sin(20,y),sin(20,z),cos(20,x),cos(20,y),cos(20,z),sin(21,x),sin(21,y),sin(21,z),cos(21,x),cos(21,y),cos(21,z)...sin(2n−1,x),sin(2n−1,y),sin(2n−1,z),cos(2n−1,x),cos(2n−1,y),cos(2n−1,z)
即输入维度会变为3+n×3×2=6n+3
在论文中,坐标输入的n=10,最终输入的是63维;
角度输入的n=4,最终输入是27维。
网络架构基本全是全连接层,但这是对密度σ的计算,在计算RGB时,还需要输入观察方向,然后在经过一层128的线性层,输出颜色RGB。
从概率的角度对上述积分公式进行推导:设σ(s)是在s点处,光子撞击粒子(光线被阻碍)的概率密度;C(s)是在s点处粒子发出的颜色;T(s)是在s点之前,光线都没有被阻碍的概率。
T
(
S
+
d
s
)
=
T
(
S
)
(
1
−
σ
(
s
)
d
s
)
[
P
(
B
∣
A
)
=
P
(
A
)
⋅
P
(
A
B
)
]
T(S+ds)=T(S)(1-\sigma(s)ds)\ \ \ \ [P(B|A) = P(A) \cdot P(AB)]
T(S+ds)=T(S)(1−σ(s)ds) [P(B∣A)=P(A)⋅P(AB)]
T ( S + d s ) − T ( S ) = − T ( S ) σ ( s ) d s T(S+ds)-T(S)=-T(S)\sigma(s)ds T(S+ds)−T(S)=−T(S)σ(s)ds
d T ( S ) T ( S ) = − σ ( s ) d s \frac{dT(S)}{T(S)} = -\sigma(s)ds T(S)dT(S)=−σ(s)ds
T ( S ) = e − ∫ 0 S σ ( t ) d t T(S)=e^{-\int_0^S\sigma(t)dt} T(S)=e−∫0Sσ(t)dt
C ^ ( t ) = ∫ 0 ∞ T ( s ) σ ( s ) C ( s ) d s \widehat{C}(t)=\int_0^\infin T(s)\sigma(s)C(s)ds C (t)=∫0∞T(s)σ(s)C(s)ds
其中 T ( S ) = e − ∫ 0 S σ ( t ) d t 其中\ \ T(S)=e^{-\int_0^S\sigma(t)dt} 其中 T(S)=e−∫0Sσ(t)dt
将整条光路 [0, s] 划分为N个相等间距的区间 [ T n − > T n + 1 T_n->T_n+1 Tn−>Tn+1], n = 0 , 1 , . . . N n=0,1,...N n=0,1,...N, 区间的长度为 δ n \delta n δn,假设每个区间内的密度与颜色值一样(常量),为 σ n \sigma _n σn与 C n C_n Cn,将每个区间的贡献光强进行累积,可以得到光线的颜色。
C ^ = ∑ n = 1 N I ( T n − > T n + 1 ) \widehat{C}=\sum\limits_{n=1}^{N}I(T_n->T_n+1) C =n=1∑NI(Tn−>Tn+1)
I ( T n − > T n + 1 ) = ∫ t n t n + 1 σ ( n ) C n T ( t ) d t I(T_n->T_n+1)=\int_{t_n}^{t_{n+1}}\sigma(n)C_nT(t)dt I(Tn−>Tn+1)=∫tntn+1σ(n)CnT(t)dt
= σ ( n ) C n ∫ t n t n + 1 T ( t ) d t =\sigma(n)C_n\int_{t_n}^{t_{n+1}}T(t)dt =σ(n)Cn∫tntn+1T(t)dt
= σ ( n ) C n ∫ t n t n + 1 T ( 0 − > t n ) T ( t n − > t ) d t =\sigma(n)C_n\int_{t_n}^{t_{n+1}}T(0->t_n)T(t_n->t)dt =σ(n)Cn∫tntn+1T(0−>tn)T(tn−>t)dt
= σ ( n ) C n T ( 0 − > t n ) ∫ t n t n + 1 T ( t n − > t ) d t =\sigma(n)C_nT(0->t_n)\int_{t_n}^{t_{n+1}}T(t_n->t)dt =σ(n)CnT(0−>tn)∫tntn+1T(tn−>t)dt
= σ ( n ) C n T ( 0 − > t n ) ∫ t n t n + 1 e − ∫ t n t σ n d s d t =\sigma(n)C_nT(0->t_n)\int_{t_n}^{t_{n+1}}e^{-\int_{t_n}^t\sigma_nds}dt =σ(n)CnT(0−>tn)∫tntn+1e−∫tntσndsdt
= σ ( n ) C n T ( 0 − > t n ) ∫ t n t n + 1 e − σ n ( t − t n ) d t =\sigma(n)C_nT(0->t_n)\int_{t_n}^{t_{n+1}}e^{-\sigma_n(t-t_n)}dt =σ(n)CnT(0−>tn)∫tntn+1e−σn(t−tn)dt
= σ ( n ) C n T ( 0 − > t n ) − 1 σ n e − σ n ( t − t n ) ∣ t n t n + 1 =\sigma(n)C_nT(0->t_n)-\frac{1}{\sigma_n}e^{-\sigma_n(t-t_n)}|_{t_n}^{t_{n+1}} =σ(n)CnT(0−>tn)−σn1e−σn(t−tn)∣tntn+1
= σ ( n ) C n T ( 0 − > t n ) ( 1 − e − σ n δ n ) =\sigma(n)C_nT(0->t_n)(1-e^{-\sigma_n\delta_n}) =σ(n)CnT(0−>tn)(1−e−σnδn)
= σ ( n ) C n T ( 0 − > t n ) ( 1 − e − σ n δ n ) =\sigma(n)C_nT(0->t_n)(1-e^{-\sigma_n\delta_n}) =σ(n)CnT(0−>tn)(1−e−σnδn)
因为:
T
(
0
−
>
t
n
)
=
e
−
∫
0
t
n
σ
(
t
)
d
t
=
e
∑
i
=
0
n
σ
i
δ
i
T(0->t_n)=e^{-\int_0^{t_n}\sigma(t)dt}=e^{\sum_{i=0}^{n}\sigma_i\delta_i}
T(0−>tn)=e−∫0tnσ(t)dt=e∑i=0nσiδi
令:
α
n
=
1
−
e
−
σ
n
δ
n
\alpha_n=1-e^{-\sigma_n\delta_n}
αn=1−e−σnδn
有:
I
(
T
n
−
>
T
n
+
1
)
=
C
n
α
n
(
1
−
α
0
)
(
1
−
α
1
)
.
.
.
.
.
.
(
1
−
α
n
−
1
)
I(T_n->T_{n+1})=C_n\alpha_n(1-\alpha_0)(1-\alpha_1)......(1-\alpha_{n-1})
I(Tn−>Tn+1)=Cnαn(1−α0)(1−α1)......(1−αn−1)
C
^
=
C
0
α
0
+
C
1
α
1
(
1
−
α
0
)
+
C
2
α
2
(
1
−
α
0
)
(
1
−
α
1
)
+
.
.
.
+
C
n
α
n
(
1
−
α
0
)
(
1
−
α
1
)
.
.
.
(
1
−
α
n
−
1
)
)
\widehat{C}=C_0\alpha_0+C_1\alpha_1(1-\alpha_0)+C_2\alpha_2(1-\alpha_0)(1-\alpha_1)+...+C_n\alpha_n(1-\alpha_0)(1-\alpha_1)...(1-\alpha_{n-1}))
C
=C0α0+C1α1(1−α0)+C2α2(1−α0)(1−α1)+...+Cnαn(1−α0)(1−α1)...(1−αn−1))
其中, α n \alpha_n αn也可以看做是第 n n n点的不透明度,当前面粒子的不透明度都很小时,后面的粒子才能被看见。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。