Различные прогнозы с одним и тем же Keras CNN - PullRequest
1 голос
/ 14 апреля 2019

Я обучил CNN на изображениях 100x120, создав следующие генераторы:

train_datagen = ImageDataGenerator(
    rescale = 1. / 255,
    shear_range = 0.2,
    zoom_range = 0.2,
    horizontal_flip = True)

test_datagen = ImageDataGenerator(
    rescale=1/255)

#Apply them
train_generator = train_datagen.flow_from_directory(
    directory = train_data_dir,
    target_size=(parameters["img_width"], parameters["img_height"]),
    batch_size = parameters["batch_size"],
    class_mode= "categorical", 
    subset = "training", 
    color_mode = "rgb",
    seed = 42)

test_generator = test_datagen.flow_from_directory(
    directory = test_data_dir,
    target_size = (parameters["img_width"], parameters["img_height"]),
    color_mode = "rgb",
    batch_size=1,
    class_mode = None,
    shuffle = False,
    seed = 41)

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

# Method 1
test_generator.reset()
pred = model.predict_generator(test_generator,verbose = 1, steps = 1)
predicted_class_indices = np.argmax(pred, axis = 1)

# Convert the dictionary
labels = (train_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]

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

# Method 2
crop_img = cv2.resize(img,(100, 120))                        
crop_img = np.reshape(crop_img,[1, 100, 120, 3])
crop_img = crop_img.astype('float32')
crop_img /= 255

# ID
pred = model.predict(crop_img)
predicted_class_indices = np.argmax(pred, axis = 1)
prediction = [labels[k] for k in predicted_class_indices]

Я получаю другой результат. С чем это может быть связано?

1 Ответ

0 голосов
/ 14 апреля 2019

Keras 'ImageDataGenerator использует PIL, а не openCV под колпаком для загрузки и изменения размера изображений. При изменении размера с помощью билинейной интерполяции ( по умолчанию для cv2.resize), ImageDataGenerator по умолчанию использует интерполяцию ближайшего соседа.

Вы можете играть с вашим методом изменения размера, пока не получите тот же результат, или использовать вспомогательные функции load_img и img_to_array из предварительной обработки keras, чтобы убедиться, что вы выполнение той же предварительной обработки, что и во время обучения:

from keras.prepropressing.image import load_img, img_to_array

img = load_img(path_to_img, target_size=(100, 120)
img = img_to_array(img) / 255.
model.predict(img)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...