给定要识别的图像集和经过训练的模型,我将如何使模型识别图像?

时间:2019-04-22 16:44:03

标签: python tensorflow keras

如何使受过训练的模型识别从其他地方提取的图像?

使用MNIST数据集训练模型,并将图像 该模型所标识的是从文档中提取的手写数字。

使用的库为tensorflow 2.0cv2numpy

据我了解,model.predict()标识其输入。意思是,如果我以某种形式在此处输入手写图像“ 3”,它将识别并输出“ 3”。再次说明,model是基于this set of tutorials的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.

以此类推。

我知道这时我会盲目而错误地进入。朝正确方向迈出的任何一步都值得赞赏。谢谢!

编辑:

所以我知道输入图像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)来显示输入图像的外观。所显示的图像只是黑白斑点的细线。由于我仍然无法链接图像,请改用here is the link to the output

我的问题是,这应该是模型的图像吗?还是我可能搞砸了?谢谢!

1 个答案:

答案 0 :(得分:0)

由于模型是使用灰度图像训练的,因此期望输入图像是灰度的。 RGB图像具有3个通道。灰度图像只有1个通道。

因此,当加载图像而不是代表 cv2.IMREAD_COLOR 1 时,请使用与 cv2.IMREAD_GRAYSCALE对应的 0 以灰度模式加载图像。

(注意:对于 cv2,请使用 -1 。IMREAD_UNCHANGED有关详细信息,请参考opencv文档here

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

要进行预测,可以在重塑后使用:

predicted_value = np.argmax(model.predict(yourimage))