MNIST训练的手写数字识别NN在自定义数据上全识别错误求助
解决自定义手写数字识别全错的问题
你的模型在MNIST测试集上表现正常,但自定义图像全被识别为5,核心原因是自定义图像与MNIST数据集的图像分布不匹配,缺失关键预处理环节。以下是具体修复方案:
关键预处理修正步骤
1. 颜色反转(匹配MNIST黑底白字格式)
MNIST数据集的图像是黑底(像素值0)白字(像素值255),而你拍摄/绘制的图像大概率是白底黑字,直接输入会导致模型特征匹配错误。
# 灰度化后添加颜色反转操作 gray_image = 255 - gray_image
2. 阈值二值化(消除灰度噪声)
自定义图像可能存在灰度渐变,需要转为纯黑白二值图,让数字边缘特征和MNIST一致:
# 可根据实际图像微调阈值(示例用127),生成二值图 _, gray_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
3. 像素值归一化(匹配模型训练输入)
MNIST训练时通常会将像素值缩放到0-1范围,自定义图像需要同步处理:
gray_image = gray_image / 255.0
4. 数字居中对齐(匹配MNIST数字位置)
自定义手写数字可能偏离中心,需要平移到图像中心位置:
# 找到数字轮廓 contours, _ = cv2.findContours(gray_image.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if contours: # 获取数字的边界框 x, y, w, h = cv2.boundingRect(contours[0]) # 计算偏移量,将数字移到图像中心 dx = (28 - w) // 2 - x dy = (28 - h) // 2 - y # 创建平移矩阵并执行平移 M = np.float32([[1, 0, dx], [0, 1, dy]]) gray_image = cv2.warpAffine(gray_image, M, (28, 28))
完整修正后的预处理+推理代码
import cv2 import numpy as np # 预处理部分 image = cv2.imread("22.png") gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 颜色反转 gray_image = 255 - gray_image # 阈值二值化 _, gray_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY) # 缩放至28×28 gray_image = cv2.resize(gray_image, (28, 28), interpolation=cv2.INTER_AREA) # 数字居中 contours, _ = cv2.findContours(gray_image.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if contours: x, y, w, h = cv2.boundingRect(contours[0]) dx = (28 - w) // 2 - x dy = (28 - h) // 2 - y M = np.float32([[1, 0, dx], [0, 1, dy]]) gray_image = cv2.warpAffine(gray_image, M, (28, 28)) # 归一化 gray_image = gray_image / 255.0 print(gray_image.shape) cv2.imshow("Processed Image", gray_image) cv2.waitKey(0) cv2.destroyAllWindows() # 推理部分 x = np.expand_dims(gray_image, axis=0) # 若模型训练时要求通道维度(如Conv2D输入为(None,28,28,1)),需添加额外维度 # x = np.expand_dims(x, axis=-1) res = model.predict(x) print(res) print(np.argmax(res))
验证步骤
处理完图像后,用Matplotlib查看是否与MNIST图像风格一致:
import matplotlib.pyplot as plt plt.imshow(gray_image, cmap=plt.cm.binary) plt.show()
若显示为黑底白字、数字居中,则格式已匹配MNIST数据集。
内容的提问来源于stack exchange,提问作者Vadim Yarush
相关产品推荐
相关产品推荐

