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

Extracting patches from 3D image in Python

我正在尝试从 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

有没有办法重塑我的补丁,或者有更好的通用方法来解决这个问题?

问题是如果不复制数据就无法创建重塑数组,因此您需要那么多 space。天真的选择是分块或批处理您的数据。大致(忽略边缘和重叠效应):

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 卷积层。