Procédure pour charger MNIST avec python et sortie en png

Chose que tu veux faire

Nous recueillons des échantillons de données d'apprentissage / de vérification pour l'apprentissage automatique.

supposition

Qu'est-ce que MNIST?

Données d'image des "nombres manuscrits" de 0 à 9. Utilisé pour l'apprentissage automatique tel que "identifier et classer les nombres manuscrits avec l'IA". http://yann.lecun.com/exdb/mnist/ Vous pouvez le télécharger gratuitement à partir de.

image.png

organisation des fichiers

Contenu du fichier

Lorsque vous décompressez le fichier gz, il devient un fichier binaire comme celui ci-dessous.

t10k-images.idx3-ubyte

image.png

Même s'il s'agit de données d'image, ce n'est pas dans un format comme .jpg, donc Il ne peut pas être prévisualisé tel quel.

Comment créer une image et un aperçu

Par exemple, si vous écrivez du code python et que vous le sortez au format png avec numpy ou PIL, vous pouvez l'afficher sous forme de fichier image ordinaire.

image.png

Préparation préalable

Si wget et unzip ne sont pas encore inclus, installez-les. Pour ubuntu:

apt-get install -y wget
apt-get install unzip

Téléchargement de fichier

Tout d'abord, téléchargez gz avec wget.

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

Puis décompressez.

gunzip train-images-idx3-ubyte.gz
gunzip train-labels-idx1-ubyte.gz

ensuite

-rw-r--r--. 1 root root 47040016 Jul 21  2000 train-images-idx3-ubyte
-rw-r--r--. 1 root root    60008 Jul 21  2000 train-labels-idx1-ubyte

Est sortie. Ensuite, écrivez le code python.

Mise en œuvre (imagerie d'images)

vi test.py

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist

import os
import numpy as np
import matplotlib.pyplot as plt
import struct
from PIL import Image

trainImagesFile = open('./train-images-idx3-ubyte','rb')
trainLabelsFile = open('./train-labels-idx1-ubyte','rb')

f = trainImagesFile

magic_number = f.read( 4 )
magic_number = struct.unpack('>i', magic_number)[0]

number_of_images = f.read( 4 )
number_of_images = struct.unpack('>i', number_of_images)[0]

number_of_rows = f.read( 4 )
number_of_rows = struct.unpack('>i', number_of_rows)[0]

number_of_columns = f.read( 4 )
number_of_columns = struct.unpack('>i', number_of_columns)[0]

bytes_per_image = number_of_rows * number_of_columns

raw_img = f.read(bytes_per_image)
format = '%dB' % bytes_per_image
lin_img = struct.unpack(format, raw_img)
np_ary = np.asarray(lin_img).astype('uint8')
np_ary = np.reshape(np_ary, (28,28),order='C')

pil_img = Image.fromarray(np_ary)
pil_img.save("output.png ")

Courir

python test.py

Résultat de sortie

output.png

image.png

Commentaire

Données d'image pour l'apprentissage train-images-idx3-ubyte La structure de est la suivante.

http://yann.lecun.com/exdb/mnist/

TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000803(2051) magic number
0004     32 bit integer  60000            number of images
0008     32 bit integer  28               number of rows
0012     32 bit integer  28               number of columns
0016     unsigned byte   ??               pixel
0017     unsigned byte   ??               pixel
........
xxxx     unsigned byte   ??               pixel

Selon ce qui précède, le décalage est lu séquentiellement tout en décalant de 4.

magic_number = f.read( 4 )

Le résultat est 2051.

number_of_images = f.read( 4 )

Le résultat est 60000.

number_of_rows = f.read( 4 )

Le résultat est 28.

number_of_columns = f.read( 4 )

Le résultat est 28.

Si vous voulez vraiment voir la valeur

print('--------------------')
print('magic_number');
print(magic_number);
print('--------------------')
print('number_of_images');
print(number_of_images);
print('--------------------')
print('number_of_rows');
print(number_of_rows);
print('--------------------')
print('number_of_columns');
print(number_of_columns);

Vous pouvez le vérifier en produisant comme suit.

--------------------
magic_number
2051
--------------------
number_of_images
60000
--------------------
number_of_rows
28
--------------------
number_of_columns
28

Et

[offset] [type]          [value]          [description]
0016     unsigned byte   ??               pixel

Comme c'est le cas, l'image est incluse après le décalage 16

bytes_per_image = number_of_rows * number_of_columns
raw_img = f.read(bytes_per_image)

Peut être lu comme. Après cela, j'ai plongé dans numpy et l'ai enregistré au format png.

Sortie png en continu par traitement en boucle

Si vous faites pivoter le processus de sortie png dans une boucle comme indiqué ci-dessous, vous pouvez créer une image en continu. Après cela, si le nombre de feuilles que vous souhaitez imprimer est de 10, vous pouvez spécifier le nombre de boucles à votre guise, comme range (10):.

for num in range(10):
    raw_img = f.read(bytes_per_image)
    format = '%dB' % bytes_per_image
    lin_img = struct.unpack(format, raw_img)
    np_ary = np.asarray(lin_img).astype('uint8')
    np_ary = np.reshape(np_ary, (28,28),order='C')
    pil_img = Image.fromarray(np_ary)
    pil_img.save("output" + str(num)  + ".png ")

Le résultat de sortie est ci-dessous.

image.png

Comparaison du tableau numpy et du png

Lorsque np_ary, qui est un tableau numpy, est affiché par print (), les données du tableau sont les suivantes.

 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   3  18  18  18 126 136  175  26 166 255 247 127   0   0   0   0]
 [  0   0   0   0   0   0   0   0  30  36  94 154 170 253 253 253 253 253  225 172 253 242 195  64   0   0   0   0]
 [  0   0   0   0   0   0   0  49 238 253 253 253 253 253 253 253 253 251   93  82  82  56  39   0   0   0   0   0]
 [  0   0   0   0   0   0   0  18 219 253 253 253 253 253 198 182 247 241    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  80 156 107 253 253 205  11   0  43 154    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0  14   1 154 253  90   0   0   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0 139 253 190   2   0   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0  11 190 253  70   0   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  35 241 225 160 108   1    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0  81 240 253 253 119   25   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  45 186 253 253  150  27   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  16  93 252  253 187   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 249  253 249  64   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  46 130 183 253  253 207   2   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  39 148 229 253 253 253  250 182   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0  24 114 221 253 253 253 253 201   78   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  23  66 213 253 253 253 253 198  81   2    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0  18 171 219 253 253 253 253 195  80   9   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0  55 172 226 253 253 253 253 244 133  11   0   0   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0 136 253 253 253 212 135 132  16   0   0   0   0   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0    0   0   0   0   0   0   0   0   0   0]


On voit que c'est la position de chaque pixel constituant le fichier image et ses informations de couleur.

image.png

À propos des données d'étiquette

L'implémentation ci-dessus consistait à convertir les données d'image (Images) en png, En plus de cela, il est également nécessaire de vérifier les données d'étiquette (étiquettes). La mise en œuvre pour cela est la suivante.

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.datasets import mnist

import os
import numpy as np
import matplotlib.pyplot as plt
import struct
from PIL import Image

trainImagesFile = open('./train-images-idx3-ubyte','rb')
trainLabelsFile = open('./train-labels-idx1-ubyte','rb')

f = trainLabelsFile

magic_number = f.read( 4 )
magic_number = struct.unpack('>i', magic_number)[0]

number_of_images = f.read( 4 )
number_of_images = struct.unpack('>i', number_of_images)[0]

print("--------------------")
print("magic_number")
print(magic_number)
print("--------------------")
print("number_of_image")
print(number_of_images)
print("--------------------")

label_byte = f.read( 1 )
label_int = int.from_bytes(label_byte, byteorder='big')
print(label_int)

Résultat de sortie

--------------------
magic_number
2049
--------------------
number_of_image
60000
--------------------
5

La structure des données d'étiquette est la suivante.

train-labels-idx1-ubyte

TRAINING SET LABEL FILE (train-labels-idx1-ubyte):
[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000801(2049) magic number (MSB first)
0004     32 bit integer  60000            number of items
0008     unsigned byte   ??               label
0009     unsigned byte   ??               label
........
xxxx     unsigned byte   ??               label
The labels values are 0 to 9.

En d'autres termes, si vous lisez le décalage 8 et les suivants un par un, vous pouvez lire l'étiquette. Si vous souhaitez l'implémenter en boucle, suivez ci-dessous.


for num in range(10):
    label_byte = f.read( 1 )
    label_int = int.from_bytes(label_byte, byteorder='big')
    print(label_int)

Le résultat de sortie est ci-dessous.

5
0
4
1
9
2
1
3
1
4

Comparez avec le résultat de sortie des images.

image.png

Chaque image png indique correctement "quel numéro?" Avec une étiquette.

Recommended Posts

Procédure pour charger MNIST avec python et sortie en png
Sortie vers un fichier csv avec Python
Sortir les caractères de couleur en joli avec python
Sortie du journal Python vers la console avec GAE
Fractal pour faire et jouer avec Python
Grattage de la nourriture avec python et sortie en CSV
MessagePack-Try pour lier Java et Python avec RPC
Conversion DICOM en PNG avec ordre croissant et décroissant
Convertir un PDF en image (JPEG / PNG) avec Python
Lire JSON avec Python et générer un CSV
Convertir un fichier svg en png / ico avec Python
J'ai essayé de sortir LLVM IR avec Python
entrée et sortie python
Je veux gérer l'optimisation avec python et cplex
Essayez le fonctionnement de la base de données avec Python et visualisez avec d3
Lire le fichier json avec Python, le formater et générer le json
[Python-pptx] Afficher les informations de police PowerPoint au format csv avec python
Il est facile d'exécuter SQL avec Python et de générer le résultat dans Excel
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Python et matériel - Utilisation de RS232C avec Python -
Essayez la sortie Python avec Haxe 3.2
Connectez-vous à Wikipedia avec Python
Publiez sur Slack avec Python 3
Basculer python vers 2.7 avec des alternatives
Écrire en csv avec Python
python avec pyenv et venv
Fonctionne avec Python et R
API Nifty Cloud facile à utiliser avec botocore et python
écran et écran partagé avec connexion python et ssh au serveur distant
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
Procédure d'installation pour Python et Ansible avec une version spécifique
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
[Jouons avec Python] Traitement d'image en monochrome et points
Convertir une vidéo en noir et blanc avec ffmpeg + python + opencv
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
Obtenez des données supplémentaires vers LDAP avec python (Writer et Reader)
Comment se connecter à AtCoder avec Python et soumettre automatiquement
Récupérez la source de la page à charger indéfiniment avec python.
Communiquez avec FX-5204PS avec Python et PyUSB
Convertir en chaîne lors de la sortie de la sortie standard avec le sous-processus Python
Extraire le jeu de données bigquery et la liste des tables avec python et la sortie en CSV
Faites fonctionner Jupyter avec l'API REST pour extraire et enregistrer le code Python
Activé pour convertir PNG en JPG avec Pillow of Python
Python: comment utiliser async avec
Robot fonctionnant avec Arduino et python
Python 3.6 sous Windows ... et vers Xamarin.
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Lien pour commencer avec python
[Introduction à Python3 Jour 1] Programmation et Python