Prozedur zum Laden von MNIST mit Python und zur Ausgabe an png

Was du machen willst

Wir sammeln Stichproben von Lern- / Verifizierungsdaten für maschinelles Lernen.

Annahme

Was ist MNIST?

Bilddaten von "handschriftlichen Zahlen" von 0 bis 9. Wird für maschinelles Lernen verwendet, z. B. "Handschriftliche Zahlen mit KI identifizieren und klassifizieren". http://yann.lecun.com/exdb/mnist/ Sie können es kostenlos von herunterladen.

image.png

Dateiorganisation

Der Inhalt der Datei

Wenn Sie die gz-Datei entpacken, wird sie zu einer Binärdatei wie der folgenden.

t10k-images.idx3-ubyte

image.png

Obwohl es sich um Bilddaten handelt, liegt sie nicht in einem Format wie .jpg vor Es kann nicht in der Vorschau angezeigt werden.

Bild und Vorschau

Wenn Sie beispielsweise Python-Code schreiben und ihn mit numpy oder PIL in png ausgeben, können Sie ihn als normale Bilddatei anzeigen.

image.png

Vorbereitungen

Wenn wget und unzip noch nicht enthalten sind, installieren Sie sie. Für Ubuntu:

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

Datei download

Laden Sie zuerst gz mit wget herunter.

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

Dann entpacken.

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

Dann

-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

Wird ausgegeben. Dann schreiben Sie den Python-Code.

Implementierung (Bildabbildung)

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 ")

Lauf

python test.py

Ausgabeergebnis

output.png

image.png

Kommentar

Bilddaten zum Lernen train-images-idx3-ubyte Die Struktur von ist wie folgt.

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

Demnach wird der Offset nacheinander gelesen, während um 4 verschoben wird.

magic_number = f.read( 4 )

Das Ergebnis ist 2051.

number_of_images = f.read( 4 )

Das Ergebnis ist 60000.

number_of_rows = f.read( 4 )

Das Ergebnis ist 28.

number_of_columns = f.read( 4 )

Das Ergebnis ist 28.

Wenn Sie den Wert wirklich sehen wollen

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);

Sie können dies überprüfen, indem Sie Folgendes ausgeben.

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

Und

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

Da dies der Fall ist, wird das Bild nach dem Versatz 16 eingefügt

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

Kann gelesen werden als. Danach stürzte ich mich in Numpy und speicherte es im PNG-Format.

Png kontinuierlich durch Schleifenverarbeitung ausgeben

Wenn Sie den PNG-Ausgabeprozess wie unten gezeigt in einer Schleife drehen, können Sie kontinuierlich Bilder erstellen. Wenn Sie danach 10 Blätter ausgeben möchten, können Sie die Anzahl der Schleifen nach Belieben angeben, z. B. Bereich (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 ")

Das Ausgabeergebnis ist unten.

image.png

Vergleich von Numpy Array und PNG

Wenn np_ary, ein numpy-Array, von print () angezeigt wird, lauten die Array-Daten wie folgt.

 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   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]


Es ist ersichtlich, dass dies die Position jedes Pixels ist, aus dem die Bilddatei und ihre Farbinformationen bestehen.

image.png

Informationen zu Etikettendaten

Die obige Implementierung bestand darin, Bilddaten (Bilder) in PNG zu konvertieren. Darüber hinaus müssen auch die Etikettendaten (Etiketten) überprüft werden. Die Implementierung dafür ist wie folgt.

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)

Ausgabeergebnis

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

Die Struktur der Etikettendaten ist wie folgt.

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.

Mit anderen Worten, wenn Sie den Versatz 8 und höher nacheinander lesen, können Sie das Etikett lesen. Wenn Sie es in einer Schleife implementieren möchten, folgen Sie unten.


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

Das Ausgabeergebnis ist unten.

5
0
4
1
9
2
1
3
1
4

Vergleichen Sie mit dem Ausgabeergebnis von Images.

image.png

Jedes PNG-Bild zeigt korrekt "welche Nummer?" Mit einem Etikett an.

Recommended Posts

Prozedur zum Laden von MNIST mit Python und zur Ausgabe an png
Ausgabe in eine CSV-Datei mit Python
Geben Sie Farbzeichen mit Python zu hübsch aus
Python-Protokoll mit GAE an die Konsole ausgeben
Fraktal zum Erstellen und Spielen mit Python
Kratzen Sie das Essen mit Python und geben Sie es an CSV aus
MessagePack-Versuchen Sie, Java und Python mit RPC zu verbinden
DICOM zu PNG Konvertierung mit aufsteigend und absteigend
Konvertieren Sie PDF in Bilder (JPEG / PNG) mit Python
Lesen Sie JSON mit Python und geben Sie CSV aus
Konvertieren Sie die SVG-Datei mit Python in png / ico
Ich habe versucht, LLVM IR mit Python auszugeben
Python-Eingabe und Ausgabe
Ich möchte die Optimierung mit Python und CPlex behandeln
Probieren Sie die DB-Operation mit Python aus und visualisieren Sie sie mit d3
Lesen Sie die json-Datei mit Python, formatieren Sie sie und geben Sie json aus
[Python-pptx] Gibt PowerPoint-Schriftinformationen mit Python in CSV aus
Es ist einfach, SQL mit Python auszuführen und das Ergebnis in Excel auszugeben
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Python und Hardware-Verwenden von RS232C mit Python-
Probieren Sie die Python-Ausgabe mit Haxe 3.2 aus
Stellen Sie mit Python eine Verbindung zu Wikipedia her
Post to Slack mit Python 3
Schalten Sie Python mit Alternativen auf 2.7 um
Schreiben Sie mit Python in csv
Python mit Pyenv und Venv
Funktioniert mit Python und R.
Einfache Verwendung der Nifty Cloud API mit Botocore und Python
Bildschirm und geteilter Bildschirm mit Python- und SSH-Anmeldung am Remote-Server
[Python] Wie man mit Klassenvariablen mit Dekorator und Metaklasse spielt
Installationsverfahren für Python und Ansible mit einer bestimmten Version
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
[Lass uns mit Python spielen] Bildverarbeitung zu Monochrom und Punkten
Konvertieren Sie Videos mit ffmpeg + python + opencv in Schwarzweiß
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Holen Sie sich zusätzliche Daten zu LDAP mit Python (Writer und Reader)
So melden Sie sich mit Python bei AtCoder an und senden automatisch
Holen Sie sich die Quelle der Seite unbegrenzt mit Python zu laden.
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Konvertieren Sie in eine Zeichenfolge, während Sie die Standardausgabe mit dem Python-Unterprozess ausgeben
Extrahieren Sie das Bigquery-Dataset und die Tabellenliste mit Python und geben Sie es in CSV aus
Führen Sie Jupyter mit der REST-API aus, um Python-Code zu extrahieren und zu speichern
Aktiviert, um PNG mit Pillow of Python in JPG zu konvertieren
Python: So verwenden Sie Async mit
Roboter läuft mit Arduino und Python
Python 3.6 unter Windows ... und zu Xamarin.
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Link, um mit Python zu beginnen
[Einführung in Python3 Tag 1] Programmierung und Python