Как предсказать одно изображение с помощью Keras ImageDataGenerator?

#python #image #tensorflow #keras #conv-neural-network

#python #изображение #тензорный поток #keras #conv-нейронная сеть

Вопрос:

Я обучил CNN классифицировать изображения по 3 классу. при обучении модели я использовал класс ImageDataGenerator из keras, чтобы применить функцию предварительной обработки к изображению и изменить его масштаб. Теперь моя сеть обучена с хорошей точностью на тестовом наборе, но я не знаю, как применить функцию предварительной обработки к прогнозированию одного изображения. Если я использую ImageDataGenerator, он ищет каталог. Предложите мне несколько альтернатив для выполнения функции предварительной обработки и масштабирования на одном изображении. смотрите мой код ниже

ОБУЧАЮЩИЙ НАБОР:

 train_datagen = ImageDataGenerator(preprocessing_function = tf.keras.applications.vgg16.preprocess_input,
                                   rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)
training_set = train_datagen.flow_from_directory('./training_set',
                                                 target_size = (224, 224),
                                                 batch_size = 10,
                                                 class_mode = 'categorical')
  

НАБОР ДЛЯ ТЕСТИРОВАНИЯ:

 test_datagen =ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input,                                                            
                                                         rescale = 1./255)
test_set = test_datagen.flow_from_directory('./test_set',
                                            target_size = (224, 224),
                                            batch_size = 10,
                                            shuffle=False,
                                            class_mode = 'categorical') 
  

Теперь я не могу применить функцию предварительной обработки и масштабирования к одному изображению перед предсказанием.
ОДНО ПРЕДСКАЗАНИЕ:

 single_datagen = ImageDataGenerator(preprocessing_function=tf.keras.applications.vgg16.preprocess_input,
                                   rescale = 1./255)
single_test = single_datagen.flow_from_directory('./single_prediction/cc.jpg',
                                            target_size = (224, 224),
                                            batch_size = 1,
                                            class_mode = 'categorical') 
  

ОШИБКА:
NotADirectoryError: [Ошибка № 20] Не каталог: ‘./single_prediction/cc.jpg ‘

Комментарии:

1. Вы убедились, что каталог доступен из программы?

Ответ №1:

Если вы хотите предсказать одно изображение, вы можете использовать следующий код.

Он возвращает список вероятностей каждого класса на основе того, как были организованы папки (классы) в вашем наборе данных train. Таким образом, первый индекс возвращаемого списка — это первая папка (или класс) в вашем наборе данных train и так далее. Индекс с наибольшей вероятностью является вашим прогнозируемым классом.

 from keras.preprocessing.image import load_img, img_to_array, ImageDataGenerator
from keras.applications.vgg16 import preprocess_input

#load the image
my_image = load_img('your_single_image.jpeg', target_size=(224, 224))

#preprocess the image
my_image = img_to_array(my_image)
my_image = my_image.reshape((1, my_image.shape[0], my_image.shape[1], my_image.shape[2]))
my_image = preprocess_input(my_image)

#make the prediction
prediction = model.predict(my_image)
  

Вы можете вернуть гораздо более четкий результат, округлив результаты до целых чисел, используя приведенный ниже список.

 import numpy as np
[np.round(x) for x in prediction]
  

Элемент с индексом 1 является вашим прогнозируемым классом.

Комментарии:

1. эй, можете ли вы объяснить, какова цель строки my_image.reshape(…). Спасибо

2. ОК. Прежде всего, обратите внимание, что для этой предварительной обработки использовалась модель VGGNet. VGGNet был построен так, чтобы ожидать, что входной массив изображений будет 4-мерным: количество выборок, X пикселей, y пикселей и количество каналов.

3. Спасибо, я понял это, когда пропустил эту строку и получил ошибку ввода при попытке предсказать одно изображение. В любом случае спасибо! Ваши решения были довольно простыми

Ответ №2:

Генератор данных изображения просматривает указанный вами каталог и выполняет поиск подкаталогов в этом каталоге, которые определяют классы. Итак, создайте каталог с именем ‘./single_prediction. В этом каталоге создайте один подкаталог, назовите его test. В этом подкаталоге с именем test поместите изображения, которые вы хотите протестировать. В качестве альтернативы вы можете написать некоторый код на Python для создания предварительно обработанных изображений. Создайте каталог с именем test и поместите в него свои изображения. Я не тестировал его, но приведенный ниже код должен работать.

 import cv2
import numpy as np
import os
data_list=[]
dir=r'c:test'
test_list=os.listdir(dir) # create a list of the files in the directory
batch_size=len(test_list) # determine number of files to process
for f in test_list:  # iterate through the files
    fpath=os.path.join (dir, f) # create path to the image file
    img=cv2.imread(fpath) # read image using cv2
    img=cv2.resize(img, (224,224)) # resize the image
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) # cv2 creates bgr images, convert to rgb images
    img=tf.keras.applications.vgg16.preprocess_input(img)   # apply the Vgg16 preprocess function
    data_list.append(img)  # append processed image to the list
data=np.array(data_list)/255 # convert to an np array and rescale images
print (data.shape, batch_size)
predictions=model.predict(data,batch_size=batch_size, verbose=0 )
trials=len (predictions)
for i in range(0,trials):
    predicted_class=predictions[i].argmax() # get index of highest probability
    print (test_list[i], predicted_class) # print file name and class prediction