最远点采样(Farthest Point Sampling)是一种非常常用的采样算法,由于能够保证对样本的均匀采样,被广泛使用,像3D点云深度学习框架中的PointNet++对样本点进行FPS采样再聚类作为感受野,3D目标检测网络VoteNet对投票得到的散乱点进行FPS采样再进行聚类,6D位姿估计算法PVN3D中用于选择物体的8个特征点进行投票并计算位姿。

对于FPS算法的原理,两篇博文:PointNet++的pytorch实现代码阅读,以及 PointNet++详解与代码
已经介绍的非常详细了,一句话概括就是不断迭代地选择距离已有采样点集合的最远点。这里再介绍一遍,并实测分析一下;

FPS算法原理:

  1. 输入点云有N个点,从点云中选取一个点P0作为起始点,得到采样点集合S={P0};
  2. 计算所有点到P0的距离,构成N维数组L,从中选择最大值对应的点作为P1,更新采样点集合S={P0,P1};
  3. 计算所有点到P1的距离,对于每一个点Pi,其距离P1的距离如果小于L[i],则更新L[i] = d(Pi, P1),因此,数组L中存储的一直是每一个点到采样点集合S的最近距离;
  4. 选取L中最大值对应的点作为P2,更新采样点集合S={P0,P1,P2};
  5. 重复2-4步,一直采样到N’个目标采样点为止。

有两个问题,一个是初始点选择,一个是采用的距离度量;

  • 初始点选择:

    • 随机选择一个点,每次结果不同;
    • 选择距离点云重心的最远点,每次结果相同,一般位于局部极值点,具有刻画能力;
  • 距离度量
    • 欧氏距离:主要对于点云,在3D体空间均匀采样;
    • 测地距离:主要对于三角网格,在三角网格面上进行均匀采样;

下面给出测试样例,也来自上面两篇博文:

from __future__ import print_function
import torch
from torch.autograd import Variabledef farthest_point_sample(xyz, npoint): """Input:xyz: pointcloud data, [B, N, 3]npoint: number of samplesReturn:centroids: sampled pointcloud index, [B, npoint]"""xyz = xyz.transpose(2,1)device = xyz.deviceB, N, C = xyz.shapecentroids = torch.zeros(B, npoint, dtype=torch.long).to(device)     # 采样点矩阵(B, npoint)distance = torch.ones(B, N).to(device) * 1e10                       # 采样点到所有点距离(B, N)batch_indices = torch.arange(B, dtype=torch.long).to(device)        # batch_size 数组#farthest = torch.randint(0, N, (B,), dtype=torch.long).to(device)  # 初始时随机选择一点barycenter = torch.sum((xyz), 1)                                    #计算重心坐标 及 距离重心最远的点barycenter = barycenter/xyz.shape[1]barycenter = barycenter.view(B, 1, 3)dist = torch.sum((xyz - barycenter) ** 2, -1)farthest = torch.max(dist,1)[1]                                     #将距离重心最远的点作为第一个点for i in range(npoint):print("-------------------------------------------------------")print("The %d farthest pts %s " % (i, farthest))centroids[:, i] = farthest                                      # 更新第i个最远点centroid = xyz[batch_indices, farthest, :].view(B, 1, 3)        # 取出这个最远点的xyz坐标dist = torch.sum((xyz - centroid) ** 2, -1)                     # 计算点集中的所有点到这个最远点的欧式距离print("dist    : ", dist)mask = dist < distanceprint("mask %i : %s" % (i,mask))distance[mask] = dist[mask]                                     # 更新distance,记录样本中每个点距离所有已出现的采样点的最小距离print("distance: ", distance)farthest = torch.max(distance, -1)[1]                           # 返回最远点索引return centroidsif __name__ == '__main__':sim_data = Variable(torch.rand(1,3,8))print(sim_data)centroids = farthest_point_sample(sim_data, 4)print("Sampled pts: ", centroids)

输出结果如下,可以看到得到的mask只有True的情况下,才会用当前计算的dist替换distance,这样distance中存储的一直是每一个点到采样点集合的最近距离,从中选择最大值就找到了下一个采样点。

tensor([[[0.4442, 0.7545, 0.8402, 0.1476, 0.6654, 0.1622, 0.1818, 0.3758],[0.0328, 0.3010, 0.0910, 0.4768, 0.6825, 0.3810, 0.1923, 0.4230],[0.5849, 0.4576, 0.5159, 0.0993, 0.3962, 0.1519, 0.0429, 0.3123]]])
-------------------------------------------------------
The 0 farthest pts tensor([2])
dist    :  tensor([[0.1649, 0.0548, 0.0000, 0.8021, 0.3947, 0.6762, 0.6675, 0.3673]])
mask 0 : tensor([[True, True, True, True, True, True, True, True]])
distance:  tensor([[0.1649, 0.0548, 0.0000, 0.8021, 0.3947, 0.6762, 0.6675, 0.3673]])
-------------------------------------------------------
The 1 farthest pts tensor([3])
dist    :  tensor([[0.5210, 0.5276, 0.8021, 0.0000, 0.3985, 0.0122, 0.0853, 0.1003]])
mask 1 : tensor([[False, False, False,  True, False,  True,  True,  True]])
distance:  tensor([[0.1649, 0.0548, 0.0000, 0.0000, 0.3947, 0.0122, 0.0853, 0.1003]])
-------------------------------------------------------
The 2 farthest pts tensor([4])
dist    :  tensor([[0.5067, 0.1572, 0.3947, 0.3985, 0.0000, 0.4038, 0.5989, 0.1583]])
mask 2 : tensor([[False, False, False, False,  True, False, False, False]])
distance:  tensor([[0.1649, 0.0548, 0.0000, 0.0000, 0.0000, 0.0122, 0.0853, 0.1003]])
-------------------------------------------------------
The 3 farthest pts tensor([0])
dist    :  tensor([[0.0000, 0.1844, 0.1649, 0.5210, 0.5067, 0.3882, 0.3881, 0.2312]])
mask 3 : tensor([[ True, False, False, False, False, False, False, False]])
distance:  tensor([[0.0000, 0.0548, 0.0000, 0.0000, 0.0000, 0.0122, 0.0853, 0.1003]])
Sampled pts:  tensor([[2, 3, 4, 0]])

最远点采样(Farthest Point Sampling)介绍相关推荐

  1. 最远点采样(Farthest Point Sampling)

    简介 以下我们将最远点采样(Farthest Point Sampling)简记为FPS.这种采样方法我觉得非常有趣.个人觉得比随机采样得到的数据能够表现更多的"轮廓性",其次用的 ...

  2. 最远点采样(Farthest Point Sampling,FPS)算法详解

    最远点采样(FSP)是一种常用的采样算法,主要用于点云数据(如激光雷达点云数据.分子坐标等)的采样. 一:算法原理 最远点采样的研究对象是点云数据,即一堆离散的坐标点.广义上其它许多样本数据类型也可以 ...

  3. FPS(farthest_point_sample) 最远点采样并可视化(附open3d python代码)

    最远点采样(Farthest Point Sampling)是一种非常常用的采样算法,由于能够保证对样本的均匀采样,被广泛使用. 一句话概括就是不断迭代地选择距离已有采样点集合的最远点. FPS算法原 ...

  4. 图解点云深度学习中FPS(Farthest Point Sampling)--最远点采样算法

    一.回忆Farthest Point Sampling算法过程(建议详细看完) 我们选取一个点云,我们假设整个点集为一共有n个点,来进行算法的讲解. 随机在整个点集中选取一个点作为起始点,并且放入集合 ...

  5. Farthest Point Sampling(最远点采样)

    Farthest Point Sampling 作用:是一种非常常用的采样算法,由于能够保证对样本的均匀采样,被广泛使用. 直观化的解释图片: 其他还有,自适应采样,参考连接 https://boug ...

  6. FPS(Farthest Point Sampling)——最远点采样

    1.算法流程 假设点个数为N,N = {P1,P2,-,Pn},经过采样后点的集合为S,初始时S = {},采样c个点 <1> 在N个点中随机选择1个点Pk1,放入S,S = {Pk1} ...

  7. 计算机视觉知识点整理:PointNet++之最远点采样(farthest point sample, FPS)代码理解

    # farthest_point_sample函数完成最远点采样: # 从一个输入点云中按照所需要的点的个数npoint采样出足够多的点, # 并且点与点之间的距离要足够远. # 返回结果是npoin ...

  8. Farthest Point Sampling on 2d image

    Farthest Point Sampling的原理是,先随机选一个点,然后呢选择离这个点距离最远的点(D中值最大的点)加入起点,然后继续迭代,直到选出需要的个数为止 其主要代码如下: %main.m ...

  9. 【最远点采样FPS】点云采样方式(一) — 最远点采样

    本文为博主原创文章,未经博主允许不得转载. 本文为专栏<python三维点云从基础到深度学习>系列文章,地址为"https://blog.csdn.net/suiyingy/ar ...

最新文章

  1. iOS架构-分离静态库.a文件并导出.m伪代码文件(11)
  2. Spring5源码 - 11 Spring事件监听机制_源码篇
  3. 签约 计算机英语,签约协议时的英文表达
  4. java限制发送短信次数_使用java发送短信验证码码,出现流量限制怎么办?急急急...
  5. net.conn read 判断数据读取完毕_高并发:缓存模式以及缓存的数据一致性
  6. node-media-server win环境安装架测试 踩坑记
  7. linux 显卡驱动程序,NVIDIA为Linux发布重大驱动程序升级
  8. spring+mybatis 框架搭建
  9. 大学生创新创业基础章节答案(李家华等,2021版)
  10. python 泰森多边形边界_geotools中泰森多边形的生成
  11. 【06月24日】预分红股息率最高排名
  12. android studio开发十一 Library第三方类库源码, Jar包和SO库
  13. CSDN编程挑战赛第六期—参赛心得+题解
  14. 鸿蒙和ios流畅对比,鸿蒙OS对比iOS,华为再次“超越”,流畅度大幅领先苹果!...
  15. ai人工智能可以干什么_什么是情感AI,为什么要关心
  16. [Android App] 内涵段子最新5.5.5 去广告去更新修改版
  17. [笔记]STM32基于HAL库的SDIO+FATFS文件系统
  18. 2022-2028全球与中国电磁建模软件市场现状及未来发展趋势
  19. 登神长阶 c语言题解
  20. 金山云容器引擎服务入门指南

热门文章

  1. 安卓自定义View进阶-事件分发机制原理
  2. 【Android应用开发】Android Studio 简介 (Android Studio Overview)
  3. 将VMProtect集成到应用程序教程之实模式(一):创建新的受保护的应用程序
  4. 小学语文美育的研究(未完)
  5. Windows系统配置代理池步骤
  6. EasyTouch学习
  7. python 系统托盘_python3 tkinter写出来的程序最小化到系统托盘
  8. 中毒取证:神经网络数据中毒的回溯方法
  9. 组队学习(数列极限)
  10. 最小函数依赖集的求解过程