文章目录
背景知识
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. MVSNet流程
对于多个视角的图像集合 { I i } i = 1 N \{I_i\}^N_{i=1} {
Ii}i=1N,我们使用卷积神经网络提取出特征图 { F i } i = 1 N \{F_i\}^N_{i=1} {
Fi}i=1N。而后将特征图利用单应性变换转到相机视锥的不同深度上形成 { V i } i = 1 N \{V_i\}_{i=1}^N {
Vi}i=1N,对于每个 V i V_i Vi其在不同深度d上用 V i ( d ) V_i(d) Vi(d)表示,而后求 { V i } \{V_i\} {
Vi}的方差矩阵 C \mathbb{C} C。 C \mathbb{C} C其实就是一个粗糙的cost volumn,我们还需要进一步改良。我们利用一个不同规模的3D CNN来实现对cost volumn的正则化,这一过程的目的就是把 C \mathbb{C} C转化为概率矩阵 P \mathbb{P} P,在最后一个卷积层会输出一个单通道的volumn(V,H,W),我们沿着深度的方向使用softmax来实现概率图 P \mathbb{P} P的归一化。利用概率图计算出像素点的预测深度,计算loss并反向传播。
具体讲解可以参考【论文精读1】MVSNet架构各组件详解,对于比较抽象的矩阵转换写的很形象。
1. MVSNeRF: Fast Generalizable Radiance Field Reconstruction from Multi-View Stereo
MVSNeRF: Fast Generalizable Radiance Field Reconstruction from Multi-View Stereo 论文地址
针对问题:以往的三维重建大多需要非常多的多视角图像才能有效
解决方案:借鉴MVSNet的设计思路,利用三张照片即可实现对场景的重建
- MVSNerf的过程和MVSNet比较相似。对于初始的图像集合 { I i } i = 1 N \{I_i\}_{i=1}^N {
Ii}i=1N,我们用一个down-sampling卷积神经网络提取特征图:
F i = T ( I i ) F_i=T(I_i) Fi=T(Ii) 然后我们把特征图转换到参考视角的不同深度对应的平面上去:
H i ( d ) = K i ⋅ ( R i ⋅ R i T + ( t 1 − t i ) ⋅ n 1 T d ) ⋅ K i T H_i(d)=K_i\cdot(R_i\cdot R_i^{T}+\frac{(t_1-t_i)\cdot n_1^T}{d})\cdot K_i^T Hi(d)=Ki⋅(Ri⋅RiT+d(t1−ti)⋅n1T)⋅KiT
H i ( d ) H_i(d) Hi(d)表示的是从视角i转换到参考视角的不同深度的转换矩阵,1是指参考视角, n 1 n_1 n1表示的就是参考视角的法向。有了以上的转换,我们可以把每一个特征图上的点转换到参考视角的相应深度上:
F i , d ( u , v ) = F i ( H i ( z ) ⋅ [ u , v , 1 ] T ) F_{i,d}(u,v)=F_i(H_i(z)\cdot [u,v,1]^T) Fi,d(u,v)=Fi(Hi(z)⋅[u,v,1]T)
其中 F i , d F_{i,d} Fi,d表示的是经过变换后的在参考视角深度d处的特征图。 - 进一步我们构建cost column P,构建的方法和MVSNet中基本相同:
P ( u , v , d ) = V a r ( F i , d ( u , v ) ) P(u,v,d)=Var(F_{i,d}(u,v)) P(u,v,d)=Var(Fi,d(u,v)) 注意这里计算方差是计算M个视角的同一深度同一个位置的方差。
接下来的部分和MVSNet就有所差别,包括之前其他的MVS方法大多是直接从cost column中获得概率图,而本文则训练了一个3D
CNN B B B来把特征图转化为一个 C C C通道的神经特征volumn S S S: S = B ( P ) S=B(P) S=B(P) - 经过上面的过程,我们基本建立起了对场景的模型。我们只需要知道每个点的信息就可以开始渲染了。文中采用了一个MLP来获取相应的信息:
σ , r = A ( x , d , f , c ) \sigma,r=A(x,d,f,c) σ,r=A(x,d,f,c) 其中x为三维坐标,d为观察方向,f=S(x)为神经特征,c为x对应原图像中点的颜色。 - 最后的volumn rendering和优化和其他论文基本一致。