如何在图像分割中使用 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])
反正可以正常使用
我有两组文件:遮罩和图像。 '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])
反正可以正常使用