使用单张图像进行预测 TensorFlow, Keras

我正在尝试构建和训练一个模型来预测美国手语(使用Sign Language MNIST数据集)。到目前为止,我已经成功构建了模型,并使用该模型对训练数据集进行了预测。训练图像的准确率也超过了70%。现在我想使用训练好的模型对单张图像进行预测。但问题是预测结果(类名)是错误的。我参考了这个内核。我希望能够预测任何给定图像的手语符号。

以下是代码

train = pd.read_csv('../asl_data_train/sign-language-mnist/sign-mnist-train.csv')test = pd.read_csv('../asl_data_train/sign-language-mnist/sign-mnist-test.csv')train.head()train.shapelabels = train['label'].valuesunique_val = np.array(labels)np.unique(unique_val)plt.figure(figsize = (18,8))sns.countplot(x =labels)train.drop('label', axis = 1, inplace = True)images = train.valuesimages = np.array([np.reshape(i, (28, 28)) for i in images])images = np.array([i.flatten() for i in images])label_binrizer = LabelBinarizer()labels = label_binrizer.fit_transform(labels)plt.imshow(images[0].reshape(28,28))x_train, x_test, y_train, y_test = train_test_split(images, labels, test_size = 0.3, random_state = 101)batch_size = 128num_classes = 24epochs = 50x_train = x_train / 255x_test = x_test / 255x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)plt.imshow(x_train[0].reshape(28,28))

构建模型的代码

model = Sequential()model.add(Conv2D(64, kernel_size=(3,3), activation = 'relu', input_shape=(28,28,1) ))model.add(MaxPooling2D(pool_size = (2, 2)))model.add(Conv2D(64, kernel_size = (3, 3), activation = 'relu'))model.add(MaxPooling2D(pool_size = (2, 2)))model.add(Conv2D(64, kernel_size = (3, 3), activation = 'relu'))model.add(MaxPooling2D(pool_size = (2, 2)))model.add(Flatten())model.add(Dense(128, activation = 'relu'))model.add(Dropout(0.20))model.add(Dense(num_classes, activation = 'softmax'))model.compile(loss = keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adam(),              metrics=['accuracy'])history = model.fit(x_train, y_train, validation_data = (x_test, y_test), epochs=epochs, batch_size=batch_size)model.save("testmodel.h5")

对测试图像进行预测

plt.plot(history.history['acc'])plt.plot(history.history['val_acc'])plt.title("Accuracy")plt.xlabel('epoch')plt.ylabel('accuracy')plt.legend(['train','test'])plt.show()test_labels = test['label']test.drop('label', axis = 1, inplace = True)test_images = test.valuestest_images = np.array([np.reshape(i, (28, 28)) for i in test_images])test_images = np.array([i.flatten() for i in test_images])test_labels = label_binrizer.fit_transform(test_labels)test_images = test_images.reshape(test_images.shape[0], 28, 28, 1)test_images.shapey_pred = model.predict(test_images)accuracy_score(test_labels, y_pred.round())

在这里我得到了大约0.8的准确率…

这是我尝试使用单张图像预测手语符号的方式

 model = load_model("testmodel.h5")test_image = image.load_img('a.jpg',color_mode="grayscale",target_size=(28,28,1))print(test_image.format)print(test_image.mode)print(test_image.size)test_image = image.img_to_array(test_image)test_image = test_image / 255test_image  = test_image.reshape((-1,) + test_image.shape)print(test_image.dtype)print(test_image.shape)y_pred = model.predict_classes(test_image)print(y_pred)classname = y_pred[0]print("Class: ",classname)

在这里我得到了类名,但例如对于字母”A”(a.jpg),我得到了类6。我在这里做错了什么..请指导我正确的方向。


回答:

图像”a.jpg”是同一数据集的一部分吗?

如果答案是否定的 -> 你应该记住,NN只能预测与训练图像具有相似特征的图像。如果NN是用多种类型的图像训练的,它可以预测更广泛的图像,但如果NN是用非常静态的数据集(白色背景,相同大小,手部居中等)训练的,那么如果输入图像与训练图像非常不同,它就会失败。

如果答案是肯定的 -> 如果你得到了80%的准确率,该图像可能被错误分类。如果你使用了一组测试数据来验证你的NN,你必须通过将它们作为一个整体或逐个传递它们来获得相同的结果。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注