CNN-Vorhersagen funktionieren anhand des Testsatzes, jedoch nicht anhand eigener Bilder

Jan 02 2021

Ich versuche, einen CNN-Geschlechtsklassifikator zu erstellen, und er funktioniert gut mit Bildern aus dem Testsatz, aber wenn ich iamges von Google eingebe, wird er immer als männlich klassifiziert. Ich habe versucht, die Antwort von hier zu bekommen, aber es hat sie nicht gelöst.

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

Testverlust: 0,24722696840763092 Testgenauigkeit: 0,8912960290908813

Wenn ich ein Bild aus dem Testsatz mit dem folgenden Code vorhersage, funktioniert es einwandfrei.

index = 5009
image = X_test[index]

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

print(classification[pred.argmax()])

Aber wenn ich versuche, Bilder von Google vorherzusagen, kommt es immer als männlich zurück.

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

Ich habe eine ganze Reihe verschiedener Bilder ausprobiert, die weiblich sind, und es kommt IMMER als männlich zurück. Was vermisse ich hier?

Antworten

2 yudhiesh Jan 02 2021 at 10:34

Sie verarbeiten die Bilder von Google anders als beim Trainieren des Modells. Die Normalisierung der Pixelwerte ist der Grund für das Problem.

image = 255-image
image /= 255

Dies sollte stattdessen sein:

image /= 255.0