0、摘要
现有的基于学习的3D表面预测解决方案无法进行端到端训练,因为它们在中间表示(例如, TSDF)上操作,在后处理步骤(例如,通过移动立方体算法)中必须从中提取3D表面网格。在本文中,我们研究了端到端的三维表面预测问题。我们首先证明了Marching Cubes算法是不可微的,并提出了一种替代的可微公式,将其作为最终层插入到3D卷积神经网络中。我们进一步提出了一组损失函数,允许用稀疏点监督训练我们的模型。我们的实验表明,该模型可以预测任意拓扑结构的亚体素精确三维形状。此外,即使在存在稀疏和不完整的基本事实的情况下,它也学会了完成形状并将物体的内部和外部分离。我们的模型是灵活的,可以与多种形状编码器和形状推断技术相结合
main contribution
- 我们证明了Marching Cubes对于拓扑变化是不可微的,并提出了一个可微的改进表示。
- 我们提出了一个端到端曲面预测模型,并推导了合适的几何损失函数。我们的模型可以从非结构化点云中训练,并且不需要明确的表面GT。
- 我们提出了一种新的损失函数,它允许在学习稀疏的非结构化3D数据时将物体的内部与外部分离。
1、Marching Cubes
主要是两步:
- 估计拓扑(即估计体积网格中每个单元格中三角形的数量和连通性)
- 预测三角形的顶点位置,确定几何形状。
1.1 详细算法过程
- 假设有N^3的符号距离场signed distance field(sdf)。每个格点记录了它到表面的符号距离d(比如格点在物体里面,d>0; 在外面,d<0)。每个小立方体(cell)有8个角落格点(cornor)。通过对所有单元格迭代( ‘marching’),并在检测到相邻格点符号变化时插入三角形面。
- 通过线性插值计算顶点w(vertex)的位置x,我们假设:
x=0, if w=v
x=1, if w=v’
d和d’表示在格点v和v’的符号距离,那么给定位置x的符号距离f(x)=d+x(d’-d)
令f(x)=0,即得到表面的顶点w的位置x=d/(d-d’)
1.2 无法使用marching cubes算法构建神经网络
给定MC算法,我们可以构建一个深度神经网络进行端到端的表面预测吗?我们可以尝试构造一个深度神经网络,它预测一个有符号的距离场,它被转换为一个三角形网格使用MC。然后我们可以通过MC层和神经网络将该表面与GT表面或点云进行比较并反向传播误差。答案是不可以。
原因:marching cubes算法不可微
- x=d/(d-d’)在d=d’时,会导致分母为0,产生异常。
- 其次,观测点只影响其附近的网格cell,即它们只作用于表面经过的cell。因此,梯度不会传播到离预测表面更远的cell。
解决办法:
不是让网络预测符号距离值,而是预测每个格点的占用概率probability of occupancy(比如格点在物体里面,o=1; 在外面,o=0)
通过线性插值计算顶点w(vertex)的位置x,我们假设:
x=0, if w=v
x=1, if w=v’
d和d’表示在格点v和v’的符号距离,那么给定位置x的符号距离f(x)=d+x(d’-d)
令f(x)=0,即得到表面的顶点w的位置x=d/(d-d’)
2、Differentiable Marching Cubes
2.1 Differentiable Marching Cubes Layer (DMCL)数学定义
网络预测的On是伯努利分布的参数,pn(t)表示体素格占用的概率。注意t取值0或1的离散值,而on取值[0,1]的实数域。
那其实,
pn(t)=on , if t=1
pn(t)=1-on, if t=0
2.1.1 立方格n其拓扑结构为T的概率:由8个格点的占用概率决定
参考文章:https://hideoninternet.github.io/2020/01/06/a18afe7a/
作者有一点很好的地方,就是假设点的概率值符合伯努利分布,这样就可以得到一个cube关于所有拓扑结构的所有概率值,计算loss的时候,是用所有的拓扑结构共享同一个vertex displacement来得到误差。这种对所有情况都预测一个概率值当做权重的思想比较常见(例:pixel2mesh++, CMR)
2.1.2 确定顶点的位移
由2.1.1确定了所有256种拓扑结构的概率,比如选其中概率最大的作为该立方体格cell的拓扑结构,比如就下图这种,那么我们只需要确定这个面4个顶点的具体位置,就可以最终确定这个面的形状。我们令网络预测一个张量X∈[0,1]NxNxNx3,令xn∈[ 0 , 1]3表示X的第n '个元素,表示与xn相关的三角形顶点沿边的位移.请注意,xn是一个三维矢量,因为我们需要为三维空间的每个维度指定一个顶点位移。
2.2 网络结构
- 点特征提取(Point feature extraction ):采用的是PointNet++的变体,全连接层对每个点提取局部特征
- 网格池化(Grid pooling): 对落在同一个voxel的所有点归为一类并进行池化,(比如最大池化?)
- 得到一个NxNxNx16的三维体素格结构,使用3D-CNN
- 使用跳连接(skip connections)保持细节
- 解码端分为两分支,一个用来预测占用概率O,一个用来预测点的位移场X。
- 一个立方体格有8个顶点,拓扑结构有2^8=256种,作者只考虑了140种单连接面(single connected topologies)的情况。
2.3 Loss 函数
1. Point to Mesh Loss
2. Occupancy Loss
3. Smoothness Loss
4. Curvature Loss
3、实验结果
4、结论
我们提出了一个学习3D网格预测的灵活框架。我们证明了端到端的训练表面预测任务会导致更准确和完整的重建。此外,我们表明,在Ground Truth 3D模型不完整的情况下,基于表面的监督结果会得到更好的预测。在未来的工作中,我们计划使用八叉树技术使我们的方法适应更高分辨率的输出,并将我们的方法与其他输入模式集成。