3

用于3D数据处理的Python多处理

 2 years ago
source link: https://panchuang.net/2021/08/10/%e7%94%a8%e4%ba%8e3d%e6%95%b0%e6%8d%ae%e5%a4%84%e7%90%86%e7%9a%84python%e5%a4%9a%e5%a4%84%e7%90%86/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

用于3D数据处理的Python多处理

fendouai • 2021年8月10日 am5:04 • Medium

今天我们将讨论如何使用Python多处理来处理大量数据。我将讲述一些可能在手册中找到的一般信息,并分享我发现的一些小技巧,例如将tqdm与多处理IMAP一起使用,以及并行处理归档。

那么,我们为什么要求助于并行计算呢?使用数据有时会出现与大数据相关的问题。每次我们有不适合RAM的数据时,我们都需要逐段地处理它。幸运的是,现代编程语言允许我们产生在多核处理器上完美工作的多个进程(甚至线程)(注意:这并不意味着单核处理器不能处理多处理,这里是关于该主题的堆栈溢出线程)here’s

今天,我们将尝试执行常见的3D计算机视觉任务,即计算网格和点云之间的距离。例如,当您需要在所有可用网格中查找定义与给定点云相同的3D对象的网格时,可能会遇到此问题。

我们的数据由存储在.7z存档中的.obj文件组成,这在存储效率方面非常好。但当我们需要访问它的确切部分时,我们应该做出努力。在这里,我定义了包装7-zip归档并提供底层数据接口的类。

这个类几乎不依赖于py7zlib包,该包允许我们在每次调用get方法时解压缩数据,并为我们提供存档中的文件数。我们还定义了__iter__,它将帮助我们在该对象上启动多进程映射,就像在迭代器上一样。

这个定义为我们提供了遍历归档的可能性,但是它允许我们并行随机访问内容吗?这是一个有趣的问题,我还没有在网上找到答案,但是如果我们深入研究py7zlib的源代码,我们可以回答这个问题。

在这里,我提供了来自pylzma的精简代码片段pylzma

我相信从上面的要点可以清楚地看出,每当同时读取多次归档时,就没有理由阻止它。

接下来,让我们快速介绍一下什么是网格和点云。首先是网格,它们是顶点、边和面的集合。顶点由空间中的(x,y,z)坐标定义,并指定有唯一编号。相应地,边和面是点对和三元组的组,并使用提到的唯一点ID进行定义。通常,当我们谈论“网格”时,我们指的是“三角形网格”,即由三角形组成的曲面。在Python中使用网格使用三角网格库要容易得多,例如,它提供了在内存中加载.obj文件的接口。要在jupyter笔记本中显示3D对象并与之交互,可以使用k3d库。

因此,我用下面的代码片段回答了这个问题:“如何用k3d在jupyter中绘制Atrimeshobject?”

其次,点云,它们是代表空间中对象的三维点阵列。许多3D扫描仪产生点云作为扫描对象的表示。出于演示目的,我们可以读取相同的网格并将其顶点显示为点云。

如上所述,3D扫描仪为我们提供了点云。让我们假设我们有一个网格数据库,我们想要在数据库中找到一个与扫描对象对齐的网格,也就是点云。为了解决这个问题,我们可以建议一种天真的方法。我们将从存档中搜索给定点云的点和每个网格之间的最大距离。如果对于某些网格,1e-4的距离会小一些,我们会认为这个网格与点云对齐。

最后,我们来到了多处理部分。请记住,我们的归档中有很多文件可能无法放在一起放在内存中,因此我们倾向于并行处理它们。为了实现这一点,我们将使用多处理池,它使用map或IMAP/IMAP_UNORDIZED方法处理用户定义函数的多次调用。MAP和IMAP之间影响我们的不同之处在于,MAP在将可迭代对象发送到工作进程之前将其转换为列表。如果归档文件太大而无法写入RAM,则不应该将其解压到Python列表中。在另一种情况下,它们的执行速度相似。

[Loading meshes: pool.map w/o manager] Pool of 4 processes elapsed time: 37.213207403818764 sec
[Loading meshes: pool.imap_unordered w/o manager] Pool of 4 processes elapsed time: 37.219303369522095 sec

在上面,您可以看到从适合内存的网格存档中简单读取的结果。

IMAP更进一步。让我们讨论如何实现找到靠近点云的网格的目标。这是数据,我们有5个来自斯坦福模型的不同网格。我们将通过向斯坦福兔子网格的顶点添加噪波来模拟3D扫描。data

当然,我们之前在下面对点云和网格顶点进行了规格化,以便在3D立方体中缩放它们。

为了计算点云和网格之间的距离,我们将使用IGL。最后,我们需要编写一个函数,该函数将在每个进程及其依赖项中调用。让我们用下面的片断来总结一下。

其中,READ_MESHES_GET_DISTANCES_POOL_IMAP是执行以下操作的中心函数:

  • 网格归档和多处理。池已初始化
  • 应用tqdm监视池进度,并手动完成整个池的性能分析
  • 执行的结果的输出

注意我们是如何将参数传递给IMAP的,使用zip(archive,itertools.repeat(Point_Cloud))从archive和point_cloud创建新的itearable。这允许我们将点云阵列粘贴到档案的每个条目,避免将档案转换为列表。

执行结果如下所示

100%|####################################################################| 5/5 [00:00<00:00,  5.14it/s]
100%|####################################################################| 5/5 [00:00<00:00, 5.08it/s]
100%|####################################################################| 5/5 [00:00<00:00, 5.18it/s]
[Process meshes: pool.imap w/o manager] Pool of 4 processes elapsed time: 1.0080536206563313 sec
armadillo.obj 0.16176825266293382
beast.obj 0.28608649819198073
cow.obj 0.41653845909820164
spot.obj 0.22739556571296735
stanford-bunny.obj 2.3699851136074263e-05

我们可以看到斯坦福兔子是离给定点云最近的网格。还可以看到,我们没有使用大量的数据,但是我们已经证明,即使我们在归档中有大量的网格,这个解决方案也是有效的。

多重处理使数据科学家不仅在三维计算机视觉领域,而且在机器学习的其他领域都取得了很好的表现。了解并行执行比循环内执行要快得多,这一点非常重要。这种差异变得非常明显,特别是在算法编写正确的情况下。大量的数据揭示了如果没有创造性的方法来利用有限的资源,这些问题就不会得到解决。幸运的是,Python语言及其丰富的库集合帮助我们数据科学家解决了这些问题。

原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/08/10/%e7%94%a8%e4%ba%8e3d%e6%95%b0%e6%8d%ae%e5%a4%84%e7%90%86%e7%9a%84python%e5%a4%9a%e5%a4%84%e7%90%86/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK