Прогнозы CNN работают на основе тестового набора, но не на основе собственных изображений

Jan 02 2021

Я пытаюсь создать гендерный классификатор CNN, и он отлично работает с изображениями из тестового набора, но когда я ввожу iamges из Google, он всегда классифицируется как мужской. Я пытался получить ответ отсюда, но это не помогло.

data = pd.read_csv('/content/age_gender.csv')

## Converting pixels into numpy array
data['pixels']=data['pixels'].apply(lambda x:  np.array(x.split(), dtype="float32"))

classification = ['Male', 'Female']

X = np.array(data['pixels'].tolist())

## Converting pixels from 1D to 3D
X = X.reshape(X.shape[0],48,48,1)
X = X / 255.0

y = data['gender'].values

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.22, random_state=37)

model = Sequential.....   # create the CNN and compile it
history = model.fit.....          # fit the model and evaluate it gives me val_accuracy: 0.8902

Потери при испытании: 0,24722696840763092 Точность испытания: 0,8912960290908813

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

index = 5009
image = X_test[index]

pred = model.predict(image.reshape(1, 48, 48, 1), batch_size=1)

print(classification[pred.argmax()])

Но когда я пытаюсь предсказать изображения из Google, он всегда возвращается как мужчина.

file = "/content/female-2.jpeg"
image = cv.imread(file, cv.IMREAD_GRAYSCALE)

image = cv.resize(image, (48, 48))
image = image.reshape(1, 48, 48, 1)
image = image.astype('float32')
image = 255-image
image /= 255

pred = model.predict(image.reshape(1, 48, 48, 1), batch_size=1)
print(classification[pred.argmax()])

Я перепробовала целую кучу разных женских образов, и ВСЕГДА возвращается мужское. Что мне здесь не хватает?

Ответы

2 yudhiesh Jan 02 2021 at 10:34

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

image = 255-image
image /= 255

Вместо этого это должно быть:

image /= 255.0