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 -
- Ne le
FixedLengthRecordReader
charger tout le fichier, cependant, il suffit de fournir les entrées une à la fois? Depuis la lecture de la premièresize
octets doit être relativement rapide. Toutefois, le code prend environ deux minutes pour s'exécuter. - 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 🙂
Vous devez vous connecter pour publier un commentaire.
Juste pour donner une réponse complète:
Ou si vous disposez d'un répertoire d'images que vous pouvez ajouter tous via ce fichier source Github
@mttk et @salvador-dali: j'espère que c'est ce dont vous avez besoin
capacity
arg pourstring_input_producer
, ce qui est important pour le réglage de la longueur maximale de laFIFOQueue
retourné à partir de cette méthode. Je suis toujours à jouer avec, mais cela pourrait signifier que vous êtes en déposant quelques entrées (même si je ne suis pas certain).ValueError: Cannot start queue runners: No default session is registered. Use "with sess.as_default()" or pass an explicit session to tf.start_queue_runners(sess=sess)
image = my_img.eval(session=sess)
et maintenant ça fonctionne.shuffle=False
en tant que paramètre àtf.train.string_input_producer
.Image.fromarray(np.asarray(image)).show()
en venir?Selon la la documentation vous pouvez décoder JPEG/PNG images.
Il devrait être quelque chose comme ceci:
Vous pouvez trouver un peu plus d'info ici
Après avoir parlé avec vous dans les commentaires, je crois que vous pouvez faire cela à l'aide de numpy/scipy. L'idée est de lire l'image dans le
numpy
3d-tableau et de le nourrir dans la variable.Ensuite, vous pouvez exécuter votre graphique:
et vérifier que c'est la même chose:
P. S. vous avez mentionné:
Since it's supposed to parallelize reading, it seems useful to know.
. À qui je peux dire que rarement dans l'analyse des données lecture des données est le goulot d'étranglement. La plupart de votre temps que vous passerez à la formation de votre modèle.Charge des noms de tf.le train.match_filenames_once obtenir le nombre de fichiers pour parcourir avec tf.taille
ouvrir de session et d'en profiter 😉
(Ne peux pas commenter, pas assez de réputation, mais voici une version modifiée qui a fonctionné pour moi)
À @HamedMP erreur sur le
No default session is registered
vous pouvez utiliserInteractiveSession
pour se débarrasser de ce message d'erreur:https://www.tensorflow.org/versions/r0.8/api_docs/python/client.html#InteractiveSession
Et à @NumesSanguis problème avec
Image.show
, vous pouvez utiliser le PIL.show()
méthode carfromarray
renvoie une image de l'objet.Je fais les deux ci-dessous (notez que j'utilise plutôt le format JPEG PNG):
J'ai utilisé CIFAR10 format au lieu de STL10 et le code est sorti comme
L'extrait de code est identique à mttk et Rosa Gronchi, mais de toute façon je n'étais pas capable d'afficher l'image en cours d'exécution, donc je l'ai enregistré en tant que fichier JPG.
Vous pouvez utiliser tf.keras API.