3D点云处理的并行化

在我们的项目中,我们研究了数百万级 3D 点云上的空间局部计算,并提出了两种主要方法,可以提高 GPU 的速度/吞吐量,同时保持最终结果的性能准确性。

通过空间局部,我们的意思是每个像素独立地基于其局部邻域中的点执行计算。我们想在这里强调两个主要贡献。首先,我们展示了近似局部邻域到 CUDA 线程块的映射,以在保持准确性的同时加速 GPU 吞吐量。其次,我们实现了本文提出的轮廓保留重采样器的快速并行版本,以对点云进行二次采样(仅保留 5% 的点效果很好!),同时保留重要特征。这有助于减轻高冗余的成本,同时仍然保持输出精度。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割

具体来说,我们选择研究分割的关键问题,这是许多计算机视觉应用程序流程中的重要一步。即,将点云“聚类”成多个同质区域,同一区域内的点将具有相同的属性。这个问题在机器人技术中有很多应用,如智能车辆、自主测绘、导航、家务劳动等。点云是一个特殊的挑战,因为它们通常具有不均匀的点密度、高冗余,并且含有许多异常值。

由于尚不清楚评估分割的最佳“指标”是什么,因此我们构建了一个简单的对象检测器(通过计算特征并在预先计算的对象特征数据库中查找最近邻居)。在较高的层面上,如果它能够可靠地检测我们训练过的对象,我们就说分割质量很好。我们想在这里强调,对象检测不是我们项目的主要焦点。相反,我们展示了如何在 GPU 上快速处理点云数据。

我们主要使用 RGB-D 对象数据库,其中包含具有如下所示对象的场景点云以及我们用来训练特征的对象本身的模型(使用点云库):

1、设计方案A

初步设计的框图如上。我们使用快速移位算法来执行图像分割。由于其计算特性和内存访问模式,它适合并行性,如下所述:

1.1 快速移位细分

快速移位分割(fast shift segmentation)分两步进行,它首先计算局部密度估计,然后将父节点分配给每个节点。这两个步骤都是空间局部的,因为每个点都通过迭代其局部邻域来执行计算。我们选择邻域大小不仅是为了确保准确性,也是为了控制分割的粒度。

function compute_density() {
  for each point p in pointcloud:
    for each neighbor x in neighborhood(p):
      density[p] += dist_estimate(p,x);
    end
  end
}
function construct_tree(){
  for each point p in pointcloud:
    for each neighbor x in neighborhood(p):
      if(density[x] > density[p] && dist(x,p) < min_dist)
        parents[p] = x;
        min_dist = dist(x,p)
    end
  end
}

1.2 实现细节

第一个贡献是利用计算的空间局部特征来体素化点云并将每个体素映射到 CUDA 线程块。这样,体素中的每个点都会对其邻域执行相同的计算,并拥有相同的内存访问模式。对原始框架的这种更改使其非常适合快速 CUDA 实现。我们通过立方点云的最小边界框来进行体素化。体素的邻域是它的邻近体素。

我们注意到,为了公平地与顺序版本进行比较,我们使用 k-d 树(对于空间本地数据访问有效)来存储点云。

2、设计方案B

在我们的第一次设计之后,我们希望通过利用点云中的冗余来加速分割。即我们问,我们处理的点是否超出了我们需要的数量?

在这里,我们介绍我们的第二个主要贡献,即我们设计中的重采样块。采样步骤分两个阶段进行,我们首先需要为每个点分配一个重要性权重(实际上是一个局部高通滤波器,又是一个空间局部计算),然后再对点进行加权采样。

后者可以借助 CUDA thrust库快速实现。事实证明,我们可以通过保留最多 5% 的总点数来进行二次采样,并保持检测性能。

2.1 重要性权重采样算法

下面我们展示了非常基本的伪代码来展示权重分配算法的结构。如下所示,权重计算又是空间局部计算,因为每个点都会迭代其局部邻域来计算其重要性权重。

function compute_weight() {
  for each point p in pointcloud:
    weighted_sum =0; 
    for each neighbor x in neighborhood(p):
      weighted_sum += weighted_neighbor(p,x);
    end
    weight[p] = dist(x, weighted_sum)
  end
}

然后我们根据这些权重对点进行采样。我们在这里提到一个警告;也就是说,我们基于 CPU 的加权顺序采样器以 O(KN)(K 是样本数)简单地执行采样。 采样器预先计算归一化权重的滚动总和,然后对均匀随机数进行采样并查看它落在哪个容器中(二分搜索)。

虽然我们在 CUDA 上实现相同的算法来执行采样,但这并不是在 CPU 上执行加权采样的最快方法。更快的基于 CPU 的实现将基于 Alias-Walker 方法,该方法的采样时间为 O(K+N)。另一个有趣的点是采样器有助于平滑空间中不均匀的点密度。

3、性能评估

下面是厨房场景分割结果的图像。原始点云大约有 300 万个点,我们只保留 80000 个样本。

我们还使用点云分割框架生成的片段显示了谷物盒的对象检测阶段的输出。报告的结果对应于在 GHC 集群上运行我们的实现,该集群具有 8 个用于多线程实现的 2 路超线程核心,以及具有 CUDA 功能 6.0 的 NVidia GeForce GTX1080 GPU。

3.1 GPU vs. CPU

我们的主要重点是最大化 GPU 上的分段吞吐量,因此,尽管我们使用 openMP 编译指令优化了 CPU 实现以在 16 个线程上运行,但它仍然不是最佳的 CPU 实现。

下图比较了我们的 openMP 和 CUDA 实现的分割过程的各个计算步骤的运行时间。 CUDA 实现相对于 openMP 实现的整体加速从 10 万点的 8 倍增加到 200 万点的约 20 倍。这种加速比的非线性增加与我们的预期是同步的,因为增加点的数量会增加点密度,从而以立方顺序增加每个体素的计算。此外,由于我们使用高度优化的推力库函数进行并行扫描和收集操作,因此采样步骤的加速比超过 1000 倍。

3.2 采样 vs. 不采样

该图比较了多线程 openMP 实现中带采样和不带采样的 CUDA 加速情况。如果不进行采样,CUDA 实现的速度仅提高 2 倍,但是将采样步骤合并到 CUDA 中可将速度提高约 20 倍。

我们注意到,与分割块的大幅加速相比,采样的开销在很大程度上可以忽略不计。我们注意到,我们采样了从 10k 到 100k 点的一系列点,这保留了检测性能。此外,在进行粗分割时,采样特别有用,因为我们需要搜索更大的邻域,更高的密度意味着极其昂贵的计算。

3.3 与图像分割的比较

与表现出高度不规则性的点云相反,图像是高度规则的。在这里,我们打算分析空间中点的密度不均匀对我们的性能有多大影响。这种不均匀性会影响每个块/体素处理的点数,进而导致工作负载不平衡模式极度倾斜。我们均衡图像中的像素数量和点云中的点数以进行公平比较。

图像分割示例,原始图像和分割图像:

4、结束语

我们研究了点云的快速并行分割问题,并实现了能够在几秒钟内分割由数百万个点组成的点云的框架。

具体来说,我们设计了多线程 CPU 和优化的 GPU 实现,这使我们的速度提高了 20 倍左右。一个关键的贡献是在实际分割之前合并了子采样阶段,这有助于进一步加速分割阶段而不影响分割质量。


原文链接:3D点云处理的并行化 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/601983.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+mybatis+vue的项目实战之(后端+前后端联调)

步骤&#xff1a; 1、项目准备&#xff1a;创建数据库&#xff08;之前已经创建则忽略&#xff09;&#xff0c;以及数据库连接 2、建立项目结构文件夹 3、编写pojo文件 4、编写mapper文件&#xff0c;并测试sql语句是否正确 5、编写service文件 6、编写controller文件 …

标准引领 | 竹云参编《面向云计算的零信任体系》行业标准正式发布!

近日&#xff0c;中华人民共和国工业和信息化部公告2024年第4号文件正式发布行业标准&#xff1a;YD/T 4598.1-2024《面向云计算的零信任体系 第1部分&#xff1a;总体架构》&#xff08;后简称“总体架构”&#xff09;&#xff0c;并于2024年7月1日起正式实施。 该标准汇集大…

vector介绍与使用【C++】

C vector 前言一、vector的介绍c文档介绍简介 二、vector的定义和使用vector的定义vector代码演示 vector的使用vector iterator 的使用vector 空间增长问题vector 增删查改vector 迭代器失效问题引起底层空间改变eraseg与vs检测比较string迭代器失效 vector 在OJ中的使用只出现…

四、 现行数据出境制度下的三条合规路径是什么?如何判断?

综合《网络安全法》《数据安全法》以及《个人信息保护法》这三大数据合规基本法律要求来看&#xff0c;企业开展数据出境活动时&#xff0c;应结合自身的主体类型、出境数据类型和数量&#xff0c;综合判断是否须要额外&#xff08;1&#xff09;申报并通过数据出境安全评估&am…

欧洲央行管委内格尔:通胀压力或将上升,未来利率水平可能保持相对高位

欧洲央行管委约阿希姆内格尔在本周二的一次讲话中表示&#xff0c;欧洲央行可能面临一系列潜在因素导致的通胀压力加大的情况。他指出&#xff0c;人口趋势可能导致持续较高的工资增长&#xff0c;并强调通胀率可能不会回到疫情前的低迷状态。 内格尔指出&#xff0c;考虑到全…

如何看待2024数维杯?

一、赛事介绍 美赛结束后,2024年又一场高含金量数模竞赛开始报名啦!数维杯每年上半年为数维杯国赛(5月,俗称小国赛),下半年为数维杯国际赛(11月),累计参赛高校千余所,参赛人数超14万人,经过八年多的发展,已成为继数学建模国赛和美赛之后的第三大全国性数学建模赛事,…

通义千问免费新功能:EMO,让照片和视频“活”起来

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃斜杠君&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &#…

Git克隆仓库报错:HTTP/2 stream 1 was not closed

报错及原因 fatal: unable to access ‘https://github.com/xxx/’: HTTP/2 stream 1 was not closed cleanly before end of the underlying stream http/2 和 http/1.1之间有个区别是“HTTP2 基于 SPDY&#xff0c;专注于性能&#xff0c;最大的一个目标是在用户和网站间只…

国际数字影像产业园专场招聘会暨四川城市职业学院双选会成功举办

为了进一步强化校企合作&#xff0c;链接企业与高素质人才&#xff0c;促进毕业生实现高质量就业&#xff0c;2024年5月7日&#xff0c;“成就梦想 职通未来”国际数字影像产业园专场招聘会暨四川城市职业学院2024届毕业生校园双选会成功举行。 当天&#xff0c;国际数字影像产…

【建网护网三十载】 守护不息创新不止,C3安全AI未来!

30年&#xff0c;中国互联网从起步探索到领先全球。1994年4月20日&#xff0c;中国正式开通首条64K的国际专线&#xff0c;标志着我国成功实现与国际互联网的全功能接轨&#xff0c;展开互联网快速发展的三十载。 回望30年&#xff0c;亲历建网&#xff0c;投身建设&#xff0c…

yolov8任务之目标检测

对象检测 对象检测是一项涉及识别图像或视频流中对象的位置和类别的任务。对象检测器的输出是一组包围图像中对象的边界框&#xff0c;以及每个框的类标签和置信度分数。当您需要识别场景中感兴趣的对象&#xff0c;但不需要确切知道对象在哪里或其确切形状时&#xff0c;对象检…

RAG系统进阶

文本分割的粒度 缺陷 粒度太大可能导致检索不精准&#xff0c;粒度太小可能导致信息不全面问题的答案可能跨越两个片段 改进: 按一定粒度&#xff0c;部分重叠式的切割文本&#xff0c;使上下文更完整 from nltk.tokenize import sent_tokenize import jsondef split_text(…

Oracle-一次TX行锁堵塞事件

问题背景&#xff1a; 接用户问题报障&#xff0c;应用服务出现大量会话堆积现象&#xff0c;数据库锁堵塞严重&#xff0c;需要协助进行问题定位和排除。 问题分析&#xff1a; 登录到数据库服务器上&#xff0c;首先查看一下数据库当前的等待事件情况&#xff0c;通过gv$ses…

大学物理实验 期末复习笔记整理(个人复习笔记/侵删/有不足之处欢迎斧正)

一、误差和数据处理 1. 系统误差是指在重复性条件下&#xff0c;对同一被测量进行无限多次测量所得结果的平均值与被测量的真值之差。它通常是由于测量设备、测量方法或测量环境等因素引起的&#xff0c;具有重复性、单向性和可测性。而随机误差则是由于测量过程中一系列有关因…

WRT1900ACS搭建openwrt服务器小记

参考链接 wrt1900acs openwrt wrt1900acs openwrt 刷机 wrt1900acs原生固件刷openwrt-23.05.3-mvebu-cortexa9-linksys_wrt1900acs-squashfs-factory.img wrt1900acs openwrt更新刷openwrt-23.05.3-mvebu-cortexa9-linksys_wrt1900acs-squashfs-sysupgrade.bin 通过WEB UI来…

醛固酮(Aldosterone)/Aldosterone ELISA kit--比色竞争法酶免疫检测试剂盒

醛固酮&#xff08;Aldosterone&#xff09;是一种由肾上腺皮质中的胆固醇合成的类固醇激素。醛固酮在肾脏和肝脏中代谢&#xff0c;并作为控制钠钾平衡的关键盐皮质激素发挥作用。肾上腺合成和释放醛固酮主要受肾素-血管紧张素-醛固酮系统&#xff08;RAAS&#xff09;的调节&…

call, apply , bind 区别详解 及 实现购物车业务开发实例

call 方法&#xff1a; 原理 call 方法允许一个对象借用另一个对象的方法。通过 call&#xff0c;你可以指定某个函数运行时 this 指向的上下文。本质上&#xff0c;call 改变了函数运行时的作用域&#xff0c;它可以让我们借用一个已存 在的函数&#xff0c;而将函数体内的 th…

ISIS学习第一部分——isis基本概念

目录 一.ISIS与OSI模型 1.IS-IS&#xff0c;中间系统到中间系统 2.ES-IS,终端系统到中间系统 二.NET——ISIS中的“IP地址” &#xff08;1&#xff09;NET有3个部分: 1.Area ID 2.System ID 3.SEL &#xff08;2&#xff09;.前面是可变长的&#xff0c;如何进行区分…

前端开发攻略---使用Sass调整颜色亮度,实现Element组件库同款按钮

目录 1、演示 2、实现原理 3、实现代码 1、演示 2、实现原理 改变颜色亮度的原理是通过调整颜色的 RGB 值中的亮度部分来实现的。在 Sass 中&#xff0c;可以使用颜色函数来操作颜色的 RGB 值&#xff0c;从而实现亮度的调整。 具体来说&#xff0c;亮度调整函数通常会改变颜…

使用 Docker 部署 TaleBook 私人书籍管理系统

1&#xff09;项目介绍 GitHub&#xff1a;https://github.com/talebook/talebook Talebook 是一个简洁但强大的私人书籍管理系统。它基于 Calibre 项目构建&#xff0c;具备书籍管理、在线阅读与推送、用户管理、SSO 登录、从百度/豆瓣拉取书籍信息等功能。 友情提醒&#x…