我使用MNIST数据集创建了一个模型,当我使用自己的图像进行测试时,它可以正确地预测类。
完成模型制作后,我将其保存为.h5文件,并编写了一个程序,使用网络摄像头预测模型的输出。
import numpy as np
import cv2
from PIL import Image
import tensorflow as tf
import os
abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
os.chdir(dname)
cam = cv2.VideoCapture(0)
model = tf.keras.models.load_model("model.h5")
class_names = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
def predict_number(prediction_image):
global model, class_names
predictions = model.predict(prediction_image)
#print(predictions)
prediction_final = np.argmax(predictions)
#print(prediction_final)
#print(f"Prediction: {class_names[prediction_final]}")
return class_names[prediction_final]
while True:
ret, win = cam.read()
window_resized = win[0:450, 0:350]
cv2.rectangle(win, (100, 100), (250, 250), (255, 0, 0), 0)
img = win[100:250, 100:250]
im_resized = cv2.resize(img, (28, 28), Image.ANTIALIAS)
im_resized_array = np.asarray(im_resized)
im_resized_array = im_resized_array[:,:,0]
im_resized_array = im_resized_array / 255
final_image = np.reshape(im_resized_array, (1, 28, 28, 1))
prediction = predict_number(final_image)
image = cv2.putText(window_resized, str(prediction), (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA)
cv2.imshow("Camera", window_resized)
if cv2.waitKey(1) == ord(' '):
break
cam.release()
cv2.destroyAllWindows()
每当我运行此代码时,模型都会不断预测";8〃;不管出于某种原因我展示了什么,但我确信我的模型运行正常,因为当我使用从同一台相机拍摄的.ipynb格式的图像进行测试时,它正确地预测了它。
我觉得我保存/加载模型的方式有问题,或者我处理图像的方式有错误。
我用保存我的模型
model.save("model.h5")
I这个问题可能与数据集和我处理图像的方式有关。我最终使用了来自tfds
的数据集,而不是keras.datasets
:
dataset = 'mnist'
(img_train, label_train), (img_test, label_test) = tfds.as_numpy(tfds.load(dataset, split = ['train', 'test'], shuffle_files=True, batch_size=-1, as_supervised=True))
builder = tfds.builder(dataset)
info = builder.info
print(info.features["label"].names)
labels = info.features["label"].names
img_train = img_train / 255.0
img_test = img_test / 255.0
然后我改变了处理图像的方式,然后用运行model.predict()
image = cv2.imread(#image)
image = np.resize(image, (28,28,1))
image = np.array(image).astype('float32')
image = image.reshape(1,28,28,1)
image = image / 255
print(np.shape(image))
tf.convert_to_tensor(image)
pred = model.predict(image)
print(pred)
pred_index = np.argmax(pred)
print("Prediction: ", labels[pred_index])
这解决了问题,现在模型至少尝试通过cv2
预测我给它的任何图像
我认为我处理图像的方式使image
成为一个空的numpy数组,因此无论我使用什么图像,它每次都预测8,因为它没有任何其他选择。