【问题标题】:Saving image files in Tensorflow在 TensorFlow 中保存图像文件
【发布时间】:2016-01-14 06:30:17
【问题描述】:

我刚开始使用 Tensorflow,我有一个新手问题。

我知道 Tensorflow 是关于神经网络的,但我只是从它的机制开始。我试图让它加载、调整大小、翻转和保存两个图像。应该是一个简单的操作吧,它让我从基础开始。

到目前为止,这是我的代码:

import tensorflow as tf
import numpy as np

print("resizing images")

filenames = ['img1.png', 'img2.png' ]
filename_queue = tf.train.string_input_producer(filenames, num_epochs=1)

reader = tf.WholeFileReader()
key,value = reader.read(filename_queue)
images = tf.image.decode_png(value)

resized = tf.image.resize_images(images, 180,180, 1)
resized.set_shape([180,180,3])

flipped_images = tf.image.flip_up_down(resized)

resized_encoded = tf.image.encode_jpeg(flipped_images,name="save_me")

init = tf.initialize_all_variables()
sess = tf.Session()

with sess.as_default():
  tf.train.start_queue_runners()
  sess.run(init)

  f = open("/tmp/foo1.jpeg", "wb+")
  f.write(resized_encoded.eval())
  f.close()

  f = open("/tmp/foo2.jpeg", "wb+")
  f.write(resized_encoded.eval())
  f.close()

它工作正常,调整两个图像的大小并保存它们。但它总是以错误结束:

W tensorflow/core/common_runtime/executor.cc:1076] 0x7f97240e7a40
 Compute status: Out of range: Reached limit of 1

我显然做错了什么。如果我去掉 num_epochs=1,那么它就不会出错。

我有几个问题:

我该如何正确地做到这一点?

另外,如果我想保留从 filename_queue 到最后的原始文件名,以便我可以使用原始名称保存它们,我该怎么做?我怎么知道我需要保存多少文件?假设我通过读取目录来制作文件名列表。我尝试了很多不同的事情,但我永远无法知道我是如何知道何时到达终点的。

我调用 resized_encoded.eval() 两次对我来说似乎很奇怪。

谢谢,我确信这是一个非常基本的问题,但我不明白这是如何工作的。

编辑:我创建了一个更简单的行为演示:

import tensorflow as tf
import numpy as np

filenames = ['file1.png', 'file2.png' ]

filename_queue = tf.train.string_input_producer(filenames, 
                        num_epochs=1, name="my_file_q")

reader = tf.WholeFileReader()
key,value = reader.read(filename_queue)
init = tf.initialize_all_variables()

sess = tf.Session()

with sess.as_default():
  print("session started")

  sess.run(init)

  coord = tf.train.Coordinator()
  threads = tf.train.start_queue_runners(coord=coord)

  for i in range (2):
    print(key.eval())

  coord.request_stop()
  coord.join(threads)

这给出了同样的警告。我不明白为什么。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    这个警告是完全正常的。如TensorFlow API中所述

    num_epochs:整数(可选)。如果指定,则 string_input_producer 之前从 string_tensor num_epochs 次生成每个字符串 生成 OutOfRange 错误。如果没有指定, string_input_producer 可以循环遍历 string_tensor 中的字符串 无限次。

    为什么这很重要,您可能会问。在我看来,我已将您的代码重构为更易于理解的内容。让我解释一下。

    import tensorflow as tf
    import numpy as np
    import os
    from PIL import Image
    
    cur_dir = os.getcwd()
    print("resizing images")
    print("current directory:",cur_dir)
    
    def modify_image(image):
        resized = tf.image.resize_images(image, 180, 180, 1)
        resized.set_shape([180,180,3])
        flipped_images = tf.image.flip_up_down(resized)
        return flipped_images
    
    def read_image(filename_queue):
        reader = tf.WholeFileReader()
        key,value = reader.read(filename_queue)
        image = tf.image.decode_jpeg(value)
        return image
    
    def inputs():
        filenames = ['img1.jpg', 'img2.jpg' ]
        filename_queue = tf.train.string_input_producer(filenames,num_epochs=2)
        read_input = read_image(filename_queue)
        reshaped_image = modify_image(read_input)
        return reshaped_image
    
    with tf.Graph().as_default():
        image = inputs()
        init = tf.initialize_all_variables()
        sess = tf.Session()
        sess.run(init)
        tf.train.start_queue_runners(sess=sess)
        for i in xrange(2):
            img = sess.run(image)
            img = Image.fromarray(img, "RGB")
            img.save(os.path.join(cur_dir,"foo"+str(i)+".jpeg"))
    

    在上面的代码中,如果您明确设置 num_epochs=2,那么正如 API 建议的那样,string_input_producer 会循环遍历 string_tensor 中的字符串 2 次。由于 string_tensor 只有 2 个文件名,队列中填充了 4 个文件名。如果我将 for 循环更改为:

    for i in xrange(5)
    

    那么这会出错。但是,如果我将其保留为 4,那就没问题了。再举一个例子。如果我不放num_epochs,那么按照建议,它可以循环无限次。放:

    for i in xrange(100)
    

    因此不会出错。我希望这能回答你的问题。

    编辑:我意识到你还有更多问题。

    另外,如果我想一直保留原始文件名 filename_queue 一直到最后,所以我可以用 原来的名字,我该怎么做?我怎么知道我有多少文件 需要保存吗?假设我通过读取一个文件名列表 目录。我尝试了很多不同的东西,但我永远找不到 我怎么知道我什么时候到达终点。

    如果你想保留原始文件名,那么你的方法需要返回文件名。这是下面的代码。

    import tensorflow as tf
    import numpy as np
    import os
    from PIL import Image
    
    cur_dir = os.getcwd()
    print("resizing images")
    print("current directory:",cur_dir)
    
    def modify_image(image):
        resized = tf.image.resize_images(image, 180, 180, 1)
        resized.set_shape([180,180,3])
        flipped_images = tf.image.flip_up_down(resized)
        return flipped_images
    
    def read_image(filename_queue):
        reader = tf.WholeFileReader()
        key,value = reader.read(filename_queue)
        image = tf.image.decode_jpeg(value)
        return key,image
    
    def inputs():
        filenames = ['img1.jpg', 'img2.jpg' ]
        filename_queue = tf.train.string_input_producer(filenames)
        filename,read_input = read_image(filename_queue)
        reshaped_image = modify_image(read_input)
        return filename,reshaped_image
    
    with tf.Graph().as_default():
        image = inputs()
        init = tf.initialize_all_variables()
        sess = tf.Session()
        sess.run(init)
        tf.train.start_queue_runners(sess=sess)
        for i in xrange(10):
            filename,img = sess.run(image)
            print (filename)
            img = Image.fromarray(img, "RGB")
            img.save(os.path.join(cur_dir,"foo"+str(i)+".jpeg"))
    

    要知道您需要保存多少文件,您只需调用以下代码:

    os.listdir(os.getcwd())
    

    这会列出目录中的所有文件。检查 os.listdir 的 API 以专门过滤 JPG、PNG 文件类型。一旦你得到这个,你可以调用一个简单的长度操作并执行:

    for i in xrange(len(number_of_elements))
    

    【讨论】:

    • 在 TensorFlow 1.2 中,出现错误:ERROR:tensorflow:Exception in QueueRunner: Attempting to use uninitialized value input_producer/limit_epochs/epochs
    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 2016-12-21
    • 1970-01-01
    • 2021-05-05
    • 2019-04-10
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多