Как передать файл или изображение в model.predict в качестве параметра в модели Keras? - PullRequest
1 голос
/ 03 августа 2020

Я просмотрел учебник по распознаванию изображений в 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 и как преобразовать результат в удобный вывод?

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Примечание: если вы используете пакет keras вместо tf.keras, замените 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.

Теперь вы можете сделать ошибку, поспешив использовать метод predict для input_arr. Тем не менее, вы должны сначала выполнить те же шаги предварительной обработки на этапе обучения и на этапе прогнозирования:

input_arr = input_arr.astype('float32') / 255.  # This is VERY important

Теперь он готов к передаче модели для прогнозирования:

predictions = model.predict(input_arr)

Бонус: Поскольку ваша модель является классификатором и использует активацию Softmax вверху, переменная predictions будет содержать вероятности для каждого класса. Чтобы узнать предсказанный класс, мы используем argmax из Numpy, чтобы найти индекс класса с наибольшей вероятностью:

predicted_class = np.argmax(predictions, axis=-1)
1 голос
/ 04 августа 2020

вы можете использовать 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
...