• 最远点采样 — D-FPS与F-FPS


             点云最远点采样FPS(Farthest Point Sampling)方法的优势是可以尽可能多地覆盖到全部点云,但是需要多次计算全部距离,因而属于复杂度较高的、耗时较多的采样方法。

    1 最远点采样(FPS)采样步骤

            FPS采样步骤为:
            (1)选择一个初始点:可以随机选择,也可以按照一定的规则来选取。如果随机选取那么每次得到的结果都是不一样的,反之每次得到的结果就是一致的。

            (2)计算所有点与(1)中点的距离,选择距离最大的值作为新的初始点。

            (3)重复前两步过程,知道选择的点数量满足要求。

            由于(2)中每次选择的距离都是最大的,所以迭代的过程距离最大值会逐渐减少。这也就是下面代码中mask选取的依据。如果把加这一个限制,那么点会被来回重复选到。

    2 距离最远点采样(D-FPS)

            上述最远点采样通过计算点与点的之间距离来进行取样。距离最远点采样是指计算点与点之间的坐标距离,通常取xyz三个坐标。

    1. # -*- coding: utf-8 -*-
    2. """
    3. 乐乐感知学堂公众号
    4. @author: https://blog.csdn.net/suiyingy
    5. 参考:https://github.com/yanx27/Pointnet_Pointnet2_pytorch
    6. """
    7. import numpy as np
    8. def farthest_point_sample(point, npoint):
    9. """
    10. Input:
    11. xyz: pointcloud data, [N, D]
    12. npoint: number of samples
    13. Return:
    14. centroids: sampled pointcloud index, [npoint, D]
    15. """
    16. N, D = point.shape
    17. xyz = point[:,:3]
    18. centroids = np.zeros((npoint,))
    19. distance = np.ones((N,)) * 1e10
    20. farthest = np.random.randint(0, N)
    21. for i in range(npoint):
    22. centroids[i] = farthest
    23. centroid = xyz[farthest, :]
    24. dist = np.sum((xyz - centroid) ** 2, -1)
    25. mask = dist < distance
    26. distance[mask] = dist[mask]
    27. farthest = np.argmax(distance, -1)
    28. point = point[centroids.astype(np.int32)]
    29. return point

    3 特征最远点采样(F-FPS)

            上述最远点采样通过计算点与点的之间距离来进行取样。特征最远点采样是指计算点的特征之间的距离。假设每个点的坐标为xyz 3个维度,输入特征为M个维度。特征最远点采样计算距离时经常会将xyz坐标与特征进行拼接作为新的特征,然后计算特征之间的距离,以进行最远点采样。

    1. # -*- coding: utf-8 -*-
    2. """
    3. 乐乐感知学堂公众号
    4. @author: https://blog.csdn.net/suiyingy
    5. 参考:https://github.com/yanx27/Pointnet_Pointnet2_pytorch
    6. """
    7. import numpy as np
    8. def farthest_point_sample(point, npoint):
    9. """
    10. Input:
    11. xyz: pointcloud data, [N, D]
    12. npoint: number of samples
    13. Return:
    14. centroids: sampled pointcloud index, [npoint, D]
    15. """
    16. N, D = point.shape
    17. xyz = point
    18. centroids = np.zeros((npoint,))
    19. distance = np.ones((N,)) * 1e10
    20. farthest = np.random.randint(0, N)
    21. for i in range(npoint):
    22. centroids[i] = farthest
    23. centroid = xyz[farthest, :]
    24. dist = np.sum((xyz - centroid) ** 2, -1)
    25. mask = dist < distance
    26. distance[mask] = dist[mask]
    27. farthest = np.argmax(distance, -1)
    28. point = point[centroids.astype(np.int32)]
    29. return point

    【python三维深度学习】python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_python 三维点云

  • 相关阅读:
    阿里云配置ECS实例的IPv6地址,开通公网IPv6
    python记录-01
    spring cloud 微服务
    Node.js--》简易资金管理系统后台项目实战(后端)
    USB Type-C数据线美国新标准UL9990报告检测项目
    合并多个PDF怎么合并?建议学会这几个合并方法
    Linux 之 start_kernel() 下的 setup_arch()
    Vuex/Vuex入门、Vuex 介绍 Vuex是什么 Vuex说明总结、Vuex主要五个内容
    PDAC复盘法是什么?怎么用?
    Cadence Allegro 过孔通孔盲孔埋孔详细说明及设计举例图文教程
  • 原文地址:https://blog.csdn.net/suiyingy/article/details/126017485