Tensorflow la lecture de l'image & affichage

J'ai un tas d'images dans un format similaire à Cifar10 (fichier binaire, size = 96*96*3 octets par image), une image après l'autre (STL-10 dataset). Le fichier que je suis en ouverture a 138MB.

J'ai essayé de lire & vérifier le contenu des Tenseurs contenant les images pour être sûr que la lecture se fait de droite, cependant j'ai deux questions -

  1. Ne le FixedLengthRecordReader charger tout le fichier, cependant, il suffit de fournir les entrées une à la fois? Depuis la lecture de la première size octets doit être relativement rapide. Toutefois, le code prend environ deux minutes pour s'exécuter.
  2. Comment faire pour obtenir l'image réelle du contenu dans un format affichable, ou de les afficher en interne pour valider que les images sont bien lus? Je n'ai sess.run(uint8image), cependant, le résultat est vide.

Le code est ci-dessous:

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)

De sortie:

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

Je suis en cours d'exécution sur mon CPU, si ça ajoute quoi que ce soit.

EDIT: j'ai trouvé la pure TensorFlow solution grâce à Rosa. Apparemment, lors de l'utilisation de la string_input_producer, afin de voir les résultats, vous devez initialiser la file d'attente des coureurs.
La seule chose à ajouter le code ci-dessus est la deuxième ligne du dessous:

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

Par la suite, l'image dans le result peut être affiché avec la matplotlib.pyplot.imshow(result). J'espère que cela aide quelqu'un. Si vous avez des questions, n'hésitez pas à me demander ou vérifier le lien dans Rosa réponse.

  • Il me semble que vous êtes la lecture d'une image (selon le [Dimension(96), Dimension(96), Dimension(3)]) et pas tous d'entre eux.
  • C'est ce que je voulais faire, lire une image et l'afficher, cependant je n'étais pas sûr si TensorFlow encore charger tout le fichier, depuis la lecture prend que quelques minutes (et cela semble être une intervention relativement simple qui ne devrait pas prendre autant de temps)
  • Est-il une raison pour laquelle vous ne voulez pas lire le fichier dans numpy comme tableau 3d et de les acheminer dans tensorFlow variable?
  • Rien d'autre que de l'aide pur TensorFlow. Depuis qu'il est censé paralléliser la lecture, il semble utile de le savoir. Je peux le faire dans numpy, en cas d'échec 🙂
InformationsquelleAutor mttk | 2015-11-11