gpt4 book ai didi

tensorflow - 在 Tensorflow 中保存图像文件

转载 作者:行者123 更新时间:2023-12-03 00:45:28 25 4
gpt4 key购买 nike

我刚刚开始使用 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 API 中所述

num_epochs: An integer (optional). If specified, string_input_producer produces each string from string_tensor num_epochs times before generating an OutOfRange error. If not specified, string_input_producer can cycle through the strings in string_tensor an unlimited number of times.

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

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)

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

编辑:我发现您还有更多问题。

Also, if I want to preserve the original file names all the way from the filename_queue through to the end so I can save them with the original names, how do I do that? And how do I know how many files I need to save? Let's say I'm making the list of file names by reading a directory. I tried many different things but I could never find out how I know when I reach the end.

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

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 - 在 Tensorflow 中保存图像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34783030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com