L-BFGS算法在点云网格重建中的应用

在上一篇博客(https://blog.csdn.net/aliexken/article/details/108020050)中,我们已经介绍了L-BFGS算法的由来与功能,在这一篇中,我们来用一个点云重建工作的实例来具体说明L-BFGS算法是如何解决实际优化问题的。

1. 问题描述

在之前的工作中,我们已经描述过利用CVT算法实现点云网格重建,即基于Centroidal Voronoi Tessellation (CVT)算法的点云三角网格化方法,https://blog.csdn.net/aliexken/article/details/106746560。但是,基于CVT方法的重建,优化时间开销较大。我们需要找到一种效率更高,优化速度更快的方法。这里,我们介绍一种基于粒子间能量优化的方法 [Zhong2019]。该方法利用L-BFGS算法来对粒子间能量进行优化,并最终使得粒子间达到一种能量平衡。如果将点云中的每个点对应一个粒子,那么粒子能量平衡,即是对点云距离场的优化结果,对应isotropic sampling。基于该结果能够建立isotropic mesh,即网格中的每个三角形都是或者近似等边三角形。

首先,我们给出粒子间能量表示:

xi与xj表示点云中的两个点,这两个点的粒子能量,被一个高斯核函数所表示。p表示范数,\segma表示高斯核半径。根据粒子能量,导出梯度,即粒子的受力方向:

这里如果调整能量表示的形式,可以得到不同密度的采样结果,如曲率敏感采样。有兴趣的同学可以看看原论文,这里不再赘述。

基于粒子间能量表示,我们能够得到每个点的势能结果,即:

点云的总势能结果为:

E(X)为我们要优化的目标函数,X为点云,X={x1,x2,...xn},梯度为F,N(i)为点xi的1邻域。

在得到了目标函数和梯度后,我们就能够利用L-BGFS来进行优化求解

2. 具体实现

原文中的算法求解过程为:

这个算法伪代码在我理解其实是有点问题的。因为对于L-BFGS算法每一步都需要对E进行优化,即E为目标函数。但是算法中,首先计算当前的E,然后在运行对点的位置更新,这个在顺序上存在逻辑问题。应该是将对E以及F的计算放在L-BFGS内部,以实现对E的更新。同时,在每一步更新后,需要将更新的点映射回到最近的切空间,即pulling back。这里我认为如果用梯度下降更直观,不过还是为了忠实于原文的叙述,我们建立了基于L-BFGS的优化框架。

这里的L-BFGS方法的实现,基于微软亚研院刘洋博士提供的工具HBFGS:https://xueyuhanlang.github.io/software/HLBFGS/

根据HBFGS的框架,我们给出更新函数的伪代码:

//假设用户指定的点云采样量为10000。
1. 获取10000点的初始位置;
2. 基于kd树,估算segama,即高斯核半径
3. 启动HLBFGS
   HLBS内部:
   evalfunc(int N, double* x, double* prev_x, double* E, double* F){//迭代函数的更新方法
       //N 为点云数据的总数,将三维坐标拉为一维,得到一个30000的一维向量x
       //这里的E与F就是目标函数与梯度。
       3.1 根据向量x计算E,注意,在计算E的时候,只考虑5*segama范围内的点。
       3.2 根据向量x计算F,与计算E时相同。   
   }
4. 完成HLBFGS优化,输出结果。

//补充
E与F的计算:
1. 建立kd树
2. For i from 10000 点
       获取i点的邻居,在5*segama范围内
       根据E的计算公式,得到Ei
       根据F的计算公式,得到Fi
3. 获得Ei的总和E,与Fi向量(10000)
4. 返回E与Fi  

3. 实验结果

文章声称的点云采样与重建结果:

Isotropic Sampling

Isotropic Mesh

 

我按照文章的参数配置,得到的结果,我这里只展示重采样结果

优化前:

 

优化后:

4. 结论

该方法能够对点云进行指定数目的重采样,采样结果也能够进行一定的均匀化。这说明HLFGS对点云的重采样优化是有效的。但是,实验也显示了结果会受到初始位置以及参数配置的影响,不能够避免陷入到局部最优的情况。

参考文献

[Zhong2019] Zhong 2019, Surface reconstruction by parallel and unified particle-based resampling from point clouds.

 

 

Guess you like

Origin blog.csdn.net/aliexken/article/details/108054315