Как применить нормализацию к изображениям на этапе тестирования при использовании keras ImageDataGenerator? - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь предсказать новый образ, используя обученную модель. Моя точность 95%. Но предикаты класса всегда возвращают первую метку [0], что бы я ни вводил. Я думаю, одна из причин в том, что я использую featurewise_center=True и samplewise_center=True в ImageDataGenerator. Я думаю, что я должен сделать то же самое на моем входном изображении. Но я не могу найти, что эти функции сделали с изображением.

Любое предложение будет оценено.

ImageDataGenerator код:

train_datagen = ImageDataGenerator(
samplewise_center=True,
rescale=1. / 255,
shear_range=30,
zoom_range=30,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2)

test_datagen = ImageDataGenerator(
samplewise_center=True,
rescale=1. / 255,
shear_range=30,
zoom_range=30,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True)

Код прогноза (я использую изображение 100 * 100 * 3 для обучения модели):

model = load_model('CNN_model.h5')
img = cv2.imread('train/defect/6.png')
img = cv2.resize(img,(100,100))
img = np.reshape(img,[1,100,100,3])
img = img/255.

classes = model.predict_classes(img)

print (classes)

обновлено 11/14:

Я изменяю свой код для предсказания изображения, как показано ниже. Но модель все еще предсказывает тот же класс, даже если я передаю изображение, которое я использовал для обучения своей модели (и получил 95% -ную точность). Я что-то пропустил?

model = load_model('CNN_model.h5')
img = cv2.imread('train/defect/6.png')
img = cv2.resize(img,(100,100))
img = np.reshape(img,[1,100,100,3])
img = np.array(img, dtype=np.float64) 
img = train_datagen.standardize(img)

classes = model.predict_classes(img)
print(classes)

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Не полный ответ, но некоторая информация:

С эта ссылка , на которую ссылается документ keras:

# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

# this is the augmentation configuration we will use for testing:
# only rescaling
test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

Я думаю, вы должны сделать это для обучения. Тогда для теста я думаю, что использование train_datagen.standardize верно.

0 голосов
/ 23 мая 2019

Я думаю, что проблема заключается в том, что вы использовали cv2 для импорта изображений, потому что когда вы используете cv2.imread, каналы не "r, g, b", а "b, g, r".

например,

import cv2
from tensorflow.keras.preprocessing import image

bgr = cv2.imread('r.jpg')
rgb = np.array(image.load_img('r.jpg'))
print(bgr[1,1,:],rgb[1,1,:])

результат:

[ 83 113   0] [  0 114  83]
0 голосов
/ 07 ноября 2018

Вам необходимо использовать метод standardize() экземпляра ImageDataGenerator. Из документации Keras :

стандартизировать

standardize(x)

Применяет конфигурацию нормализации к группе входов.

Аргументы

  • x: Пакет входов для нормализации.

Возвращает

Входы нормализованы.

Так было бы так:

img = cv2.imread('train/defect/6.png')
img = cv2.resize(img,(100,100))
img = np.reshape(img,[1,100,100,3])
img = train_datagen.standardize(img)

classes = model.predict_classes(img)

Обратите внимание, что также будет применено изменение масштаба, поэтому нет необходимости делать это самостоятельно (т.е. удалять img = img/255.).

Кроме того, имейте в виду, что, так как вы установили featurewise_ceneter=True, вам нужно использовать fit() метод генератора, прежде чем использовать его для обучения:

train_datagen.fit(training_data)

# then use fit_generator method
model.fit_generator(train_datagen, ...)
...