You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:20:42