首页 > 其他分享 >目标检测 | Farthest Point Sampling 及其 CUDA 实现

目标检测 | Farthest Point Sampling 及其 CUDA 实现

时间:2024-02-11 23:11:34浏览次数:27  
标签:采样 Farthest Point Sampling mesh 均匀 点云

Farthest Point Sampling 及其 CUDA 实现

目录

概述

在深度学习中,在mesh模型(网格模型)上直接学习并预测是一个相当复杂的任务,一方面在于没有高效的模型,另一方面在于现实中难以直接获取性质良好的mesh模型。所以我们常会通过采样和扫描的形式将mesh模型或者现实中的物体转化为point cloud(点云),对于一个点云,其定义为一个\(N\times C\)的张量,\(N\)表示有多少个点,\(C\)表示每个点的信息。对于一个三维的点云,一般\(C=3\),以表示\((x,y,z)\)。如果点云还携带了更多的信息例如反射强度等,则\(C=3+C^\prime\)。而评价这个点云质量的好坏,就是评价这个点云是否尽可能保留了mesh模型中的几何特征。

现在假设我们拥有一个mesh模型,其渲染效果如下图所示:

mesh模型的渲染可视化

但是我们的模型不能直接处理这个mesh模型,因此我们通过扫描或者采样的方式得到了一组\(4096\times 3\)的点云:

mesh模型的扫描结果可视化

如果我们凭借肉眼观察,可见这组点云较好地保留了mesh的几何特征,因此这组点云可以称得上是“质量不错”。

但是我们需要把这组\(4096\times 3\)点云输入到一个输入为固定大小\(256\times 3\)的模型中,我们就必须通过下采样将点云采样为\(256\times 3\)。

均匀随机采样

首先我们想到的一种最为朴素的下采样方法就是均匀随机采样(uniform random sampling),这种下采样方法在python中可以被简单实现:

# 所有的点(1 x 4096 x 3)
total_point = ...

# 进行均匀随机采样
num_samples = 256
indices = torch.randint(0, total_point.size(1), (num_samples,))
sampled_points = total_point[0, indices]

# 可视化
plot_pointcloud(sampled_points, title="uniform random sampling")
plt.show()

我们得到采样结果为:

均匀随机采样结果的可视化

显然这组点云的采样效果并不能称得上“质量不错”,如下图所示,经过采样之后的点并不能很好地保留原始的几何特征,显然均匀随机采样得到的点在分布上却并不均匀。

均匀随机采样结果与原始图形的比较

经过分析,这是因为虽然点在每个mesh平面上的分布是均匀的,但是mesh平面在空间上本身分布就不均匀。也就是说点的先验分布并不保证“空间均匀”,所以经过随机采样得到的自然也就不能保证“空间均匀”。我们需要一种“空间均匀”的均匀随机采样,而非“平面均匀”。

Farthest Point Sampling(待完成)

Farthest Point Sampling (FPS)最早被引入深度学习领域应该是Charles R. Qi等人的文章PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space,FPS算法在其中作为PointNet++特征提取的中心点采样层使用。

其基本思想是从点云中选择一个起始点,然后在剩余的点中选择与已选点距离最远的点作为下一个选定点。这个过程迭代进行,直到达到所需数量的采样点为止。通过这种方式,FPS确保了选定的点在整个点云中分布均匀,从而能够较好地表示点云的特征。

FPS的关键步骤包括:

  1. 选择起始点: 从点云中随机选择一个点作为起始点。
  2. 计算距离: 计算剩余点与已选点之间的距离。
  3. 选择最远点: 选择距离已选点最远的点作为下一个选定点。
  4. 重复步骤2和步骤3: 重复计算距离和选择最远点的过程,直到达到所需数量的采样点。

如下图所示,我们可以通过迭代的形式来理解FPS算法。假设我们拥有已采样的点集(图中红点),以及尚未被采样的点集(图中绿点),那么红点将构成一个密度场(图中虚线),那么我们可以通过点到达该点集的最短距离以估算出点所在位置的空间密度大小。显然这个距离最大的点所处的位置就是当前已采样的点集中密度最小的地方,按照“空间均匀”的原则,我们将该点加入采样集合使得空间密度方差的下降最大,因此我们将该点加入已采样的点集,完成一次迭代。

FPS算法的一次迭代解释

Farthest Point Sampling 的并行版本(待完成)

标签:采样,Farthest,Point,Sampling,mesh,均匀,点云
From: https://www.cnblogs.com/uzuki/p/18013606

相关文章

  • 【Java 并发】【队列应用】【二】Tomcat的NioEndPoint中ConcurrentLinkedQueue 的使用
    1 前言这一节我们讲解Tomcat的NioEndPoint中ConcurrentLinkedQueue的使用。2  Tomcat的容器结构本节讲解apache-tomcat-7.0.32-src源码中ConcurrentLinkedQueue的使用。首先介绍Tomcat的容器结构以及NioEndPoint的作用,以便后面能够更加平滑地切入话题,如图11-4所示......
  • SharePoint Online 列表的 Audience Targeting
    前言最近,碰到一个需求,用户希望列表的视图,不被管理员以外的任何人看到,这样数据会更加安全。正文1.这时候,我们就需要用到列表的AudienceTargeting功能了,我们首先要去到列表设置,如下图:2.进去以后启用列表的AudienceTargeting,如下图:3.我们去到列表视......
  • SharePoint Online 对比文档库中文档的版本
    前言我们经常会使用SharePointOnline来保存和协作编辑文档,但是,有时候编辑的时候会想知道之前某个版本做过哪些更改,该如何去做呢?其实,Word本身为我们提供了一个非常好的比较功能,我们演示一下给大家看。正文1.需要使用Openinapp在本地word中打开文档,如下......
  • SharePoint Online 查看独立权限的项目
    前言最近碰到这么个需求,用户想要查看SharePointOnline站点里,有多少文档是断开权限的。正文1.我们先要进入到站点权限,如下图:2.然后进入高级权限设置,如下图:3.点击showtheseitems,如下图:4.这样我们可以看到哪些文档库里面有独立权限的项目了,......
  • SharePoint Online 中Excel引用另一个Excel中的单元格
    前言最近,碰到一个需求,用户想要在SharePointOnline中从一个Excel文件引用另一个Excel文件的内容,所以就研究了一下。正文1.建一个测试的Excel文件,随便写点东西,如下图:2.新建另一个Excel,用来引用上一个Excel文件,如下图:3.在第一个Excel中的文件,选中单......
  • SharePoint Online Framework WebPart 魔改乱用
    前言最近,经常碰到微软更新SharePointOnlineDOM的情况,然后,页面里的WebPart就乱七八糟了,思前想后,找了个解决方法可以规避这个问题,虽然有点剑走偏锋,但是大家可以看看。正文1.下面灰色的部分,是我测试用的WebPart,大家可以看到位置比较奇葩,在整个页面最下方,而不是......
  • SharePoint Online Lookup column threshold
    前言最近,一个开发的同时碰到这样一个问题,来问自己,相信很多人也碰到过类似的问题,就分享下。正文1.错误描述SomethingwentwrongThequerycannotbecompletedbecausethenumberoflookupcolumnsitcontainsexceedsthelookupcolumnthreshold.......
  • mysql插入数据出现java.sql.SQLException Create breakpoint : Incorrect string valu
    问题图片如下:  如果出现这个问题,就是当前的mysql设置的字符集和当前业务的需求符合;前:当前我需要在mysql中存入的内容中包括了表情等信息,如下:问题分析:因为我在docker中搭建的mysql设置的默认编码为utf-8,下面是我的my.cnf文件[client]default_character_set=utf8[my......
  • SharePoint Online 使用Power Apps定制页面
    前言最近,用户有个需求,想要定制一下SharePointOnline的表单,我们就推荐用户使用PowerApps,下面我们就介绍下如何去做。正文1.我们先简单建一个测试列表,比较懒,字段类型我就都选择了单行文本,如下图:2.选择自定义表单,会默认打开PowerApps界面,如下图:3.......
  • Java 将PDF转为PowerPoint (2行代码)
    通过编程实现PDF转PPT的功能,可以自动化转换过程,减少手动操作的工作量,并根据需要进行批量转换。将PDF文件转换为PPT文档后,可以利用PPT的丰富功能和动画效果,达到更好的演示效果。在Java中,我们可以使用第三方库Spire.PDFforJava来将PDF转换为PowerPoint文档。以下示例包含将PDF转......