今天我们来介绍如何使用keras训练的模型识别手写字。
其完整的过程分为以下几个步骤:
- 获取训练数据集,构建模型并进行训练
- 保存模型和权重
- 加载模型和权重
- 对用户输入的手写字图片进行预处理
- 对手写字进行识别
下面我们就按照上面的步骤一步步操作吧。
构建模型
我们先构建一个简单的深度网络模型,然后进行训练。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import tesnorflow as tf
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(train_image, train_labels, epochs=5) model.evaluate(test_images, test_labels)
model.save('model.keras')
|
构建模型和训练模型,代码很简单,就不多说了。
加载模型和权重
我们可以使用keras提供的load_model方法加载模型和权重,代码如下:
1 2 3 4 5
| import tensorflow as tf
model = tf.keras.models.load_model('model.keras') model.summary()
|
加载模型和权重的代码也很简单,这里就不再赘述了。
预处理输入的手写字图片
我们需要将用户输入的手写字图片进行预处理,才能在模型中进行识别。预处理步骤如下:
- 将图片转换为灰度图
- 将图片缩放为28x28大小
- 将图片转换为numpy数组
预处理代码如下:
1 2 3 4 5 6 7 8 9
| import cv2 import numpy as np def preprocess(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) resized = cv2.resize(gray, (28, 28)) return np.array([resized])
|
这里写了一个函数,其作用就是将用户输入的手写字图片转换为灰度图,缩放为28x28大小,并转换为numpy数组。
对手写字进行识别
得到转换后的图片,就可以使用我们之前加载好的模型对图片进行识别了,代码如下:
1 2 3 4 5 6 7 8 9 10
| ...
img = cv2.imread('user_input.jpg') preprocessed_img = preprocess(img) print(preprocessed_img.shape) print(preprocessed_img)
prediction = model.predict(preprocessed_img) print(prediction) ...
|
小结
总结一下,通过mnist我们就将深度学习从训练到布署到应用的完整过程向你介绍清楚了。
在大多数情况下我们都是使用别人训练好的模型,但如果找不到训练好的模型时,我们就可以自己进行训练。