PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space论文精读与FPS简单实现

收录期刊会议:NeurIPS(CCF-A)
日期:2017年
作者:Charles R. Qi等
单位:Stanford University
论文链接:PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

在这里插入图片描述

一、写作背景

尽管pointNet在3D点云方向取得了巨大的进步,但是pointNet也存在一些问题。PointNet无法捕捉有度量空间引起的局部结构,这导致其无法识别精细部分和对复杂场景得概括性。为此,作者提出了一种层级式特征提取网络,在各层级之间递归应用PointNet。

二、介绍

在现实生活中利用3D扫描器等设备产生得点云集合其密度和特征分布是变化的和不均匀的。从不同的度量空间定义局部邻域会产生不同的特征属性。PointNet的基本思想是学习每个点的空间编码,然后将所有单个点的特征汇总到全局点云特征中。这表明他不具备局部特征得捕捉能力,但从卷积操作的成功可以看出,局部信息对网络精度的提升是非常重要的,分层级得特征抽象使得模型能够更好地概括未见过的情况。

三、实验难点(需解决的问题)

1.如何生成点云集合分区
2.如何通过一个局部特征学习器抽象点云集合得特征。

四、解决方法(Method)

1、 对于难点2

作者使用共享权值的PointNet作为局部特征学习器,共享权值是因为各分区之间会产生相同的结构(分区的方式一致),使用PointNet作为局部特征学习器是因为其已经被证明了是最好的处理无序点云集合的网络。

2、 对于难点1

作者首先定义了分区为一个个邻域–以中心点为圆心,Euclidean distance(欧几里德距离)为半径的邻域球,其中中心点的确定是通过FPS(Farthest Point Sample)确定的。对于邻域球的尺寸的确定是个值得考究的问题,因为点云集的密度分布不均匀不能单单的像CNN一样使用距离来划分分区。作者表明了分区中的点云数如果过少会导致模型的鲁棒性下降。为此作者采取了一种K邻近方式来划分邻域规模。

3、Hierarchical Point Set Feature Learning

作者对点进行分层分组,并沿层级逐步抽象出越来越大的局部区域。

在这里插入图片描述

作者的层级结构是由一个个叫做集合抽象层(set abstraction)的结构组成。在每个集合抽象层,一个点集合会被分区并抽象产生更加高级的抽象点集合。每个集合抽象层由三个组成:Sampling layer, Grouping layer和PointNet layer。

(1)Sampling layer:
使用FPS来选择采样中心点,以便选择的子集中的点互相之间的距离尽可能远。FPS的具体做法是将剩余的未作为采样点的点与采样点之间计算欧几里得距离,选择最近的一个作为该点与采样点之间的距离,再从该距离中选择最远的一个加入到采样点中,这么做的好处是可以尽可能的覆盖整个点云集。

import numpy as np


import numpy as np

def farthest_point_sampling(points, num_samples):
    # points是输入的点云数据,形状为(N, 3),表示N个点的三维坐标
    # num_samples是要选择的采样点的数量

    num_points = points.shape[0]
    sampled_indices = np.zeros(num_samples, dtype=int)  # 用于存储选择的采样点的索引
    distances = np.full(num_points, np.inf)  # 用于存储每个点到最近采样点的距离

    # 随机选择一个起始点
    start_index = np.random.choice(num_points)
    sampled_indices[0] = start_index

    for i in range(1, num_samples):
        # 计算每个点到最近采样点的距离
        current_point = points[sampled_indices[i - 1]]
        current_distances = np.linalg.norm(points - current_point, axis=1)
        print(current_distances)

        # 更新距离信息,仅保留最短距离
        distances = np.minimum(distances, current_distances)
        print(distances)

        # 选择距离最远的点作为下一个采样点
        next_index = np.argmax(distances)
        sampled_indices[i] = next_index

    return sampled_indices


# 示例用法
# points是包含点云数据的NumPy数组,num_samples是要选择的采样点数量
# sampled_indices包含了选择的采样点的索引
points = np.random.randint(10,size=(10,3))
print(points)
num_samples = 3
sampled_indices = farthest_point_sampling(points, num_samples)
print(sampled_indices)

(2)Grouping layer:
类比CNN卷积核使用Manhattan distance来构造局部像素区域,作者在对比了ball query和Knn(k邻近)划分区域后认为ball query(球查询)保证了一个固定的区域尺寸,使得区域特征在空间中更加具有通用性,这对需要局部分割任务来说是有利的。
(3)PointNet layer:
该层是对分区后的局部点云单独运用PointNet网络生成更加高级的(抽象的)局部点云。在输入点云网络之前,作者首先对区域内的点云三维坐标进行了归一化,即将每个点云的坐标都转换为相对于中心点位置为原点后的坐标。

4、Robust Feature Learning under Non-Uniform Sampling Density(非均分密度点云集下的鲁棒特征学习)

在点云任务中,密集数据区域中学习到的特征不能很好得推广到稀疏数据区域中,反之亦然。且当稀疏区域中的点云过分少(采样不充分)时并不利于模型得精度提升。为了解决这一问题,作者提出了一个密度自适应(density adaptive)的PointNet layer。当输入采样的密度变化时,该层能够学习到不同寸尺的分区的结合特征。作者将带有密度自适应 PointNet 层的分层网络称为 PointNet++。作者提出了两种类型,一个是MSG,另一个时MRG。MSG 方法的计算成本很高,因为它需要为每个中心点运行大规模邻域的本地 PointNet。MRG是直接对划分区域中的所有区域使用PointNet,并将不同层级的特征拼接起来。当局部区域的密度较低时,MSG可能不如MRG可靠,因为计算MSG子区域包含的点更少,采样不足的情况也更严重。当局部区域的密度较高时,MSG会提供更精细的信息,因为它具有在较低层次递归检测较高分辨率的能力。

在这里插入图片描述

5、Point Feature Propagation for Set Segmentation

在分割任务中,需要对每个点云输出类别。作者提出了两种方式,第一个方式是不改变输入点云的数量,在传播过程中不进行下采样,计算复杂度高。第二个方式是利用插值的方式对子采样中的点云传播到原始点云中。PointNet++中作者采用的是第二种插值的方式,插值公式如下,公式中的k和p的值默认为3和2。插完之后,作者将对应的集合抽象层通过跳跃连接拼接两组特征点云。

在这里插入图片描述

五、实验

作者使用了四个数据集:MNIST(2D分类)、ModelNet40(3D分类)、ScanNet(全景分割)、SHREC15(分类但是同一类别包含不同的pose)

(1)第一个和第二个数据集验证了PointNet++在分类上的art of the state。同时改变输入点云的数量验证了PointNet++的鲁棒性。

在这里插入图片描述

(2)第三个数据集验证了PointNet++在全景分割任务中的优异性,同时验证了其在不均匀密度的点云集中的鲁棒性,证明MSG+DP的PointNet在不均匀密度点云集中的表现最好,与均匀密度点云集分割精度相差不大。

在这里插入图片描述

(3)最后作者通过SHREC15数据集验证了该网络在非Euclidean distance中的通用性。在SHREC15数据集中使用的度量空间是geodesic distances(测地距离,即物体表面距离)。作者通过比较不同的输入特征验证了在geodesic distances度量空间中,XYZ的三维坐标特征并不能给网络提供很好的具有辨识性分割特征,需要使用其他内在特征(intrinsic feature)(如multi-scale Gaussian,WKS,HKS)。

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卡比兽-Carpe_diem

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

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

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

打赏作者

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

抵扣说明:

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

余额充值