如何在图像分割中使用 tf.Dataset 和 TIFF 文件?

How to use tf.Dataset with TIFF files in image segmentation?

我有两组文件:遮罩和图像。 'tensorflow'中没有tiff解码器,但是有'tfio.experimental'。 Tiff 文件有超过 4 个通道。

此代码无效:

    import numpy as np
    import tiffile as tiff
    import tensorflow as tf

    for i in range(100):
      a = np.random.random((30, 30, 8))
      b = np.random.randint(10, size = (30, 30, 8))
      tiff.imsave('new1//images'+str(i)+'.tif', a)
      tiff.imsave('new2//images'+str(i)+'.tif', b)

    import glob
    paths1 = glob.glob('new1//*.*')
    paths2 = glob.glob('new2//*.*')

    def load(image_file, mask_file):
      image = tf.io.read_file(image_file)
      image = tfio.experimental.image.decode_tiff(image)

      mask = tf.io.read_file(mask_file)
      mask = tfio.experimental.image.decode_tiff(mask)

      input_image = tf.cast(image, tf.float32)
      mask_image = tf.cast(mask, tf.uint8)
      return input_image, mask_image

    AUTO = tf.data.experimental.AUTOTUNE
    BATCH_SIZE = 32

    dataloader = tf.data.Dataset.from_tensor_slices((paths1, paths2))

    dataloader = (
    dataloader
    .shuffle(1024)
    .map(load, num_parallel_calls=AUTO)
    .batch(BATCH_SIZE)
    .prefetch(AUTO)
    )

不可能将整个数据集保存在内存中,保存到 numpy 数组也没有提供简单的解决方案。虽然上面提供的代码直接没有报错。但是图像的形状是 (None, None, None)

'model.fit' 给出错误

有没有其他方法可以保存数组?我只看到在自定义训练期间手动输入随机批次的蛮力解决方案。

我找到了我的问题的解决方案:DataGenerator 允许处理任何文件

class Gen(tf.keras.utils.Sequence):

    def __init__(self, x_set, y_set, batch_size):
        self.x, self.y = x_set, y_set
        self.batch_size = batch_size

    def __len__(self):
        return math.ceil(len(self.x) / self.batch_size)

    def __getitem__(self, idx):
        batch_x = self.x[idx * self.batch_size:(idx + 1) *
        self.batch_size]
        batch_y = self.y[idx * self.batch_size:(idx + 1) *
        self.batch_size]

        return np.array([
            tiff.imread(file_name_x)
               for file_name_x in batch_x]), np.array([
            tiff.imread(file_name_y)
               for file_name_y in batch_y])

反正可以正常使用