最远点采样(Farthest Point Sampling)是一种非常常用的采样算法,由于能够保证对样本的均匀采样,被广泛使用,像3D点云深度学习框架中的PointNet++对样本点进行FPS采样再聚类作为感受野,3D目标检测网络VoteNet对投票得到的散乱点进行FPS采样再进行聚类,6D位姿估计算法PVN3D中用于选择物体的8个特征点进行投票并计算位姿。
对于FPS算法的原理,两篇博文:PointNet++的pytorch实现代码阅读,以及 PointNet++详解与代码
已经介绍的非常详细了,一句话概括就是不断迭代地选择距离已有采样点集合的最远点。这里再介绍一遍,并实测分析一下;
FPS算法原理:
- 输入点云有N个点,从点云中选取一个点P0作为起始点,得到采样点集合S={P0};
- 计算所有点到P0的距离,构成N维数组L,从中选择最大值对应的点作为P1,更新采样点集合S={P0,P1};
- 计算所有点到P1的距离,对于每一个点Pi,其距离P1的距离如果小于L[i],则更新L[i] = d(Pi, P1),因此,数组L中存储的一直是每一个点到采样点集合S的最近距离;
- 选取L中最大值对应的点作为P2,更新采样点集合S={P0,P1,P2};
- 重复2-4步,一直采样到N’个目标采样点为止。
有两个问题,一个是初始点选择,一个是采用的距离度量;
- 初始点选择:
- 随机选择一个点,每次结果不同;
- 选择距离点云重心的最远点,每次结果相同,一般位于局部极值点,具有刻画能力;
- 距离度量
- 欧氏距离:主要对于点云,在3D体空间均匀采样;
- 测地距离:主要对于三角网格,在三角网格面上进行均匀采样;
下面给出测试样例,也来自上面两篇博文:
from __future__ import print_function
import torch
from torch.autograd import Variable
def farthest_point_sample(xyz, npoint):
""" Input: xyz: pointcloud data, [B, N, 3] npoint: number of samples Return: centroids: sampled pointcloud index, [B, npoint] """
xyz = xyz.transpose(2,1)
device = xyz.device
B, N, C = xyz.shape
centroids = 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(<
今天的文章最远点采样(Farthest Point Sampling)介绍分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/60781.html