首页 > 解决方案 > 将 tf.data.Dataset 用于 ppm 文件

问题描述

我想使用tf.data.DataSetppm 图像,但不支持开箱即用,我一直在努力寻找可能的解决方法。

我创建了一个图像列表,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)

现在我收到一个 imageio 错误说

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课程那样高效。

标签: tensorflow

解决方案


尝试使用

image_raw = tf.io.read_file(image_path)
image = tf.image.decode_image(image_raw)

推荐阅读