我选择了基于深度学习的脑肿瘤语义分割问题。我正在使用BRATS2015数据集。它有274例患者MRI扫描,每个大小为240x240x155。每个病人有四种治疗方式(T1,T2,T1c,FLAIR)。因此,我使用这些模式作为网络中的渠道。
在理想的世界中,我的3D UNet网络的输入可以在channels_last模式下具有形状(Batch_size,240,240,155,4)。但是,图形卡显然没有设备来处理这种大小的数据。因此,我需要把我的MRI扫描转换成补丁。
这就是我困惑的地方。对于单通道三维数据来说,获得补丁相对容易。为此,我们有许多库和助手函数。我面临的问题是为多模数据生成补丁,即带有通道的三维数据。
我查看了patchify
库,在这里我们可以使用下面的代码生成补丁
from patchify import patchify, unpatchify
#This will split the image into small images of shape [3,3,3]
patches = patchify(image, (3, 3, 3), step=1)
reconstructed_image = unpatchify(patches, image.shape)
但我不知道如何生成多模式补丁。是否有一种使用patchify
或任何其他库/助手函数来实现此操作的方法?
发布于 2021-08-07 14:50:28
您可能希望通过区块修补您的数据集。文件上说
输入n维数组的块视图(使用重步长)。块是输入数组的不重叠视图。
下面是一个虚拟的例子。
import numpy as np
from skimage.util.shape import view_as_blocks
# batch_size:3
# height:4
# width:6
# depth:8
# channels:4
arr = np.arange(3*4*6*8*4).reshape(3,4,6,8,4)
patches = view_as_blocks(arr,block_shape=(1,2,2,2,4))
print(patches.shape) # (3, 2, 3, 4, 1, 1, 2, 2, 2, 4)
# Print the first patch
print(patches[0,0,0,0,0,:,:,:,:,:])
# [[[[[ 0 1 2 3]
# [ 4 5 6 7]]
# [[ 32 33 34 35]
# [ 36 37 38 39]]]
# [[[192 193 194 195]
# [196 197 198 199]]
# [[224 225 226 227]
# [228 229 230 231]]]]]
patches.shape
可能看起来很混乱,下面是一个简短的解释。最后5个数字代表块形状(1,2,2,2,4),前5个数字代表相应尺寸的块数。或者,简单地说,arr.form/block_block会给您(3,2,3,4,1)。
请注意以下几点:
要做到这一点,您可以首先根据您的block_shape
为您的图像垫。
patches
将比arr
占用更多的存储空间。因此,将所有补丁保存到您的磁盘上,然后一个一个地将它们提供给您的模型是有意义的。https://stackoverflow.com/questions/68687832
复制相似问题