Spin-UP with IDE

好的,我将根据您的要求,将原先使用球面高斯(SG)表示环境光的部分替换为集成方向编码(Integrated Directional Encoding,IDE)。这主要影响到光初始化渲染过程相关的步骤。以下是修改后的全流程总结,包含具体实现过程和关键公式,以及如何在流程中集成您提供的IDE函数。


全流程总结(使用IDE表示环境光)

1. 数据采集

设置旋转平台和相机:

  • 准备一个可旋转的平台和固定的相机。
  • 将待拍摄的物体放置在平台中央,并确保相机对准物体。
  • 相机与物体之间的相对位置保持固定,同时物体旋转,使得物体在不同角度上接受环境光照。

旋转拍摄:

  • 启动平台旋转,通常进行360度旋转。
  • 在旋转过程中,以固定角度间隔(例如每旋转2度)捕捉物体的图像,最终获得一组多角度图像 {Ijj[1,...,NI]}\{I_j | j \in [1, ..., N_I]\}

2. 图像处理

图像预处理:

  • 对每个捕捉到的图像进行预处理,如去除噪声、校正颜色和畸变。
  • 确定每个图像中物体的边界,生成掩码以便于后续处理。

3. 数据预处理

深度图预测:

  • 使用多层感知器(MLP)根据每个像素的二维图像坐标预测其深度值,生成深度图 DD
  • 具体实现:
    • 输入:像素坐标 (x,y)(x, y)
    • 通过MLP输出对应的深度值 zz
      z=MLPD(x,y) z = \text{MLP}_D(x, y)
    • 组合形成深度图:
      D={zii[1,...,NP]} D = \{ z_{i} | i \in [1, ..., N_P] \}
      其中 NPN_P 为像素总数。

边界法线计算:

  • 根据物体在图像中的边界,计算每个边界像素的梯度:
    Bx=Bx,By=By \partial B_x = \frac{\partial B}{\partial x}, \quad \partial B_y = \frac{\partial B}{\partial y}
  • 使用梯度计算初始法线向量:
    nb=(Bx,By,1) n_b = (\partial B_x, \partial B_y, 1)
  • 为了提高法线精度,加入小偏移量 β\beta 进行修正并归一化:
    nb=normalize(Bx,By,1+β) n_b = \text{normalize}(\partial B_x, \partial B_y, 1 + \beta)
    其中,β\beta 通常取一个小值,如 0.01。

4. 渲染方程中的法线计算

选择相邻点:

  • 对于每个像素 pp,选择其周围的四个相邻点 p1,p2,p3,p4p_1, p_2, p_3, p_4,这些点的深度值分别为 z1,z2,z3,z4z_1, z_2, z_3, z_4

转换到相机坐标系:

  • 将这些像素点从图像坐标系转换到相机坐标系:
    pk=((xkcx)zkfx,(ykcy)zkfy,zk) p_k' = \left( \frac{(x_k - c_x) z_k}{f_x}, \frac{(y_k - c_y) z_k}{f_y}, z_k \right)
    其中:
    • (xk,yk)(x_k, y_k) 为图像坐标。
    • (cx,cy)(c_x, c_y) 为相机主点坐标。
    • fx,fyf_x, f_y 为相机焦距在x和y方向上的像素值。

法线计算:

  • 使用以下公式计算法线向量:
    n=k=14wk((pk+1p)×(pkp))k=14wk((pk+1p)×(pkp)) n = \frac{\sum_{k=1}^{4} w_k \cdot ( (p_{k+1}' - p') \times (p_k' - p') )}{\|\sum_{k=1}^{4} w_k \cdot ( (p_{k+1}' - p') \times (p_k' - p') )\|}
    其中:
    • wk=exp(pkp)w_k = \exp(-\|p_k' - p'\|),用于给予距离较近的点更高的权重。
    • pp' 为中心像素在相机坐标系中的位置。

5. 环境光建模与初始化(使用IDE)

5.1 集成方向编码(IDE)准备:

生成IDE函数:

  • 根据需要的球谐函数阶数 deg_view\text{deg\_view},生成用于环境光编码的IDE函数。
  • 实现:
    ide_fn = generate_ide_fn(deg_view)
    
    其中,deg_view 控制编码的细节程度,通常取值为 4 或 5。

5.2 边界信息获取:

  • 从预处理后的图像中提取边界像素的颜色信息 mbm_b 和对应的法线 nbn_b
  • 计算对应的入射方向 ωb\omega_b
    ωb=Rjnb \omega_b = R_j \cdot n_b
    其中,RjR_j 为第 jj 张图像对应的旋转矩阵。

5.3 环境光编码与初始化:

  • 对每个边界入射方向 ωb\omega_b 计算其IDE编码:
    IDEb=ide_fn(ωb,κinv) \text{IDE}_b = \text{ide\_fn}(\omega_b, \kappa_{\text{inv}})
    其中:
    • κinv\kappa_{\text{inv}} 为von Mises-Fisher分布的浓度参数的倒数,控制编码的分布宽度,一般取一个小值,如 0.1。
  • 通过最小二乘优化求解环境光系数 LL
    L=argminLbmb(IDEbL)2 L = \arg\min_L \sum_b \| m_b - (\text{IDE}_b \cdot L) \|^2
    • 这可以通过线性回归或梯度下降等优化方法求解。

5.4 环境光模型表示:

  • 最终的环境光模型表示为:
    E(ω)=ide_fn(ω,κinv)L E(\omega) = \text{ide\_fn}(\omega, \kappa_{\text{inv}}) \cdot L
    • 其中,LL 为环境光的系数向量,ω\omega 为任意方向。

6. 渲染与损失计算

6.1 反射方向计算:

  • 对于每个像素,计算其反射方向:
    ωr=2(nv)nv \omega_r = 2 (\mathbf{n} \cdot \mathbf{v}) \mathbf{n} - \mathbf{v}
    其中:
    • n\mathbf{n} 为表面法线。
    • v\mathbf{v} 为视线方向。

6.2 渲染颜色计算:

  • 对于每个像素,根据渲染方程计算其颜色值:
    C=ρdE(ωi)+ρsE(ωr) C = \rho_d \cdot E(\omega_i) + \rho_s \cdot E(\omega_r)
    其中:
    • ρd\rho_d 为漫反射系数(从材质MLP预测)。
    • ρs\rho_s 为镜面反射系数(从材质MLP预测)。
    • E(ω)E(\omega) 为对应方向的环境光辐照度。

6.3 损失函数计算:

  • 定义重建损失(如均方误差):
    Lrecon=i,jIi,jCi,j2 L_{\text{recon}} = \sum_{i,j} \| I_{i,j} - C_{i,j} \|^2
  • 可能的正则化项:
    • 法线平滑损失 LnormL_{\text{norm}}
    • 深度平滑损失 LdepthL_{\text{depth}}
    • 反射率平滑损失 LreflectL_{\text{reflect}}
  • 总损失:
    L=Lrecon+λ1Lnorm+λ2Ldepth+λ3Lreflect L = L_{\text{recon}} + \lambda_1 L_{\text{norm}} + \lambda_2 L_{\text{depth}} + \lambda_3 L_{\text{reflect}}
    • 其中,λ1,λ2,λ3\lambda_1, \lambda_2, \lambda_3 为权重超参数。

7. 训练策略

7.1 间隔采样(Interval Sampling,IS):

  • 将高分辨率图像划分为不重叠的块,每个块包含 NB×NBN_B \times N_B 像素点。
  • 从每个块中提取相同位置的像素点,生成低分辨率子图像,以减少计算开销并提高训练效率。
  • 在训练过程中,这些子图像在每个周期内随机采样,平滑正则项基于子图像的分辨率进行计算。

7.2 缩小范围计算(Shrinking Range Computing,SRC):

  • 在子图像分辨率下,使用全分辨率图像坐标系中的相邻点进行法线计算,以提高法线估计的精度。
  • 在训练的早期阶段,选择距离查询点较远的相邻点进行法线计算,以获得更平滑和稳定的法线图。
  • 在训练的后期,逐步选择距离查询点较近的相邻点,最终提高法线计算的精度。

7.3 迭代优化:

  • 使用梯度下降或其他优化算法,迭代更新深度、法线、反射率和环境光系数。
  • 在每个迭代中,根据当前估计的参数重新计算渲染颜色和损失,并更新参数。
  • 训练过程持续进行,直到损失收敛或达到预设的迭代次数。

8. 最终结果生成

8.1 法线图输出:

  • 从训练得到的法线预测中,生成最终的高精度法线图:
    Nfinal={nii[1,...,NP]} N_{\text{final}} = \{ n_i | i \in [1, ..., N_P] \}

8.2 深度图和反射率图输出:

  • 输出最终的深度图 DfinalD_{\text{final}} 和反射率图 ρfinal\rho_{\text{final}}

8.3 3D重建和渲染:

  • 利用生成的深度图和法线图,可以进行高质量的3D重建。
  • 使用反射率图和环境光模型,可以在新视角下对物体进行真实感渲染。

总结

通过将球面高斯(SG)替换为集成方向编码(IDE),我们在环境光表示上获得了更高的表达能力和计算效率。IDE能够更有效地捕捉环境光的方向信息,特别适用于复杂光照场景下的3D重建任务。在整个流程中,主要修改集中在环境光建模与初始化以及渲染与损失计算部分,其中使用IDE对环境光进行编码和优化,并在渲染过程中应用这些编码以生成逼真的图像合成。训练策略和最终结果生成步骤也相应地调整,以适应新的环境光表示方式。

IDE:

阅读refnerf、nero关于IDE推导的部分

IDE原理:refnerf

视角方向:从哪里看,相机的方向
反射方向:光线从表面反射的反向(固有属性)

IDE流程

IDE是一个对光线逆渲染的过程。
通过进入相机的光线(视角方向),对应物体上的一个点,光线和该点的法向量计算出一个反射方向。
用这个反射方向结合粗糙度,判断对应环境光中的一个可能的区域,通过积分,对环境光进行恢复

只转动RS1,normal不变,环境光变
只转动RS2,normal变,但环境光不变,只能恢复对应视角下的环境光
解决方案:

  1. 均匀转动RS1,每个RS1的位置,转动几次RS2,获取几张图片
  2. 同时转动RS1、RS2

对于该系统,有:
RS1转等价于相机转等价于环境光转,此时需要乘以旋转矩阵R
RS2转等价于物体转,此时不需要乘以旋转矩阵,直接通过normal映射回环境光的对应位置

方案1:
IDE(l,σ)
for 转动 RS1:IDE(Rl,σ)
for 转动 RS2

方案2:

我的想法:
NeRO设定:绕着物体从下到上旋转拍摄128张图片,物体相对于环境光不变。可以拍摄到从下到上多个水平角度的图片,恢复的形状更完整
ours:使用旋转平台,只有水平视角,但是增加了物体自转,减少了base color和环境光的耦合

如果在NeRO上直接加物体自转,是否效果能达到最好?

赞赏