Nous recueillons des échantillons de données d'apprentissage / de vérification pour l'apprentissage automatique.
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.
Lorsque vous décompressez le fichier gz, il devient un fichier binaire comme celui ci-dessous.
t10k-images.idx3-ubyte
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.
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.
Si wget et unzip ne sont pas encore inclus, installez-les. Pour ubuntu:
apt-get install -y wget
apt-get install unzip
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.
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 ")
python test.py
output.png
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.
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.
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.
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)
--------------------
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.
Chaque image png indique correctement "quel numéro?" Avec une étiquette.
Recommended Posts