¿Cómo alimentar el modelo entrenado Cifar10 con mi propia imagen y obtener la etiqueta como salida?

Estoy tratando de usar el modelo entrenado basado en el tutorial de Cifar10 y me gustaría alimentarlo con una imagen externa 32×32 (jpg o png).
Mi objective es poder obtener la etiqueta como salida . En otras palabras, quiero alimentar a la red con una sola imagen jpeg de tamaño 32 x 32, 3 canales sin etiqueta como entrada y que el proceso de inferencia me dé el tf.argmax(logits, 1) .
Básicamente, me gustaría poder usar el modelo cifar10 entrenado en una imagen externa y ver qué clase escupirá.

He estado tratando de hacer eso basado en el tutorial de Cifar10 y desafortunadamente siempre tengo problemas. Especialmente con el concepto Session y el concepto batch.

Cualquier ayuda para hacer eso con Cifar10 sería muy apreciada.

Aquí está el código implementado hasta ahora con problemas de comstackción:

 #!/usr/bin/env python from __future__ import absolute_import from __future__ import division from __future__ import print_function from datetime import datetime import math import time import tensorflow.python.platform from tensorflow.python.platform import gfile import numpy as np import tensorflow as tf import cifar10 import cifar10_input import os import faultnet_flags from PIL import Image FLAGS = tf.app.flags.FLAGS def evaluate(): filename_queue = tf.train.string_input_producer(['/home/tensor/.../inputImage.jpg']) reader = tf.WholeFileReader() key, value = reader.read(filename_queue) input_img = tf.image.decode_jpeg(value) init_op = tf.initialize_all_variables() # Problem in here with Graph / session with tf.Session() as sess: sess.run(init_op) coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) for i in range(1): image = input_img.eval() print(image.shape) Image.fromarray(np.asarray(image)).show() # Problem in here is that I have only one image as input and have no label and would like to have # it compatible with the Cifar10 network reshaped_image = tf.cast(image, tf.float32) height = FLAGS.resized_image_size width = FLAGS.resized_image_size resized_image = tf.image.resize_image_with_crop_or_pad(reshaped_image, width, height) float_image = tf.image.per_image_whitening(resized_image) # reshaped_image num_preprocess_threads = 1 images = tf.train.batch( [float_image], batch_size=128, num_threads=num_preprocess_threads, capacity=128) coord.request_stop() coord.join(threads) logits = faultnet.inference(images) # Calculate predictions. #top_k_predict_op = tf.argmax(logits, 1) # print('Current image is: ') # print(top_k_predict_op[0]) # this does not work since there is a problem with the session # and the Graph conflicting my_classification = sess.run(tf.argmax(logits, 1)) print ('Predicted ', my_classification[0], " for your input image.") def main(argv=None): evaluate() if __name__ == '__main__': tf.app.run() ''' 

Algunos conceptos básicos primero:

  1. Primero defina su gráfico: cola de imágenes, preprocesamiento de imágenes, inferencia de convnet, precisión top-k
  2. Luego, crea una tf.Session() y trabaja dentro de ella: inicia los corredores de cola y llama a sess.run()

Así es como debería verse tu código

 # 1. GRAPH CREATION filename_queue = tf.train.string_input_producer(['/home/tensor/.../inputImage.jpg']) ... # NO CREATION of a tf.Session here float_image = ... images = tf.expand_dims(float_image, 0) # create a fake batch of images (batch_size=1) logits = faultnet.inference(images) _, top_k_pred = tf.nn.top_k(logits, k=5) # 2. TENSORFLOW SESSION with tf.Session() as sess: sess.run(init_op) coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) top_indices = sess.run([top_k_pred]) print ("Predicted ", top_indices[0], " for your input image.") 

EDITAR:

Como sugiere @mrry, si solo necesita trabajar en una sola imagen, puede eliminar los corredores de cola:

 # 1. GRAPH CREATION input_img = tf.image.decode_jpeg(tf.read_file("/home/.../your_image.jpg"), channels=3) reshaped_image = tf.image.resize_image_with_crop_or_pad(tf.cast(input_img, width, height), tf.float32) float_image = tf.image.per_image_withening(reshaped_image) images = tf.expand_dims(float_image, 0) # create a fake batch of images (batch_size = 1) logits = faultnet.inference(images) _, top_k_pred = tf.nn.top_k(logits, k=5) # 2. TENSORFLOW SESSION with tf.Session() as sess: sess.run(init_op) top_indices = sess.run([top_k_pred]) print ("Predicted ", top_indices[0], " for your input image.") 

El código fuente original en cifar10_eval.py también se puede usar para probar sus propias imágenes individuales como se muestra en la siguiente salida de consola

 nbatfai@robopsy:~/Robopsychology/repos/gpu/tensorflow/tensorflow/models/image/cifar10$ python cifar10_eval.py --run_once True 2>/dev/null [ -0.63916457 -3.31066918 2.32452989 1.51062226 15.55279636 -0.91585422 1.26451302 -4.11891603 -7.62230825 -4.29096413] deer nbatfai@robopsy:~/Robopsychology/repos/gpu/tensorflow/tensorflow/models/image/cifar10$ python cifar2bin.py matchbox.png input.bin nbatfai@robopsy:~/Robopsychology/repos/gpu/tensorflow/tensorflow/models/image/cifar10$ python cifar10_eval.py --run_once True 2>/dev/null [ -1.30562115 12.61497402 -1.34208572 -1.3238833 -6.13368177 -1.17441642 -1.38651907 -4.3274951 2.05489922 2.54187846] automobile nbatfai@robopsy:~/Robopsychology/repos/gpu/tensorflow/tensorflow/models/image/cifar10$ 

y fragmento de código

 #while step < num_iter and not coord.should_stop(): # predictions = sess.run([top_k_op]) print(sess.run(logits[0])) classification = sess.run(tf.argmalogits[0], 0)) cifar10classes = ["airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck"] print(cifar10classes[classification]) #true_count += np.sum(predictions) step += 1 # Compute precision @ 1. precision = true_count / total_sample_count # print('%s: precision @ 1 = %.3f' % (datetime.now(), precision)) 

Se pueden encontrar más detalles en la publicación ¿Cómo puedo probar mi propia imagen en el tutorial de Cifar-10 en Tensorflow?