使用tf.data读取Tensorflow-2.0中的图像和蒙版(用于分割问题)

时间:2019-10-01 12:54:30

标签: tensorflow tensorflow-datasets

我正在尝试通过点击this链接来读取图像数据集以解决分割问题(​​一类)。我的主文件夹包含两个文件夹,即(a)img(b)maskimg包含图像样本,mask包含相应的蒙版。我的方法是生成图像的路径,然后更改字符串路径(即img-> mask)。我修改了提供的here代码,现在看起来是:

def process_path(file_path):
  file_path_str = str(file_path)
  file_path_mask = file_path_str.replace('img', 'mask') 
  # load the raw data from the file as a string
  img = tf.io.read_file(file_path)
  img = decode_img(img)

  mask = tf.io.read_file(str(file_path_mask))
  mask = decode_mask(mask)
  return img, mask

但是,当我尝试使用以下方法查看样本大小时:

for image, mask in labeled_ds.take(1):
  print("Image shape: ", image.numpy().shape)
  print("Mask shape: ", mask.numpy().shape)

我遇到以下错误:

InvalidArgumentError: NewRandomAccessFile failed to Create/Open: Tensor("arg0:0", shape=(), dtype=string) : The filename, directory name, or volume label syntax is incorrect. ; Unknown error [[{{node ReadFile_1}}]] [Op:IteratorGetNextSync]

问题:关于如何从给定的文件夹中读取图像和遮罩而没有以上错误的任何建议?

2 个答案:

答案 0 :(得分:0)

我们可以使用tf.regex.replace重命名字符串。因此,代替使用python字符串,请使用:file_path_mask = tf.regex_replace(file_path, "img", "mask")。对于TF 2.0,请使用tf.strings.regex_replace

答案 1 :(得分:0)

类似问题的替代解决方法。我有200个(nb_of_images = 200)形状(512、512)的灰度图像加载为np.array,还有200个也具有形状(512、512)并作为np.array加载的二进制蒙版。在for循环中,我拍摄所有图像,将它们转换为EagerTensor(使用tf.convert_to_tensor),通过tf.float32 arg将其投射到dtype,添加一维:

img = img[:, :, tf.newaxis]

这样我的图像现在EagerTensor的形状(512、512、1),最后将它们附加到名为images的外部列表中。

在同一循环中,我对掩码进行了完全相同的操作,最后将它们附加到名为masks的外部列表中。

for循环完成之后,我基本上有了两个EagerTensors列表,

len(images) == len(masks) == nb_of_images

最后,我将两个列表重新转换为tf.Tensor:

images_tf = tf.convert_to_tensor(images)  # convert list back to tf.Tensor
masks_tf = tf.convert_to_tensor(masks)  # convert list back to tf.Tensor

最后我用以下方法创建tf.data.Dataset

dataset = tf.data.Dataset.from_tensor_slices((images_tf, masks_tf))  # create tf.data.Dataset