当前位置: 首页 > news >正文

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

目录

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

1. 说明

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

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

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()
# 加载cnn_mnist.h5文件,重新生成模型对象, 等价于之前训练好的cnn_model
recons_model = keras.models.load_model('cnn_mnist.h5')

2.3 设置保存图片的路径

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

# 创建图片保存路径
test_file_path = os.path.join(sys.path[0], 'imgs', 'test100.png')
# 存储测试数据的任意一个
Image.fromarray(x_test[100]).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]
print(test_img.shape)

2.5 图片预处理

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

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

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()
# 加载cnn_mnist.h5文件,重新生成模型对象, 等价于之前训练好的cnn_model
recons_model = keras.models.load_model('cnn_mnist.h5')
# 创建图片保存路径
test_file_path = os.path.join(sys.path[0], 'imgs', 'test100.png')
# 存储测试数据的任意一个
Image.fromarray(x_test[100]).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]
print(test_img.shape)
# 预处理: 归一化 + reshape
new_test_img = (test_img/255.0).reshape(1, 28, 28, 1)
# 预测
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()
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
(28, 28)
1/1 [==============================] - 0s 210ms/step
test.png的预测概率: [[2.3381226e-05 1.1173951e-09 2.5884110e-09 2.3000638e-10 1.5515226e-073.6373976e-07 9.9997604e-01 5.8317045e-13 1.0071908e-07 1.6725430e-09]]
test.png的预测概率: 0.99997604
test.png的所属类别/手写体数字: 6

在这里插入图片描述

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

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

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()
# 加载cnn_mnist.h5文件,重新生成模型对象, 等价于之前训练好的cnn_model
recons_model = keras.models.load_model('cnn_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]# 预处理: 归一化 + reshapenew_test_img = (test_img/255.0).reshape(1, 28, 28, 1)# 预测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),并不是值实际的数字。

To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
input the number of test picture :2
input the test picture path:1.jpg
input the test picture num:1
1/1 [==============================] - 0s 156ms/step
test.png的预测概率: [[4.3549915e-07 4.7153802e-07 9.9998319e-01 5.7891691e-07 2.7986115e-085.3348625e-08 7.1938064e-09 1.4849566e-05 3.6678301e-07 2.2624316e-09]]
test.png的预测概率: 0.9999832
test.png的所属类别/手写体数字: 2

在这里插入图片描述

input the test picture path:2.jpg
input the test picture num:2
1/1 [==============================] - 0s 26ms/step
test.png的预测概率: [[1.4249144e-10 9.9994874e-01 6.1170212e-08 2.7543174e-09 1.9512597e-065.1548787e-09 1.5619334e-07 3.3457465e-07 4.5184272e-05 3.6284032e-06]]
test.png的预测概率: 0.99994874
test.png的所属类别/手写体数字: 1

在这里插入图片描述

http://www.lryc.cn/news/96344.html

相关文章:

  • Linux使用教程
  • 项目名称:智能家居边缘网关项目
  • SciencePub学术 | 物联网类重点SCIEEI征稿中
  • EtherNet/IP转Modbus网关以连接AB PLC
  • mysql用户添加
  • 628. 三个数的最大乘积
  • linux驱动开发入门(学习记录)
  • SpringCloud-Alibaba之Sentinel熔断与限流
  • 深“扒”云原生高性能分布式文件系统JuiceFS
  • opencv-18 什么是色彩空间?
  • RedHat离线安装工具yum+gcc+pcre+zlib+openssl+openssh
  • Redis概述及安装、使用和管理
  • 【算法第十一天7.25】二叉树前、中、后递归、非递归遍历
  • Linux搭建Promtail + Loki + Grafana 轻量日志监控系统
  • [PyTorch][chapter 44][RNN]
  • 20230726----重返学习-vue3项目实战-知乎日报第3天-TS-简历
  • TypeScript 在前端开发中的应用实践
  • 商业密码应用安全性评估量化评估规则2023版更新点
  • 【软件测试】单元测试工具---Junit详解
  • 【算法基础:搜索与图论】3.4 求最短路算法(Dijkstrabellman-fordspfaFloyd)
  • 【Matlab】基于卷积神经网络的数据分类预测(Excel可直接替换数据)
  • 【C++ 重要知识点总结】自定义类型-枚举和联合
  • Centos MySql安装,手动安装保姆级教程
  • 电脑C盘空间大小调整 --- 扩容(扩大/缩小)--磁盘分区大小调整/移动
  • centos7设置网桥网卡
  • TCP模型和工作沟通方式
  • Langchain 的 ConversationSummaryBufferMemory
  • 【Rust 基础篇】Rust 通道实现单个消费者多个生产者模式
  • HTTP协议各版本介绍
  • 玩转ChatGPT:Custom instructions (vol. 1)