Tetra-NeRF

这是一个对体素点云进行nerf重建的方法,对使用纹理渲染后的点云地图的补全和照片级重建很有参考价值。
文章提出使用基于四面体的自适应表示Delaunay表示来代替均匀细分或基于点的场景表示。
下面大概是引言部分:先是一开始得nerf是怎么做的,有什么问题,一些方法怎么解决的,有什么问题,最后Te怎么解决的。贡献:1、输入为点云,2、与point-nerf比较、3、开源了代码。
Tetra-NeRF_第1张图片
作者是如何使用Delaunay triangulation 代替 用于体渲染和神经渲染的体素?

准备工作

NERF 两个部分 1、隐式函数F (x, d),返回d方向上3D点x的颜色和体密度。2、体渲染用来合成新视角

体渲染:对于虚拟视图中的每个像素,我们将来自相机平面的光线投影到场景中,并对辐射场进行采样,以获得沿光线距离ti处的颜色和密度值ci和σi,然后组合各个样本以预测像素的颜色C:公式如下
Tetra-NeRF_第2张图片
在这里插入图片描述

体渲染推导

假设每束光只受其发射方向附近粒子(注意这里的粒子就是nerf中某一投影点的周围点)的影响,如图1
Tetra-NeRF_第3张图片
光束从发射到输出,其受影响范围构成了一个圆柱体。这个圆柱体长度的起始位置长度为0,圆柱体中间某位置设为s,s到起始位置的距离(长度)为ds。如图
Tetra-NeRF_第4张图片
在这个过程中,一束光会遇到四种情况而影响光的强度:1、被粒子吸收了(-);2、被发光粒子增强了-放射(+);3、被粒子弹开(-);4、合并了被其他粒子弹开的光(+);

情况1-吸收

先看图示
Tetra-NeRF_第5张图片
粒子截面面积为A,圆柱的底面面积为E,粒子在s处的密度为p(s),当ds足够小(位置0很接近位置s),即粒子之间不会重叠,此时在ds这个厚度下,圆柱体积为Eds,粒子总数为p(s)Eds,遮挡面积就是p(s)EdsA。也就是在面积为E的面上,有p(s)EdsA的区域是被挡住的。那么在s处光被拦下的概率就是p(s)EdsA / E(注意整个圆柱体有无穷多个s处),再扩展开来就是,很多个光束覆盖了这个面,当光束出来后光强变化了,变化量为dI(因为是变小,所以是个负值), 假设s处的光强为I(s),I(s)乘以遮挡概率就得到变化量,dI = -(p(s)Eds*A / E)*I(s) --> dI/ds = p(s)AI(s) --> (1/I(s))*dI = p(s)Ads ,其中在这里插入图片描述
求积分 得整个圆柱体衰减比例
在这里插入图片描述
这就是比尔-朗伯吸收定律 (Beer-Lambert law):如果介质 (粒子群) 是均匀的,即(p(s)*A )处处相等,那么入射光在经过介质 (粒子群) 后,辐射强度会呈指数衰减。
透射比:
在这里插入图片描述
在这里插入图片描述也被称为光学厚度optical depth

情况2-放射

每个粒子都会发光,粒子总数为p(s)Eds,发光面为p(s)EdsA,单位面积光强为Ie,总强度为Iep(s)EdsA,在s处整个E面发出得单位面积平均强度Iep(s)EdsA / E = Iep(s)dsA = dI
在这里插入图片描述

情况3-外散射(弹开)

粒子除了吸收光子,也可能会弹射光子,这个过程称为外散射,即光子被弹射出原本的光路,导致光线强度减弱。同吸收一样,外散射对光线的「削弱」程度,也跟光学厚度相关,不过过程相对吸收来说又复杂一些。光学厚度更复杂。

情况4-内散射(合并)

光子可以被弹射走,自然就有其他光路的光子被弹射到当前光路,这一过程就是内散射。
内散射的过程比外散射又更加复杂,因为弹射到当前光路的光子可能来自多条不同的光路,因此需要综合考虑其他光路的辐射强度以及各种弹射角度。
在这里插入图片描述
体渲染方程:
在这里插入图片描述
吸收和外散射都会削弱光线的辐射强度,并且由于它们都和入射光有关,因此它们共同构成了体渲染中的衰减项 (attenuation item),而粒子发光和内散射都来自独立的光源,因此被称为源项 (source item)
合并衰减项(前两项)得:
在这里插入图片描述
在这里插入图片描述
记后两项为g(s): dI/ds = -┏(s)I(s) + g(s) 再记g(s) = ┏(s)c(s) 先提一下后面推导时将s替换成t

dI/ds + ┏(s)I(s) = g(s)
两边同乘在这里插入图片描述
在这里插入图片描述
这里巧用(z(t)exp(y(t)))求导特点
在这里插入图片描述
求积分得:
在这里插入图片描述
Tetra-NeRF_第6张图片
其中等式右侧第一项代表着从坐标0点出发经过0-D的介质入射到摄像机D的光强,称之为背景光,在NeRF中考虑为0。所以在NeRF中,这个式子化简为:
在这里插入图片描述
但是NeRF中的坐标,是让相机在坐标原点也就是0点,无穷远就是无穷远。因此上述公式
在这里插入图片描述
在这里插入图片描述
也就是说,从相机的视线出发,情况1的光强会由弱变强,情况2的光强会由强变弱
重新推导一次:
Tetra-NeRF_第7张图片
在这里插入图片描述
介质是有边界的:0到∞中不是处处有介质,可以定义近平面和远平面tn,tf。
在这里插入图片描述
在这里插入图片描述(这样写是为了表示后面的体密度吧)
在这里插入图片描述
现在让射线动起来
*(是为了后面表示相机的运动吧)**,这个r(t)表示动态射线。
在这里插入图片描述第一项是发射点,第二项是距离乘以方向向量表示一个距离矢量吧。积分符号 透射比 介质密度 光强
在这里插入图片描述
研究的是r这条射线上的光,射线也是个变量,用C替换掉光强I (为了表示后面的颜色吧)
在这里插入图片描述
将上式离散化,将近远平面区间等分成N份,在每份小区间内取样
在这里插入图片描述
在这里使用了等价的无穷小在这里插入图片描述来替换
在这里插入图片描述
Tetra-NeRF_第8张图片至此就得到了论文中的预测的色彩值,在计算与每条射线相关联的预测颜色和地面实况颜色之间的均方误差(MSE)之后,将梯度反向传播到辐射场。怎么实现的?

基于体素的特征场

对输入的体素数据,为每个体素网格的网格点分配一个可训练向量,每个体素关联八个特征向量,而且这些向量会与相邻体素进行共享。对于每一个沿着射线采样的查询点,其相应的体素会被先找到,基于查询点的位置,通过体素点特征的四线性插值法获得每个查询点的特征。之后将特征向量通过第一个MLP获得点密度和表面向量,再将表面向量与射线方向结合通过第二个MLP获得视角依赖的颜色
Tetra-NeRF_第9张图片

四面体场

一句话:给出一个3D空间的点集,通过三角化构建四面体。
德劳内三角剖分:它将给定的点集进行连线,生成由无重叠三角形组成的网格,使得该网格最大化所有三角形的最小角度,并且每个三角形都能够被内接圆唯一包含。Delaunay 三角剖分具有良好的性质,如不会出现锐角三角形、仅有 O(n log n) 个三角形等,因此在计算机图形学、计算机辅助设计等领域得到了广泛应用
Tetra-NeRF_第10张图片
这个点云是COLMAP给出的。
用可训练的向量将四面体所有的顶点关联起来。顶点也是与邻近的四面体所共享,对每个查询点,首先找到包含该点的四面体,使用重心插值–为什么,优势在哪从四面体顶点处存储的四个特征向量计算查询点的特征向量。
Tetra-NeRF_第11张图片
我们计算查询点x的重心坐标λ,其将点的3D坐标表示为四面体顶点的3D坐标的唯一加权组合。
在这里插入图片描述
相同的权重λ可以应用于顶点的特征向量,以获得查询特征 有什么用。
插值特征(质心插值法)输入到一个小MLP(三层)中以预测查询点的密度和颜色(表面向量);然后将表面向量与用傅里叶特征编码的射线方向连接起来,将这个结果通过一个线程层以获得原始的RGB色彩;最后,使用softplus activation function Y = log(1 + eX) 将由神经网络返回的原始密度值映射到体渲染需要的体密度,使用sigmod函数在这里插入图片描述用于投影RGB颜色。

高效的四面体查询

通过哈希化 可以高效确定给定查询点相应的体素。但是四面体就更为复杂一些。文章不考虑孤立点只考虑射线上的点,计算与射线相交的四面体,使能够穿过四面体,而不是逐个计算,使用加速结构进行快速射线三角形相交计算可以有效地找到相关的四面体(NVidia’s OptiX library):1、计算来自仿真视角射线与四面体面的相交;2、每条射线,使用前512个相交三角形,并确定相应的四面体;3、沿着射线对四面体进行排序,能够很容易的确定哪个四面体能够用于给定的查询点。
另一个好处:可以简化质心坐标系的计算。1、计算每个相交的三角形2D质心,2、然后,我们通过简单地为与三角形相对的顶点加零,获得关于关联四面体的3D重心坐标。对于四面体内的查询点,我们可以通过在射线和四面体的两个交点的重心坐标之间进行线性插值来计算其四面体重心坐标。

粗采样和细采样

与NeRF(NeRF: Representing scenes as neural radiance fields for view synthesis)不同,我们将采样限制在四面体占据的空间内
1、沿射线均匀取样:粗级采用分层均匀抽样。将射线划分为均匀长度间隔,对每个间隔进行均匀采样,
2、使用来自粗略采样阶段的密度权重,如下 将采样偏向于更接近潜在表面的采样
在这里插入图片描述
后面一项没看懂–:这些权重是方程1中用作颜色乘数的系数 那不就是透射比*介质密度 和这个公式不符
通过对上面权重进行归一化(NeRF: Representing scenes as neural radiance fields for view synthesis)获得wi,使用权重wi对一组精细样本进行采样。
为了渲染最终的颜色,我们将密集和精细的样本合并,并在渲染方程(TensoRF: Tensorial radiance fields.)中使用所有样本。

后面是实验部分。对大场景的效果不行,如下:
Tetra-NeRF_第12张图片
这个问题可以通过增加访问四面体数量的限制来解决,代价是更高的内存需求和运行时间。或者,从更粗糙的四面体化开始并修剪空间的粗糙tofine方案可能会处理这个问题。

接下来就是跑他们代码,看看效果了,这种离线式渲染怎么样?

你可能感兴趣的:(人工智能,算法,学习)