在flask中加载mnist模型,并预测图片

一、在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: ignoreapp = 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

四、最后

如遇到问题,可留言,如需要文件,请填写邮箱地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dsp开发与arm开发有什么区别,应用差别

一、DSP开发与ARM开发的区别 DSP(Digital Signal Processor)和ARM(Advanced RISC Machine)是两种不同类型的处理器,它们在设计理念、应用领域、指令集架构、性能特点等方面有所区别。 设计理念和应用领域 DSP&#…

机器人控制系列教程之运动规划(2)

简介 在笛卡尔坐标空间中轨迹规划时,首先用位置矢量和旋转矩阵表示所有相应的机器人节点,其次在所有路径段插值计算相对的位置矢量和旋转矩阵,依次得出笛卡尔坐标空间中的轨迹序列通过求解运动学逆问题得到相应关节位置参数。 优点&#xf…

linux安装pack格式的文件

在Linux中安装.pack格式的文件通常涉及使用pack工具,这是一个早期的压缩工具,现在已经不是主流的压缩格式了。如果你确实需要安装一个.pack文件,你可以按照以下步骤操作: 确保你的系统上安装了pack工具。如果没有安装&#xff0c…

评测|贪吃小猫疯狂长肉,让它停不下嘴的希喂、鲜朗、帕特真实调研

我发现很多铲屎官存在一个误区,认为“进口即是高贵”,过度信赖进口产品。一见到进口宠物粮就冲动购买,甚至对国产品牌持贬低态度,贴上“质量不佳”、“不符合标准”等标签。 为了更深入地了解这一现象,我深入研究了主食…

探索1688.item_get接口:深入解析与技术实现

在当前的电商领域,数据驱动已经成为了一种趋势。对于电商平台、数据分析应用以及与之相关的服务开发者来说,获取商品的详细信息是一项至关重要的任务。1688作为中国最大的B2B电商平台,提供了丰富的API接口,其中1688.item_get接口尤…

kotlin——MVVM框架下的大型项目优化、以及activity和viewmodel臃肿的优化

目录 概要 优化思路 一、重构过长的Activity 二、优化臃肿的ViewModel 示例代码: 1.Activity封装到单独的Fragment中 2.把ViewModel拆分成多个子viewmodel 小结 概要 在大型项目中,随着项目越做越大,activity和viewmodel的代码会越来越多&am…

【Unity小技巧】记一个RenderTexture无法正确输出Camera视图下的Depth渲染的问题

问题 这个问题出现在使用URP管线时,我试图用Shader实现血条的制作,并用RenderTexture将视图渲染到RawImage上。 但是渲染结果出现了问题: 可以看到液体边缘的渲染出现了错误,原因不明 在StackFlow上查找后找到了类似的问题&…

Spring Cloud - 开发环境搭建

1、JDK环境安装 1、下载jdk17:下载地址,在下图中红色框部分进行下载 2、双击安装,基本都是下一步直到完成。 3、设置系统环境变量:参考 4、设置JAVA_HOME环境变量 5、在PATH中添加%JAVA_HOME%/bin 6、在命令行中执行:j…

第三十篇——等价性:如何从等价信息里找答案?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 知道了等价性的逻辑,通过等价性去衡量事物,像是给…

QPaintEngine

当使用 Qt 进行绘图操作时&#xff0c;QPaintEngine 的方法在底层起着重要作用。以下是一个更详细的示例&#xff0c;展示了如何在自定义的 QWidget 子类中使用 QPaintEngine 的方法进行绘图操作&#xff1a; #include <QWidget> #include <QPaintEvent> #include…

1.1、Redis系列-Epoll 的高效工作流程

epoll 的高效工作流程 epoll 是 Linux 操作系统提供的一种高效 I/O 多路复用机制。它的设计初衷就是为了高效地处理大量并发连接&#xff0c;解决 select 和 poll 的性能瓶颈问题。下面详细解释 epoll 的高效工作流程&#xff0c;并重点突出其高效性。 一、创建 epoll 实例 …

Linux配置网卡详细教程

这个网卡配置然后头痛了两天&#xff0c;看了很多篇关于这方面的文章&#xff0c;但是都没让我成功&#xff0c;可惜工亏不负有心人&#xff0c;然后终于学会了下面此方法 实现完成的效果&#xff1a; 永久修改网卡IP vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEther…

node带参数命令

不带参数命令示例&#xff1a; node /www/wwwroot/server 带参数命令示例&#xff1a; node /www/wwwroot/server arg1 arg2 arg3 在启动页进行参数处理&#xff1a; // 获取启动参数(除去前2个默认参数&#xff0c;示例&#xff1a;node /www/wwwroot/server arg1 arg2 …

西门子840dsl机床仿真软件配置opcua说明

需要的安装包如下&#xff0c;可在百度网盘中下载 主软件包&#xff1a;sinutrain-v4.7-ed4&#xff08;也可在官网中下载最新版本&#xff09; 用户文件&#xff1a;UserDataBase 授权sinutrain&#xff1a;Sim_EKB_Install_2021_06_22 链接&#xff1a;https://pan.baidu.c…

小阿轩yx-用户管理与高级SQL语句

小阿轩yx-用户管理与高级SQL语句 MySQL 进阶查询 运维工作中可以提供不小的帮助&#xff0c;运维身兼数职&#xff0c;可能会有不少数据库的相关工作 常用查询介绍 对查询的结果集进行处理 按关键字排序 使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来 对结…

1.0.计算机系统知识

考点分布&#xff1a;3 ~ 7分&#xff0c;历史平均5分&#xff0c;选择题 CPU 运算器和控制器的组件及它们的功能和特点。 数据的表示 定点数 原码、反码、补码、移码的计算 浮点数 阶码表示范围 尾数表示精度 校验码 奇偶校验、CRC循环冗余校验、海明校验。 其中 CRC循…

第一百二十六节 Java面向对象设计 - Java枚举类

Java面向对象设计 - Java枚举类 枚举类型的超类 编译枚举类型时&#xff0c;编译器会创建一个类。 枚举类型可以具有构造函数&#xff0c;字段和方法。枚举类型仅在编译器生成的代码中实例化。 每个枚举类型都隐式地扩展java.lang.Enum类。 Enum类中定义的所有方法都可以与…

PostgreSQL 索引优化与性能调优(十一)

1. 索引基础知识 1.1 什么是索引 索引是一种数据结构&#xff0c;用于快速定位和访问数据库表中的特定行。在 PostgreSQL 中&#xff0c;常见的索引类型包括 B-tree、哈希、GiST 和 GIN 等。 1.2 创建索引 1.2.1 创建 B-tree 索引 CREATE INDEX idx_column ON table_name …

从一到无穷大 #29 ByteGraph的计算,内存,存储三级分离方案是否可以通用化为多模数据库

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言ByteGraph现有架构阿里云Lindorm腾讯YottaDB多模型化修改点ByteGraph论文中的优化…

PD虚拟机支持M3吗 PD虚拟机怎样配置图形卡

最近有很多人在问M3芯片的苹果电脑和M2相比&#xff0c;有哪些提升的功能。实际上&#xff0c;M3芯片的苹果电脑拥有与M2相同的CPU与GPU数量&#xff0c;但比M2多50亿个晶体管&#xff0c;并引入了动态缓存、增强型神经网络引擎等技术&#xff0c;性能、功能均进一步加强。面对…