背景知识

1. Nerf主要步骤

在这里插入图片描述

  • 首先输入多个视角的 2D 图像,转为三维坐标。

  • nerf的核心思想是用一个MLP来学习一个5D映射函数:
    ( x , y , z , θ , ϕ ) → ( c , σ ) (x,y,z,\theta,\phi)\rightarrow(c,\sigma) (x,y,z,θ,ϕ)(c,σ)
    其中 x , y , z x,y,z x,y,z是点在三维空间中的坐标, θ , ϕ \theta,\phi θ,ϕ是相机的观察方向, c c c是RGB颜色, σ \sigma σ是体积密度。

  • 进而在渲染图像时,采用公式: C ( r ) = ∫ t n t f T ( t ) σ ( t ) c ( t ) d t , T ( t ) = exp ⁡ ( − ∫ t n t σ ( s ) d s ) C(r) = \int_{t_n}^{t_f} T(t) \sigma(t) c(t) dt,T(t) = \exp \left(- \int_{t_n}^{t} \sigma(s) ds \right) C(r)=tntfT(t)σ(t)c(t)dt,T(t)=exp(tntσ(s)ds)

  • 反向传播更新 MLP 参数

2. 点云

其实点云是某个坐标系下的点的数据集。点包含了丰富的信息,包括三维坐标 X,Y,Z、颜色、分类值、强度值、时间等等。

1. Point-NeRF: Point-based Neural Radiance Fields

Point-NeRF: Point-based Neural Radiance Fields 论文网址在这里插入图片描述针对问题:Nerf的速度非常慢
解决方案:利用带有相关神经特征的3D点云,综合神经网络混合MVS的优势

  • 首先使用MVS算法,利用基于cost-volumn的3D CNN生成点云。给定一组图像 { I i } \{I_i\} {Ii}和对应的相机视角 { ϕ i } \{\phi_i\} {ϕi},我们使用MVSNet-based网络 G p , γ G_{p,\gamma} Gp,γ来生成点的位置和置信度:
    ( p i , γ i ) = G p , γ ( I 1 , ϕ 1 , I 2 , ϕ 2 , . . . I m , ϕ m ) (p_i,\gamma_i)=G_{p,\gamma}(I_1,\phi_1,I_2,\phi_2,...I_m,\phi_m) (pi,γi)=Gp,γ(I1,ϕ1,I2,ϕ2,...Im,ϕm)

  • 接着用2D CNN来生成特征 f f f:
    { f i } = G f ( I q ) \{f_i\}=G_f(I_q) {fi}=Gf(Iq)
    在这里插入图片描述

  • 我们用 P i = { ( p i , f i , γ i ) ∣ i = 1 , 2 , . . . , N } P_i=\{(p_i,f_i,\gamma_i)|i=1,2,...,N\} Pi={(pi,fi,γi)i=1,2,...,N}来表示点i,其中 p i , f i , γ i p_i,f_i,\gamma_i pi,fi,γi分别表示位置,神经特征向量,置信度(取值[-1,1],描述该点位于真实场景表面附近的可能性)。
    对于任何我们想知道的位置 x x x和观察视角 d d d,我们选择它半径 R R R内的 K K K近邻的点:
    ( c , σ ) = P o i n t − N e r f ( x , d , p 1 , f 1 , γ 1 , . . . , p k , f k , γ k ) (c,\sigma)=Point-Nerf(x,d,p_1,f_1,\gamma_1,...,p_k,f_k,\gamma_k) (c,σ)=PointNerf(x,d,p1,f1,γ1,...,pk,fk,γk)

  • 这样建好的点云还比较粗糙,可能存在holes或outliers降低了渲染的质量。一方面我们去除(prun)置信度 γ \gamma γ过低的点,因为这说明这些点在真实空间中应该在空白处;另一方面,我们利用每条光线的着色位置 x j x_j xj进行光线步进,以识别新的候选点。特别地,我们识别光线中具有最高不透明度的位置 x j g x_{jg} xjg
    α j = 1 − exp ⁡ ( − σ j Δ j ) , j g = arg ⁡ max ⁡ j α j . \alpha_j = 1 - \exp(-\sigma_j \Delta_j), \quad j_g = \arg\max_j \alpha_j. αj=1exp(σjΔj),jg=argjmaxαj.我们计算 ϵ j g \epsilon_{j_g} ϵjg 作为 x j g x_{j_g} xjg 到其最近神经点的距离。对于一条步进光线,我们在 x j g x_{jg} xjg 处增加一个神经点,如果 α j g > T o p a c i t y \alpha_{j_g} > T_{opacity} αjg>Topacity 并且 ϵ j g > T d i s t \epsilon_{j_g} > T_{dist} ϵjg>Tdist。这意味着该位置靠近表面,但远离其他神经点。这时候我们就在这个位置增加一个点(grow)。

  • 接着进行volumn rendering,这个和之前的基本一样,不说了。

  • 计算rendering loss,反向传播进行优化。

2. Neural Points: Point Cloud Representation with Neural Fields

Neural Points: Point Cloud Representation with Neural Fields 论文地址
在这里插入图片描述
针对问题:以往的点云一般只包含位置信息,要实现更高的分辨率表示需要使用upsample的方法,但是也只是离散表示到离散表示。
解决方案:采用表达场景更加高效的神经点云,实现了对空间的连续表达,便于优化和精细结构描述。

  • 在给定初始点云后,我们要建立相应的神经点云,我们把点 { x i } \{x_i\} {xi}作为中心建立相互重叠的片 { P i } \{P_i\} {Pi},这个三维片P要和二维图像信息的相应区域D内同质,应该有一个双射将这二者相对应:
    ϕ i : D → P i , ψ i : R 3 → D , w h e r e : ϕ ∣ p i = ψ − 1 \phi_i:D\rightarrow P_i,\psi_i:\mathbb{R}^3\rightarrow D,where:\phi|_{p_i}=\psi^{-1} ϕi:DPi,ψi:R3D,where:ϕpi=ψ1
    在这里插入图片描述

  • 现在的片还不是一个整体,我们要把它们合成一个整体。对于每个三维空间的点我们要把它们拉到物体表面上去。我们找到与它临近的中心点,把这些点的索引放在 N ( x ) N(\mathbb{x}) N(x)中,进而我们计算出不同点贡献的权重:
    w k = e − α ∣ ∣ x − x k ∣ ∣ 2 , k ∈ N ( x ) w_k=e^{-\alpha||x-x_k||^2},k\in N(x) wk=eα∣∣xxk2,kN(x)进而计算出被拉动后的点的新位置:
    ρ ( x ) = ∑ k ∈ N ( x ) ( w k ⋅ ϕ k ∘ ψ k ( x ) ) ∑ k ∈ N ( x ) w k \rho(x)=\frac{\sum_{k\in N(x)} (w_k\cdot\phi_k\circ\psi_k(x))}{\sum_{k\in N(x)} w_k} ρ(x)=kN(x)wkkN(x)(wkϕkψk(x))法向量也可以计算,需要请查看论文。

  • 为了实现任意分辨率的识别,我们还需要继续采样来增加点到要求的分辨率。文中采用的方法是所有的k个中心点在2D空间内均匀采样R个点然后映射到3D空间中,在这kR个点中等可能得选择J个点,然后用我们上一部分提到的方法将这些点拉到神经点云表面上的点 ρ ( x ) \rho(x) ρ(x)处。

  • 计算loss,比较特别的是该loss为形状误差,点法向,积分质量加权和。

刚开始学习三维重建,如果有错误请大家不吝赐教,谢谢[手动合十]!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐