基于卷积神经网络实现手写数字图片识别,并用GUI进行可视化的代码,不使用tensorflow
时间: 2024-03-07 14:50:23 浏览: 79
卷积神经网络实现手写数字识别
好的,以下是基于卷积神经网络实现手写数字图片识别,并用GUI进行可视化的Python代码,使用的是Keras库,不使用TensorFlow:
```python
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras.utils import np_utils
from tkinter import *
from PIL import Image, ImageDraw
# 加载MNIST数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 将数据转换为float类型并归一化到0-1之间
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255
# 对标签进行one-hot编码
y_train = np_utils.to_categorical(y_train, 10)
y_test = np_utils.to_categorical(y_test, 10)
# 将数据转换为卷积神经网络所需的格式
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)
# 构建卷积神经网络模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
# 编译模型
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 训练模型
model.fit(X_train, y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test, y_test))
# 创建GUI界面
root = Tk()
root.title("手写数字识别")
root.geometry("280x280")
# 创建画布
canvas = Canvas(root, bg="white", width=280, height=280)
canvas.pack()
# 创建图像对象和画笔对象
image = Image.new("L", (280, 280), 0)
draw = ImageDraw.Draw(image)
# 定义画笔的宽度和颜色
width = 20
color = 255
# 定义画布上鼠标点击和拖拽的事件处理函数
def paint(event):
x1, y1 = (event.x - width), (event.y - width)
x2, y2 = (event.x + width), (event.y + width)
canvas.create_oval(x1, y1, x2, y2, fill="black", outline="black")
draw.ellipse([x1, y1, x2, y2], fill=color)
def recognize():
# 将图像转换为28x28的灰度图像
image_small = image.resize((28, 28), Image.ANTIALIAS).convert("L")
image_small = np.array(image_small).reshape((1, 28, 28, 1)) / 255.0
# 进行数字识别
result = model.predict(image_small)
label = np.argmax(result)
# 在GUI界面上显示识别结果
result_label.config(text="识别结果:{}".format(label))
# 创建按钮和标签
button_recognize = Button(root, text="识别", command=recognize)
button_recognize.pack(side=BOTTOM)
result_label = Label(root, text="识别结果:")
result_label.pack(side=BOTTOM)
# 绑定鼠标事件
canvas.bind("<B1-Motion>", paint)
root.mainloop()
```
这段代码中,我们首先加载MNIST数据集,并对数据进行预处理。然后,构建卷积神经网络模型并进行编译和训练。最后,创建GUI界面,包括一个画布用于用户手写数字的输入,一个按钮用于进行识别,以及一个标签用于显示识别结果。在GUI界面上,我们使用PIL库创建一个图像对象和画笔对象,并在画布上绑定鼠标事件。当用户在画布上绘制完数字之后,点击识别按钮即可进行数字识别,并将结果显示在标签上。
阅读全文