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

news2024/10/27 15:55:15

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

一、生成手写数字图像

1. 导入所需库

import cv2
import numpy as np
import os

cv2用于计算机视觉操作。

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

os用于文件和目录操作。

2. 初始化画布

canvas = np.zeros((280, 280), dtype="uint8")

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

 3. 鼠标回调函数

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. 创建窗口并设置回调

cv2.namedWindow("Canvas")
cv2.setMouseCallback("Canvas", draw)

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

  5. 主循环

while True:
    cv2.imshow("Canvas", canvas)
    key = cv2.waitKey(1) & 0xFF

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

   6. 处理用户输入

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

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

    7. 保存图像目录

save_dir = "Data"
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

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

     8. 保存图像文件

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. 关闭窗口 

cv2.destroyAllWindows()

关闭所有OpenCV窗口。 

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

1. 导入所需库

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. 加载训练的模型 

model = load_model("my_model.h5")

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

 3. 加载手写数字图像

original_img = cv2.imread("Data/handwritten_digit.png", cv2.IMREAD_GRAYSCALE)

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

 4. 处理图像用于预测 

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. 调整图像形状以便于预测

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

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

6. 进行预测

predictions = model.predict(img)
predicted_class = np.argmax(predictions, axis=1)

 7. 可视化预测结果

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)更适合图像数据,因为它们能够利用卷积层自动提取空间特征,从而提高分类性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitHub下载参考

1.Git下载 Git下载https://blog.csdn.net/mengxiang_/article/details/128193219 注意:根据电脑的系统配置选择合适的版本,我安装的是64.exe的版本 2.Git右键不出现问题: Git右键不出现https://blog.csdn.net/ling1998/article/details/1…

Java项目实战II基于微信小程序的马拉松报名系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 马拉松运动…

[SWPUCTF 2022 新生赛]py1的write up

开启靶场,下载附件,解压后得到: 双击exe文件,出现弹窗: 问的是异或,写个python文件来计算结果: # 获取用户输入的两个整数 num1 int(input("Enter the first number: ")) num2 int…

云渲染主要是分布式(分机)渲染,如何使用blender云渲染呢?

云渲染主要是分布式(分机)渲染,比如一个镜头同时开20-100张3090显卡的机器渲染,就能同时渲染20-100帧,渲染不仅不占用自己电脑,效率也将增加几十上百倍! blender使用教程如下: 第一…

基于Django+python的车牌识别系统设计与实现(带文档)

项目运行 需要先安装Python的相关依赖:pymysql,Django3.2.8,pillow 使用pip install 安装 第一步:创建数据库 第二步:执行SQL语句,.sql文件,运行该文件中的SQL语句 第三步:修改源…

软件架构设计学习总结

概述; 如何描述软件架构; 架构的层次结构; 架构设计技能: 需求分析、业务架构、数据架构、应用架构、技术架构、开发架构设计; 层次框架设计; 集成与接口设计; 性能优化; 设计…

C语言程序设计:现代设计方法习题笔记《chapter5》下篇

第七题 题目分析&#xff1a;求最大最小值转换为条件判断问题&#xff0c;最大值有四种可能&#xff0c;最小值相应有三种情况&#xff0c;给出下列代码。 示例代码&#xff1a; #include <stdio.h>int main() {int num1, num2, num3, num4; // 定义四个变量来存储输入…

Linux安装部署数据库:MongoDB

Linux安装部署数据库&#xff1a;MongoDB 一、虚拟机环境说明1、安装前准备2、数据库软件3、数据库工具 二、源码安装 MongoDB1、安装配置环境2、服务启动方式3、设置开机自启 三、管理使用 MongoDB1、登录使用2、常用命令 四、安全优化 MongoDB1、创建普通用户启动服务2、编写…

机器学习 - 树结构1 - 随机森林

算法原理 随机森林由多个决策树构成&#xff0c;每棵树在训练时使用随机选择的样本和特征子集。在分类任务中&#xff0c;每棵树对新的输入样本进行分类&#xff0c;最终的分类结果由多数树的分类结果决定。这种方法可以提高预测的准确性&#xff0c;并且通过平均或投票机制减少…

【C++】动态库动态加载实例详解

动态库动态加载&#xff1a;LoadLibrary与函数地址获取详解 一、概述三、加载失败的原因及解决方案DLL文件不存在或路径不正确&#xff1a;依赖的其他DLL未找到&#xff1a;权限问题&#xff1a;DLL版本不兼容&#xff1a; 四、总结 在软件开发中&#xff0c;模块化设计是一种非…

基于Spring Boot的学生宿舍信息资源整合

3系统分析 3.1可行性分析 通过对本学生宿舍信息管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本学生宿舍信息管理系统采用Spring Boot框架&#xff0…

【C++笔记】内存管理

前言 各位读者朋友们大家好&#xff0c;上期我们讲了类和对象下的内容&#xff0c;类和对象整体的内容我们就讲完了&#xff0c;接下来我们开启新的部分内存管理的讲解。 目录 前言一. C/C内存分布二. C语言中内存管理的方式三. C内存管理方式3.1 new/delete操作内置类型3.2…

时间序列预测(九)——门控循环单元网络(GRU)

目录 一、GRU结构 二、GRU核心思想 1、更新门&#xff08;Update Gate&#xff09;&#xff1a;决定了当前时刻隐藏状态中旧状态和新候选状态的混合比例。 2、重置门&#xff08;Reset Gate&#xff09;&#xff1a;用于控制前一时刻隐藏状态对当前候选隐藏状态的影响程度。…

idea 无法输入中文 快速解决

idea在某些情况会出现无法输入中文的情况&#xff0c;我们不去深究内部原因&#xff0c;直接上解决方案&#xff1a; 1、点击菜单help->Edit Custom VM Options 2、最后一行&#xff0c;追加&#xff1a; -Drecreate.x11.input.methodtrue 、 3、重启

计算机毕业设计Java连锁超市销售与分析系统 销售数据管理 超市运营分析 数据可视化 (源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

10月27日

取P为A 秩1矩阵只有1个特征值为正&#xff0c;其余为1

YOLO11 目标检测 | 自动标注 | 预标注 | 标签格式转换 | 手动校正标签

本文分享使用YOLO11进行目标检测时&#xff0c;实现模型推理预标注、自动标注、标签格式转换、以及使用Labelme手动校正标签等功能。 目录 1、预训练权重 2、生成预标注 3、分析YOLO11的目标检测格式 4、分析Labelme标注工具的格式 5、生成json标注文件 6、手动校正标签 …

#渗透测试#SRC漏洞挖掘# 信息收集-Shodan进阶VNC

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

PHPOK 4.8.338 后台任意文件上传漏洞(CVE-2018-12941)复现

PHPOK企业站(简称PHPOK&#xff09;建设系统是一套基于PHP和MySQL构建的高效企业网站建设方案之一&#xff0c;全面针对企业网&#xff08;以展示为中心&#xff09;进行合理的设计规划。 PHPOK是一套开源免费的建站系统&#xff0c;可以在遵守LGPL协议的基础上免费使用。系统具…

trueNas 24.10 docker配置文件daemon.json无法修改(重启被覆盖)解决方案

前言 最近听说truenas的24.10版本开放docker容器解决方案放弃了原来难用的k3s&#xff0c;感觉非常巴适&#xff0c;就研究了一下&#xff0c;首先遇到无法迁移老系统应用问题比较好解决&#xff0c;使用sudo登录ssh临时修改daemon.json重启docker后进行docker start 容器即可…