CVPR2021文章理解1-Neural Geometric Level of Detail: Real-time Rendering with Implicit 3D Shapes


在这里插入图片描述

该文章仅为个人学习理解,如有理解不到位的地方请谅解。
文章地址:https://arxiv.org/abs/2101.10994
代码地址:https://github.com/nv-tlabs/nglod
文章主页:https://nv-tlabs.github.io/nglod/

主要工作

针对SDF重建三维物体存在计算量大的问题,无法实现实时的效果,该文章实现了一种高质量且实时的SDF渲染。使用基于八叉树的特征体来表示隐式的曲面,它能够自适应多个细节的形状。比DeepSDF快100倍左右,比NeRF快500倍,NSVF快50倍。下图为渲染的例子。
图片来源于原论文

具体方法

总体实现实施的细节重建。
总体结构图如下
图片来源于原论文

Neural Signed Distance Functions (SDFs)

SDF直译为有符号的距离,它是一种映射,对于每一个查询点(物体所在空间中的采样点),对应的SDF值(距离)为距离最近表面的距离,而符号则代表,该点位于物体的内部则为“-”,位于物体的外部则为“+”,因此,重建物体的表面其实就是找到0值所在的位置即为物体的表面。
在这里插入图片描述

对于网络来讲,网络训练的目的是对于每一个查询点去估计它的SDF值,与真实的SDF值进行Loss约束优化训练。为了使网络适应不同的形状,通常会输入一个Z值作为隐变量去控制形状。
但是其在渲染时会出现一定的问题,一般渲染SDF使用的是光线追踪算法,这种算法需在每条光线上进行上百次距离查询,使得网络非常大并且查询速度很慢。使用小的网络会导致重建的分辨率不够。所以认为固定大小的网络不能适应高度复杂的形状,同时对于一些不需要细节的物体也不适应,会造成资源的浪费。因此,该文章设计了针对不同细节的重建设计。

Neural Geometric Levels of Detail

使用DeepSDF的思想,进行了改进,DeepSDF将形状编码为了一个单一的隐变量z,但是该文章使用了一个特征体素Z去表达特征向量。
具体来说,将Z存储在一个离散的体素树中(SVO),在每个体素的八个顶点都有一个可学习的特征向量,该特征向量被相邻的特征向量所共享。并且只有当体素包含表面时,这个体素才有值,使得整个SVO是离散的。
这里八叉树的知识可参考我的另一篇博客:
https://blog.csdn.net/cgsmalcloud/article/details/114818757
每个等级L的SVO定义了一个LOD,随着在SVO中树的深度逐渐增加,表面将更加的细化,内存占用和重建的质量是成正比的。最后增加了小的从1:L的MLP网络去对应每个LOD解码。
对于每个LOD,为了去计算查询点的SDF值,遍历整个L水平的树,找到包含查询点X的对应多个水平的体素。对于每个等级体素进行三线性插值,找到每个对应等级的特征向量,最后进行所有特征的求和,最后解码出SDF的值。这里结合上面的总体结构图很好理解。
虽然方法中对于每个等级的LOD是离散的,但是可以通过插值的方法实现连续的LOD,使用双线性插值就可实现,这种混合方式只适用于SDF,不适用于mesh和点云。
在这里插入图片描述

网络的训练

使用级联训练每个LOD来保证每个等级的SVO均能得到有效的表示。
在这里插入图片描述

渲染

使用球追踪来实现渲染,但该文章的SVO SDF仅定义和表面相交的体素,所以要正确处理无值的体素的距离。
一种方式是使用等步长的光线追踪,但是不能保证收敛因为步长可能过大。
该文章采用另一种方式,在每个帧的开头,使用RAY-SVO去检索每个分辨率下和光线相交的体素。使用Vr去表示相交体素的有序深度集合,在Vr中的每个体素包含相交体素的索引,体素的位置,父节点体素,指向八角特征向量的指针。特征向量存成一维数组,通过指针去找对应的特征以减少内存。
###使用自适应的步进
给定一个K次迭代的球追踪的光线,在该等级的LOD中去检索发生碰撞的第一个体素。
如果此时光线推进所处位置不属于相交的第一个体素,那么就将光线推进到相交点,如果查询点属于相交的第一个体素,那么就去查询对应的特征体素。然后递归的检索所有相对应不同细节等级(1:L)的父体素,然后对每个节点的特征向量进行求和。最后多层感知机编码出一个离最近表面的距离去作为步长。
在这里插入图片描述
如果新的Xk+1在空的空间中,那么就直接跳到沿着光线的下一个相交体素,如果不存在下一个相交体素,那么直接忽略该光线。如果他在体素之中,使用光线追踪算法,直到光线消失或者达到物体的表面。这种方式可以在离散的空间中实现自适应的步进,存储量小。
在这里插入图片描述

Sparse Ray-Octree Intersection

光线八叉树相交算法,利用breadth-first traversal strategy and parallel scan kernels
算法流程:
在这里插入图片描述
首先生成一个光线集,将他们存储在射线和体素成对的数组中,表示射线和体素相交的含义。然后用根节点(八叉树的最顶级的体素)去初始化每个数组元素。接下来从0-l去分别迭代八叉树的各个级别,每次迭代中,确定每个射线和体素对中是否相交,产生一个决策列表,其中D=1表示光线和体素相交,D=0则表示两者不相交,然后使用EXCLUSIVESUM去计算列表中的排斥和(异或,相同为0,不同为1),去进行下一步运算。如果还未到达最高等级的LOD,那么使用SUBDIVIDE去用光线相交的下一个子体素去填充下一个列表,并继续迭代。否则,使用Compactify去消除所有没有产生相交的N。最终算法的结果是一个为每个层次的八叉树产生的紧凑的,深度有序的一个光线体素相交列表。同时,通过分析光线的原点位于体素内部空间的位置,可以对子体素进行排序,这样射线和体素对N将根据到光线原点的距离进行排序。

LOD的选择

用户选择
#实验的结果
在这里插入图片描述
在这里插入图片描述

注:图片均来源于原论文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值