一、在tensorflow中新建及保存模型
启动Jupyter Notebook
新建Notebook
生成 mnist_model.h5 模型的代码
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
# MNIST 数据集参数
num_classes = 10 # 总类别数
img_rows, img_cols = 28, 28 # 图像尺寸
# 加载 MNIST 数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 将图像数据调整为 TensorFlow 需要的格式,并进行归一化处理
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
# 将类别标签转换为 one-hot 编码
y_train = tf.keras.utils.to_categorical(y_train, num_classes)
y_test = tf.keras.utils.to_categorical(y_test, num_classes)
# 创建模型
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(img_rows, img_cols, 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(num_classes, activation='softmax'))
# 编译模型
model.compile(loss=tf.keras.losses.categorical_crossentropy,
optimizer=tf.keras.optimizers.Adadelta(),
metrics=['accuracy'])
# 训练模型
model.fit(x_train, y_train,
batch_size=128,
epochs=10,
verbose=1,
validation_data=(x_test, y_test))
# 评估模型
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
model.save('mnist_model.h5')
mnist_hello.py文件
from flask import Flask, request, jsonify # type: ignore
import numpy as np # type: ignore
import tensorflow as tf # type: ignore
import json
from PIL import Image # type: ignore
app = Flask(__name__)
# 加载模型(确保模型文件与此脚本在同一目录下,或者提供正确的路径)
model = tf.keras.models.load_model('mnist_model.h5')
@app.route('/predictlast', methods=['GET'])
def predictlast():
# if 'file' not in request.files:
# return jsonify({'error': 'No file part in the request'}), 400
# file = request.files['file']
# file = Image.open('path_to_your_image.jpg')
# 如果用户未选择文件,浏览器也会提交一个空文件部分,没有文件名
# if file.filename == '':
# return jsonify({'error': 'No selected file'}), 400
img_array = np.random.rand(1, 28, 28) # 生成一个随机的28x28图像作为示例
# 如果你想保存为标准的灰度图像(0-255),需要将值乘以255并转换为整数
random_image_uint8 = (img_array * 255).astype(np.uint8)
# 因为我们只有一个图像,所以我们可以去掉第一个维度(如果有多个图像,需要遍历它们)
single_image = random_image_uint8[0]
# 将NumPy数组转换为PIL Image对象
image_pil = Image.fromarray(single_image, mode='L') # 'L' 表示灰度模式
# 保存图片到本地
image_pil.save('random_28x28_gray.png')
# 显示图片(可选)
image_pil.show()
# 读取图片文件
#img = Image.open('random_28x28_gray.png')
# 转换为模型需要的格式
#img_array = preprocess_image(img)
# 使用模型进行预测
prediction = model.predict(img_array)
# 输出预测结果
print(prediction)
# print(prediction)
# 假设你的模型输出的是 one-hot 编码,你需要找到概率最高的类别
# predicted_class = np.argmax(prediction, axis=1)[0]
# 返回预测结果
# return jsonify({'predicted_class': predicted_class})
return "成功"
# 【测试通过】本地图片生成为28x28图像,并进行预测
@app.route('/predictlast_new', methods=['GET'])
def predictlast_new():
# 加载本地图片
#image_path = 'image_3.jpg' # 替换为你的图片路径
image_path = 'image_9.png'
image = Image.open(image_path).convert('L') # 转换为灰度图像
# 调整图片尺寸为28x28
image = image.resize((28, 28), Image.LANCZOS)
# 将PIL图像转换为NumPy数组
image_array = np.array(image)
# 归一化图像数据(将像素值缩放到0-1范围)
image_array = image_array.astype('float32') / 255.0
# 如果你的模型期望的输入是4D的(batch_size, height, width, channels),
# 你需要添加一个维度来表示batch_size(在这个案例中是1)
image_array = np.expand_dims(image_array, axis=0)
# 加载预训练的模型
model = tf.keras.models.load_model('mnist_model.h5')
# 使用模型进行预测
predictions = model.predict(image_array)
# 输出预测结果(通常predictions是一个二维数组,包含每个类别的概率)
print(predictions)
# 如果你想要得到最有可能的类别,你可以取概率最高的索引
predicted_class = np.argmax(predictions[0])
print(f'预测的数字: {predicted_class}')
return "成功"
if __name__ == '__main__':
app.run(debug=True) # 启动Flask应用(开发模式)
二、VScode 启动Flask命令
pip install tensorflow
pip install Pillow
python -- mnist_hello.py
启动效果
运行时本地需要的图片,并将图片名称命名为 image_9.png
三、访问地址
http://127.0.0.1:5000/predictlastpredictlast_new
四、最后
如遇到问题,可留言,如需要文件,请填写邮箱地址