模型训练识别手写数字(二)

模型训练识别手写数字(一)使用手写数字图像进行模型测试

一、生成手写数字图像

1. 导入所需库

python 复制代码
import cv2
import numpy as np
import os

cv2用于计算机视觉操作。

numpy用于处理数组和图像数据。

os用于文件和目录操作。

2. 初始化画布

python 复制代码
canvas = np.zeros((280, 280), dtype="uint8")

创建一个280x280的黑色画布(值为0表示黑色)。

3. 鼠标回调函数

python 复制代码
def draw(event, x, y, flags, param):
    if event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
        cv2.circle(canvas, (x, y), 5, 255, -1)

draw函数在鼠标移动时绘制白色圆点(值为255)到画布上。圆点的半径为5像素。

4. 创建窗口并设置回调

python 复制代码
cv2.namedWindow("Canvas")
cv2.setMouseCallback("Canvas", draw)

创建一个名为"Canvas"的窗口,并设置鼠标回调函数。

5. 主循环

python 复制代码
while True:
    cv2.imshow("Canvas", canvas)
    key = cv2.waitKey(1) & 0xFF

不断显示画布,等待用户输入。

6. 处理用户输入

python 复制代码
if key == ord('c'):
    canvas = np.zeros((280, 280), dtype="uint8")
elif key == ord('q'):
    break

按 'c' 键清空画布,按 'q' 键退出循环。

7. 保存图像目录

python 复制代码
save_dir = "Data"
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

检查并创建保存图像的目录。

8. 保存图像文件

python 复制代码
save_path = os.path.join(save_dir, "handwritten_digit.png")
if cv2.imwrite(save_path, canvas):
    print(f"Image saved successfully at {save_path}")
else:
    print("Failed to save image.")

将画布保存为PNG文件,并输出保存状态。

9. 关闭窗口

python 复制代码
cv2.destroyAllWindows()

关闭所有OpenCV窗口。

二、调用训练的模型进行测试

1. 导入所需库

python 复制代码
import cv2
import matplotlib.pyplot as plt
import numpy as np
from keras.api.models import load_model

cv2用于图像处理。

matplotlib.pyplot用于可视化结果。

numpy用于数值计算。

load_model用于加载训练好的Keras模型。

2. 加载训练的模型

python 复制代码
model = load_model("my_model.h5")

从文件中加载训练好的模型。

3. 加载手写数字图像

python 复制代码
original_img = cv2.imread("Data/handwritten_digit.png", cv2.IMREAD_GRAYSCALE)

读取手写数字图像,并以灰度模式加载。

4. 处理图像用于预测

python 复制代码
img = cv2.resize(original_img, (28, 28))  # 调整为28x28大小
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)[1]  # 二值化
img = img.astype('float32') / 255  # 归一化

将图像调整为28x28像素,这是模型所需的输入尺寸。

使用阈值处理将图像二值化(黑白),并将背景设置为白色,手写数字为黑色。

将图像数据归一化到0, 1范围。

5. 调整图像形状以便于预测

python 复制代码
img = img.flatten()  # 展平为一维数组
img = img.reshape(1, 784)  # 调整形状为 (1, 784)

将28x28的图像展平为784个像素值的单行数组,以适应模型的输入格式。

6. 进行预测

python 复制代码
predictions = model.predict(img)
predicted_class = np.argmax(predictions, axis=1)

7. 可视化预测结果

python 复制代码
plt.figure(figsize=(6, 6))

# 显示原图
plt.imshow(original_img, cmap='gray', aspect='equal')  # 使用原始图像
plt.title(f'Predicted: {predicted_class[0]}', fontsize=14)
plt.axis('off')

plt.tight_layout()
plt.show()

创建一个图形窗口,并显示原始图像。

在标题中显示模型预测的类别。

使用tight_layout()优化图形布局,并显示图形。

手写8,预测却是2;说明模型在训练集上表现良好,但在测试却表现差。

目前使用的是一个全连接神经网络(Feedforward Neural Network)。这个网络的结构通常包括以下几个部分:

  1. 输入层:接受输入数据,例如在你的例子中是手写数字的像素值。
  2. 隐藏层:通过全连接的方式进行计算,使用激活函数(如 ReLU)引入非线性。
  3. 输出层:生成预测结果,通常使用 softmax 激活函数进行分类。

全连接神经网络在处理图像时通常需要将输入图像展平(flatten),这可能导致对空间特征的捕捉不够有效,因此卷积神经网络(CNN)更适合图像数据,因为它们能够利用卷积层自动提取空间特征,从而提高分类性能。

相关推荐
财迅通Ai1 小时前
MLCC业务爆发式增长,带动昀冢科技三季度扭亏为盈
大数据·人工智能·科技·昀冢科技
AI日报派送佬1 小时前
2026年11月02日 AI 行业日报|商汤开源 Loop-9B、Pika 发布 H3 Flex 音视频模型、Meta× 傅利叶推出人形机器人 Max
人工智能·微软·开源·音视频·openai·1024程序员节·ai日报
义嘉泰1 小时前
心率能测出来不难,难的是低功耗、稳定、还能量产
人工智能·科技
具身AGI1 小时前
家用导航的安全,要看它离什么多近多快
人工智能·深度学习·安全
大模型任我行1 小时前
英伟达:双重采样修正强化学习奖励
人工智能·语言模型·自然语言处理·论文笔记
Meta Luo1 小时前
AI 时代,Web 自动化测试该怎么做?
前端·人工智能·playwright 替代工具·无代码自动化测试工具·低代码 ui 自动化测试·web 回归测试工具
海盗12341 小时前
微软技术日报 2026-11-02:开发者环境服务退役、Defender 清点本地 AI 代理
人工智能·microsoft·机器人·人工智能aigc
猿界零零七1 小时前
Agent 开发面试题--Day002【Agent和Workflow的有什么区别】
人工智能·大模型
lucas_AI1 小时前
OpenAI 重写「模型宪法」:五条价值观取代规则清单,第一条给了人类意图
人工智能
品牌常新1 小时前
室外巡检机器人推荐:园区与厂区怎么选
数据库·人工智能·机器人