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

news2024/11/20 16:35:15

一、在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

四、最后

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

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

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

相关文章

【Oracle篇】逻辑备份工具expdp(exp)/impdp(imp)和物理备份工具rman的区别和各自的使用场景总汇(第八篇,总共八篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

26.4 Django 视图层

1. 视图函数 视图函数是Django框架中用于处理Web请求并返回Web响应的重要组件. 以下是对Django视图函数的详细解释: * 1. 视图函数与URL的映射.为了让Django能够知道哪个URL对应哪个视图函数, 需要在应用的urls.py文件中定义URL模式.使用path或re_path函数来定义URL模式, 并将…

计算机视觉的职业规划

Hi,大家好。我是茶桁。 今天这节课呢,咱们先不着急讲原理,先来讲讲职业规划的话题。 如果想要直接上手企业级的 AI 项目,可以看看咱们的「AI 人工智能企业项目实战」。 趋势和薪资 首先,先来讲讲就业的趋势。其实学…

Python学习笔记20:进阶篇(九)常见标准库使用之sys模块和re模块

前言 本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。 根据模块知识,一次讲解单个或者多个模块的内容。 教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html 错误输出…

python笔记3

1.通过乘法多次打印,以及字符串相加的合体打印 xzzz yyyy print(xy) print(x*10)#与一个数为打印多少次 2.设置俩个变量,可以通过下面的方法来判断是否一个元素是否在另一个元素中,返回bool值 xzzz yyyy print(xy) print(x*10)#与一个数为打…

算法学习笔记——单双链表及其反转—堆栈诠释

单双链表及其反转——堆栈诠释 按值传递 int、long、byte、short、char、float、double、boolean和String 都是按值传递 概念:在方法被调用时,实参通过形参把它的内容副本传入方法内部,此时形参接收到的内容是实参值的一个拷贝,…

Windows 获取打印机及端口号方法 (C#)

1. 打开注册表编辑器 regedit 2.选择如下配置 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Device 3. 代码 C# using System; using Microsoft.Win32;class Program {static void Main(){string registryPath "SOFTWARE\Microsoft\Windows …

解决pycharm安装dlib失败的问题

今天使用pycharm来学习opencv人脸识别库face-recognition的时候出现了一点小问题,在pycharm中直接安装face-recognition会失败,说是因为缺少依赖库dlib,但是直接使用pycharm安装dlib库也有问题,不知道大家遇到没有 错误提示 note…

【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统

最终效果 文章目录 最终效果前言素材下载图片配置获取格子坐标动态控制背包大小添加物品移动物品物品跟随鼠标创建物品的容器,定义不同物品修改物品尺寸修复物品放置位置问题按物品尺寸占用对应大小的格子判断物品是否超出边界范围物品放置重叠,交换物品…

全景图片/老照片/动漫图片一键无损放大与修复

在日常生活中,我们经常使用系统自带的图片处理软件来对图片进行缩放操作,从而实现放大或缩小图片。然而,这种方法会带来一个问题:如果原始图片较小,放大后会导致精度损失,使图片变得模糊。 近年来&#xf…

SD-WAN带宽对使用的影响及如何规划

SD-WAN(软件定义广域网)是一种创新技术,旨在优化和提升企业网络的性能、可靠性和安全性。带宽在SD-WAN的使用中起着关键作用,而确定SD-WAN专线所需的带宽大小需要综合考虑多个因素。本文将深入探讨SD-WAN带宽对使用的影响以及如何…

革新城市景观:轻空间设计团队呈现“淄博会展中心”

“淄博会展中心”,作为国内最大的气膜会展建筑群,自启用以来已经成为淄博市的亮丽新名片和经济引擎。该会展中心在第二十届中国(淄博)国际陶瓷博览会上首次亮相,其独特的设计和先进的建筑理念吸引了广泛关注。今天&…

xxl-job 分布式任务调度 基本使用

xxl-job 是一个分布式任务调度平台,使用非常方便。 官网:https://gitee.com/xuxueli0323/xxl-job 工作原理类似于nacos 执行器注册到调度中心 调度中心分配任务 执行器执行任务 docker-compose 配置 version: 3 services:xxl-job:image: xuxueli/xxl-…

【神经网络】深入理解多层神经网络(深度神经网络

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 深入理解多层神经网络&#x…

【C++题解】1712. 输出满足条件的整数2

问题:1712. 输出满足条件的整数2 类型:简单循环 题目描述: 有这样的三位数,其百位、十位、个位的数字之和为偶数,且百位大于十位,十位大于个位,请输出满所有满足条件的整数。 输入&#xff1…

博客solo!bolo-solo让博客创作更自由。

bolo-solo:独行侠的数字笔录, 你的博客新伙伴- 精选真开源,释放新价值。 概览 bolo-solo是GitHub 上一个开源的个人博客系统:Bolo Solo,简单易部署,自带精致主题、数据统计表、邮件提醒、自定义图床、功能…

利用Linked SQL Server提权

点击星标,即时接收最新推文 本文选自《内网安全攻防:红队之路》 扫描二维码五折购书 利用Linked SQL Server提权 Linked SQL server是一个SQL Server数据库中的对象,它可以连接到另一个SQL Server或非SQL Server数据源(如Oracle&a…

规则引擎-Aviator 表达式校验是否成立

目录 介绍特性使用更多文献支持 介绍 Aviator是一个轻量级、高性能的Java表达式执行引擎,它动态地将表达式编译成字节码并运行。 特性 支持绝大多数运算操作符,包括算术操作符、关系运算符、逻辑操作符、位运算符、正则匹配操作符(~)、三元表达式(?:…

Java学习十一—Java8特性之Stream流

一、Java8新特性简介 2014年3月18日,JDK8发布,提供了Lambda表达式支持、内置Nashorn JavaScript引擎支持、新的时间日期API、彻底移除HotSpot永久代。 ​ Java 8引入了许多令人兴奋的新特性,其中最引人注目的是Lambda表达式和Stream API。以…

【redis】redis概述

1、定义 Redis(Remote Dictionary Server),即远程字典服务,是一个开源的、内存中的数据结构存储系统。redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)…