广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何利用Python多处理库处理3D数据
  • 772
分享到

如何利用Python多处理库处理3D数据

2023-06-22 05:06:32 772人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

如何利用python多处理库处理3D数据,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。今天我们将介绍处理大量数据时非常方便的工具。我不会只告诉您可能在手册中找到

如何利用python多处理库处理3D数据,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

今天我们将介绍处理大量数据时非常方便的工具。我不会只告诉您可能在手册中找到的一般信息,而是分享一些我发现的小技巧,例如tqdm与 multiprocessingimap一起使用、并行处理档案、绘制和处理 3D 数据以及如何搜索如果您有点云,则用于对象网格中的类似对象。

那么我们为什么要求助于并行计算呢?如今,如果您处理任何类型的数据,您可能会面临与“大数据”相关的问题。每次我们有不适合 RAM 的数据时,我们都需要一块一块地处理它。幸运的是,现代编程语言允许我们生成在多核处理器上完美运行的多个进程(甚至线程)。(注意:这并不意味着单核处理器不能处理多处理。  这是关于该主题的堆栈溢出线程。)

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

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

类 ArcHive7z(基础):def __init__ ( self , file , passWord = None ):# ...自我。文件={}# ...对于信息的文件。文件:#创建一个知道磁盘位置的ArchiveFile实例file = ArchiveFile ( info , pos , src_pos , folder , self , maxsize = maxsize )# ...自我。文件。追加(文件)# ...自我。文件映射。更新([(X。文件名,X)为X的自我。文件])#从files_map字典返回ArchiveFile的方法def getmember ( self , name ):if isinstance ( name , ( int , long )):尝试:回归自我。文件[名称]除 了 IndexError:返回无回归自我。文件映射。获取(名称,无)类 Archive7(基础):定义读取(自我):# ...对于水平,编码器在枚举(自我。_folder。编码器):# ...#获取解码器并解码底层数据data = getattr ( self , decoder ) ( coder , data , level , num_coders )返回数据

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

您可能知道,可以创建一个 Python 类,从中可以实例化可迭代对象。该类应满足以下条件:覆盖__getitem__返回self和__next__返回后续元素。我们绝对遵守这条规则。

上面的定义为我们提供了遍历存档的可能性,但 它是否允许我们 并行随机访问内容,这是一个有趣的问题,我在网上没有找到答案,但我们可以研究源代码py7zlib并尝试自己回答。

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

类 Archive7z(基础):def __init__ ( self , file , password = None ):# ...自我。文件={}# ...对于信息的文件。文件:#创建一个知道磁盘位置的ArchiveFile实例file = ArchiveFile ( info , pos , src_pos , folder , self , maxsize = maxsize )# ...自我。文件。追加(文件)# ...自我。文件映射。更新([(X。文件名,X)为X的自我。文件])#从files_map字典返回ArchiveFile的方法def getmember ( self , name ):if isinstance ( name , ( int , long )):尝试:回归自我。文件[名称]除 了 IndexError:返回无回归自我。文件映射。获取(名称,无)类 Archive7z(基础):定义读取(自我):# ...对于水平,编码器在枚举(自我。_folder。编码器):# ...#获取解码器并解码底层数据data = getattr ( self , decoder ) ( coder , data , level , num_coders )返回数据

在代码中,您可以看到在从存档中读取下一个对象期间调用的方法。我相信从上面可以清楚地看出,只要同时多次读取存档,就没有理由阻止存档。

接下来,我们快速介绍一下什么是网格和点云。

首先,网格是顶点、边和面的集合。顶点由空间中的(x,y,z) 坐标定义并分配有唯一编号。边和面是相应的点对和三元组的组,并用提到的唯一点 id 定义。通常,当我们谈论“网格”时,我们指的是“三角形网格”,即由三角形组成的表面。使用trimesh库在 Python 中使用网格要容易得多。例如,它提供了一个接口来加载.obj内存中的文件。要在jupyter notebook一个3D 对象中显示和交互,可以使用k3d库。

所以,用下面的代码片段我回答这个问题:“你怎么绘制trimesh的对象jupyter有k3d?”

进口饰面导入k3d使用 open ( w. /data/meshes/stanford-bunny, obj")作为 f : bunny_mesh =网眼。力口载(f , 'obj')情节=k3d。情节()网格= k3d。网格 (bunny_mesh . vertices> bunny_mesh . faces) 绘图上网格情节。显示。

如何利用Python多处理库处理3D数据

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

进口饰面导入k3d使用 open ( w. /data/meshes/stanford-bunny, obj")作为 f :   bunny_mesh =网眼。力口载(f , 'obj')情节=k3d。情节()云=k3d。点(bunny_mesh . vertices , point_size = 0. 0001 , shader = "flat")情节+=云情节。显示。

如何利用Python多处理库处理3D数据

k3d绘制的点云

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

最后,我们来到了多处理部分。请记住,我们的存档中有大量文件可能无法放在一起放在内存中,因为我们更喜欢并行处理它们。为了实现这一点,我们将使用 multiprocessing Pool,它使用map或imap/imap_unordered方法处理用户定义函数的多次调用。map和imap影响我们的区别在于,map在将其发送到工作进程之前将可迭代对象转换为列表。如果存档太大而无法写入 RAM,则不应将其解压缩到 Python 列表中。换句话说,两者的执行速度是相似的。

[加载网格:pool.map w/o manager] 4 个进程的池经过时间:37.213207403818764 秒[加载网格:pool.imap_unordered w/o manager] 4 个进程的池经过时间:37.219303369522095 秒

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

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

将numpy导入为npA numpy。随机 导入 defaultingdef nORMalize_pc (点):   点额=点额-点额。平均值(轴=0)[无,:]   分布=np。linalg<>范数(点,轴=1) scaled_points =点 / dists中。最大值。 返回 scaled_pointsdef load_bunny_pc ( bunny_path ):   标准差=lₑ-3   使用 open ( bunny_path )作为 f : bunny_mesh = load_mesh ( f )   #标准化后云   scaled_bunny = normalize_pc ( bunny_mesh . vertices )   #向点云添加一些噪声 rng = defaulting ()   噪音=rng。正常(0. 0 , STD , scaled_bunny . shape ) 畸变兔子=缩放兔子+噪声    返回 di st ort ed_bunny

当然,我们之前在下面将点云和网格顶点归一化,以在 3D 立方体中缩放它们。

要计算点云和网格之间的距离,我们将使用igl。为了完成,我们需要编写一个函数来调用每个进程及其依赖项。让我们用下面的代码片段来总结一下。

导入迭代工具导入时间将 numpy 导入为 np  nwnpyo 随机导入 default rng面以1 口口如 进进从A多处理导入池de£ load_mesh ( obj_file ):   目二 trimesh。力口载(obj_file , ' obj')   返回网格def get_max__dist ( basjmesh , point_cloud ):   distance_sq , mesh_face__indexes , _ = igl。point_mesh_squared_distance (       点云,       basjmesho 顶点,       basjmesho 面孔   )   返回distancjsq。最大值0def 1 oad_mesh__get_di stance ( args ):   obj_file , point__cloud = args [ 0 ]/ args [ 1 ]   网格二 load_mesh ( obj_file )   网。顶点=RormaliNe_pc (网格。顶点)   max_dist = get_max_dist (网格,点云)   返回 max__distde£ read_meshes__get__di stances_pool__imap ( archive_path , point_cloud , nwn_proc , nwn_i terations ):   #在疝中进行向格“理   elapsed__time =[]   为一在 范围(nujn-i terati ons ):      归档二 MeshesArchive (ARCHIVE-PATH)      池二池(nwn_proc )      开始=时间。时间0      导致=名单(tqdm(池。IMAP (         1 o ad_m e sh__ge t_di s t anc e ,         zip (存档,itertoolso 重复(point_cloud)),      ),总计=len辱档)))      池。关闭0      池。加入o      结束=时间。时间0      elapsed time o追加(结束一开始)   print ( F [Process meshes: pool, imap] {num_proc}个进程的池经过的时间:{np. array (elapsed_time). mean()} sec )   对于 name , di st in zip ( archive . namesjist , result ): 打印(r{name} {dist}")   返回结果如果 _name_ ==   bunny_path =  /data/meshes/stanford-bunny, obj"   archive_path = /data/meshes. 7zff   nwn_proc = 4   num_iterations = 3   point__cloud - load__bunny_pc ( bunny_path )     read_meshes__get__di stances_pool_no_manager__imap ( archive_path ,point_cloud , nwn_proc , num.iterations )

这read_meshes_get_distances_pool_imap是一个中心函数,其中完成以下操作:

  • MeshesArchive并multiprocessing.Pool初始化

  • tqdm 用于观察池进度,并手动完成整个池的分析

  • 执行结果的输出

请注意我们如何传递参数以imap从archive和point_cloud使用zip(archive, itertools.repeat(point_cloud)). 这允许我们将点云数组粘贴到存档的每个条目上,避免转换archive为列表。

执行结果如下:

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]

[进程网格:pool.imap w/o manager] 4 个进程的池经过时间:1.0080536206563313 秒

犰狳.obj 0.16176825266293382

野兽.obj 0.28608649819198073

牛.obj 0.41653845909820164

现货.obj 0.22739556571296735

stanford-bunny.obj 2.3699851136074263e-05

我们可以注意到斯坦福兔子是最接近给定点云的网格。还可以看出,我们没有使用大量数据,但我们已经证明,即使我们在存档中有大量网格,该解决方案也能奏效。

多处理使数据科学家不仅在 3D 计算机视觉中而且在机器学习的其他领域中都取得了出色的表现。理解并行执行比在循环内执行快得多是非常重要的。差异变得显着,尤其是在正确编写算法时。大量数据揭示了如果没有关于如何使用有限资源的创造性方法就无法解决的问题。幸运的是,Python 语言及其广泛的库集帮助我们数据科学家解决了这些问题。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网Python频道,感谢您对编程网的支持。

--结束END--

本文标题: 如何利用Python多处理库处理3D数据

本文链接: https://www.lsjlt.com/news/302773.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何利用Python多处理库处理3D数据
    如何利用Python多处理库处理3D数据,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。今天我们将介绍处理大量数据时非常方便的工具。我不会只告诉您可能在手册中找到...
    99+
    2023-06-22
  • 利用Python多处理库处理3D数据详解
    今天我们将介绍处理大量数据时非常方便的工具。我不会只告诉您可能在手册中找到的一般信息,而是分享一些我发现的小技巧,例如tqdm与 multiprocessing​imap​​一起使用...
    99+
    2022-11-12
  • 如何利用 Python 处理大数据?
    Python 是一种高级编程语言,最初是为编写脚本而设计的,但是随着时间的推移,它已经成为数据科学和大数据处理的主要语言之一。本文将介绍如何使用 Python 处理大数据。 什么是大数据? 大数据是指数据量太大,以至于无法使用传统的数据处理...
    99+
    2023-07-10
    spring git 大数据
  • python 数据库处理
    # -*- coding:utf-8 -*- #!/bin/env python ''' #Auth:karl #Function: ...
    99+
    2022-10-18
  • python如何处理SQLite数据库
    本篇内容主要讲解“python如何处理SQLite数据库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python如何处理SQLite数据库”吧!一、安装pip3 install&nb...
    99+
    2023-06-29
  • 利用python做表格数据处理
    目录技术背景python对Excel表格的处理vaex的安装与使用vaex的安装性能对比数据格式转换总结概要技术背景 数据处理是一个当下非常热门的研究方向,通过对于大型实际场景中的...
    99+
    2022-11-12
  • 如何利用python处理原始音频数据
    目录一、基础知识二、转换函数三、片段特征函数四、片段操作一、基础知识 PCM(pulse code modulation) ,即脉冲编码调制,是将模拟信号转为数字信号的一种编码系统。...
    99+
    2022-11-12
  • 实时数据处理:利用Go WaitGroup处理数据流
    在Go语言中,可以使用`sync.WaitGroup`来处理实时数据流。`sync.WaitGroup`是一个计数信号量,用来等待一...
    99+
    2023-10-08
    Golang
  • 如何利用Python处理excel表格中的数据
    目录一、基础、常用方法二、提高三、出错总结一、基础、常用方法 1. 读取excel 1、导入模块: import xlrd 2、打开文件: x1 = xlrd.open_workb...
    99+
    2022-11-13
  • 如何用Python处理大数据?
    Python是一种非常流行的编程语言,它在处理大数据方面表现突出。Python的易用性和灵活性使得它成为了处理大数据的首选语言之一。本文将介绍如何使用Python处理大数据。 使用Pandas处理大数据 Pandas是Python中非常...
    99+
    2023-11-04
    大数据 二维码 自然语言处理
  • 如何快速用Python处理3万多条数据
    这篇文章给大家介绍如何快速用Python处理3万多条数据,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。应用场景:工作中经常遇到大量的数据需要整合、去重、按照特定格式导出等情况。如果用 Excel 操作,不仅费时费力,还...
    99+
    2023-06-16
  • 如何利用Python处理海量自然语言数据?
    自然语言处理(NLP)是人工智能领域中的一个重要分支,它涉及到计算机如何处理和分析人类语言。在现代社会中,海量的自然语言数据被广泛应用于各个领域,如搜索引擎、社交媒体、自然语言对话系统等。因此,处理海量自然语言数据是一个重要的挑战。本文将...
    99+
    2023-10-13
    大数据 自然语言处理 同步
  • 如何利用Python和Numpy进行高效数据处理?
    当今时代,数据处理已经成为了各个行业的必备技能。而Python和Numpy作为数据科学领域中最受欢迎的工具之一,它们的高效性和易用性已经得到了广泛的认可。在本文中,我们将会介绍一些Python和Numpy的高效数据处理技巧,并且会穿插一些演...
    99+
    2023-08-11
    日志 numy load
  • Python 实时数据处理:如何利用 bash 优化数据流程?
    Python 是一个强大的数据处理工具,在数据分析和机器学习领域有着广泛的应用。在实际应用中,我们经常需要处理实时数据流,这就需要高效的数据处理流程来保证数据准确性和实时性。在本文中,我们将介绍如何使用 Python 和 bash 优化数...
    99+
    2023-11-14
    实时 关键字 bash
  • 在 Python 中利用Pool 进行多处理
    目录为什么要引入线程池练习为什么要引入线程池 如果在程序中经常要用到线程,频繁的创建和销毁线程会浪费很多硬件资源,所以需要把线程和任务分离。线程可以反复利用,省去了重复创建的麻烦。在...
    99+
    2022-11-10
  • Python如何处理大数据?
    Python如何处理大数据? 在现代数据处理技术中,大数据处理是一个非常重要的领域。Python作为一种高效、易学、易用的编程语言,也在大数据处理领域中占据着重要的地位。Python可以通过多种方式处理大数据,包括使用Python内置库、第...
    99+
    2023-10-21
    http 大数据 对象
  • 怎么在c#中利用多线程处理多个数据
    本篇文章为大家展示了怎么在c#中利用多线程处理多个数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。概述多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多...
    99+
    2023-06-14
  • 如何利用Python处理大数据文件中的对象?
    随着数据量的快速增长,处理大数据已成为许多企业和组织所面临的最大挑战之一。Python语言因其简单易学、灵活和高效的特点,成为了处理大数据的首选语言之一。本文将介绍如何利用Python处理大数据文件中的对象,为读者提供一些实用的技巧和工具。...
    99+
    2023-10-26
    对象 文件 大数据
  • Python利用jmespath模块进行json数据处理
    jmespath是python的第三方模块,是需要额外安装的。它在python原有的json数据处理上 做出了很大的贡献,至于效果接下来试试就知道了有多方便。 话不多说,我们直接进入...
    99+
    2022-11-13
  • 怎么利用python处理原始音频数据
    本篇内容介绍了“怎么利用python处理原始音频数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、基础知识PCM(pulse code ...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作