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