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

# farthest_point_sample函数完成最远点采样:
# 从一个输入点云中按照所需要的点的个数npoint采样出足够多的点,
# 并且点与点之间的距离要足够远。
# 返回结果是npoint个采样点在原始点云中的索引。
def farthest_point_sample(xyz, npoint):
    """
    Input:
        xyz: pointcloud data, [B, N, 3]
        npoint: number of samples
    Return:
        centroids: sampled pointcloud index, [B, npoint]
    """
    device = xyz.device
    B, N, C = xyz.shape
    # 初始化一个centroids矩阵,用于存储npoint个采样点的索引位置,大小为B×npoint
    # 其中B为BatchSize的个数 
    centroids = torch.zeros(B, npoint, dtype=torch.long).to(device)
    # distance矩阵(B×N)记录某个batch中所有点到某一个点的距离,初始化的值很大,后面会迭代更新
    distance = torch.ones(B, N).to(device) * 1e10
    # farthest表示当前最远的点,也是随机初始化,范围为0~N,初始化B个;每个batch都随机有一个初始最远点
    farthest = torch.randint(0, N, (B,), dtype=torch.long).to(device)
    # batch_indices初始化为0~(B-1)的数组
    batch_indices = torch.arange(B, dtype=torch.long).to(device)
    # 直到采样点达到npoint,否则进行如下迭代:
    for i in range(npoint):
        # 设当前的采样点centroids为当前的最远点farthest
        centroids[:, i] = farthest
        # 取出该中心点centroid的坐标
        centroid = xyz[batch_indices, farthest, :].view(B, 1, 3)
        # 求出所有点到该centroid点的欧式距离,存在dist矩阵中
        dist = torch.sum((xyz - centroid) ** 2, -1)
        # 建立一个mask,如果dist中的元素小于distance矩阵中保存的距离值,则更新distance中的对应值
        # 随着迭代的继续,distance矩阵中的值会慢慢变小,
        # 其相当于记录着某个Batch中每个点距离所有已出现的采样点的最小距离
        mask = dist < distance
        distance[mask] = dist[mask]
        # 从distance矩阵取出最远的点为farthest,继续下一轮迭代
        farthest = torch.max(distance, -1)[1]
    return centroids
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
PointNet中的采样层是一种用于对云数据进行采样的方法。在云数据中,每个都包含了丰富的三维信息,如位置、颜色和法线等。但是云数据的数量通常很大,对于深度学习等机器学习任务来说,这可能会导致计算和存储方面的问题。 为了解决这个问题,PointNet提出了采样层,用于对输入的云数据进行降采样采样层的作用是在保留尽可能多的关键信息的同时,减少云数据的数量。 具体来说,采样层可以通过两种方式进行操作:uniform采样FPSFarthest Point Sampling)采样。uniform采样是一种随机采样的方法,从原始云数据中均匀地选择一部分进行保留。而FPS采样是一种迭代的贪心算法,通过选择距离当前已选择最远加入采样的集合中。 采样层在进行降采样时,通常会保留一定数量的采样。这些采样可以被视为云数据的一个子集,通过这个子集可以大致代表原始云数据的信息。通过采样层,可以有效地减小云数据的规模,降低了计算和存储的复杂度,同时还能保留主要的结构和特征信息。 总的来说,PointNet的采样层是一种能够对云数据进行降采样的方法,通过对原始数据进行合理的选择和保留,既能减小数据规模,又能保留主要的结构特征信息。这为云数据的后续处理和机器学习任务提供了便利,并提升了计算效率和准确性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值