简介
主页:https://github.com/wayne1123/code-nerf
CodeNeRF表示对象类中形状和纹理的变化。左图:测试时,给定单一输入图像,训练后的模型可用于联合优化相机视点和形状/纹理潜码。右图:物体的形状、纹理和视点可以通过改变潜在代码进行编辑,从而提供对合成的完全控制。
CodeNeRF是一个新颖的三维感知的对象类别表示,它学会了分离形状和纹理。
在训练过程中,CodeNeRF采用一组姿势输入图像,同时学习形状和纹理的不同潜在嵌入,以及多层感知器的权重,通过加强多视图光度一致性来预测每个3D点的体积密度和视相关亮度
在推断过程中,给定一个看不见的物体的未摆姿参考图像,CodeNeRF优化形状和纹理代码以及相机姿势,并通过修改各自的潜在代码就可以显式编辑对象的形状和纹理
总结
不同于NeRF,CodeNeRF不是特定于场景的,可以在对象类中建模形状和外观的变化
不同于SRN,CodeNeRF分离了几何和外观,为合成任务提供了对形状和纹理的显式控制
同时,CodeNeRF在测试时不需要相机姿势的知识,通过优化来估计它
CodeNeRF与DeepSDF一样采用了自动解码器架构,但与之有很大的不同,因为只需要2D监督,可以在对象类别中分离出形状和纹理变化
实现流程
CodeNeRF通过潜在插值合成新形状或纹理来分离几何和外观。显示两个参考图像(左和右)。CodeNeRF首先估计这些图像的相机姿势和形状+纹理代码,然后在它们之间进行插值。
CodeNeRF通过学习形状和纹理的单独嵌入和一个完全连接的网络F(θ)来分离几何、外观和视点,该网络将3D位置和射线方向映射到密度和RGB值。
CodeNeRF架构。
γ
x
(
x
)
γ_x(x)
γx(x)和
γ
d
(
d
)
γ_d(d)
γd(d) 分别为三维点坐标和观测方向的位置编码。体积密度 σ 不依赖于纹理编码
z
t
z_t
zt
给定跨语义类描述 M 个对象的 N 个图像的训练集,以及它们各自的相机本征和位姿参数
V
=
I
i
,
K
i
,
T
i
i
N
=
1
V = {I_i, K_i, T_i}^N_i=1
V=Ii,Ki,TiiN=1, CodeNeRF联合学习封装了跨观察对象的几何和外观的多层感知器
F
Θ
F_Θ
FΘ 的权值,以及分别分离出形状和外观分离的潜在嵌入
{
z
s
j
,
z
t
j
}
j
=
1
M
∈
R
256
\{z_s^j, z_t^j\}^M_{j=1}∈R^{256}
{zsj,ztj}j=1M∈R256,
F
Θ
F_Θ
FΘ是一个解耦的神经辐射场,以形状和纹理代码为输入,将场景坐标 x 和观看方向 d 映射到相应的体积密度 σ 和RGB颜色值 c
对场景坐标 x 和观看方向 d 使用位置编码 γ(·) 来捕捉高频细节,用10个频率表示 x, 4 个频率表示 d,设计了解码器的结构,利用体积密度 σ 只依赖于3D点 x 和形状代码
z
s
z_s
zs ,而RGB颜色还依赖于观看方向 x 和纹理代码
z
t
z_t
zt,MLP的第一层
f
Θ
f_Θ
fΘ 将输入三维坐标 γ(x) 和形状代码
z
s
z_s
zs 映射到体积密度 σ 和中间特征向量 v ∈
R
256
R^{256}
R256,网络
F
Θ
t
F^t_Θ
FΘt的第二部分以 v 和
z
t
z_t
zt 为输入输出RGB颜色
借鉴SRN、DeepSDF,CodeNeRF采用了一种具有解耦形状和纹理嵌入空间的自动解码器架构,训练过程中,嵌入向量
{
z
s
j
,
z
t
j
}
j
=
1
M
\{z_s^j, z_t^j\}^M_{j=1}
{zsj,ztj}j=1M 与网络参数
F
Θ
F_Θ
FΘ 联合优化,不同于DeepSDF,形状和纹理嵌入可以只从图像端到端进行训练,不需要任何3D监督,不同于SRNs,形状和纹理嵌入是解耦的,可以用作编辑/合成的单独控件。
形状/纹理嵌入和解码器网络 F θ F_θ Fθ 共同充当学习先验,模拟跨语义类别的形状变形和纹理变化,一旦训练了模型,给定一个单一的输入图像,它就可以用于一个看不见的物体的一次重建,通过测试时间优化,估计相应的形状和纹理代码 { z s j , z t j } \{z_s^j, z_t^j\} {zsj,ztj},甚至相机姿势
体渲染部分与NeRF一致
Training CodeNeRF
对于训练集
V
=
{
I
i
,
K
i
,
T
i
}
i
=
1
N
V = \{I_i, K_i, T_i\}^N_{i=1}
V={Ii,Ki,Ti}i=1N 中的每个图像,在每次训练迭代中,使用内部参数和外部参数对一批4094条射线进行采样。然后, 沿着每条射线采样64个点,并将它们连同形状和纹理代码的当前估计一起发送到 MLP
F
Θ
F_Θ
FΘ。
F
Θ
F_Θ
FΘ提供了占用密度 σ 和 RGB 颜色 c,使用体渲染来沿着每条射线聚合颜色。训练使用光度损失和正则化损失作为潜在向量的先验(见公式(4))进行监督。用AdamW优化器训练模型,网络参数的初始学习率为1e-4,潜在向量的初始学习率为1e-3。
Inference Optimization
在推理时,给定一个看不见的物体的单一输入图像,训练过的模型可用于优化潜在向量,通过最小化渲染像素和观察像素之间的光度损失(Eq. 5,下面介绍),同时保持神经网络的权重固定。此外,CodeNeRF不需要已知的摄像机姿态,它的参数也可以与潜码联合优化。
Camera Pose Optimization
CodeNeRF使用相机到世界的转换矩阵将像素投影到3D射线中,需要已知的摄像机矩阵来训练模型,一旦学习了模型,在推理时,与其他方法不同,不需要已知的摄像机视点,通过获取输入点和射线方向上的梯度,以类似于可微渲染器的方式,与潜在嵌入向量联合优化旋转和平移参数,与其他物体类别的3D重建方法类似,假设一个简化的相机模型,其中世界坐标系以 3D 物体为中心,相机面对其原点,向上向量与z轴对齐。在这种情况下,R 和 t 可以通过方位角 φ、仰角 θ 和与相机的距离 ρ 来参数化,如图所示
相机视点参数化。在测试时,CodeNeRF与潜码共同优化摄像机姿态。
相机到世界的变换矩阵可以写成
T
c
w
=
(
R
T
p
0
1
)
T_{cw} = \left( \begin{matrix} R^T & p \\ 0 & 1 \ \end{matrix} \right)
Tcw=(RT0p1 )
p = (ρ cos θ cos φ, ρ cos θ sin φ, ρ sin θ)是摄像机的位置。在推理时,给定参考图像
I
i
I_i
Ii,摄像机位姿和采样射线
γ
i
γ_i
γi 可以用摄像机参数方位角(φ, θ, ρ)表示,并利用梯度进行优化。
Test time optimization
使用AdamW优化器将光度损失与形状和纹理代码以及相机参数(固定解码器参数Θ)联合最小化
用训练后的均值向量初始化潜伏向量,初始学习率为1e-2。摄像机参数的初始学习率分别为1e-2、1e-1和1e-1。
Enforcing disentanglement
为了说明良好的体系结构选择和解纠缠之间的联系,训练了两个可选模型(M1/M2)。在 M1 中,已知
γ
d
(
d
)
γ_d(d)
γd(d)与 3D 点位置
γ
x
(
x
)
γ_x(x)
γx(x)一起作为 KaTeX parse error: Double subscript at position 6: F^s_θ_̲s 第一层的输入(类似于PixelNeRF)。在M2中,
z
s
z_s
zs 和
z
t
z_t
zt 被给定为 KaTeX parse error: Double subscript at position 6: F^s_θ_̲s 的输入,这相当于使用单一的嵌入。然后执行纹理编辑,保持形状代码固定。下图显示了CodeNeRF如何完全消除形状和纹理的歧义。M1无法合成正确的纹理,而M2的形状发生了不必要的变化。