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:
Téléchargez les images et les étiquettes de formation/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:
list
d'octets non signés.array
d'octets non signés.(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()
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)
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é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é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.
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
Utilisez ceci pour extraire la base de données mnist des images et des étiquettes csv dans python: