繁体   English   中英

在 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

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

问题是如果不复制数据就无法创建重新整形的数组,因此您需要那么多空间。 天真的选择是对数据进行分块或批处理。 粗略地(忽略边缘和重叠效果):

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 补丁)在该领域有一个名称,称为卷积,卷积神经网络为您完成此操作,而无需创建昂贵的数据副本。 简而言之,以这种方式使用view_as_windows是一个巧妙的小技巧,理解 this 与卷积的等价性很有用,但它不是这项工作的正确工具。 为此,您应该在您选择的深度学习库中使用 3D 卷积层。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM