web-dev-qa-db-fra.com

Extrayez les images du fichier .idx3-ubyte ou du fichier GZIP via Python

J'ai créé une fonction simple pour facerecognition en utilisant le facerecognizer d'OpenCV. Cela fonctionne très bien avec des images de personnes.

Maintenant, je voudrais faire un test en utilisant des caractères manuscrits au lieu de personnes. Je suis tombé sur un jeu de données MNIST, mais ils stockent les images dans un fichier étrange que je n'avais jamais vu auparavant.

J'ai simplement besoin d'extraire quelques images de:

train-images.idx3-ubyte

et enregistrez-les dans un dossier sous le nom .gif

Ou suis-je mal compris cette chose MNIST. Si oui, où pourrais-je obtenir un tel jeu de données?

[~ # ~] éditer [~ # ~]

J'ai aussi le fichier gzip:

train-images-idx3-ubyte.gz

J'essaie de lire le contenu, mais show() ne fonctionne pas et si je read(), je vois des symboles aléatoires.

images = gzip.open("train-images-idx3-ubyte.gz", 'rb')
print images.read()

[~ # ~] éditer [~ # ~]

Géré pour obtenir des sorties utiles en utilisant:

with gzip.open('train-images-idx3-ubyte.gz','r') as fin:
    for line in fin:
        print('got line', line)

D'une manière ou d'une autre je dois convertir ceci maintenant en une image, sortie:

enter image description here

16
Roman

Téléchargez les images et les étiquettes de formation/test:

  • train-images-idx3-ubyte.gz: images du poste de formation
  • train-labels-idx1-ubyte.gz: étiquettes de kits de formation
  • t10k-images-idx3-ubyte.gz: test des images
  • t10k-labels-idx1-ubyte.gz: étiquettes des jeux de test

Et décompressez-les dans un répertoire de travail, dites samples/.

Obtenez le paquet python-mnist depuis PyPi:

pip install python-mnist

Importez le package mnist et lisez les images de formation/test:

from mnist import MNIST

mndata = MNIST('samples')

images, labels = mndata.load_training()
# or
images, labels = mndata.load_testing()

Pour afficher une image sur la console:

index = random.randrange(0, len(images))  # choose an index ;-)
print(mndata.display(images[index]))

Vous obtiendrez quelque chose comme ça:

............................
............................
............................
............................
............................
.................@@.........
..............@@@@@.........
............@@@@............
..........@@................
..........@.................
...........@................
...........@................
...........@...@............
...........@@@@@.@..........
...........@@@...@@.........
...........@@.....@.........
..................@.........
..................@@........
..................@@........
..................@.........
.................@@.........
...........@.....@..........
...........@....@@..........
............@@@@............
.............@..............
............................
............................
............................

Explication:

  • Chaque image de la liste des images est un Python list d'octets non signés.
  • Les étiquettes est un Python array d'octets non signés.
39
Laurent LAPORTE

(Utiliser seulement matplotlib, gzip et numpy)
Extraire les données d'image:

import gzip
f = gzip.open('train-images-idx3-ubyte.gz','r')

image_size = 28
num_images = 5

import numpy as np
f.read(16)
buf = f.read(image_size * image_size * num_images)
data = np.frombuffer(buf, dtype=np.uint8).astype(np.float32)
data = data.reshape(num_images, image_size, image_size, 1)

Imprimer des images:

import matplotlib.pyplot as plt
image = np.asarray(data[2]).squeeze()
plt.imshow(image)
plt.show()

enter image description here

Imprimez les 50 premières étiquettes:

f = gzip.open('train-labels-idx1-ubyte.gz','r')
f.read(8)
for i in range(0,50):   
    buf = f.read(1)
    labels = np.frombuffer(buf, dtype=np.uint8).astype(np.int64)
    print(labels)
10
Punnerud

Vous pouvez réellement utiliser le paquet idx2numpy disponible sur PyPI. Il est extrêmement simple simple à utiliser et convertit directement les données en tableaux numpy. Voici ce que vous devez faire:

Télécharger les données

Téléchargez le jeu de données MNIST depuis le site officiel .
Si vous utilisez Linux, vous pouvez utiliser wget pour l'obtenir à partir de la ligne de commande elle-même. Il suffit de courir:

wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz

Décompresser les données

Décompressez ou décompressez les données. Sous Linux, vous pouvez utiliser gzip

En fin de compte, vous devriez avoir les fichiers suivants:

data/train-images-idx3-ubyte
data/train-labels-idx1-ubyte
data/t10k-images-idx3-ubyte
data/t10k-labels-idx1-ubyte

Le préfixe data/ est simplement parce que je les ai extraites dans un dossier nommé data. Votre question a l'air d'être terminée jusqu'à maintenant, alors continuez à lire.

Utiliser idx2numpy

Voici un simple code python) pour tout lire à partir des fichiers décompressés sous forme de tableaux numpy.

import idx2numpy
import numpy as np
file = 'data/train-images-idx3-ubyte'
arr = idx2numpy.convert_from_file(file)
# arr is now a np.ndarray type of object of shape 60000, 28, 28

Vous pouvez maintenant l’utiliser avec les contours OpenCV de la même manière que vous affichez une autre image, en utilisant

cv.imshow("Image", arr[4])

Pour installer idx2numpy, vous pouvez utiliser PyPI (pip gestionnaire de paquets). Il suffit de lancer la commande:

pip install idx2numpy
3
avneesh mishra

Utilisez ceci pour extraire la base de données mnist des images et des étiquettes csv dans python:

https://github.com/sorki/python-mnist

1
Aqib Mumtaz