基于das的三维体处理

2024-03-29 15:56:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在探索三维交互式体积卷积与一些简单的模板使用dask。 让我解释一下我的意思:

  • 假设您有一个三维数据,您想通过Sobel变换处理(例如,获得L1或L2梯度)。在
  • 然后将输入的3D图像分成子卷(有一些重叠的边界–对于3x3x3的模具Sobel,它需要+2个样本重叠/填充)
  • 现在让我们假设您在整个3D体积上创建了一个Sobel 3D变换的延迟计算,但还没有执行它。在

现在最重要的部分是:

  • 我想写一个函数,从虚拟转换的数据中提取一些特定的2D部分。在
  • 最后让dask计算所有的东西:
    • 但我需要dask做的不是为我计算整个转换,然后提供一个部分。
      • 我需要它来执行那些任务,这些任务需要计算特定的二维转换图像切片。在

你认为有可能吗?

为了用图像来解释这一点,请将其视为三维区域分解(这是来自DWT的,但有利于说明from here):

illistration of domain decomposition

假设有一个函数可以使用dask计算整个体积的三维变换。 但我想得到的是转换后的3D数据的2D图像,它由LLL1、LLH1、HLH1、HLL1平面组成(基本上是一个单切片)。在

重要的部分不是计算整个子立方体,而是让dask以某种方式自动跟踪计算图中的依赖关系并只计算那些依赖关系。

请不要担心compute v.s.复制时间。 假设它有完美的比率。在

如果需要更多的澄清请告诉我! 谢谢你的帮助!在


Tags: 数据函数图像模板l1关系切片体积
2条回答

不是为了贬低@MRocklin精心设计的答案,而是为了补充更多内容。在

我也经常发现自己需要做一些事情,如边缘检测和其他图像处理技术的大规模数组数据。由于Dask是一个非常好的库,可以在大型数组数据上构建和探索这样的计算工作流,因此我们在一个名为dask-image的GitHub组织中为一些常见的图像处理技术组合了一些实用程序库。它们在很大程度上被设计成模仿SciPy的ndimageAPI。在

至于在Dask中使用Sobel运算符,可以使用来自dask-ndfilters(许可证)的^{}函数在Dask数组上执行此操作。它在引擎盖下的方块上处理适当的光环,返回一个新的达斯克阵列。在

由于SciPy的^{}函数(以及dask ndfilters的sobel)在一维上运行,因此需要映射到每个轴和堆栈上以获得完整的Sobel运算符结果。也就是说,这是很简单的。下面是一个简短的片段,展示了如何在随机Dask数组上执行此操作。还包括沿XZ平面切一片。尽管可以很容易地获取其他切片或对数据执行附加操作。在

希望这有帮助。:)

import dask.array as da
import dask_ndfilters as da_ndfilt

d = da.random.random((100, 120, 140), chunks=(25, 30, 35))
ds = da.stack([da_ndfilt.sobel(d, axis=i) for i in range(d.ndim)])
dsp = ds[:, :, 0, :]
asp = dsp.compute()

我听到一些问题。我会一一回答

  • Dask能否跟踪输出子集所需的任务并仅计算这些任务?

是的。延迟Dask操作生成依赖关系图。在下列情况下磁盘阵列此图是按块显示的。如果您的输出只依赖于图的一个子集,那么Dask将删除不必要的任务。这方面的深入文档是here,特别是cull优化。在

以这个100000乘100000数组为例

>>> x = da.random.random((100000, 100000), chunks=(1000, 1000))

假设我从中添加了几个1d切片

^{pr2}$

得到的优化图只足够计算输出

>>> graph = y._optimize(y.dask, y._keys())  # you don't need to do this
>>> len(graph)                              # it happens automatically
301

我们可以很快计算出结果:

In [8]: %time y.compute()
CPU times: user 3.18 s, sys: 120 ms, total: 3.3 s
Wall time: 936 ms
Out[8]: 
array([ 1.59069994,  0.84731881,  1.86923216, ...,  0.45040813,
        0.86290539,  0.91143427])

现在,这并不完美。它必须生产出我们两个切片接触到的所有1000x1000块。但你可以在那里控制粒度。在

简短回答:Dask将自动检查图形,只运行评估输出所需的任务。你不需要做任何特别的事来做这件事。在

  • 使用达斯克阵列?

也许吧。相关文档页在Overlapping Blocks with Ghost Cells上。磁盘阵列有方便的功能,便于写下来。但是它将创建内存中的副本。很多处在你这种地位的人觉得memcopy太慢了。Dask通常不支持就地计算,所以我们不能像正确的MPI代码那样高效。不过,我还是把性能问题留给你。在

相关问题 更多 >