📅  最后修改于: 2023-12-03 15:22:11.370000             🧑  作者: Mango
在本教程中,我们将介绍如何使用 Flask 框架和 TensorFlow 2.1 来构建一个卷积神经网络模型并将其部署到 Web 上。我们将使用 Python 3.6+ 在本地环境进行开发,并使用 Flask 的 web 应用程序框架将模型与客户端进行通信。
在开始构建我们的 CNN 模型之前,我们需要安装以下必要的软件:
如果您还没有这些软件,请使用以下命令单独安装它们(在命令行中运行):
pip3 install Flask==1.1.2
pip3 install tensorflow==2.1.0
请确保您的 TensorFlow 版本不低于 2.1。
在本教程中,我们将使用 MNIST 手写数字数据集来训练我们的 CNN 模型。您可以使用该数据集训练一个基于 TensorFlow 2.1 的 CNN 模型,并将其保存为“model.h5”文件,以便以后在 Flask 应用程序中使用。
在这里,我们将给出一个简单的 MNIST CNN 模型代码的示例,以供参考:
import keras
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Dropout, Flatten, MaxPooling2D
# 导入数据集
from keras.datasets import mnist
# 加载 MNIST 数据集并将其划分为训练和测试数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 标准化数据(将像素值从[0,255]缩放到[0,1])
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
# 将标签转换为 one-hot 编码
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
# 构建卷积神经网络模型
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
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.reshape(-1, 28, 28, 1), y_train, batch_size=128, epochs=5, verbose=1)
# 评估模型的性能
score = model.evaluate(x_test.reshape(-1, 28, 28, 1), y_test, verbose=0)
# 打印测试准确率
print('Test accuracy:', score[1])
# 将模型保存到文件中
model.save('model.h5')
该代码创建了一个简单的 2 层卷积神经网络,它使用 MNIST 数据集来训练模型。我们将模型保存到“model.h5”文件中,以在 Flask 应用程序中使用。
请注意,如果您不想编写自己的模型代码,您可以使用 TensorFlow 的 Keras API 来加载现有的 CNN 模型,并使用相同的方法将其部署到 Flask 应用程序中。
以下是一个简单的 Flask 应用程序示例,它加载“model.h5”文件并将其部署到 Web 上:
from flask import Flask, jsonify, request
from keras.models import load_model
import numpy as np
# 加载模型
model = load_model('model.h5')
# 创建 Flask 应用程序
app = Flask(__name__)
# 定义路由
@app.route('/predict', methods=['POST'])
def predict():
# 解析客户端发送的 JSON 请求
data = request.get_json()
# 将图像数据转换为 NumPy 数组
img = np.array(data['image'])
# 执行预测并返回结果
result = model.predict(img.reshape(-1, 28, 28, 1))
# 将预测结果转换为标签
label = np.argmax(result, axis=1)[0]
# 返回 JSON 格式预测结果
return jsonify({'label': label})
# 启动应用程序
if __name__ == '__main__':
app.run('0.0.0.0', port=5000)
以上代码创建了一个名为“predict”的路由,并解析客户端发送的 JSON 请求以获取图像数据。然后,它将图像数据转换为 NumPy 数组,执行预测,并返回预测结果。
请注意,此处仅提供了最基础的 Flask 代码示例。您可以根据自己的需要来扩展它。例如,您可以添加用户身份验证逻辑,保护模型免受未经授权的访问。您还可以添加更多的路由来允许客户端执行其他类型的操作。
为了使用我们的 CNN 模型,我们需要向 Flask 应用程序发送 JSON 请求。以下是一个示例客户端代码,它使用 Python 和 requests 库来执行此操作:
import requests
from PIL import Image
import numpy as np
# 加载图像并将其调整为模型期望的大小(28x28)
img = Image.open('test.png')
img = img.resize((28, 28))
# 将图像转换为 NumPy 数组
img = np.array(img)
# 将 NumPy 数组转换为包含图像数据的 JSON 对象
data = {'image': img.tolist()}
# 发送 JSON 请求
response = requests.post('http://localhost:5000/predict', json=data)
# 显示预测结果
print('预测结果: ', response.json()['label'])
该代码加载名为“test.png”的图像,并使用 PIL 库将其调整为 28x28 像素的大小。然后,它将图像数据转换为 JSON 对象,并将其发送到 Flask 应用程序的“predict”路由。
请注意,上述代码中的“http://localhost:5000/predict”应替换为您的 Flask 应用程序的基本 URL。如果您正在本地运行 Flask 应用程序,则应该使用“http://localhost:5000/predict”,如果您正在公共服务器上部署应用程序,则应该使用服务器的公共 IP 地址。