用于医学成像的TensorFlow tf.data.Dataset API

时间:2018-12-07 03:51:19

标签: python tensorflow

我是医学影像专业的学生。我必须构建一个用于图像分割的神经网络。我有285个主题的数据集,每个主题都有4种方式(T1,T2,T1ce,FLAIR)+各自的细分基础事实。一切都是3D的,分辨率为240x240x155体素(这是BraTS数据集)。

我们知道,由于内存原因,我无法在GPU上输入整个图像。我必须对图像进行预处理,并将它们分解为3D重叠的补丁(子体积为40x40x40),这是我使用scikit-image view_as_windows进行的,然后将窗口序列化为TFRecords文件。由于每个面片在每个方向上重叠10个体素,因此每个体积的总和为5,292个面片。问题是,只有1种方式,每个TFRecords文件的大小为800 GB。另外,我必须计算它们各自的分割权重图,并将其存储为补丁。分段也作为补丁存储在同一文件中。

最终我必须包括所有其他模式,这将需要不小于TB的存储空间。我还必须记住,我还必须在背景和前景之间进行等效数量的补丁采样(类平衡)。

因此,我想我必须在每个训练步骤之前即时进行所有预处理步骤(同时希望也不要减慢训练速度)。我无法使用tf.data.Dataset.from_tensors(),因为无法将所有内容加载到RAM中。我无法使用tf.data.Dataset.from_tfrecords(),因为在对整个内容进行预处理之前会占用大量存储空间,最终我会用光。

问题是:还有什么让我做清楚的事情,并有可能在训练图像推断后重新加载模型?

非常感谢您,随时询问其他详细信息。

Pierre-Luc

1 个答案:

答案 0 :(得分:1)

最后,我找到了解决问题的方法。

我首先裁剪对象的图像,而不应用实际的裁剪。我只测量将体积裁剪到仅大脑所需的切片。然后,我将所有数据集图像序列化为一个TFRecord文件,每个训练示例都是图像模态,原始图像的形状和切片(保存为Int64功能)。

我随后解码TFRecords。将每个训练样本重塑为要素中包含的形状。我使用tf.stack()方法将所有图像模态堆叠到堆栈中。我使用先前提取的切片对堆栈进行裁剪(然后裁剪将应用于堆栈中的所有图像)。我终于使用tf.random_crop()方法获得了一些随机补丁,该方法使我可以随机裁剪4维数组(高,宽,深,通道)。

我唯一还没有弄清楚的是数据扩充。由于所有这些都是以Tensors格式发生的,因此我无法使用普通的Python和NumPy旋转,剪切和翻转4-D数组。我需要在tf.Session()中进行此操作,但是我想避免这种情况,直接输入训练手柄。

为了进行评估,我在TFRecords文件中序列化每个文件仅一个测试对象。测试对象也包含所有模态,但是由于没有TensorFLow方法可以提取4-D图像中的色块,因此可以使用Scikit-Learn extract_patches()方法以小色块对图像进行预处理。我将这些补丁序列化为TFRecords。

这样,训练TFRecords就小得多。我可以使用批量预测来评估测试数据。

感谢阅读并随时发表评论!