web-dev-qa-db-fra.com

Lecture et affichage d'images Tensorflow

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 j'ouvre a 138Mo.

J'ai essayé de lire et de vérifier le contenu des tenseurs contenant les images pour m'assurer que la lecture était correcte, mais j'ai deux questions à poser - 

  1. Est-ce que FixedLengthRecordReader charge tout le fichier, mais ne fournit que des entrées une à la fois? Depuis la lecture du premier size octets devrait être relativement rapide. Cependant, le code prend environ deux minutes à exécuter. 
  2. Comment obtenir le contenu réel des images dans un format affichable ou les afficher en interne pour vérifier que les images sont bien lues? J'ai fait sess.run(uint8image), mais 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)

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

J'exécute ceci sur mon processeur, si cela ajoute quelque chose.

EDIT: J'ai trouvé la solution pure TensorFlow grâce à Rosa. Apparemment, lorsque vous utilisez le string_input_producer, pour voir les résultats, vous devez initialiser les coureurs de la file d'attente. La seule chose à ajouter au code ci-dessus est la deuxième ligne en dessous:

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

Ensuite, l'image dans result peut être affichée avec matplotlib.pyplot.imshow(result). J'espère que ça aidera quelqu'un. Si vous avez d'autres questions, n'hésitez pas à me demander ou à vérifier le lien dans la réponse de Rosa.

30
mttk

Juste pour donner une réponse complète:

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)

Ou si vous avez un répertoire d'images, vous pouvez toutes les ajouter via ce fichier source Github

@tttt et @ salvador-dali: j'espère que c'est ce dont vous avez besoin

42
Hamed MP

Selon la documentation , vous pouvez décoder des images JPEG/PNG.

Cela devrait être quelque chose comme ça:

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)

Vous pouvez trouver un peu plus d'infos ici

14
Rosa Gronchi

Après avoir parlé avec vous dans les commentaires, je pense que vous pouvez le faire en utilisant numpy/scipy. L'idée est de lire l'image dans le tableau 3D numpy et de l'insérer dans 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]

Ensuite, vous pouvez exécuter votre graphique:

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

et vérifiez que c'est la même chose:

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()

 enter image description here

P.S. vous avez mentionné: Since it's supposed to parallelize reading, it seems useful to know.. À quoi je peux dire que rarement dans la lecture de l'analyse de données est le goulot d'étranglement. Vous passerez la plupart de votre temps à former votre modèle.

10
Salvador Dali

Chargez les noms avec tf.train.match_filenames_once et récupérez le nombre de fichiers à parcourir avec la session tf.sizeopen et profitez-en ;-)

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')
3
Ivan Jacobs

(Je ne peux pas commenter, pas assez de réputation, mais voici une version modifiée qui a fonctionné pour moi)

Pour une erreur @HamedMP concernant le No default session is registered, vous pouvez utiliser InteractiveSession pour supprimer cette erreur: https://www.tensorflow.org/versions/r0.8/api_docs/python/client.html#InteractiveSession

Et pour le problème @NumesSanguis avec Image.show, vous pouvez utiliser la méthode PIL .show() régulière car fromarray renvoie un objet image. 

Je fais les deux ci-dessous (notez que j'utilise JPEG au lieu 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)
1
curiouscat

Vous pouvez utiliser l'API tf.keras.

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()
0
Alex-zhai

J'ai utilisé le format CIFAR10 au lieu de STL10 et le code est sorti comme

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')

L'extrait de code est identique à mttk et Rosa Gronchi, mais je n'ai pas réussi à afficher l'image au moment de l'exécution. Je l'ai donc enregistré au format JPG. 

0
Cloud Cho