Lectura y visualización de la imagen de Tensorflow

Tengo un montón de imágenes en un formato similar a Cifar10 (archivo binario, size = 96*96*3 bytes por imagen), una imagen tras otra ( conjunto de datos STL-10 ). El archivo que estoy abriendo tiene 138MB.

Intenté leer y verificar el contenido de los tensores que contienen las imágenes para asegurarme de que la lectura se haya realizado correctamente. Sin embargo, tengo dos preguntas:

  1. ¿El FixedLengthRecordReader carga el archivo completo, sin embargo, solo proporciona entradas de una en una? Dado que la lectura de los bytes de primer size debe ser relativamente rápido. Sin embargo, el código tarda unos dos minutos en ejecutarse.
  2. ¿Cómo obtener el contenido de la imagen real en un formato visualizable o mostrarlo internamente para validar que las imágenes se lean bien? Hice sess.run(uint8image) , sin embargo, el resultado está vacío.

El código está abajo:

 import tensorflow as tf def read_stl10(filename_queue): class STL10Record(object): pass result = STL10Record() result.height = 96 result.width = 96 result.depth = 3 image_bytes = result.height * result.width * result.depth record_bytes = image_bytes reader = tf.FixedLengthRecordReader(record_bytes=record_bytes) result.key, value = reader.read(filename_queue) print value record_bytes = tf.decode_raw(value, tf.uint8) depth_major = tf.reshape(tf.slice(record_bytes, [0], [image_bytes]), [result.depth, result.height, result.width]) result.uint8image = tf.transpose(depth_major, [1, 2, 0]) return result # probably a hack since I should've provided a string tensor filename_queue = tf.train.string_input_producer(['./data/train_X']) image = read_stl10(filename_queue) print image.uint8image with tf.Session() as sess: result = sess.run(image.uint8image) print result, type(result) 

Salida:

 Tensor("ReaderRead:1", shape=TensorShape([]), dtype=string) Tensor("transpose:0", shape=TensorShape([Dimension(96), Dimension(96), Dimension(3)]), dtype=uint8) I tensorflow/core/common_runtime/local_device.cc:25] Local device intra op parallelism threads: 4 I tensorflow/core/common_runtime/local_session.cc:45] Local session inter op parallelism threads: 4 [empty line for last print] Process finished with exit code 137 

Estoy ejecutando esto en mi CPU, si eso agrega algo.

EDITAR: Encontré la solución TensorFlow pura gracias a Rosa. Aparentemente, cuando se utiliza el string_input_producer , para ver los resultados, necesita inicializar los corredores de cola. Lo único requerido para agregar al código anterior es la segunda línea de abajo:

 ... with tf.Session() as sess: tf.train.start_queue_runners(sess=sess) ... 

Después, la imagen en el result se puede mostrar con matplotlib.pyplot.imshow(result) . Espero que esto ayude a alguien. Si tiene más preguntas, no dude en preguntarme o consultar el enlace en la respuesta de Rosa.

Solo para dar una respuesta completa:

 filename_queue = tf.train.string_input_producer(['/Users/HANEL/Desktop/tf.png']) # list of files to read reader = tf.WholeFileReader() key, value = reader.read(filename_queue) my_img = tf.image.decode_png(value) # use png or jpg decoder based on your files. init_op = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init_op) # Start populating the filename queue. coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) for i in range(1): #length of your filename list image = my_img.eval() #here is your image Tensor :) print(image.shape) Image.fromarray(np.asarray(image)).show() coord.request_stop() coord.join(threads) 

O si tiene un directorio de imágenes, puede agregarlas todas a través de este archivo fuente de Github

@mttk y @ salvador-dali: espero que sea lo que necesiten

Según la documentación puedes decodificar imágenes JPEG / PNG.

Debería ser algo como esto:

 import tensorflow as tf filenames = ['/image_dir/img.jpg'] filename_queue = tf.train.string_input_producer(filenames) reader = tf.WholeFileReader() key, value = reader.read(filename_queue) images = tf.image.decode_jpeg(value, channels=3) 

Puedes encontrar un poco más de información aquí.

Después de hablar con usted en los comentarios, creo que solo puede hacer esto usando numpy / scipy. La idea es leer la imagen en la numpy 3d numpy e introducirla en la variable.

 from scipy import misc import tensorflow as tf img = misc.imread('01.png') print img.shape # (32, 32, 3) img_tf = tf.Variable(img) print img_tf.get_shape().as_list() # [32, 32, 3] 

Luego puedes ejecutar tu gráfica:

 init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) im = sess.run(img_tf) 

y verifica que sea el mismo:

 import matplotlib.pyplot as plt fig = plt.figure() fig.add_subplot(1,2,1) plt.imshow(im) fig.add_subplot(1,2,2) plt.imshow(img) plt.show() 

introduzca la descripción de la imagen aquí

PS que mencionaste: Since it's supposed to parallelize reading, it seems useful to know. . A lo que puedo decir que rara vez en el análisis de datos la lectura de los datos es el cuello de botella. La mayor parte de tu tiempo lo pasarás entrenando a tu modelo.

Cargue nombres con tf.train.match_filenames_once obtenga la cantidad de archivos para iterar una vez más con tf.size abrir sesión y disfrutar 😉

 import tensorflow as tf import numpy as np import matplotlib; from PIL import Image matplotlib.use('Agg') import matplotlib.pyplot as plt filenames = tf.train.match_filenames_once('./images/*.jpg') count_num_files = tf.size(filenames) filename_queue = tf.train.string_input_producer(filenames) reader=tf.WholeFileReader() key,value=reader.read(filename_queue) img = tf.image.decode_jpeg(value) 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) num_files = sess.run(count_num_files) for i in range(num_files): image=img.eval() print(image.shape) Image.fromarray(np.asarray(image)).save('te.jpeg') 

(No puedo comentar, no tengo suficiente reputación, pero aquí hay una versión modificada que funcionó para mí)

Para comentar el error @HamedMP sobre la No default session is registered , puede utilizar InteractiveSession para deshacerse de este error: https://www.tensorflow.org/versions/r0.8/api_docs/python/client.html#InteractiveSession

Y a @NumesSanguis problema con Image.show , puede usar el método PIL .show() fromarray porque fromarray devuelve un objeto de imagen.

Hago las dos a continuación (nota que estoy usando JPEG en lugar de PNG):

 import tensorflow as tf import numpy as np from PIL import Image filename_queue = tf.train.string_input_producer(['my_img.jpg']) # list of files to read reader = tf.WholeFileReader() key, value = reader.read(filename_queue) my_img = tf.image.decode_jpeg(value) # use png or jpg decoder based on your files. init_op = tf.initialize_all_variables() sess = tf.InteractiveSession() with sess.as_default(): sess.run(init_op) # Start populating the filename queue. coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) for i in range(1): #length of your filename list image = my_img.eval() #here is your image Tensor :) Image.fromarray(np.asarray(image)).show() coord.request_stop() coord.join(threads) 

Utilicé el formato CIFAR10 en lugar de STL10 y el código salió como

 filename_queue = tf.train.string_input_producer(filenames) read_input = read_cifar10(filename_queue) with tf.Session() as sess: tf.train.start_queue_runners(sess=sess) result = sess.run(read_input.uint8image) img = Image.fromarray(result, "RGB") img.save('my.jpg') 

El fragmento es idéntico al de mttk y a Rosa Gronchi, pero de alguna manera no pude mostrar la imagen durante el tiempo de ejecución, por lo que guardé el archivo JPG.

Puedes usar tf.keras API.

 import tensorflow as tf import numpy as np from tensorflow.keras.preprocessing.image import load_img, array_to_img tf.enable_eager_execution() img = load_img("example.png") img = tf.convert_to_tensor(np.asarray(img)) image = tf.image.resize_images(img, (800, 800)) to_img = array_to_img(image) to_img.show()