在 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 卷积层。
我正在尝试从 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 卷积层。