【问题标题】:TensorFlow tf.data.Dataset API for medical imaging用于医学成像的 TensorFlow tf.data.Dataset API
【发布时间】:2019-04-14 11:28:06
【问题描述】:

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

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

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

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

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

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

皮埃尔-吕克

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    终于找到了解决问题的方法。

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

    我随后解码了 TFRecords。每个训练样本都被重新塑造成它包含在一个特征中的形状。我使用tf.stack() 方法将所有图像模式堆叠到一个堆栈中。我使用先前提取的切片裁剪堆栈(然后裁剪应用于堆栈中的所有图像)。我终于使用tf.random_crop() 方法获得了一些随机补丁,该方法允许我随机裁剪一个 4 维数组(高度、宽度、深度、通道)。

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

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

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

    感谢阅读,欢迎评论!

    【讨论】:

    • 感谢这篇文章。我一直在寻找类似的东西,但我不太明白“我首先裁剪对象的图像而不应用实际裁剪”这一行?
    • @samra 之后我切换到 PyTorch。用于研究目的要简单得多。我们创建了自己的库煤油 (github.com/banctilrobitaille/kerosene) 和 SAMItorch (github.com/sami-ets/SAMITorch)。
    猜你喜欢
    • 2021-11-30
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2019-08-16
    相关资源
    最近更新 更多