python与深度学习(二):ANN和手写数字识别二

news2024/11/29 2:40:09

目录

  • 1. 说明
  • 2. 手写数字识别的ANN模型测试
    • 2.1 导入相关库
    • 2.2 加载数据和模型
    • 2.3 设置保存图片的路径
    • 2.4 加载图片
    • 2.5 图片预处理
    • 2.6 对图片进行预测
    • 2.7 显示图片
  • 3. 完整代码和显示结果
  • 4. 多张图片进行测试的完整代码以及结果

1. 说明

本篇文章是对上篇文章训练的模型进行测试。首先是将训练好的模型进行重新加载,然后采用opencv对图片进行加载,最后将加载好的图片输送给模型并且显示结果。

2. 手写数字识别的ANN模型测试

2.1 导入相关库

在这里导入需要的第三方库如cv2,如果没有,则需要自行下载。

from tensorflow import keras
# 引入内置手写体数据集mnist
from keras.datasets import mnist
import skimage, os, sys, cv2
from PIL import ImageFont, Image, ImageDraw  # PIL就是pillow包(保存图像)
import numpy as np

2.2 加载数据和模型

把MNIST数据集进行加载,并且把训练好的模型也加载进来。

# 加载mnist数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 加载ann_mnist.h5文件,重新生成模型对象, 等价于之前训练好的ann_model
recons_model = keras.models.load_model('ann_mnist.h5')

2.3 设置保存图片的路径

将数据集的某个数据以图片的形式进行保存,便于测试的可视化。
在这里设置图片存储的位置。

# 创建图片保存路径
test_file_path = os.path.join(sys.path[0], 'imgs', 'test1.png')
# 存储测试数据的任意一个
Image.fromarray(x_test[1]).save(test_file_path)

在书写完上述代码后,需要在代码的当前路径下新建一个imgs的文件夹用于存储图片,如下。
在这里插入图片描述
执行完上述代码后就会在imgs的文件中可以发现多了一张图片,如下(下面测试了很多次)。
在这里插入图片描述

2.4 加载图片

采用cv2对图片进行加载,下面最后一行代码取一个通道的原因是用opencv库也就是cv2读取图片的时候,图片是三通道的,而训练的模型是单通道的,因此取单通道。

# 加载本地test.png图像
image = cv2.imread(test_file_path)
# 复制图片
test_img = image.copy()
# 将图片大小转换成(28,28)
test_img = cv2.resize(test_img, (28, 28))
# 取单通道值
test_img = test_img[:, :, 0]

2.5 图片预处理

对图片进行预处理,即进行归一化处理和改变形状处理,这是为了便于将图片输入给训练好的模型进行预测。

# 预处理: 归一化 + reshape
new_test_img = (test_img/255.0).reshape(1, 784)

2.6 对图片进行预测

将图片输入给训练好我的模型并且进行预测。
预测的结果是10个概率值,所以需要进行处理, np.argmax()是得到概率值最大值的序号,也就是预测的数字。

# 预测
y_pre_pro = recons_model.predict(new_test_img, verbose=1)
# 哪一类数字
class_id = np.argmax(y_pre_pro, axis=1)[0]
print('test.png的预测概率:', y_pre_pro)
print('test.png的预测概率:', y_pre_pro[0, class_id])
print('test.png的所属类别/手写体数字:', class_id)
class_id = str(class_id)

2.7 显示图片

对预测的图片进行显示,把预测的数字显示在图片上。
下面6行代码分别是创建窗口,设定窗口大小,显示数字,显示图片,停留图片,清除内存。

# # 显示
cv2.namedWindow('img', 0)
cv2.resizeWindow('img', 500, 500)  # 自己设定窗口图片的大小
cv2.putText(image, class_id, (2, 5), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 0.2, (255, 0, 0), 1)
cv2.imshow('img', image)
cv2.waitKey()
cv2.destroyAllWindows()

3. 完整代码和显示结果

以下是完整的代码和图片显示结果。

from tensorflow import keras
# 引入内置手写体数据集mnist
from keras.datasets import mnist
import skimage, os, sys, cv2
from PIL import ImageFont, Image, ImageDraw  # PIL就是pillow包(保存图像)
import numpy as np

# 加载mnist数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 加载ann_mnist.h5文件,重新生成模型对象, 等价于之前训练好的ann_model
recons_model = keras.models.load_model('ann_mnist.h5')
# 创建图片保存路径
test_file_path = os.path.join(sys.path[0], 'imgs', 'test1.png')
# 存储测试数据的任意一个
Image.fromarray(x_test[1]).save(test_file_path)
# 加载本地test.png图像
image = cv2.imread(test_file_path)
# 复制图片
test_img = image.copy()
# 将图片大小转换成(28,28)
test_img = cv2.resize(test_img, (28, 28))
# 取单通道值
test_img = test_img[:, :, 0]
# 预处理: 归一化 + reshape
new_test_img = (test_img/255.0).reshape(1, 784)
# 预测
y_pre_pro = recons_model.predict(new_test_img, verbose=1)
# 哪一类数字
class_id = np.argmax(y_pre_pro, axis=1)[0]
print('test.png的预测概率:', y_pre_pro)
print('test.png的预测概率:', y_pre_pro[0, class_id])
print('test.png的所属类别/手写体数字:', class_id)
class_id = str(class_id)
# # 显示
cv2.namedWindow('img', 0)
cv2.resizeWindow('img', 500, 500)  # 自己设定窗口图片的大小
cv2.putText(image, class_id, (2, 5), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 0.2, (255, 0, 0), 1)
cv2.imshow('img', image)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

4. 多张图片进行测试的完整代码以及结果

为了测试更多的图片,引入循环进行多次测试,效果更好。

# python练习
# 重新学习时间:2023/4/30 23:45
from tensorflow import keras
# 引入内置手写体数据集mnist
from keras.datasets import mnist
import skimage, os, sys, cv2
from PIL import ImageFont, Image, ImageDraw  # PIL就是pillow包(保存图像)
import numpy as np

# 加载mnist数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 加载ann_mnist.h5文件,重新生成模型对象, 等价于之前训练好的ann_model
recons_model = keras.models.load_model('ann_mnist.h5')

prepicture = int(input("input the number of test picture :"))
for i in range(prepicture):
    path1 = input("input the test picture path:")
    # 创建图片保存路径
    test_file_path = os.path.join(sys.path[0], 'imgs', path1)
    # 存储测试数据的任意一个
    num = int(input("input the test picture num:"))
    Image.fromarray(x_test[num]).save(test_file_path)
    # 加载本地test.png图像
    image = cv2.imread(test_file_path)
    # 复制图片
    test_img = image.copy()
    # 将图片大小转换成(28,28)
    test_img = cv2.resize(test_img, (28, 28))
    # 取单通道值
    test_img = test_img[:, :, 0]
    # 预处理: 归一化 + reshape
    new_test_img = (test_img/255.0).reshape(1, 784)
    # 预测
    y_pre_pro = recons_model.predict(new_test_img, verbose=1)
    # 哪一类数字
    class_id = np.argmax(y_pre_pro, axis=1)[0]
    print('test.png的预测概率:', y_pre_pro)
    print('test.png的预测概率:', y_pre_pro[0, class_id])
    print('test.png的所属类别/手写体数字:', class_id)
    class_id = str(class_id)
    # # 显示
    cv2.namedWindow('img', 0)
    cv2.resizeWindow('img', 500, 500)  # 自己设定窗口图片的大小
    cv2.putText(image, class_id, (2, 5), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 0.2, (255, 0, 0), 1)
    cv2.imshow('img', image)
    cv2.waitKey()
    cv2.destroyAllWindows()

下面的test picture num指的是数据集中该数据的序号(0-59999),并不是值实际的数字。

2023-07-18 21:24:54.034234: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
input the number of test picture :5
input the test picture path:61.jpg
input the test picture num:1
1/1 [==============================] - 0s 212ms/step
test.png的预测概率: [[6.7599565e-11 5.6974045e-08 9.9999976e-01 1.4167172e-08 4.2876313e-14
  8.5433702e-17 9.8270281e-12 2.0837895e-07 2.0044362e-13 3.8371804e-15]]
test.png的预测概率: 0.99999976
test.png的所属类别/手写体数字: 2

在这里插入图片描述

input the test picture path:62.jpg
input the test picture num:2
1/1 [==============================] - 0s 25ms/step
test.png的预测概率: [[2.95021305e-08 9.99796808e-01 5.78483643e-08 1.15721946e-07
  1.02379022e-06 1.07751411e-07 1.75613415e-04 1.84143373e-05
  7.72468411e-06 8.39250518e-08]]
test.png的预测概率: 0.9997968
test.png的所属类别/手写体数字: 1

在这里插入图片描述

input the test picture path:63.jpg
input the test picture num:3
1/1 [==============================] - 0s 26ms/step
test.png的预测概率: [[9.9962425e-01 7.8167646e-11 6.5924123e-06 9.7057705e-07 2.3867991e-11
  3.1169588e-04 5.6094854e-05 9.8954046e-11 1.0871034e-08 3.3060348e-07]]
test.png的预测概率: 0.99962425
test.png的所属类别/手写体数字: 0

在这里插入图片描述

input the test picture path:64.jpg
input the test picture num:4
1/1 [==============================] - 0s 30ms/step
test.png的预测概率: [[1.3954380e-09 5.2584750e-07 7.7287673e-08 2.3394799e-08 9.9983513e-01
  4.9446136e-10 1.9493827e-06 4.0978726e-08 3.1354301e-07 1.6186526e-04]]
test.png的预测概率: 0.99983513
test.png的所属类别/手写体数字: 4

在这里插入图片描述

input the test picture path:65.jpg
input the test picture num:5
1/1 [==============================] - 0s 47ms/step
test.png的预测概率: [[4.70661676e-10 9.99986053e-01 5.76763526e-10 1.16811161e-09
  5.13054097e-08 5.98078254e-10 1.21732055e-05 1.10577037e-06
  5.98011809e-07 1.74244752e-09]]
test.png的预测概率: 0.99998605
test.png的所属类别/手写体数字: 1

在这里插入图片描述

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

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

相关文章

SpringMVC学习笔记--下篇

SpringMVC学习笔记 文章目录 SpringMVC学习笔记1、JSON1.1、什么是JSON1.2、JSON 和 JavaScript 对象互转1.3、Controller返回JSON数据1.3.1、使用Jackson工具1.3.1.1、乱码问题的代码优化1.3.1.2、集合测试1.3.1.3、输出时间对象1.3.1.4、抽取为工具类 1.3.2、使用FastJson的工…

Java虚拟机——类加载的过程

接下来,我们会详细了解Java虚拟中类加载的全过程。即加载、验证、准备、解析和初始化这五个阶段所执行的具体动作。 加载 在加载阶段下,Java虚拟机需要完成三件事 通过一个类的全限定名来获取定义此类的二进制字节流将这个字节流所代表的静态存储结构…

Small Tip: 怎么找S4HANA所有的CDS View

1. SAP Business Accelerator Hub 到网址:https://api.sap.com 2. 到Categories底下找。如果没看见CDS View就去View all categories 3. 找到CDS Views之后,点击进去。 4. 按Package 分类来找:

实时网络更改检测

未经授权的配置更改可能会对业务连续性造成严重破坏,这就是为什么使用实时更改检测来检测和跟踪更改是网络管理员的一项关键任务。尽管可以手动跟踪更改,但此方法往往非常耗时,并且通常会导致人为错误,例如在跟踪时错过关键网络设…

Spring Boot : ORM 框架 JPA 与连接池 Hikari

数据库方面我们选用 Mysql , Spring Boot 提供了直接使用 JDBC 的方式连接数据库,毕竟使用 JDBC 并不是很方便,需要我们自己写更多的代码才能使用,一般而言在 Spring Boot 中我们常用的 ORM 框架有 JPA 和 Mybaties ,本…

C#的ref和out使用

ref和out是C#中用于参数传递的关键字,它们都允许在方法内部修改参数的值,区别如下: 1、ref关键字:使用ref关键字声明的参数,在方法调用前必须被初始化,并且可以被视为已经赋予了一个初始值。在方法内部对r…

会议OA项目之会议发布(多功能下拉框的详解)

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于OA项目的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.主要功能点介绍 二.效果展示 三.前…

【网络编程】传输层协议——TCP协议

文章目录 一、TCP协议格式1.1 TCP如何将报头与有效载荷进行分离?1.2 有效载荷如何向上交付?1.3 TCP报头的理解1.4 序号与确认序号1.4.1 网络不可靠问题1.4.2 32位序号1.4.2 32位确认序号 1.5 窗口大小1.6 六个标志位 二、确认应答机制(ACK&am…

集成学习Bagging——随机森林模型

目录 1. Bagging方法的基本思想 2. 随机森林RandomForest 2.1 RandomForestRegressor的实现 2.2 随机森林回归器的参数 2.2.1 弱分类器结构 2.2.2 弱分类器数量 2.2.3 弱分类器训练的数据 2.2.4 其它参数 1. Bagging方法的基本思想 Bagging又称“袋装法”,它…

keyclaok~keycloak存到cookie中的值和session_state

keycloak存到cookie中的值 AUTH_SESSION_IDKEYCLOAK_IDENTITYKEYCLOAK_SESSION AUTH_SESSION_ID 用户的当前session_state,它是会话级的,关闭浏览器就没了 KEYCLOAK_IDENTITY 它是用户跨端登录的基础,它也是一个jwt串,解析后…

Scala学习(三)

2.8 浮点类型(Float、Double) Scala的浮点类型可以表示一个小数,比如123.4f,7.8,0.12等等。 1)浮点型分类 数据类型 描述 Float [4] 32 位, IEEE 754标准的单精度浮点数 Double [8] 64 位 IEEE 754标准的双…

electron+vue3全家桶+vite项目搭建【24】设置应用图标,打包文件的图标

文章目录 引入实现步骤测试结果 引入 在electron中,我们可以通过electron-builder的配置文件来设置打包后的应用图标 实现步骤 因为mac环境下的图标需要特殊格式,这里我们可以利用electron-icon-builder进行配置 1.引入相关依赖 # 安装electron-ico…

Halcon 深度学习初探

什么是深度学习? 深度学习是一系列机器学习的方法集合,其算法结构类似于多层级的神经网络。通过对大量的训练样本图像的学习,提取其各个层次的特征,使网络具有判别和推理能力。 关于halcon中的深度学习: 自halcon17…

C#中的HashTable和Dictionary之间的区别

面试基础:C#中的HashTable和Dictionary之间的区别 HashTable和Dictionary都是用于存储数据的数据结构的类型。这两个数据结构都将存储的数据保存为键值对。

ESP32 VS Code开发环境“hello world“

程序员的世界有个不成文的约定,第一个程序先跑"hello world",今天我们就在esp32上跑下hello world! vs code配置 新建一个esp32-test文件夹,并在该文件夹下打开vs code: mkdir esp32-test cd est32-test …

小白到运维工程师的自学之路 第五十四集 (ansible自动化运维工具)

一、概述 Ansible是一种开源的自动化工具,用于自动化任务的执行、配置管理和应用部署。它采用基于Python编写的简单、轻量级的语法,可以通过SSH协议远程管理和配置多台计算机。 Ansible的主要特点包括: 1、简单易用:设计简单&a…

自动驾驶多任务框架 MultiTask V3、HybridNets和YOLOP比较

目标检测和分割是自动驾驶汽车感知系统的两个核心模块。它们应该具有高效率和低延迟,同时降低计算复杂性。目前,最常用的算法是基于深度神经网络的,这保证了高效率,但需要高性能的计算平台。 在自动驾驶汽车的场景下,大多使用的都是计算能力有限的嵌入式平台,这使得难以满…

Python 算法基础篇之散列查找算法:哈希表、哈希集合、哈希映射

Python 算法基础篇之散列查找算法:哈希表、哈希集合、哈希映射 引言 1. 散列查找算法概述2. 哈希表的概念3. 哈希集合的概念4. 哈希映射的概念5. 实例演示实例1:哈希表实例2:哈希集合实例3:哈希映射 总结 引言 散列查找算法是一种…

Spring Cloud 之 Gateway 网关

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

Web安全基础

Web安全基础 一、Web应用安全概述1.1、什么是Web应用安全?1.2、WEB应用安全的兴起1.3、常见web应用1.3.1、常见Web应用—前后台 1.4、Web应用安全与传统安全的区别 二、Web应用的基本架构2.1、Web应用的基本架构2.2、Web服务的提供者——Web中间件2.3、简单的Web服务…