In meinem OpenCV -Projekt möchte ich eine Sudoku -Tabelle lesen, sie in einzelne Zellen
teilen und die Zahlen erkennen. Der Rest ist hauptsächlich Sudoku -Lösung. Ich habe mich entschlossen, den MNIST -Datensatz zu verwenden, um das Modell zu trainieren. Aus einem Grund, warum ich nicht herausfinden konnte, erkennt das Programm immer die Ziffer falsch. Ich werde meinen Code unten weiter erklären.
Code: Select all
(ds_train, ds_test), ds_info = tfds.load(
'mnist',
split=['train', 'test'],
shuffle_files=True,
as_supervised=True,
with_info=True,
)
def normalize_img(image, label):
"""Normalizes images: `uint8` -> `float32`."""
return tf.cast(image, tf.float32) / 255., label
ds_train = ds_train.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(ds_info.splits['train'].num_examples)
ds_train = ds_train.batch(128)
ds_train = ds_train.prefetch(tf.data.AUTOTUNE)
ds_test = ds_test.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_test = ds_test.batch(128)
ds_test = ds_test.cache()
ds_test = ds_test.prefetch(tf.data.AUTOTUNE)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28, 1)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)
])
model.compile(
optimizer=tf.keras.optimizers.legacy.Adam(0.001),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],
)
model.fit(
ds_train,
epochs=6,
validation_data=ds_test,
)
sample = cv.cvtColor(sample, cv.COLOR_BGR2GRAY)
sample = cv.resize(sample, (28, 28))
view_image(sample)
sample = np.invert(np.array([sample]))
prediction = model.predict(sample)
print(np.argmax(prediction))
sample = np.invert(np.array([sample])).reshape((28, 28, 1))
cv.imshow("test", sample)
cv.waitKey(0)
Dies ist mein Bild vor der Verarbeitung und nach der Verarbeitung. 28x28:
Das Modell sagt mein Bild als 3 ständig vor. Ich kenne den Grund dafür nicht. />
size = 300
(ds_train, ds_test), ds_info = tfds.load(
'mnist',
split=['train', 'test'],
shuffle_files=True,
as_supervised=True,
with_info=True,
)
def resize_img(image, label):
return tf.image.resize(image, (size, size)), label
ds_train = ds_train.map(resize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_test = ds_test.map(resize_img, num_parallel_calls=tf.data.AUTOTUNE)
def normalize_img(image, label):
"""Normalizes images: `uint8` -> `float32`."""
return tf.cast(image, tf.float32) / 255., label
ds_train = ds_train.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(ds_info.splits['train'].num_examples)
ds_train = ds_train.batch(128)
ds_train = ds_train.prefetch(tf.data.AUTOTUNE)
ds_test = ds_test.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_test = ds_test.batch(128)
ds_test = ds_test.cache()
ds_test = ds_test.prefetch(tf.data.AUTOTUNE)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(size, size, 1)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)
])
model.compile(
optimizer=tf.keras.optimizers.legacy.Adam(0.001),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],
)
model.fit(
ds_train,
epochs=6,
validation_data=ds_test,
)
sample = cv.cvtColor(sample, cv.COLOR_BGR2GRAY)
sample = cv.resize(sample, (size, size))
view_image(sample)
sample = np.invert(np.array([sample]))
prediction = model.predict(sample)
print(np.argmax(prediction))
for class_index, prob in enumerate(prediction[0]):
print(f'Class {class_index}: Probability {prob}')
sample = np.invert(np.array([sample])).reshape((size, size, 1))
cv.imshow("test", sample)
cv.waitKey(0)
< /code>
Dies ist der Code, den ich geschrieben habe, um alle Bilder im 300x300 -Format zu verarbeiten. Natürlich ist es langsamer als der 28x28, aber ich dachte, dass es die Genauigkeit erhöhen würde. Leider hat es nichts geändert.
In meinem OpenCV -Projekt möchte ich eine Sudoku -Tabelle lesen, sie in einzelne Zellen [url=viewtopic.php?t=13628]teilen[/url] und die Zahlen erkennen. Der Rest ist hauptsächlich Sudoku -Lösung. Ich habe mich entschlossen, den MNIST -Datensatz zu verwenden, um das Modell zu trainieren. Aus einem Grund, warum ich nicht herausfinden konnte, erkennt das Programm immer die Ziffer falsch. Ich werde meinen Code unten weiter erklären.[code](ds_train, ds_test), ds_info = tfds.load(
'mnist',
split=['train', 'test'],
shuffle_files=True,
as_supervised=True,
with_info=True,
)
def normalize_img(image, label):
"""Normalizes images: `uint8` -> `float32`."""
return tf.cast(image, tf.float32) / 255., label
ds_train = ds_train.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(ds_info.splits['train'].num_examples)
ds_train = ds_train.batch(128)
ds_train = ds_train.prefetch(tf.data.AUTOTUNE)
ds_test = ds_test.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_test = ds_test.batch(128)
ds_test = ds_test.cache()
ds_test = ds_test.prefetch(tf.data.AUTOTUNE)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28, 1)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)
])
model.compile(
optimizer=tf.keras.optimizers.legacy.Adam(0.001),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],
)
model.fit(
ds_train,
epochs=6,
validation_data=ds_test,
)
sample = cv.cvtColor(sample, cv.COLOR_BGR2GRAY)
sample = cv.resize(sample, (28, 28))
view_image(sample)
sample = np.invert(np.array([sample]))
prediction = model.predict(sample)
print(np.argmax(prediction))
sample = np.invert(np.array([sample])).reshape((28, 28, 1))
cv.imshow("test", sample)
cv.waitKey(0)
[/code]
Dies ist mein Bild vor der Verarbeitung und nach der Verarbeitung. 28x28:
Das Modell sagt mein Bild als 3 ständig vor. Ich kenne den Grund dafür nicht. />
size = 300
(ds_train, ds_test), ds_info = tfds.load(
'mnist',
split=['train', 'test'],
shuffle_files=True,
as_supervised=True,
with_info=True,
)
def resize_img(image, label):
return tf.image.resize(image, (size, size)), label
ds_train = ds_train.map(resize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_test = ds_test.map(resize_img, num_parallel_calls=tf.data.AUTOTUNE)
def normalize_img(image, label):
"""Normalizes images: `uint8` -> `float32`."""
return tf.cast(image, tf.float32) / 255., label
ds_train = ds_train.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(ds_info.splits['train'].num_examples)
ds_train = ds_train.batch(128)
ds_train = ds_train.prefetch(tf.data.AUTOTUNE)
ds_test = ds_test.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE)
ds_test = ds_test.batch(128)
ds_test = ds_test.cache()
ds_test = ds_test.prefetch(tf.data.AUTOTUNE)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(size, size, 1)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)
])
model.compile(
optimizer=tf.keras.optimizers.legacy.Adam(0.001),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=[tf.keras.metrics.SparseCategoricalAccuracy()],
)
model.fit(
ds_train,
epochs=6,
validation_data=ds_test,
)
sample = cv.cvtColor(sample, cv.COLOR_BGR2GRAY)
sample = cv.resize(sample, (size, size))
view_image(sample)
sample = np.invert(np.array([sample]))
prediction = model.predict(sample)
print(np.argmax(prediction))
for class_index, prob in enumerate(prediction[0]):
print(f'Class {class_index}: Probability {prob}')
sample = np.invert(np.array([sample])).reshape((size, size, 1))
cv.imshow("test", sample)
cv.waitKey(0)
< /code>
Dies ist der Code, den ich geschrieben habe, um alle Bilder im 300x300 -Format zu verarbeiten. Natürlich ist es langsamer als der 28x28, aber ich dachte, dass es die Genauigkeit erhöhen würde. Leider hat es nichts geändert.