4 Pluspunkte 0 Minuspunkte

Ich habe ein einfaches Modell mit dem mnist Datensatz trainiert

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.utils import to_categorical

(X_train, y_train), (X_test, y_test) = mnist.load_data()

X_train = X_train / 255.0
X_test = X_test / 255.0

y_train = to_categorical(y_train, num_classes=10)
y_test = to_categorical(y_test, num_classes=10)

model = Sequential([
    Flatten(input_shape=(28, 28)),  # Eingabeschicht
    Dense(128, activation='relu'),   # Versteckte Schicht mit 128 Neuronen
    Dense(10, activation='softmax')   # Ausgabeschicht mit 10 Neuronen (10 Klassen)
])

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

model.fit(X_train, y_train, epochs=5, batch_size=32, validation_split=0.2)

loss, accuracy = model.evaluate(X_test, y_test)
print(f"Test Loss: {loss:.4f}, Test Accuracy: {accuracy:.4f}")

und die Vorhersage funktioniert auch

import numpy as np
import matplotlib.pyplot as plt

test_image = X_test[0]  

batched_image = np.expand_dims(test_image, axis=0)

predictions = model.predict(batched_image)

predicted_digit = np.argmax(predictions)

plt.imshow(test_image, cmap='gray')
plt.title(f"Predicted Digit: {predicted_digit}")
plt.show()

aber das verwendet nur Bilder aus dem Datensatz. Die kennt das Modell also alle schon. Wie kann ich aber jetzt eine Ziffer auf einem beliebigen Bild erkennen? Ich möchte mit Paint eine Ziffer zeichnen und diese dann als PNG speichern und erkennen. Wie geht das?

von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Du musst die Pixelwerte auf den Bereich von 0 bis 1 skalieren und die Größe des Bildes auf das erwartete Eingabeformat des Modells (28 x 28 Pixel) anpassen. Mit dem PIL Modul kannst du das PNG laden und mit Numpy zu einem Array konvertieren.

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

# Laden des PNG-Bilds und Konvertierung in Graustufen
image = Image.open('image.png').convert('L')

# Skalierung der Pixelwerte auf den Bereich [0, 1]
image = np.array(image) / 255.0

# Anpassen der Bildgröße auf 28x28 (wie im MNIST-Datensatz)
resized_image = np.array(Image.fromarray((image * 255).astype(np.uint8)).resize((28, 28)))

# Das Modell verwendet Eingaben im Batch-Format, daher Bild in ein Batch umwandeln
batched_image = np.expand_dims(resized_image, axis=0)

# Vorhersage mit dem Modell machen
predictions = model.predict(batched_image)

# Die Ausgabe ist eine Wahrscheinlichkeitsverteilung für jede Ziffer (0-9)
predicted_digit = np.argmax(predictions)

# Das Originalbild anzeigen
plt.imshow(resized_image, cmap='gray')
plt.title(f"Predicted Digit: {predicted_digit}")
plt.show()
von