我正在尝试通过点击this链接来读取图像数据集以解决分割问题(一类)。我的主文件夹包含两个文件夹,即(a)img
(b)mask
。 img
包含图像样本,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]
问题:关于如何从给定的文件夹中读取图像和遮罩而没有以上错误的任何建议?
答案 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