如何将文件或图像作为 Keras 模型中的参数提供给 model.predict?
Posted
技术标签:
【中文标题】如何将文件或图像作为 Keras 模型中的参数提供给 model.predict?【英文标题】:How to give file or image to model.predict as a parameter in a Keras model? 【发布时间】:2020-11-23 21:28:36 【问题描述】:我看过一个关于 Python 图像识别的教程,并使用编写的代码来训练网络。它编译和学习很好,但是如何用它来预测新图像呢?可能类似于:model.predict(y)
?
代码如下:
import numpy
from keras.datasets import cifar10
from keras.models import Sequential
from keras.layers import Dense, Flatten, Activation
from keras.layers import Dropout
from keras.layers.convolutional import Conv2D, MaxPooling2D
from keras.utils import np_utils
from keras.optimizers import SGD
numpy.random.seed(42)
#Loading data
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
batch_size = 32
nb_classes = 10
#Number of epochs
epochNumber = 25
#Image size
img_rows, img_cols = 32, 32
#RGB
img_channels = 3
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
#To catogories
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)
#Creating a model
model = Sequential()
#Adding layers
model.add(Conv2D(32, (3, 3), padding='same',
input_shape=(32, 32, 3), activation='relu'))
model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes, activation='softmax'))
#Optimization
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
#Training model
model.fit(X_train, Y_train,
batch_size=batch_size,
epochs=epochNumber,
validation_split=0.1,
shuffle=True,
verbose=2)
scores = model.evaluate(X_test, Y_test, verbose=0)
print("Accuracy on test data: %.2f%%" % (scores[1]*100))
那么,如何预测呢?
target = "C://Users//Target.png"
print(model.predict(target))
如何正确使用model.predict
以及如何将结果转换为用户友好的输出?
【问题讨论】:
您需要先将图像加载到数组中,然后才能使用model.predict
。然后,您可以在模型输出上运行 .argmax(-1)
以获取预测的类的 ID。
【参考方案1】:
注意:如果您使用keras
包而不是tf.keras
,请将以下所有代码sn-ps 中的tf.keras
替换为keras
。
要加载单张图片,可以使用tf.keras.preprocessing.image.load_img
:
image = tf.keras.preprocessing.image.load_img(image_path, target_size=(img_rows, img_cols))
这会将图像加载为PIL 格式;因此,我们需要先将其转换为 numpy 数组,然后再将其提供给我们的模型:
import numpy as np
input_arr = tf.keras.preprocessing.image.img_to_array(image)
input_arr = np.array([input_arr]) # Convert single image to a batch.
现在,你可能会因为在input_arr
上使用predict
方法而犯了一个错误。但是,您应该首先在预测阶段执行与训练阶段相同的预处理步骤:
input_arr = input_arr.astype('float32') / 255. # This is VERY important
现在,可以将其提供给模型进行预测:
predictions = model.predict(input_arr)
奖励:由于您的模型是一个分类器,并且它在顶部使用 Softmax 激活,因此predictions
变量将包含每个类的概率。为了找出预测的类,我们使用 Numpy 中的argmax
来查找概率最高的类的索引:
predicted_class = np.argmax(predictions, axis=-1)
【讨论】:
【参考方案2】:您可以使用 cv2 读取图像。您想确保您在训练中对输入图像所做的任何处理,您也对您使用 CV2 读入的图像进行处理。小心 CV2 以 BGR 格式读取图像。如果您在 rgb 图像上训练您的模型,您需要将 cv2 图像转换为 rgb,如下面的代码所示。然后您想让图像为 32 X 32 X3,因此如果不是该大小,请使用 cv2 调整图像大小。我假设您重新缩放了训练图像,因此您也需要重新缩放 cv2 图像。代码如下
import cv2
img=cv2.imread(f_path) # where f_path is the path to the image file
img=cv2.resize(img, (32,32), interpolation = cv2.INTER_AREA)
img=img/255
# CV2 inputs images in BGR format in general when you train a model you may have
#trained it with images in rgb format. If so you need to convert the cv2 image.
#uncomment the line below if that is the case.
#img=img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
predictions=model.predict(img)
pre_class=predictions.argmax()
# this will give you an integer value
【讨论】:
以上是关于如何将文件或图像作为 Keras 模型中的参数提供给 model.predict?的主要内容,如果未能解决你的问题,请参考以下文章
如何将图像文件夹中的数据与在 Keras 中保存分类详细信息的 excel 结合起来
如何在keras tensorflow中将图像作为输入并获取另一个图像作为输出