Teachable Machine模型之TensorFlow使用篇

前言: 使用在teachable machine训练的h5格式模型

tensorflow使用篇

1. 使用teachable machine训练模型

地址: 传送门, 需要梯子翻一下

训练后, 导出的时候可以选择三种类型
在这里插入图片描述

导出模型文件 converted_keras.zip (py版)
解压后得到
在这里插入图片描述

2. py项目中使用模型

根据你当时使用teachable machine的时间, 选择py项目中TensorFlow的版本

我现在使用的是必须是2.3.0版本及以上才行, 然后我直接升级到了2.10.0

如果版本不匹配会报错如下

ValueError: (‘Unrecognized keyword arguments:’, dict_keys([‘ragged’]))

解决的方法就是升级TensorFlow版本

pip install tensorflow==2.10.0 --upgrade

目录结构如下
在这里插入图片描述

第一种app.py, 判断项目本地的图片, 可以直接使用postman请求无参get, 可以得到卡类型

# -*- coding: utf-8 -*-
import flask as fk
from flask import jsonify, request
import tensorflow as tf
from PIL import Image
import numpy as np

app = fk.Flask(__name__)

# 加载标签映射
class_label_map = {}
with open('labels.txt', 'r', encoding='utf-8') as f:
    for line in f.readlines():
        index, label = line.strip().split()
        class_label_map[int(index)] = label

print(class_label_map)

# 加载模型
global model
model = tf.keras.models.load_model('keras_model.h5')
print('模型加载成功')

# 图片预处理方法
def preprocess_image(image_path):
    img = Image.open(image_path)
    # 调整大小、归一化等操作,具体取决于模型要求
    img_resized = img.resize((224, 224))
    img_array = np.array(img_resized) / 255.0  # 将像素值归一化到[0, 1]区间
    img_array = np.expand_dims(img_array, axis=0)  # 添加批量维度(batch size = 1)
    return img_array

# 预测方法
def load_model():

    # 准备输入数据
    input_data = preprocess_image("danka.jpg")
    # input_data = preprocess_image("duolianka.jpg")
    # 预测
    predictions = model.predict(input_data)
    # 获取预测结果
    predicted_class_index = np.argmax(predictions[0])
    # 获取预测的类名
    predicted_class_name = class_label_map[predicted_class_index]
    print(f"Predicted class: {predicted_class_name}")
    return predicted_class_name


# 测试预测
@app.route('/api/hello', methods=['GET'])
def get_data():
    return load_model()


# 假设我们要提供一个获取用户信息的API
@app.route('/api/user/<int:user_id>', methods=['GET'])
def get_user_info(user_id):
    # 这里模拟从数据库或其他服务获取用户信息
    user_data = {'id': user_id, 'name': 'John Doe', 'email': 'john.doe@example.com'}

    # 假设用户不存在,返回404
    # 返回JSON格式的用户信息
    return jsonify(user_data)


# 定义一个接收POST请求的路由,假设该接口用于创建新用户
@app.route('/api/users', methods=['POST'])
def create_user():
    # 从请求体中获取JSON格式的数据
    data = request.get_json()

    # 检查必要的字段是否存在
    if not all(key in data for key in ('username', 'email', 'password')):
        return jsonify({"error": "Missing required fields"}), 400

    # 这里仅做示例,实际开发中应将数据保存至数据库等
    new_user = {
        'username': data['username'],
        'email': data['email'],
        'password': data['password']
    }

    # 模拟用户创建成功
    resultMap = {"message": "User created successfully", "user": new_user}

    # 返回201状态码表示已创建资源
    return jsonify(resultMap), 201


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

第二种app.py, 通过post请求上传图片, 返回卡类型

# -*- coding: utf-8 -*-
import flask as fk
from flask import jsonify, request
import tensorflow as tf
from PIL import Image
import numpy as np

app = fk.Flask(__name__)



# 加载标签映射
global class_label_map
class_label_map = {}
with open('labels.txt', 'r', encoding='utf-8') as f:
    for line in f.readlines():
        index, label = line.strip().split()
        class_label_map[int(index)] = label

print(class_label_map)

# 加载模型
global model
model = tf.keras.models.load_model('keras_model.h5')
print('模型加载成功')

# 本地图片预处理方法
def preprocess_image(image_path):
    img = Image.open(image_path)
    # 调整大小、归一化等操作,具体取决于模型要求
    img_resized = img.resize((224, 224))
    img_array = np.array(img_resized) / 255.0  # 将像素值归一化到[0, 1]区间
    img_array = np.expand_dims(img_array, axis=0)  # 添加批量维度(batch size = 1)
    return img_array


# 预测方法
def load_model(input_data):
    # 预测
    predictions = model.predict(input_data)
    # 获取预测结果
    predicted_class_index = np.argmax(predictions[0])
    # 获取预测的类名
    predicted_class_name = class_label_map[predicted_class_index]
    print(f"Predicted class: {predicted_class_name}")
    return predicted_class_name


# 测试预测
@app.route('/api/hello', methods=['GET'])
def get_data():
    # 准备输入数据
    input_data = preprocess_image("danka.jpg")
    # input_data = preprocess_image("duolianka.jpg")
    return load_model(input_data)

# 定义一个接收POST请求的路由,假设该接口用于图片预测
@app.route('/api/forecast', methods=['POST'])
def forecast():
    # 从请求体中获取图片数据
    if 'image' not in request.files:
        return jsonify({"error": "No image provided"}), 400
    image = request.files['image']
    input_data = preprocess_image(image)
    result = load_model(input_data)
    resultMap = {"message": result, "code": 200}
    return jsonify(resultMap), 200


# 假设我们要提供一个获取用户信息的API
@app.route('/api/user/<int:user_id>', methods=['GET'])
def get_user_info(user_id):
    # 这里模拟从数据库或其他服务获取用户信息
    user_data = {'id': user_id, 'name': 'John Doe', 'email': 'john.doe@example.com'}

    # 假设用户不存在,返回404
    # 返回JSON格式的用户信息
    return jsonify(user_data)


# 定义一个接收POST请求的路由,假设该接口用于创建新用户
@app.route('/api/users', methods=['POST'])
def create_user():
    # 从请求体中获取JSON格式的数据
    data = request.get_json()

    # 检查必要的字段是否存在
    if not all(key in data for key in ('username', 'email', 'password')):
        return jsonify({"error": "Missing required fields"}), 400

    # 这里仅做示例,实际开发中应将数据保存至数据库等
    new_user = {
        'username': data['username'],
        'email': data['email'],
        'password': data['password']
    }

    # 模拟用户创建成功
    resultMap = {"message": "User created successfully", "user": new_user}

    # 返回201状态码表示已创建资源
    return jsonify(resultMap), 201


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg: 简易ijkplayer播放器实现--06封装打开和关闭stream

文章目录 流程图stream openstream close 流程图 stream open 初始化SDL以允许⾳频输出&#xff1b;初始化帧Frame队列初始化包Packet队列初始化时钟Clock初始化音量创建解复用读取线程read_thread创建视频刷新线程video_refresh_thread int FFPlayer::stream_open(const cha…

Nginx转发请求错误

说明&#xff1a;记录一次使用Nginx转发请求的错误&#xff1b; 场景 公司内部有两台服务器都跑了后端项目&#xff0c;在使用Nginx做请求分发时&#xff0c;我发现其中有台服务器一直没有处理请求&#xff08;没打印相关的日志信息&#xff09;&#xff0c;于是我修改了下Ng…

企业如何使用SNP Glue将SAP与Snowflake集成?

SNP Glue是SNP的集成技术&#xff0c;适用于任何云平台。它最初是围绕SAP和Hadoop构建的&#xff0c;现在已经发展为一个集成平台&#xff0c;虽然它仍然非常专注SAP&#xff0c;但可以将几乎任何数据源与任何数据目标集成。 我们客户非常感兴趣的数据目标之一是Snowflake。Sno…

SpringBoot集成Skywalking链路追踪

安装skywaling 参考&#xff1a;Centos7搭建 SkyWalking 单机版-CSDN博客 下载Agents https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz 1. 在IDEA中使用skywalking agent 在VM options中填入如下信息 -javaagent后是…

LeetCode-2529题:正整数和负整数的最大计数(原创)

【题目描述】 给你一个按 非递减顺序 排列的数组 nums &#xff0c;返回正整数数目和负整数数目中的最大值。换句话讲&#xff0c;如果 nums 中正整数的数目是 pos &#xff0c;而负整数的数目是 neg &#xff0c;返回 pos 和 neg二者中的最大值。注意&#xff1a;0 既不是正整…

windows ffmpeg7 通过rtsp拉取h265裸流

点击下边那个链接会转到github 下载完成后&#xff0c;添加include、lib到工程。 添加头文件&#xff1a; extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libavformat/avio.h" #inclu…

【实战JVM】打破双亲委派机制之自定义类加载器

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

JVS智能BI:嵌套数据集在多层次数据关联中的实战应用

在数据分析平台中&#xff0c;数据集的嵌套调用主要用于处理复杂数据结构或多层次数据关联&#xff0c;或者有多场景使用的重复使用中间数据&#xff0c;那么就需要把某些数据生成中间结果的数据集合。 例如&#xff1a;用户的分类需要根据用户的各方面的数据特征进行分类打标…

算法设计与分析实验报告c++实现(矩阵链相乘问题、投资问题、背包问题、TSP问题、数字三角形)

一、实验目的 1&#xff0e;加深学生对动态规划算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、…

自动化测试提速必备 - 并发编程

在自动化测试领域&#xff0c;多线程和多进程技术被广泛应用于提高测试的执行效率和性能。通过并发运行测试用例&#xff0c;可以显著缩短测试周期&#xff0c;特别是在面对大量测试用例或者需要在多个环境中进行测试时尤为重要。 在实际的自动化测试中&#xff0c;我们经常碰…

2024年【T电梯修理】考试总结及T电梯修理考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 T电梯修理考试总结考前必练&#xff01;安全生产模拟考试一点通每个月更新T电梯修理考试技巧题目及答案&#xff01;多做几遍&#xff0c;其实通过T电梯修理试题及解析很简单。 1、【多选题】修理工陶、陈&#xff0c…

废石颗粒运动理论模型及Python模拟

学者赵国彦等[26]对于废石颗粒运动的理论模型进行做了较为充分的研究&#xff0c;本文在以往研究的基础上对相关推导进行补充修正&#xff0c;并以某金矿充填废石的基本物理性能测试数据为基础&#xff0c;对废石运动理论模型的进行模拟。 4.2.1废石运动理论模型 4.2.1.1废石…

AI大模型探索之路-应用篇10:Langchain框架-架构核心洞察

目录 前言 一、LangChain设计目标 二、LangChain设计之道 三、LangChain典型应用 1、简单的问答Q&A over SQL CSV: 2、聊天机器人Chatbots: 3、总结摘要Summarization: 4、网页爬虫Web scraping: 5、本地知识库&#xff08;Q&A with RAG): 三、LangChain架构…

数字阅览室-数字图书馆体系的重要补充

数字阅览室&#xff08;Digital Reading Room&#xff09;是一种依托现代信息技术&#xff0c;特别是互联网、数字媒体技术和数据库管理技术&#xff0c;为用户提供在线访问、阅读、学习和研究各类数字化文献资源的虚拟空间。它是数字图书馆服务体系中的一个重要组成部分&#…

文库配置异步转换(宝塔)| 魔众文库系统

执行以下操作前提前进入网站根目录&#xff0c;如 cd /www/wwwroot/example.com执行 artisan 命令前请参照 开发教程 → 开发使用常见问题 → 如何运行 /www/server/php/xxx/bin/php artisan xxx 命令 步骤1&#xff0c;生成数据库队列表迁移文件 在执行该步骤前&#xff0c;请…

数据可视化高级技术Echarts(折线图)

目录 一、什么是折线图 二、如何实现 1.基本折线图 2.如何变得平滑只需要定义&#xff1a; smooth 3.如何定义线条的样式 color&#xff1a;设置线的颜色 width&#xff1a;设置线宽 type&#xff1a;设置线的类型 4.如何定义节点样式 symbol symbolSize&#xff1a…

开发着开发着,盘满了

办公电脑突然报家目录不足1G空间了, 使用 Disk Usage Analyzer 工具打开看了下, 微软还真没把我当穷人, 一个vs code给我占了30几个G的空间. 大家可能也遇到这种情况的, 看到真的让人窒息, 以前windows上被VS studio 支配C盘的感觉又回来了. 不过这个ubuntu好处理点, 我该删…

算法打卡day32

今日任务&#xff1a; 1&#xff09;738.单调递增的数字 2&#xff09;968.监控二叉树 738.单调递增的数字 题目链接&#xff1a;738. 单调递增的数字 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;贪…

CPU核心数、线程数都是什么意思?

最早&#xff0c;每个物理 cpu 上只有一个核心&#xff0c;对操作系统而言&#xff0c;也就是同一时刻只能运行一个进程/线程。 为了提高性能&#xff0c;cpu 厂商开始在单个物理 cpu 上增加核心&#xff08;实实在在的硬件存在&#xff09;&#xff0c;也就出现了多核 cpu&…

个人博客项目笔记_07

写文章 写文章需要 三个接口&#xff1a; 获取所有文章类别 获取所有标签 发布文章 1. 所有文章分类 1.1 接口说明 接口url&#xff1a;/categorys 请求方式&#xff1a;GET 请求参数&#xff1a; 参数名称参数类型说明 返回数据&#xff1a; {"success":…