所以几周以来我一直坚持这个问题。我想从图像文件名列表中批量生成图像。我将文件名列表插入队列并使用阅读器来获取文件。然后,阅读器返回文件名和读取的图像文件。
我的问题是,当我使用解码的jpg和阅读器中的标签进行批处理时,tf.train.shuffle_batch()会混合图像和文件名,以便现在标签的图像顺序错误文件。我在使用queue / shuffle_batch做错了吗?如何解决这个问题,以便批量出现正确的文件标签?
非常感谢!
import tensorflow as tf
from tensorflow.python.framework import ops
def preprocess_image_tensor(image_tf):
image = tf.image.convert_image_dtype(image_tf, dtype=tf.float32)
image = tf.image.resize_image_with_crop_or_pad(image, 300, 300)
image = tf.image.per_image_standardization(image)
return image
# original image names and labels
image_paths = ["image_0.jpg", "image_1.jpg", "image_2.jpg", "image_3.jpg", "image_4.jpg", "image_5.jpg", "image_6.jpg", "image_7.jpg", "image_8.jpg"]
labels = [0, 1, 2, 3, 4, 5, 6, 7, 8]
# converting arrays to tensors
image_paths_tf = ops.convert_to_tensor(image_paths, dtype=tf.string, name="image_paths_tf")
labels_tf = ops.convert_to_tensor(labels, dtype=tf.int32, name="labels_tf")
# getting tensor slices
image_path_tf, label_tf = tf.train.slice_input_producer([image_paths_tf, labels_tf], shuffle=False)
# getting image tensors from jpeg and performing preprocessing
image_buffer_tf = tf.read_file(image_path_tf, name="image_buffer")
image_tf = tf.image.decode_jpeg(image_buffer_tf, channels=3, name="image")
image_tf = preprocess_image_tensor(image_tf)
# creating a batch of images and labels
batch_size = 5
num_threads = 4
images_batch_tf, labels_batch_tf = tf.train.batch([image_tf, label_tf], batch_size=batch_size, num_threads=num_threads)
# running testing session to check order of images and labels
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
print image_path_tf.eval()
print label_tf.eval()
coord.request_stop()
coord.join(threads)
答案 0 :(得分:2)
等等......你的使用有点奇怪吗?
您基本上是通过调用:
运行图表两次 print image_path_tf.eval()
print label_tf.eval()
由于您只要求image_path_tf
和label_tf
,因此此行以下的任何内容都无法运行:
image_path_tf, label_tf = tf.train.slice_input_producer([image_paths_tf, labels_tf], shuffle=False)
也许试试这个?
image_paths, labels = sess.run([images_batch_tf, labels_batch_tf])
print(image_paths)
print(labels)
答案 1 :(得分:1)
从您的代码中我不确定您的标签是如何从jpeg图像编码/提取的。我曾经在同一个文件中编码所有内容,但后来发现了一个更优雅的解决方案。假设您可以获得文件名列表image_paths
和一系列标签labels
,您可以将它们绑定在一起并使用tf.train.slice_input_producer
对单个示例进行操作,然后使用{{1}将它们一起批处理}}
tf.train.batch