在Tensorflow中保存图像文件

在Tensorflow中保存图像文件,tensorflow,Tensorflow,我刚从Tensorflow开始,我有一个新手问题 我知道Tensorflow是关于神经网络的,但我只是从它的力学开始。我试图让它加载,调整大小,翻转,并保存两个图像。应该是一个简单的操作,对吧,它让我从基础开始 以下是我目前的代码: import tensorflow as tf import numpy as np print("resizing images") filenames = ['img1.png', 'img2.png' ] filename_queue = tf.train

我刚从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_队列一直到最后,这样我就可以用原始名称保存它们,我该怎么做?我如何知道需要保存多少文件?假设我正在通过读取目录来创建文件名列表。我尝试了很多不同的事情,但我永远都不知道我是如何知道何时到达终点的

对我来说,调用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)

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

这个警告完全正常。如合同中所述

num_epochs:一个整数(可选)。如果指定,字符串\u输入\u生产者 从之前的字符串\u张量num\u时代生成每个字符串 正在生成超出范围错误。如果没有规定, 字符串\u输入\u生产者可以在字符串\u张量中循环字符串 无数次

你可能会问,为什么这很重要。在我看来,我已经将你的代码重构成了一种可能更容易理解的东西。让我解释一下

将tensorflow导入为tf
将numpy作为np导入
导入操作系统
从PIL导入图像
cur_dir=os.getcwd()
打印(“调整图像大小”)
打印(“当前目录:”,当前目录)
def修改_图像(图像):
resized=tf.image.resize_图像(图像,180,180,1)
调整大小。设置形状([180180,3])
翻转的图像=tf.image.flip\u up\u down(调整大小)
返回翻转的图像
def read_图像(文件名_队列):
reader=tf.WholeFileReader()
key,value=reader.read(文件名\队列)
image=tf.image.decode\u jpeg(值)
返回图像
def输入():
文件名=['img1.jpg','img2.jpg']
filename\u queue=tf.train.string\u input\u producer(文件名,num\u epochs=2)
读取\输入=读取\图像(文件名\队列)
重塑的_图像=修改_图像(读取输入)
返回整形图像
使用tf.Graph()作为默认值():
图像=输入()
初始化所有变量()
sess=tf.Session()
sess.run(初始化)
tf.列车启动\队列\跑步者(sess=sess)
对于X范围内的i(2):
img=sess.run(图)
img=Image.fromarray(img,“RGB”)
保存(os.path.join(cur_dir,“foo”+str(i)+.jpeg)))
在上面的代码中,如果显式地将num_epochs=2,那么正如API所建议的,string_input_producer在string_tensor中循环字符串2次。由于字符串_张量只有2个文件名,因此队列中填充了4个文件名。如果我将for循环更改为:

for i in xrange(5)
然后这个会被窃听出来。不过,如果我在4点离开,那就好了。再举一个例子。如果我不使用num_历代,那么按照建议,它可以循环无限次。推杆:

for i in xrange(100)
这样就不会漏掉。我希望这能回答你的问题

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

另外,如果我想保留所有原始文件名,从 文件名一直排到最后,这样我就可以用 原名,我该怎么做?我怎么知道我有多少文件 需要储蓄吗?假设我正在通过读取 目录我尝试了很多不同的方法,但我永远也找不到答案 我是如何知道我何时到达终点的

如果要保留原始文件名,则方法需要返回文件名。下面是代码

将tensorflow导入为tf
将numpy作为np导入
导入操作系统
从PIL导入图像
cur_dir=os.getcwd()
打印(“调整图像大小”)
打印(“当前目录:”,当前目录)
def修改_图像(图像):
resized=tf.image.resize_图像(图像,180,180,1)
调整大小。设置形状([180180,3])
翻转的图像=tf.image.flip\u up\u down(调整大小)
返回翻转的图像
def read_图像(文件名_队列):
reader=tf.WholeFileReader()
key,value=reader.read(文件名\队列)
image=tf.image.decode\u jpeg(值)
返回键,图像
def输入():
文件名=['img1.jpg','img2.jpg']
filename\u queue=tf.train.string\u input\u producer(文件名)
文件名,读取输入=读取图像(文件名队列)
重塑的_图像=修改_图像(读取输入)
返回文件名,重塑的_图像
使用tf.Graph()作为默认值():
图像=输入()
初始化所有变量()
sess=tf.Session()
sess.run(初始化)
tf.列车启动\队列\跑步者(sess=sess)
对于X范围内的i(10):
文件名,img=sess.run(图像)
打印(文件名)
img=Image.fromarray(img,“RGB”)
保存(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中,我得到一个错误:
错误:TensorFlow:QueueRunner中的异常:尝试使用未初始化的值输入\u producer/limit\u epochs/epochs