iterative farthest point sample (IFPS or FPS)

本文介绍了一种在点云数据处理中常用的下采样方法——迭代最远距离采样。该方法通过循环迭代的方式从点云数据中选择采样点,确保采样点之间的最大距离,适用于PointNet++等算法中。文章详细解释了采样的步骤,并提供了PyTorch代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 概念

2. 图例说明

3. 代码实现


1. 概念

迭代最远距离采样,在点云论文PointNet++和PF-Net中用于对点云数据下采样。

(1)随机选择一个点作为已选择采样点;

(2)计算未选择采样点集中每个点与已选择采样点集之间的最小距离作为到采样点集的距离;

(3)将距离最大的那个点加入已选择采样点集,然后更新distance,一直循环迭代下去,直至获得了目标数量的采样点。

2. 图例说明

如下所示,5个点,如果采样3个点,则依次采样1,5,4. 其中distance是每个点到各自采样点的距离,dist是所有点和当前采样点的距离。

  

 

3. 代码实现

来自PF-Net 

def farthest_point_sample(xyz, npoint, RAN=True):
    """
    下采样,提取npoint个点作为骨架点
    Input:
        xyz: pointcloud data, [B, N, C]. eg. (8,512,3)
        npoint: number of samples. eg. 64
    Return:
        centroids: sampled pointcloud index, [B, npoint]
    """
    device = xyz.device
    B, N, C = xyz.shape
    centroid_idx = torch.zeros(B, npoint, dtype=torch.long).to(device)  # (b,64). 全0。存放已选择采样点集的索引

    distance = torch.ones(B, N).to(device) * 1e10  # (b,512). 超大值。保存的是点云中每个点到已采样点集合中的最小值。
    if RAN:  # 是否随机选择一个点作为已选择采样点
        farthest_idx = torch.randint(0, 1, (B,), dtype=torch.long).to(device)  # (b,) 填充全0. 这里代码应该是写错了。
    else:  # 不随机,直接填充全1
        farthest_idx = torch.randint(1, 2, (B,), dtype=torch.long).to(device)  # (b,) 填充全1. 选择一个初始点作为已选择采样点

    batch_indices = torch.arange(B, dtype=torch.long).to(device)  # (b,). val=[0,1,2,...]
    for i in range(npoint):  # 画个图就能理解
        centroid_idx[:, i] = farthest_idx  # (b,512). (b). 将距离最大的那个点的索引加入已选择采样点集

        centroid = xyz[batch_indices, farthest_idx, :].view(B, 1, 3)  # 当前采样点集坐标. (b,3)->(b,1,3)
        dist = torch.sum((xyz - centroid) ** 2, -1)  # 计算每个点和当前采样点之间的距离. xyz(b,512,3). centroid(b,1,3). (b,512)
        mask = dist < distance  # (b,512). 所有的点和已选择采样点的距离,是否比之前的更近
        distance[mask] = dist[mask]  # 更新为更近的distance. 存放所有点和各自采样点之间的距离
        farthest_idx = torch.max(distance, -1)[1]  # (b,512)->(b,1). 即当前点云中找到距离采样点最远的索引
    return centroid_idx  # (b,64)

迭代最近点算法Iterative Closest Point Algorithm, ICPL)是一种用于三维点云配准的算法。其基本思想是通过迭代的方式,将一个点云与另一个参考点云对齐,以获得两个点云之间的最优转换关系。 ICP算法的步骤如下: 1. 初始化:选择一个参考点云和一个待配准点云,并设定初始转换矩阵。 2. 最近点匹配:对于待配准点云中的每个点,通过计算其在参考点云中的最近邻点,建立起点对的对应关系。 3. 计算刚体变换:通过使用最小二乘法,计算待配准点云到参考点云的最佳刚体变换,并更新转换矩阵。 4. 更新待配准点云:将待配准点云根据最佳刚体变换进行变换。 5. 终止条件判断:如果满足终止条件,即配准误差小于设定阈值,算法结束;否则返回步骤2进行下一轮迭代。 ICP算法的主要优点是简单高效,特别适用于实时点云配准。它在三维重建、机器人导航、三维医学图像处理等领域有广泛应用。然而,ICP算法也存在一些不足之处,如对初始矩阵的敏感性、可能陷入局部最优以及对噪声和局部形状变化敏感等。 为了克服这些限制,研究者提出了各种改进的ICP算法,如带分支限界的ICP、多尺度ICP和非刚性ICP等。这些改进使得ICP算法在更复杂的场景下具有更好的鲁棒性和配准精度。随着深度学习的兴起,ICP算法也被结合到深度学习框架中进行点云配准任务,展现出更强大的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.Q

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

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

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

打赏作者

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

抵扣说明:

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

余额充值