我想将tf.data.DataSet
与ppm图像一起使用,但是现成不支持此功能,因此我一直试图寻找可能的解决方法。
我创建了一个图像列表image_names
,其中存储了要导入数据集中的所有文件的名称。在TensorFlow教程之后,我编写了以下代码(用于jpeg图像):
def parse_function1(filename):
image_string = tf.read_file(filename)
image = tf.image.decode_jpeg(image_string, channels=3)
image = tf.image.convert_image_dtype(image, tf.float32)
return image
# Create a dataset, iterator and print some data
dataset = tf.data.Dataset.from_tensor_slices(image_names)
dataset = dataset.shuffle(len(image_names))
dataset = dataset.map(parse_function1, num_parallel_calls=1)
iterator = dataset.make_initializable_iterator()
next_element = iterator.get_next()
init_op = iterator.initializer
with tf.Session() as sess:
# Initialize the iterator
sess.run(init_op)
print(sess.run(next_element))
不幸的是,这不适用于ppm文件(没有tf.image.decode_ppm
),所以我试图创建一个替代的解析函数,该函数使用imageio从磁盘读取文件:
def parse_function2(filename):
img_raw = imageio.imread(filename)
img_tensor = tf.convert_to_tensor(img_raw, dtype=tf.float32)
return img_tensor
使用parse_function2
运行脚本会引发错误:
File ".local/lib/python3.7/site-packages/imageio/core/request.py", line 240, in _parse_uri
raise IOError("Cannot understand given URI: %s." % uri_r)
OSError: Cannot understand given URI: <tf.Tensor 'args_0:0' shape=() dtype=string>.
我的理解是参数filename
实际上是一个包含字符串值的张量,因此我尝试使用py_function
包装器构造数据集。不用打电话
dataset = dataset.map(parse_function2, num_parallel_calls=1)
我愿意
dataset = dataset.map(lambda x : tf.py_function(parse_function2, [x], Tout=[tf.float32]), num_parallel_calls=1)
现在我收到图像错误提示
File "/home/martin/.local/lib/python3.7/site-packages/imageio/core/request.py", line 240, in _parse_uri
raise IOError("Cannot understand given URI: %s." % uri_r)
OSError: Cannot understand given URI: <tf.Tensor: id=21, shape=(), dtype=string, numpy=b'/home/....
请问您如何解决此问题。您是否建议完全不使用tf.data.Dataset
而是编写自己的类?恐怕这将永远不会比原始的Dataset
类有效。
答案 0 :(得分:0)
尝试使用
image_raw = tf.io.read_file(image_path)
image = tf.image.decode_image(image_raw)