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



我是医学影像学的学生。我必须构建一个用于图像分割的神经网络。我有一个285名受试者的数据集,每个受试者都有4种模式(T1、T2、T1ce、FLAIR(+他们各自的分割基础真相。所有东西都是三维的,分辨率为240x240x155体素(这是BraTS数据集(。

正如我们所知,由于内存原因,我无法在GPU上输入整个图像。我必须对图像进行预处理,并将其分解为3D重叠补丁(40x40x40的子卷(,这是我用scikit-imageview_as_windows完成的,然后在TFRecords文件中序列化窗口。由于每个贴片在每个方向上与10个体素重叠,因此这些总和为每个体积5292个贴片。问题是,只有一个模态,每个TFRecords文件的大小为800GB。此外,我还必须计算它们各自的分割权重图,并将其存储为补丁。分段也作为补丁存储在同一文件中。

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

所以,我想我必须在每一个训练步骤之前,快速完成所有的预处理步骤(同时希望不要放慢训练速度(。我不能使用tf.data.Dataset.from_tensors(),因为我不能在RAM中加载所有内容。我不能使用tf.data.Dataset.from_tfrecords(),因为之前的预处理需要大量的存储空间,最终会用完。

问题是:在图像推理训练后重新加载模型的可能性下,我还能做些什么?

非常感谢您,如有任何其他细节,请随时询问。

Pierre Luc

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

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

之后我解码TFRecords。每个训练样本都将被重塑为特征中包含的形状。我使用tf.stack()方法将所有的图像模态堆叠到一个堆栈中。我使用之前提取的切片裁剪堆栈(然后裁剪应用于堆栈中的所有图像(。最后,我使用tf.random_crop()方法获得了一些随机补丁,该方法允许我随机裁剪一个4-D阵列(高度、宽度、深度、通道(。

我唯一还没有弄清楚的是数据扩充。由于所有这些都是以张量格式发生的,我不能使用普通Python和NumPy来旋转、剪切和翻转4-D数组。我需要在tf.Session()中进行,但我宁愿避免这种情况,并直接输入训练句柄。

为了进行评估,我在TFRecords文件中序列化每个文件只有一个测试主题。受试者也包含所有模态,但由于没有TensorFLow方法来提取4-D中的补丁,因此使用Scikit Learnextract_patches()方法对图像进行小补丁预处理。我将这些修补程序序列化到TFRecords。

通过这种方式,训练TFRecords要小得多。我可以使用批量预测来评估测试数据。

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

最新更新