Las predicciones de CNN funcionan con el conjunto de prueba, pero no con imágenes propias

Jan 02 2021

Estoy tratando de hacer un clasificador de género de CNN y funciona bien con imágenes del conjunto de prueba, pero cuando ingreso iamges de Google, siempre se clasifica como masculino. Intenté obtener la respuesta desde aquí, pero no la resolvió.

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

Pérdida de prueba: 0.24722696840763092 Exactitud de prueba: 0.8912960290908813

Cuando predigo una imagen del conjunto de prueba usando el siguiente código, funciona bien.

index = 5009
image = X_test[index]

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

print(classification[pred.argmax()])

Pero cuando trato de predecir imágenes de Google, siempre vuelve como masculino.

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()])

He probado un montón de imágenes diferentes que son mujeres y SIEMPRE vuelve como masculino. ¿Que me estoy perdiendo aqui?

Respuestas

2 yudhiesh Jan 02 2021 at 10:34

Las imágenes de Google se procesan previamente de manera diferente en comparación con cuando se entrena el modelo. La normalización de los valores de los píxeles es lo que causa el problema.

image = 255-image
image /= 255

En cambio, esto debería ser:

image /= 255.0