在Python中从3D图像中提取补丁

时间:2020-03-22 17:27:33

标签: python scikit-image

我正在尝试从3D图像中提取补丁作为神经网络的训练数据。但是在重塑补丁以获取更大图像时遇到了麻烦。我目前正在使用 view_as_windows ,但是如果其他方法更有用,则可以使用其他方法。

我的代码如下所示的示例:

import numpy as np
from skimage.util import view_as_windows

kernel_size = 17
V = np.random.rand(150,150,150)
X = view_as_windows(V,(kernel_size,kernel_size,kernel_size),step=1)

这将创建一个大小为(134,134,134,17,17,17)的numpy数组。现在,理想情况下,我希望将其重塑为(2406104,4913)的大小,但是尝试重塑会导致分配错误:

X = X.reshape(134**3,17**3)
MemoryError: Unable to allocate 88.1 GiB for an array with shape (134, 134, 134, 17, 17, 17) and data type float64

有什么方法可以重塑补丁,还是有更好的一般方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题在于,如果不复制数据就无法创建重构数组,因此需要那么多空间。天真的选项是对数据进行分块或批处理。大致(忽略边缘和重叠效果):

xsize, ysize, zsize = V.shape
xbatch, ybatch, zbatch = (34, 34, 34)
batch_size = xbatch * ybatch * zbatch
for i, j, k in itertools.product(
    range(xsize // xbatch), range(ysize // ybatch), range(zsize // sbatch)
):
    Xbatch = X[i * xbatch : (i+1) * xbatch,
               j * ybatch : (j+1) * ybatch,
               k * zbatch : (k+1) * zbatch]
    Xbatch_linear = Xbatch.reshape((batch_size, -1))
    # ... do your deep learning on the batch

更长的答案是,您正在做的事情(遍历所有17x17x17补丁)在该字段中具有一个名称,称为 convolution ,而卷积神经网络为您做到这一点,而无需创建昂贵的副本的数据。简而言之,以这种方式使用view_as_windows是一个巧妙的小窍门,了解卷积与卷积的等效性很有用,但这不是完成此工作的正确工具。为此,您应该在选择的深度学习库中使用3D卷积层。