我正在尝试制作一个基于CNN的性别分类器,它在测试集的图像上运行良好,但当我输入从谷歌搜索的图像时,总是被分类为男性。我尝试从这里获取答案,但没有解决问题。
data = pd.read_csv('/content/age_gender.csv')## 将像素转换为numpy数组data['pixels']=data['pixels'].apply(lambda x: np.array(x.split(), dtype="float32"))classification = ['Male', 'Female']X = np.array(data['pixels'].tolist())## 将像素从1D转换为3DX = X.reshape(X.shape[0],48,48,1)X = X / 255.0y = data['gender'].valuesX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.22, random_state=37)model = Sequential..... # 创建并编译CNNhistory = model.fit..... # 拟合模型并评估,得到val_accuracy: 0.8902
测试损失: 0.24722696840763092测试准确率: 0.8912960290908813
当我使用以下代码预测来自测试集的图像时,它运行正常。
index = 5009image = X_test[index]pred = model.predict(image.reshape(1, 48, 48, 1), batch_size=1)print(classification[pred.argmax()])
但当我尝试预测来自谷歌的图像时,总是返回男性。
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-imageimage /= 255pred = model.predict(image.reshape(1, 48, 48, 1), batch_size=1)print(classification[pred.argmax()])
我尝试了许多不同女性的图像,但结果总是返回男性。我在这里遗漏了什么?
回答:
你对来自谷歌的图像的预处理方式与训练模型时不同。像素值的归一化是导致问题的根源。
image = 255-imageimage /= 255
这应该改为:
image /= 255.0