PointCleanNet: 一种基于数据驱动的点云去噪方法

最近投文章,不止一个审稿人向我推荐了PointCleanNet用于稠密点云去噪。查了一下,是Ovsjanikov教授挂名的文章,发表在CGF上。高手背书,果断决定研究一下。

1. 介绍

点云去噪是一个老问题了,一般主要是针对高斯噪声和异常点(Outliers)进行去噪,经典的方法包括双线性,高斯核以及MLS曲面重映射等方法。作者在PointCleanNet中,提出了一些关于点云去噪的一些细节问题,如下:

1)平衡去噪与特征保护;2)自适应;3)对无序点云与刚性变换鲁棒;4)不干扰非噪声点。

这里给出我个人的解释,一般在点云去噪中,为了追求点云的连续性,通常都会采取平滑算法。可想而知,一些重要的几何特征,如锐利的边界以及几何纹理细节会被平滑掉。这是我们不希望发生的。因此,去噪需要在平滑与特征保持中建立平衡。自适应,意思是不希望有过多的人为输入。因为一些经典算法都要求用户输入搜索半径等参数,而这些参数对结果又会有很大影响,同时用户又不太清楚如何输入较好的参数,所以导致基于参数的算法实用性一般。自适应就是要解决这个问题。无序与刚性变换鲁棒比较容易理解,就是对同一个点云,变换点的顺序与对点云进行平移旋转,去噪结果一致。最有一点,不干扰非噪声点,就是说点云需要在尽可能保持原始信息的基础上去噪,否则就是输出一个和原来模型不一致的所谓理想结果,自己逗自己玩。

为了解决这些问题,作者提出了PointCleanNet。该网络基于PCPNet architecture [1] 来估计局部几何特征,并根据该特征实现去噪。通过对一组包括了噪声的点云块集合进行训练,得到PointCleanNet,即首先去除Outliers,然后估计留下的点的校正向量。

2. 问题建模

假设带噪声点云表示如下:

P‘为输入点云;我们希望恢复噪声点的位置并去除Outlier, 于是我们建立校正向量的表示

 d为校正向量,p_i^'为消除了Outlier的点。

PointCleanNet的目标就是消除Outlier并且获得对校正向量的估计。基本上这是一个局部估计的问题,校正向量要与点云的邻域结果报纸一致,以获得平滑的曲面。PCPNet能够用来计算一个点云的邻域结构的几何特征。

 使用一个非线性函数g来估计输入点是outlier的概率: 

o^{~}_i是outliers的判断概率,当大于0.5时,即判断输入点为outlier。

使用一个函数f来估计校正向量d

建立局部块local patch:建立一个类似于ball space的空间,来搜索附近的区域,以获得outlier的概率;使用spatial transformer network(quaternion spatial transformer network:QSTN)[2] 来去除旋转影响;

Loss function: 基本上就是点的欧氏距离,也可以是Hausdorff距离。

3. 程序调试

首先下载源代码,作者已经提供了项目链接:GitHub - mrakotosaon/pointcleannet

配置,我是在pycharm上配置的,需要安装的包包括cudatoolkit,cudnn,pytorch,numpy,script,tensorboardx,请按照版本需求安装。

程序的使用:

首先,下载训练数据,使用download_data.py

之后,训练,使用train_pcpnet.py

按照要求,在项目根目录中创建一个文件夹,存储输出的去噪结果

最后,运行run.sh (如果是windows平台,需要安装shell执行应用。我没有搞定,就直接把sh里的命令在命令行模式里输入的,总共三条语句,即对点云进行的三次迭代。)

我对python的点云项目不太熟,应该是可以把这个程序重新改一下,不需要这么麻烦,熟悉python点云项目的兄弟有空可以优化一下: 

论文中的一些去噪的实验结果: 

我用自己的数据跑出来的一些结果:(有效果,但是确实一般。事实上,依靠局部邻域的patch去建立源输入,还是不能彻底解决过于离散的outlier的情况。不过,肯定比传统方法要好一点。)

 

[1] GUERRERO P, et al. PCPNet: Learning local shape properties from raw point clouds.CGF 37, 2 (2018), 75–85.

[2] JADERBERG M, et al. Spatial transformer networks. In NIPS (2015), pp. 2017–2025.

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
### 回答1: 点云去噪点云处理中的一个重要任务,可以提高点云的质量和精度。Python中有很多点云去噪的库,比如: 1. Pyntcloud:一个基于Python的点云处理库,提供了多种点云去噪方法,包括基于统计学的方法和机器学习方法。 2. Open3D:一个开源的3D计算机视觉库,提供了多种点云去噪方法,包括基于统计学的方法和基于深度学习方法。 3. PCL:一个点云处理库,支持多种点云去噪方法,包括基于统计学的方法和基于机器学习的方法。 这里以Pyntcloud为例,介绍一下如何使用它进行点云去噪。 首先,安装Pyntcloud库: ``` pip install pyntcloud ``` 然后,加载点云数据: ```python import pyntcloud cloud = pyntcloud.PyntCloud.from_file("input.ply") ``` 接下来,可以使用VoxelGrid滤波器对点云进行降采样: ```python voxelgrid_id = cloud.add_structure("voxelgrid", size_x=0.05, size_y=0.05, size_z=0.05) voxelgrid = cloud.structures[voxelgrid_id] downsampled_cloud = voxelgrid.get_sample() ``` 然后,使用StatisticalOutlierRemoval滤波器对点云进行去噪: ```python statistical_id = downsampled_cloud.add_filter("statistical_outlier_removal", nb_neighbors=20, std_ratio=0.2) filtered_cloud = downsampled_cloud.get_filter(statistical_id) ``` 最后,保存处理后的点云数据: ```python filtered_cloud.to_file("output.ply") ``` 以上就是使用Pyntcloud进行点云去噪的简单示例。需要注意的是,不同的点云去噪方法适用于不同的场景和数据类型,因此需要根据具体情况选择合适的方法。 ### 回答2: 点云去噪处理三维点云数据中噪声的过程。Python为我们提供了一些库和工具,可以用于点云去噪。 首先,我们可以使用Open3D库来加载和处理点云数据。该库提供了一些去噪算法,如基于高斯噪声模型的滤波器。我们可以使用`read_point_cloud`函数加载点云数据,然后通过使用`StatisticalOutlierRemoval`滤波器对点云进行去噪。该滤波器会根据每个点的邻域信息计算点的局部密度,然后通过比较每个点的密度与给定阈值来判断其是否为离群点。 另外一个常用的去噪算法是基于机器学习的方法,如基于深度学习的神经网络。点云中的噪声可以看作是异常点或离群点,可以使用深度学习模型来检测和去除这些异常点。Python中的一些库,如PyTorch或TensorFlow,可以用于训练和使用这些深度学习模型。 除了上述方法之外,还有一些其他的点云去噪算法可以在Python中实现,如基于形态学的滤波算法、基于统计学的滤波算法等。这些算法可以根据点云数据的特点和需求进行选择和调整。 综上所述,Python提供了一些库和工具,可以用于点云去噪。我们可以使用Open3D库中的滤波器或者使用深度学习模型来实现去噪的功能。同时,根据点云数据的特点和需求,还可以选择和调整其他的点云去噪算法。 ### 回答3: 点云去噪是指通过对点云数据进行处理,去掉其中的噪声点,从而减少数据的噪声干扰,获取更加清晰的点云模型。Python提供了一些工具和库可以用来进行点云去噪处理。 在Python中,可以使用开源库Open3D来进行点云去噪操作。Open3D提供了一系列的滤波器,例如:统计滤波器、高斯滤波器、半径滤波器等,可以根据不同的需求选择相应的滤波器来去噪。 首先,需要加载点云数据。可以使用Open3D的`read_point_cloud`函数来读取点云文件,得到一个点云对象。接下来,可以选择合适的滤波器进行去噪操作。 例如,可以使用统计滤波器对点云进行去噪。统计滤波器通过计算每个点的邻域范围内的点的统计特征,例如:点的密度和距离。可以使用Open3D的`StatisticalOutlierRemoval`函数创建一个统计滤波器对象,并设置相应的参数,如邻域范围和点的阈值。然后,将点云对象传入滤波器的`filter()`函数来进行去噪操作,得到去噪后的点云结果。 除了统计滤波器,还可以尝试其他的滤波器,例如高斯滤波器和半径滤波器,以根据实际需求选择最适合的滤波器进行点云去噪。 在去噪完成后,可以使用Open3D的`write_point_cloud`函数将去噪后的点云数据保存到文件中,以供后续使用或分析。 总之,通过使用Python中的Open3D库,可以方便地对点云数据进行去噪操作,提高点云数据的质量和准确性。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿老甘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值