0

我选择了使用深度学习对脑肿瘤进行语义分割的问题。我正在使用 BRATS2015 数据集。它有 274 个患者 MRI 扫描,每个扫描大小为 240x240x155。每位患者有四种模式(T1、T2、T1c、FLAIR)。所以我将这些模式用作网络中的渠道。

在理想情况下,我的 3D UNet 网络的输入可以在 channels_last 模式下具有形状 (Batch_size, 240, 240, 155, 4)。但是显卡显然不具备处理这种大小的数据的能力。因此,我需要将我的 MRI 扫描转换为补丁。

这就是我感到困惑的地方。获取单通道 3D 数据的补丁相对容易。为此,我们有许多库和辅助函数。我面临的问题是为多模式数据生成补丁,即带有通道的 3D 数据。

  • 我已经想到了为每个通道分别生成补丁并连接最终结果的想法,但我相信如果我单独处理它而不是直接为多模式数据生成补丁,我可能会丢失一些多通道信息。

我查看了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或任何其他库/帮助函数来做到这一点?

4

1 回答 1

0

您可能想通过view_as_blocks修补您的数据集。文件说

输入 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.shape/block_shape 会给你 (3, 2, 3, 4, 1)。

需要注意的几点:

  1. 每个维度(block_shape)必须平均划分为 arr_in 的相应维度。

为此,您可以先根据您的block_shape.

  1. patches将比arr. 因此,将所有补丁保存到您的磁盘中,然后将它们一一提供给您的模型是有意义的。
于 2021-08-07T14:50:28.763 回答