Sat-NeRF论文笔记和复现问题处理
论文相关
N e R F NeRF NeRF衍生算法
N e R F − W NeRF-W NeRF−W
N e R F i n t h e w i l d NeRF \space in\space the\space wild NeRF in the wild通过学习将瞬态现象与静态场景分离,对辐射变化和瞬态对象具有鲁棒性。除了通常的 c c c和 σ \sigma σ之外,还使用额外的全连接层头来预测每个输入点的瞬态颜色 c T c^T cT和体积密度 σ T \sigma^T σT。瞬态输出与静态输出线性组合,以渲染每条光线的颜色。 N e R F − W NeRF-W NeRF−W还使用瞬态头来发出不确定性系数 β \beta β,该系数衡量网络对点属于瞬态对象的置信度。 β \beta β值用于损失函数,以减少学习过程中瞬态/不可靠像素的影响。
S − N e R F S-NeRF S−NeRF
S h a d o w N e R F Shadow\space NeRF Shadow NeRF是首次尝试将 N e R F NeRF NeRF应用于多视图卫星摄影测量。 S − N e R F S-NeRF S−NeRF显示了同时利用太阳光线的方向来学习到达场景每个点 x x x的太阳光量 S S S在几何估计方面的优势。太阳光线的方向是卫星图像的常见元数据。== S a t − N e R F Sat-NeRF Sat−NeRF==的工作可以被视为 S − N e R F S-NeRF S−NeRF的扩展,它结合了瞬态物体建模和更适合卫星数据的相机模型表示。
D S − N e R F DS-NeRF DS−NeRF
深度监督 N e R F NeRF NeRF在损失函数中加入了深度监督项,以加速学习并减少输入图像的数量。深度监督项利用了属于场景表面的稀疏3D点集,可以使用运动结构 S f M SfM SfM管道轻松检索。 S f M SfM SfM是 N e R F NeRF NeRF框架中常见的预处理步骤,因为它可以估计投射输入光线所需的相机姿态。
输入参数
-
x \rm{x} x: 保存场景体素中的点的坐标三维向量,是射线 r r r的一部分。
-
ω \omega ω: 编码太阳光线方向的三维矢量。对于每个输入图像, ω \omega ω从方位角和仰角 ( θ , ϕ ) (\theta,\phi) (θ,ϕ)中提取,该角度表示太阳在遥感图像metadata中的位置
-
t j \rm{t}_j tj: 从图像索引 j j j的函数中学习得到的 N ( t ) N^{(t)} N(t)维嵌入向量。 t j t_j tj的目标是在第 j j j个视角中表达瞬态元素。该元素不能用 ω \omega ω给出的位置来表达。设置 N t = 4 N^{t}=4 Nt=4
体函数
F : ( x , ω , t j ) → ( σ , c , s , a , β ) \mathcal{F}:(\rm{x},\omega,\rm{t}_j)\rightarrow(\sigma,\rm{c},s,\rm{a},\beta) F:(x,ω,tj)→(σ,c,s,a,β)
输出结果
- σ \sigma σ: 编码位置 x \rm{x} x处的体密度的标量。
- c a \rm{c}_a ca: 由反射率决定的颜色。完全取决于几何信息,即空间坐标 x \rm{x} x。
- s s s: 阴影感知的标量。从坐标 x \rm{x} x和太阳光线方向向量 ω \omega ω的函数中学习获得。
- a \rm{a} a:周围颜色。和场景集合信息完全独立,取决于由 ω \omega ω给出的太阳位置,定义了一个全局色调偏差。
- β \beta β: 与由瞬态对象解释的 x x x的颜色概率相关的不确定性系数。
核心方法1:阴影感知辐照度模型(Shadow-aware irradiance model)
保持公式(1)和公式(2)的渲染方式,用公式(3)的方法定义透射率和不透明度因子。
c
(
r
)
=
∑
i
=
1
N
T
i
α
i
c
i
(1)
c(r)=\sum^{N}_{i=1}T_i\alpha_ic_i \tag{1}
c(r)=i=1∑NTiαici(1)
d ( r ) = ∑ i = 1 N T i α i t i (2) d(r)=\sum^{N}_{i=1}T_i\alpha_it_i \tag{2} d(r)=i=1∑NTiαiti(2)
α i = 1 − e x p ( − σ i δ i ) ; T i = ∏ j = 1 i − 1 ( 1 − α j ) (3) \alpha_i=1-\rm{exp}(-\sigma_i\delta_i);\space\space\space\space\space\space T_i=\prod^{i-1}_{j=1}(1-\alpha_j) \tag{3} αi=1−exp(−σiδi); Ti=j=1∏i−1(1−αj)(3)
那Sat-NeRF是如何预测投影到某个像素上的光线
r
r
r的颜色
c
c
c的呢?借鉴S-NeRF的工作提出阴影感知辐照度模型来计算光线
r
r
r在每个点
x
x
x处的颜色
c
c
c:
c
(
x
,
ω
,
t
j
)
=
c
a
(
x
)
⋅
[
s
(
x
,
ω
)
+
(
1
−
s
(
x
,
ω
)
)
⋅
a
(
ω
)
]
(4)
\rm{c}(\rm{x},\omega,\rm{t}_j)=\rm{c_a}(\rm{x})\cdot[s(x,\omega)+(1-s(x,\omega))\cdot a(\omega)]\tag{4}
c(x,ω,tj)=ca(x)⋅[s(x,ω)+(1−s(x,ω))⋅a(ω)](4)
这里的
c
(
x
,
ω
,
t
j
)
\rm{c}(x,\omega,t_j)
c(x,ω,tj)代替公式(1)中的
c
i
\rm{c_i}
ci,阴影标量
s
(
x
,
ω
)
s(\rm{x},\omega)
s(x,ω)取值在0到1之间,用于通过暗化反照率(albedo)来添加阴影。理想情况下,在直接被太阳照射的三维点中,
s
≈
1
s\approx1
s≈1,其颜色应该完全由反照率
c
a
(
x
)
\rm{c}_a(x)
ca(x)来解释。该公式通过环境颜色
a
(
ω
)
\rm{a}(\omega)
a(ω)来捕捉阴影的蓝色调,有助于那些
s
s
s取值更接近0的点。在实际情况下,太阳光线
ω
\omega
ω的方向与采集日期密切相关,特别是如果卫星在一天中的同一时间经过。因此,由于一系列现象的叠加,
a
(
ω
)
\rm{a}(\omega)
a(ω)可以捕获环境的辐照度,这些现象与
ω
\omega
ω相关,也与天气或季节变化等特定日期条件相关。
在S-Nerf中,阴影标量
s
(
x
,
ω
)
s(\rm{x},\omega)
s(x,ω)可能会对训练数据中看不到的太阳光线方向产生不切实际的结果,这时就需要添加太阳光线的正则项来最小化损失:
L
S
C
(
R
S
C
)
=
∑
r
∈
R
S
C
(
∑
i
=
1
N
S
C
(
T
i
−
s
i
2
+
1
−
∑
i
=
1
N
S
C
T
i
α
i
s
i
)
)
(5)
L_{SC}(\cal{R}_{SC})=\sum_{\rm{r}\in \cal{R}_{SC}}(\sum^{N_{SC}}_{i=1}(T_i-s_i^2+1-\sum^{N_{SC}}_{i=1}T_i\alpha_is_i))\tag{5}
LSC(RSC)=r∈RSC∑(i=1∑NSC(Ti−si2+1−i=1∑NSCTiαisi))(5)
其中
R
S
C
R_{SC}
RSC是第二批次太阳矫正射线,在
R
S
C
R_{SC}
RSC中的光线遵循太阳光线
ω
\omega
ω的方向,而
R
R
R中的光线在NeRF的颜色损失(MSE)
∑
r
∈
R
∣
∣
c
(
r
)
−
c
G
T
(
r
)
∣
∣
2
2
]
\sum_{\rm{r}\in\cal{R}}||\rm{c}(r)-c_{GT}(r)||^2_2]
∑r∈R∣∣c(r)−cGT(r)∣∣22]的主项中遵循相机的观察方向。
太阳光线的正则项使用由透射率 T i T_i Ti和不透明度 α i \alpha_i αi编码的几何规则来进一步监督阴影感知标量 s ( x , ω ) s(\rm{x,\omega}) s(x,ω)的学习。第一部分强制要求对于 R s c \cal{R}_{sc} Rsc中每条射线 r r r,在第 i i i个点预测的 s i s_i si应近似于 T i T_i Ti,即到达可见表面之前的高值、到达可见表面之后的低值( s i s_i si和 T i T_i Ti都取0到1之间的值)。没太看懂这句。
第二部分鼓励 s s s和 r r r的积分接近1,因为非遮挡和非阴影区域必须主要由公式(4)中的反照率来解释。
核心方法2:瞬态对象的不确定性权重(Uncertainty weighting for transient objects)
类似于NeRF-W方法,任务不确定性学习方法,通过 β \beta β获得对瞬态对象的鲁棒性。瞬态对象是输入图像中的准时局部变化,无法用静态表面或可用元数据(太阳的位置)来解释。辐照度模型没有明确处理瞬态对象,可以发现 s s s和 σ \sigma σ通常试图解释它们,导致深度预测出现错误。通过 β \beta β,Sat-NeRF有一定的余量来忽略这些物体引起的颜色不一致。
渲染颜色和已知颜色之间每条每条光线的MSE都通过不确定性预测系数
β
\beta
β来加权,设置以下损失:
L
R
G
B
(
R
)
=
∑
r
∈
R
∣
∣
c
(
r
)
−
c
G
T
(
r
)
∣
∣
2
2
2
β
′
(
r
)
2
+
(
l
o
g
β
′
(
r
)
+
η
2
)
(6)
L_{RGB}(\cal{R})=\sum_{\rm{r}\in\cal{R}}\frac{||\rm{c(r)-c_{GT}(r)}||^2_2}{2\beta'(\rm{r})^2}+(\frac{\rm{log}\beta'(r)+\eta}{2}) \tag{6}
LRGB(R)=r∈R∑2β′(r)2∣∣c(r)−cGT(r)∣∣22+(2logβ′(r)+η)(6)
其中,
β
′
(
r
)
=
β
(
r
)
+
β
m
i
n
\beta'(\rm{r})=\beta(r)+\beta_{min}
β′(r)=β(r)+βmin,在公式(6)中,使用
β
m
i
n
=
0.05
\beta_{min}=0.05
βmin=0.05和
η
=
3
\eta=3
η=3来避免对数中出现负值。对数在
L
R
G
B
L_{RGB}
LRGB中的作用是防止
β
\beta
β收敛到无穷大。通过这种方式,模型会被迫在不确定系数
β
\beta
β和颜色的差异中,找到折中的结果。
与射线
r
r
r相关的
β
(
r
)
\beta(\rm{r})
β(r)是通过对
r
\rm{r}
r的
N
N
N个点的不确定性预测系数进行积分获得的:
β
(
r
)
=
∑
i
=
1
N
T
i
α
i
β
(
x
i
,
t
j
)
(7)
\beta(\rm{r})=\sum^{N}_{i=1}T_i\alpha_i\beta(x_i,t_j)\tag{7}
β(r)=i=1∑NTiαiβ(xi,tj)(7)
其中,
β
(
x
i
,
t
j
)
\beta(\rm{x_i,t_j})
β(xi,tj)是在
r
\rm{r}
r的第
i
\rm{i}
i个点预测的不确定系数,Sat-NeRF学习基于场景的空间坐标
x
\rm{x}
x(一些区域可能会展示瞬态对象,比如露天停车场)和每个输入训练图像的瞬态嵌入向量
t
j
\rm{t_j}
tj来预测场景的每个点的不确定性
β
\beta
β。在每个视角中,瞬态物体会影响一些区域在反照率方面出现不同。嵌入向量
t
j
\rm{t_j}
tj是在训练期间从第
j
j
j个图像中学习的。
通过研究发现,在第二个epoch
后开始使用
β
\beta
β,效果是最好的,此时阴影感知标量
s
s
s已经被很好的初始化。否则,模型可能会使用
β
\beta
β来忽略阴影区域,而不是试图用
s
s
s来解释它们。因此,在前两个epoch
中,将公式(6)替换为
∑
r
∈
R
∣
∣
c
(
r
)
−
c
G
T
(
r
)
∣
∣
2
2
]
\sum_{\rm{r}\in\cal{R}}||\rm{c}(r)-c_{GT}(r)||^2_2]
∑r∈R∣∣c(r)−cGT(r)∣∣22]。
核心方法3:在卫星RPC模型中进行点采样(Point sampling from satellite RPC models)
Sat-NeRF直接使用了一组卫星图像的 RPC
(Rational Polynomial Coefficients)相机模型来进行光线投射。RPC
模型在光学卫星图像中应用广泛,因为它能够描述复杂的成像系统,而无需依赖于特定卫星的物理模型。每个 RPC
模型都包含一个投影函数(将 3D 点映射到图像像素上)和一个逆向定位函数(从图像坐标定位到 3D 空间)。
在 NeRF 框架中使用 RPC
模型相较以往的卫星数据处理方法是一项改进。此前在 S-NeRF中,每个输入视图的 RPC
模型被替换为一个简化的针孔相机矩阵,这种针孔模型是 NeRF 中常见的表示方法,用于处理近距离图像。
将场景的最小和最大高度分别表示为
h
m
i
n
h_{min}
hmin和
h
m
a
x
h_{max}
hmax。穿过场景并与第
j
j
j幅图像像素
p
p
p相交的光线被建模为初始点和最终点,即
x
s
t
a
r
t
x_{start}
xstart和
x
e
n
d
x_{end}
xend ,之间的直线,这些边界点是通过使用第
j
j
j幅图像的RPC
定位函数
L
j
\cal{L}_j
Lj将像素
p
p
p定位在
h
m
i
n
h_{min}
hmin和
h
m
a
x
h_{max}
hmax处获得:
x
s
t
a
r
t
=
L
j
(
p
,
h
m
a
x
)
E
C
E
F
x
e
n
d
=
L
j
(
p
,
h
m
i
n
)
E
C
E
F
(8)
\mathrm{x}_{start}=\cal{L}_j(\rm{p},\mathit{h}_{max})_{ECEF}\\ \mathrm{x}_{end}=\cal{L}_j(\rm{p},\mathit{h}_{min})_{ECEF} \tag{8}
xstart=Lj(p,hmax)ECEFxend=Lj(p,hmin)ECEF(8)
这里的子索引ECEF
(Earth-centered, Earth-fixed)表示定位函数
L
j
\cal{L}_j
Lj返回的3D点被转换为以地球为中心的固定坐标系(地心坐标系)。
给定
x
s
t
a
r
t
x_{start}
xstart和
x
e
n
d
x_{end}
xend,射线
r
(
t
)
=
o
+
t
d
\rm{r}(t)=o+\it{t}d
r(t)=o+td相交于第
j
j
j幅图像上的像素
p
\rm{p}
p,其原点
o
\rm{o}
o,方向向量
d
\rm{d}
d为:
o
=
x
s
t
r
a
r
t
d
=
x
e
n
d
−
x
s
t
a
r
t
∣
∣
x
e
n
d
−
x
s
t
a
r
t
∣
∣
2
(9)
\rm{o}=\rm{x}_{strart}\\ \rm{d}=\frac{x_{end}-x_{start}}{||x_{end}-x_{start}||_2} \tag{9}
o=xstrartd=∣∣xend−xstart∣∣2xend−xstart(9)
设定与相机距离最近的最大高度点
x
start
x_{\text{start}}
xstart为光线的原点
o
o
o。射线
r
(
t
)
=
o
+
t
d
r(t) = o + td
r(t)=o+td的边界,即
[
t
min
,
t
max
]
[t_{\text{min}}, t_{\text{max}}]
[tmin,tmax],设置为
t
min
=
0
t_{\text{min}} = 0
tmin=0和
t
max
=
∥
x
end
−
x
start
∥
2
t_{\text{max}} = \| x_{\text{end}} - x_{\text{start}} \|_2
tmax=∥xend−xstart∥2。由于在处理ECEF
坐标时,表示值较大,因此不便于直接使用,采用类似于RPC
函数中使用的偏移减法和缩放方法,将所有光线点归一化到区间
[
−
1
,
1
]
[-1, 1]
[−1,1]。通过在
h
min
h_{\text{min}}
hmin和
h
max
h_{\text{max}}
hmax处对输入图像中的所有像素进行定位所得到的3D点集合用于计算每个空间维度的偏移和缩放。
核心方法4:RPC优化提高性能(RPC refinement for improved performance)
捆绑调整方法是遥感中常见的良好做法,用于纠正观测同一场景的RPC
模型集合之间的不一致性。特别是,捆绑调整方法通过最小化图像上看到的一组对应点的重投影误差来校正RPC
。
在没有提前进行RPC
优化的情况下,用不同原始RPC
函数投影的3D点通常了落在距离非入射图像点十个像素左右的位置上。这将导致任何用于卫星图像的NeRF
方法系统性地丧失准确性,因为从不同视图的相应像素追踪射线无法在物体空间中的精确点相交。为了防止这种情况,在训练Sat-NeRF之前,先采用捆绑调整对所有输入图像的RPC
模型进行相对校正。捆绑调整使用的点集来自SIFT
关键点的对应关系。
虽然改进的RPC
模型直接提高了点采样策略的准确性,但之前的捆绑调整也可以通过其他方式提高Sat-NeRF性能。在卫星图像的情况下,捆绑调整会产生一组从图像特征中导出的等效稀疏3D点。基于这一想法,可以考虑在Sat-NeRF模型的损失中添加深度监督项:
L
D
S
(
R
D
S
)
=
∑
r
∈
R
D
S
w
(
r
)
(
d
(
r
)
−
∣
∣
X
(
r
)
−
o
(
r
)
∣
∣
2
)
2
(10)
L_{DS}(\cal{R}_{DS})=\sum_{\rm{r}\in\cal{R}_{DS}}w(\rm{r})(\it{d}\rm{(r)}-||X(r)-o(r)||_2)^2 \tag{10}
LDS(RDS)=r∈RDS∑w(r)(d(r)−∣∣X(r)−o(r)∣∣2)2(10)
这里的
d
(
r
)
d(\rm{r})
d(r)是原点为
o
(
r
)
\rm{o}(r)
o(r)的射线
r
\rm{r}
r预测的深度,如果
r
\rm{r}
r与已知的3D点
X
(
r
)
\rm{X}(r)
X(r)相交,则
∣
∣
X
(
r
)
−
o
(
r
)
∣
∣
2
||\rm{X}(r)-o(r)||_2
∣∣X(r)−o(r)∣∣2是要学习的目标深度。
R
D
S
\cal{R}_{DS}
RDS表示与已知3D点相交的一批射线。由于捆绑调整已经提供了与这些3D点相关的像素坐标,因此
R
D
S
\cal{R}_{DS}
RDS中的所有射线都可以通过点采样中定义射线的方法来定义。为了和点采样中的定义保持一致,在上式(10)中使用
[
−
1
,
1
]
[-1,1]
[−1,1]之间的归一化坐标来表示对象空间中的点。
类似于下面的公式(11),只在最初 25 % 25\% 25%的训练中使用 L D S \cal{L}_{DS} LDS,这种设置足以获得所学几何的准确性。观察 R D S \cal{R}_{DS} RDS中每个深度监督射线 r r r的贡献由公式(10)中的 w ( r ) w(\rm{r}) w(r)加权,其中 w ( r ) w(\rm{r}) w(r)是根据捆绑调整提供的每个点 X ( r ) \rm{X}(r) X(r)的重投影误差设置的标量集。
核心方法5:多任务损失和网络架构(Multi-task loss and network architecture)
Sat-NeRF损失函数的主要项是公式(6)中定义的
L
R
G
B
L_{RGB}
LRGB,辅以在公式(5)的太阳光线正则项
L
S
C
L_{SC}
LSC和在公式(10)中的深度监督项
L
D
S
L_{DS}
LDS。完整的损失函数可以表示为:
L
=
L
R
G
B
(
R
)
+
λ
S
C
L
S
C
(
R
S
C
)
+
λ
D
S
L
D
S
(
R
D
S
)
L = L_{RGB}(\cal{R}) + \lambda_{SC} \it{L}_{SC}(\cal{R}_{SC}) + \lambda_{DS} {L}_{DS}(\cal{R}_{DS})
L=LRGB(R)+λSCLSC(RSC)+λDSLDS(RDS)
其中,
λ
S
C
\lambda_{SC}
λSC和
λ
D
S
\lambda_{DS}
λDS是赋予每个次要项的任意权重。我们通过经验发现,
λ
S
C
=
0.1
3
\lambda_{SC} = \frac{0.1}{3}
λSC=30.1和
λ
D
S
=
1000
3
\lambda_{DS} = \frac{1000}{3}
λDS=31000能提供良好的结果,使得次要项足够相关,但低于
L
R
G
B
L_{RGB}
LRGB的数量级。对于深度监督,我们依据[31]的输出,为每个感兴趣区域使用了大约
2
k
2k
2k到
10
k
10k
10k个捆绑调整点。
R
R
R、
R
S
C
R_{SC}
RSC和
R
D
S
R_{DS}
RDS的批量大小相同。
Sat-NeRF的架构如图3所示。主块由全连接层构成,每层有 h h h个通道,专门用于预测场景的静态属性:体积密度 σ \sigma σ和反照率颜色 c a c_a ca。在此基础上,添加了一个次级头,其层数较少且每层通道数减半,以基于太阳光线方向 ω \omega ω和主块学习的 h h h个几何相关特征向量来估计阴影标量 s s s。最后,使用两个单层头分别从瞬态嵌入向量 t j t_j tj和 ω \omega ω预测不确定性系数 β \beta β和环境颜色 a a a。
这里采用SIREN
层。使用softplus
函数预测
σ
\sigma
σ对取得满意的结果至关重要。不确定性
β
\beta
β也是通过softplus
生成的,相较于传统的ReLU
,这产生了更平滑的优化问题。其他输出则由sigmoid
函数计算,因为它们与归一化的RGB
值相关,且必须在区间[0, 1]内。
h
h
h的值应根据观察区域的分辨率和大小进行调整。在本工作中,设置
h
=
512
h = 512
h=512。
复现情况
将项目 clone 到实验室服务器,并下载 EarthVision :https://github.com/centreborelli/satnerf/releases/tag/EarthVision2022的数据集。
配置环境的时候遇到 sh 脚本无法执行的情况,看报错内容应该是无法通过脚本连接到环境依赖的仓库,该方法不可行。
采用手动创建虚拟环境的方法:(这个是错误的指令)
conda env create -n satname python=3.6
通过后期验证发现 python = 3.6 对应的 torch
不满足代码需求,所以后面改成 3.8 版本的 python
然后通过配置文件手动添加相关依赖:
pip install -r requirements.txt
第一条报错显示 gdal
无法正确安装,所以考虑用 conda
手动安装,因为 conda
会自动管理兼容的 libgdal
版本:
conda install gdal
还是会出现报错显示 opencv
版本不匹配,为了满足项目需求,安装指定较低版本的 opencv
:
pip install opencv-contrib-python==4.5.3.56
接下来出现的报错,关于某些库无法正确安装可以直接用 conda
和 pip
,哪个能用就用哪个。
第一次配置好环境之后,把下载好的数据集导入训练,编写官方给的训练指令,执行训练。
load 完输入图像后,一直无法调用到对应 GPU 和 CUDA,推测应该 pytorch 和 cuda 的版本太低了,和服务器的 GPU 不匹配,所以无法调用。
把 satnerf
环境删了,重新配一个虚拟环境,这次改用 python3.8
。然后 pytorch
版本选用 2.4.1,torchvision
版本对应上(0.19.2)之后,可以顺利执行训练。
官方给的训练指令修改后如下所示:
python3 main.py --model sat-nerf --exp_name JAX_068_ds1_sat-nerf --root_dir /home/data1/xxx/Project/satnerf/data/root_dir/crops_rpcs_ba_v2/JAX_068 --img_dir /home/data1/xxx/Project/satnerf/data/DFC2019/Track3-RGB-crops/JAX_068 --cache_dir /home/data1xxx/Project/satnerf/data/cache_dir/crops_rpcs_ba_v2/JAX_068_ds1 --gt_dir /home/data1/xxx/Project/satnerf/data/DFC2019/Track3-Truth --logs_dir /home/data1/xxx/Project/satnerf/data/SatNeRF_output/logs --ckpts_dir /home/data1/xxx/Project/satnerf/data/SatNeRF_output/ckpts
官方给的默认参数设置在 ~/opt.py
中的 line40:
# training and network configuration
parser.add_argument('--lr', type=float, default=5e-4,
help='initial learning rate')
parser.add_argument('--batch_size', type=int, default=1024,
help='batch size (number of input rays per iteration)')
parser.add_argument('--img_downscale', type=float, default=1.0,
help='downscale factor for the input images')
parser.add_argument('--max_train_steps', type=int, default=300000,
help='number of training iterations')
parser.add_argument('--save_every_n_epochs', type=int, default=4,
help="save checkpoints and debug files every n epochs")
parser.add_argument('--fc_units', type=int, default=512,
help='number of fully connected units in the main block of layers')
parser.add_argument('--fc_layers', type=int, default=8,
help='number of fully connected layers in the main block of layers')
parser.add_argument('--n_samples', type=int, default=64,
help='number of coarse scale discrete points per input ray')
parser.add_argument('--n_importance', type=int, default=0,
help='number of fine scale discrete points per input ray')
parser.add_argument('--noise_std', type=float, default=0.0,
help='standard deviation of noise added to sigma to regularize')
parser.add_argument('--chunk', type=int, default=1024*5,
help='maximum number of rays that can be processed at once without memory issues')
最大迭代次数 max_train_steps
为 300000,批大小 batch_size
为 1024。
第一次训练结果,迭代了epoch=27
:
总训练时间:约 42484 秒,11.8h。
主要耗时操作:
run_training_epoch
:占用总时间的 99.847%run_training_batch
和optimizer_step_and_closure_0
分别占 87.486% 和 85.262%
模型前向传播(model_forward
)及反向传播(backward
)占总时间的 30.203% 和 50.486%
输出的内容
有些文件夹是空的,只记录一下有内容的文件夹。目前只有sky这一组结果没有图像。
Albedo(反照率):
- 反照率表示物体表面的光反射率,它是由表面材质决定的,与光照条件无关。Albedo 是 Sat-NeRF 生成的表面颜色,排除了阴影和瞬态光照的影响。这个图像可以帮助分析表面的真实颜色,适用于计算物体在不同光照条件下的表现。
Beta(不确定性系数):
- 不确定性系数衡量的是模型在瞬态对象(如汽车、行人等临时物体)周围的信心水平。Beta 值较高的区域通常对应变化频繁或短暂出现的对象,因此可以通过该系数来抑制这些对象对整体模型的干扰。这有助于提高模型在不同时间段的图像之间一致性的重建质量。
Depth(深度图):
- 深度图表示每个像素到相机的距离,这在 3D 重建中用于表示场景中的相对距离。深度图提供了场景的几何信息,可用于合成不同视角下的图像,或生成立体图像。
DSM(数字表面模型):
- 数字表面模型(Digital Surface Model)是表面高度的三维表示,通常包括所有地物(如树木、建筑等)的高度。DSM 可以看作是深度图的绝对版本,它对场景的结构和形态有清晰的呈现。Sat-NeRF 通过 DSM 生成高分辨率的 3D 表面模型,使得重建结果具有更高的地理真实性。
GT_RGB(Ground Truth RGB,真实 RGB):
- 真实 RGB是从卫星影像中直接采集的颜色数据,作为 Sat-NeRF 的训练或对比基准。GT_RGB 图像可以用于与重建的 RGB 结果进行对比,以评估模型的准确性和生成的图像质量。
RGB:
- RGB表示 Sat-NeRF 生成的渲染结果,包括阴影、瞬态对象以及环境光在内的所有场景因素。该图像是对 GTRGB 的近似,用于比较生成图像和真实图像的差异。理想情况下,RGB 与 GTRGB 应尽可能一致。
Sky(天空):
- 天空图像可能是由于天空部分没有足够的几何或纹理信息,因此模型未生成有效的图像。通常天空区域对重建没有直接贡献,因为它的深度或几何信息不足。天空的存在主要用于光照条件下的参考。
Sun(太阳光照):
- 太阳光照图像展示了太阳在场景中的光照效果。这对场景中的阴影生成和阴影标量的计算非常重要,因为不同的太阳角度会影响阴影在场景中的呈现。Sun 信息通常用于模拟不同时间的光照变化,以便更真实地呈现场景。