Учитывая набор изображений, которые должны быть идентифицированы, и обученную модель, как мне заставить модель идентифицировать изображения? - PullRequest
0 голосов
/ 22 апреля 2019

Как я могу заставить обученную модель идентифицировать изображения, извлеченные из другого места?

Модель обучена с использованием набора данных MNIST и изображений, которые будут по модели идентифицируются рукописные цифры, извлеченные из документа.

Используются следующие библиотеки: tensorflow 2.0, cv2 и numpy.

Как я понимаю, model.predict() идентифицирует свой ввод. Под этим я подразумеваю, что если я введу там рукописное изображение «3» в некоторой форме, оно идентифицирует и выведет «3». Опять же, это сказанное model обучено с набором данных MNIST на основе этого набора учебных пособий .

Предполагая, что это так, я хотел бы знать параметры функции или как мне отформатировать изображение / набор изображений, чтобы получить ожидаемый результат. Если нет, то я бы хотел знать, как именно это сделать.

import cv2
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from tensorflow import keras

# Load and prepare the MNIST dataset. Convert the samples from integers to floating-point numbers:
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

def createModel():  
  # Build the tf.keras.Sequential model by stacking layers. 
  # Choose an optimizer and loss function used for training:
  model = tf.keras.models.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(10, activation='softmax')
  ])

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

  return model

model = createModel()
model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))
model.evaluate(x_test, y_test)

c = cv2.imread("./3.png", 1)
c = c.reshape(-1, 28*28)/255.0

# now what?

Я ожидал, что model.predict() сделает это так, как мне нужно. Пока это мои попытки:

model.predict(c) выходы TypeError: predict() missing 1 required positional argument: 'x'

model.predict([""], c) выходы ValueError: When using data tensors as input to a model, you should specify the шаги argument.

и так далее.

Я знаю, что в этот момент я вхожу слепо и неправильно. Любой шаг в правильном направлении приветствуется. Спасибо!

EDIT:

Так что я знаю, что входное изображение c должно быть в оттенках серого 28x28 даже до изменения формы, поэтому я попытался пропустить это. Ошибка, которая появилась, когда я реализовал прогноз:

...
tensorflow.python.framework.errors_impl.InvalidArgumentError: Matrix size-incompatible: In[0]: [28,28], In[1]: [784,128]
     [[{{node dense/MatMul}}]] [Op:__inference_keras_scratch_graph_2593]

Итак, я использовал c = c.reshape(-1, 28*28)/255.0 до предсказания, но тогда он никогда не предсказывал правильное значение любой цифры.

Затем я попытался использовать cv2.imshow(str(predicted_value), c), чтобы показать, как будет выглядеть входное изображение. Показанное изображение представляет собой тонкую линию черных и белых пятен. Поскольку я до сих пор не могу связать изображения, здесь есть ссылка на вывод .

Мой вопрос: это то, как должно выглядеть изображение для модели? Или что я все испортил? Спасибо!

1 Ответ

0 голосов
/ 23 апреля 2019

Поскольку ваша модель тренируется с изображениями серой шкалы, она ожидает, что входное изображение будет серой шкалой.RGB изображение имеет 3 канала.Изображение серой шкалы имеет только 1 канал.

Таким образом, при загрузке изображения вместо 1 , что означает cv2.IMREAD_COLOR , используйте 0 соответствует cv2.IMREAD_GRAYSCALE для загрузки изображения в режиме оттенков серого.

(Примечание: используйте -1 для cv2.IMREAD_UNCHANGED См.документация opencv здесь для более подробной информации)

yourimage = cv2.imread("yourimage.png", 0)

Для прогнозирования после изменения формы вы можете использовать:

predicted_value = np.argmax(model.predict(yourimage))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...