Python 给定一组要识别的图像和一个经过训练的模型,我如何使模型识别图像?

Python 给定一组要识别的图像和一个经过训练的模型,我如何使模型识别图像?,python,tensorflow,keras,Python,Tensorflow,Keras,如何使经过训练的模型识别从其他地方提取的图像 使用MNIST数据集对模型进行训练,并将图像 由模型识别的是从文档中提取的手写数字 使用的库包括tensorflow 2.0、cv2和numpy 据我所知,model.predict()标识其输入。我的意思是,如果我以某种形式输入“3”的手写图像,它将识别并输出“3”。同样,所述模型使用基于的MNIST数据集进行训练 假设是,我想知道函数的参数,或者如何格式化图像/图像集以获得预期的输出。如果没有,我想知道我将如何确切地实现这一点 导入cv2 将ma

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

使用MNIST数据集对模型进行训练,并将图像 由模型识别的是从文档中提取的手写数字

使用的库包括
tensorflow 2.0
cv2
numpy

据我所知,
model.predict()
标识其输入。我的意思是,如果我以某种形式输入“3”的手写图像,它将识别并输出“3”。同样,所述
模型
使用基于的MNIST数据集进行训练

假设是,我想知道函数的参数,或者如何格式化图像/图像集以获得预期的输出。如果没有,我想知道我将如何确切地实现这一点

导入cv2
将matplotlib.pyplot作为plt导入
将numpy作为np导入
导入tensorflow作为tf
从tensorflow进口keras
#加载并准备MNIST数据集。将样本从整数转换为浮点数:
(x_列,y_列),(x_测试,y_测试)=keras.dataset.mnist.load_data()
x_系列,x_测试=x_系列/255.0,x_测试/255.0
def createModel():
#通过层叠建立tf.keras.Sequential模型。
#选择用于培训的优化器和损失函数:
模型=tf.keras.models.Sequential([
keras.layers.Flatten(输入_形状=(28,28)),
keras.layers.致密(128,活化='relu'),
keras.层压降(0.2),
keras.层.致密(10,活化='softmax')
])
model.compile(优化器='adam',
损失=“稀疏”\u分类”\u交叉熵',
指标=[‘准确度’])
回归模型
model=createModel()
模型拟合(x_序列,y_序列,历元=5,验证数据=(x_检验,y_检验))
模型评估(x_检验,y_检验)
c=cv2.imread(“./3.png”,1)
c=c.重塑(-1,28*28)/255.0
#现在怎么办?
我希望
model.predict()
能满足我的需要。到目前为止,这是我的尝试:

model.predict(c)
outputs
TypeError:predict()缺少1个必需的位置参数:“x”

model.predict([“”],c)
outputs
ValueError:当使用数据张量作为模型的输入时,您应该指定
步骤
参数。

等等

我知道在这一点上我是盲目和错误的。朝着正确方向迈出的任何一步都是值得赞赏的。谢谢

编辑:

所以我知道即使在重塑之前,输入图像
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.reformate(-1,28*28)/255.0
,但它从未预测任何数字的正确值

然后我尝试使用
cv2.imshow(str(predicted_value),c)
来显示输入图像的样子。显示的图像只是一条黑白斑点的细线。因为我还不能链接图片


我的问题是,这是模型的图像应该是什么样子的吗?或者我可能把事情搞砸了?谢谢

当您的模型使用灰度图像进行训练时,它希望输入图像为灰度图像。 RGB图像有3个通道。灰度图像只有一个通道

因此,当加载图像时,使用0对应于cv2.IMREAD\u GRAYSCALE以灰度模式加载图像,而不是1代表cv2.IMREAD\u COLOR

(注意:对cv2使用-1。IMREAD\u未更改有关详细信息,请参阅opencv文档)

对于预测,重塑后可以使用:

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

c
的形状是什么?哦,我在示例代码中犯了一个错误
txt
应该是
c
,因此
c
应该是单通道28*28图像,这与单个MNIST图像的形状相同。谢谢!成功了!然而,它从来没有一个数字是正确的。请在我的帖子中查看以下编辑,因为评论太长了。再次感谢你!预测的准确性是衡量神经网络结构好坏的一个指标,它还取决于训练/验证数据。你必须调整你的神经网络,通过调整超参数,如层数、层类型、学习率、优化器等,使其具有良好的泛化能力。在你的情况下,我认为5个时代不足以建立模型。尝试将其增加到100以上。你的验证准确度是多少?所以输入图像不是问题?顺便说一下,如果您所说的验证精度是训练或加载重量后的
模型评估(x_检验,y_检验)
的输出,那么它至少是0.97。我会试试你说的。非常感谢。
predicted_value = np.argmax(model.predict(yourimage))