将tf.data.Dataset用于ppm文件

时间:2019-07-12 13:47:09

标签: tensorflow

我想将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类有效。

1 个答案:

答案 0 :(得分:0)

尝试使用

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