批量生成时,Tensorflow会混合图像和标签

时间:2017-01-26 00:54:09

标签: python image-processing machine-learning tensorflow batch-processing

所以几周以来我一直坚持这个问题。我想从图像文件名列表中批量生成图像。我将文件名列表插入队列并使用阅读器来获取文件。然后,阅读器返回文件名和读取的图像文件。

我的问题是,当我使用解码的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)

2 个答案:

答案 0 :(得分:2)

等等......你的使用有点奇怪吗?

您基本上是通过调用:

运行图表两次
  print image_path_tf.eval()
  print label_tf.eval()

由于您只要求image_path_tflabel_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