0208《XEduHub + PySimpleGUI + PySimpleGUIWeb:在行空板上部署模型的全解析》【模型部署】

news/2025/2/8 21:11:06/文章来源:https://www.cnblogs.com/flyingsir/p/18705397
          

 - 2月8日,晚上,19:30~21:00(主讲老师:邱奕盛)
实验内容:

【模型部署】利用统一推理框架实现模型部署。

在训练好的模型基础上,设计简洁的体验界面,

最终尝试在行空板上实现完整效果的呈现,涉及

XEduHub、PySimpleGUI、PySimpleGUIWeb等工具。

   
   
   
 

 

 

 

import PySimpleGUI as sg
import cv2
import io
from XEdu.hub import Workflow as wf#sg.start_your_app(your_app_function, host="0.0.0.0", port=8080)# 初始化模型
mm = wf(task='mmedu', checkpoint='cls.onnx')# 定义布局
layout = [[sg.Text("智能图片小助手", font=("Arial", 16), justification="center")],[sg.Text("输入图片地址:"), sg.InputText(default_text="img.jpg", key="-IMAGE-")],[sg.Button("确定")]
]# 创建主窗口
window = sg.Window("智能图片小助手", layout, size=(240, 320))# 事件循环
while True:event, values = window.read()if event == sg.WINDOW_CLOSED:breakelif event == "确定":image_path = values["-IMAGE-"]try:# 调用模型进行推理res, img = mm.inference(data=image_path, img_type='cv2')# 标准化推理结果result = mm.format_output(lang="zh")# 获取预测结果prediction = result['预测结果']# 将 cv2 图像转换为 PySimpleGUI 可以显示的格式is_success, buffer = cv2.imencode(".png", img)if not is_success:raise ValueError("无法编码图像")img_data = io.BytesIO(buffer).read()# 创建新窗口显示图片和预测结果image_layout = [[sg.Text("预测结果:", font=("Arial", 12))],[sg.Text(prediction, font=("Arial", 12), text_color="blue")],[sg.Image(data=img_data, key="-IMAGE_DISPLAY-")]]image_window = sg.Window("推理结果", image_layout, size=(400, 400))while True:event, _ = image_window.read()if event == sg.WINDOW_CLOSED:image_window.close()breakexcept Exception as e:sg.popup(f"无法加载图片或进行推理!错误信息:{e}", title="错误提示")# 关闭主窗口
window.close()

  

   

 

训练好的模型,部署到不同的设备上,

或者开源的硬件上

 

 

 

 

xedu的一键安装包

 

 

 

 

 

向AI大模型提问要明确问题的关键
请帮我用PySimpleGul开发一个软件。窗口的大必是:
第一行有一个标题第二行有个输入框,输入图片地址:第三行是一个确定按钮。
当点击确定按钮后,弹出一个新的窗口,来展示这张图片。

 

 

PySimpleGUI 是一个用于创建图形用户界面(GUI)的 Python 库,它封装了多种底层 GUI 框架(如 Tkinter、Qt、WxPython 等),提供了一个简单易用的接口,使得开发者可以快速构建跨平台的桌面应用程序。PySimpleGUI 的设计目标是让 GUI 编程变得简单直观,即使是初学者也能轻松上手。

PySimpleGUI 的特点

  1. 简单易用:提供了简洁的 API,使得创建 GUI 应用变得非常容易。
  2. 跨平台:支持 Windows、MacOS 和 Linux 系统。
  3. 功能丰富:支持多种控件,如按钮、输入框、列表框、图像等。
  4. 灵活性高:可以轻松切换底层 GUI 框架,以适应不同的需求。

安装 PySimpleGUI

你可以使用 pip 来安装 PySimpleGUI:
bash复制
pip install pysimplegui

基本用法

以下是一个简单的示例,展示如何使用 PySimpleGUI 创建一个基本的 GUI 应用程序:
Python复制
import PySimpleGUI as sg# 定义布局
layout = [[sg.Text("请输入你的名字:")],[sg.InputText()],[sg.Button("确定"), sg.Button("取消")]
]# 创建窗口
window = sg.Window("PySimpleGUI 示例", layout)# 事件循环
while True:event, values = window.read()if event == sg.WINDOW_CLOSED or event == "取消":breakelif event == "确定":sg.popup(f"你好,{values[0]}!")# 关闭窗口
window.close()

示例解释

  1. 定义布局:
    • 使用嵌套的列表定义窗口的布局。每个子列表代表一行,其中可以包含各种控件(如 sg.Textsg.InputTextsg.Button 等)。
  2. 创建窗口:
    • 使用 sg.Window 创建一个窗口,传入窗口标题和布局。
  3. 事件循环:
    • 使用 window.read() 获取用户交互事件和输入值。
    • 根据事件类型执行相应的操作。例如,当用户点击“确定”按钮时,弹出一个对话框显示输入的名字。
  4. 关闭窗口:
    • 使用 window.close() 关闭窗口。

高级用法

PySimpleGUI 提供了许多高级功能,如多线程、自定义布局、图像显示等。以下是一个稍微复杂一点的示例,展示如何在窗口中显示图像:
Python复制
import PySimpleGUI as sg# 定义布局
layout = [[sg.Text("选择一张图片:")],[sg.InputText(), sg.FileBrowse()],[sg.Image(key="-IMAGE-")],[sg.Button("显示"), sg.Button("取消")]
]# 创建窗口
window = sg.Window("PySimpleGUI 图像显示", layout)# 事件循环
while True:event, values = window.read()if event == sg.WINDOW_CLOSED or event == "取消":breakelif event == "显示":image_path = values[0]if image_path:window["-IMAGE-"].update(filename=image_path)# 关闭窗口
window.close()

示例解释

  1. 文件选择:
    • 使用 sg.FileBrowse() 添加一个文件选择按钮,用户可以通过它选择图片文件。
  2. 显示图像:
    • 使用 sg.Image 创建一个图像控件,并通过 window["-IMAGE-"].update(filename=image_path) 更新图像控件的内容。

使用 PySimpleGUIWeb

PySimpleGUIWeb 是 PySimpleGUI 的一个分支,用于创建基于 Web 的 GUI 应用程序。它允许你使用相同的代码在浏览器中运行你的 GUI 应用。安装方法如下:
bash复制
pip install pysimpleguiweb
使用 PySimpleGUIWeb 时,只需将导入语句中的 PySimpleGUI 替换为 PySimpleGUIWeb
Python复制
import PySimpleGUIWeb as sg

总结

  • PySimpleGUI 是一个简单易用的 GUI 库,适合快速开发桌面应用程序。
  • 安装:使用 pip install pysimplegui 安装。
  • 基本用法:定义布局、创建窗口、事件循环和关闭窗口。
  • 高级用法:支持多线程、自定义布局、图像显示等。
  • PySimpleGUIWeb:用于创建基于 Web 的 GUI 应用程序。

 

 

 模型转换  

 权重文件  pkl

 

  • .pkl 文件:用于保存 Python 对象,常用于保存模型参数或训练数据。
  • .pth 文件:用于保存 PyTorch 模型的参数,常用于模型的保存和加载。
  • .onnx 文件:用于保存模型的参数和结构,支持跨框架共享和高效推理。
 模型转换  

基础实验2:模型推理方法

模型推理方法分三步:模型转换、模型测试、模型部署。

模型转换借助昨天课上我们训练的模型,将pth文件转换为onnx格式的模型。

这里代码为专用代码,大模型无法生成,因此提前给出:

 

from MMEdu import MMClassification as cls
model = cls(backbone='LeNet')
checkpoint = 'mycheckpoints/epoch_4.pth' # 复制pth模型所在路径
out_file="mymodel.onnx"  # 设置新模型的路径
model.convert(checkpoint=checkpoint, out_file=out_file)

  

 

 

 模型测试、

 

模型部署。

 

 昨天是mmedu的库进行推理的。  包含训练和推理。模型亏庞大。小设备不友好。

 

from XEdu.hub import Workflow as wf
import numpy as np# 模型声明
mm = wf(task='mmedu',checkpoint='cls.onnx')
# 待推理图像,此处仅以随机数组为例
image = np.random.random((400,400)) # 可替换成您想要推理的图像路径,如 img = 'cat.jpg'
# 模型推理
res,img = mm.inference(data=image,img_type='cv2')
# 标准化推理结果
result = mm.format_output(lang="zh")
# 可视化结果图像
mm.show(img)

  

Workflow 

推理 比较小巧方便使用。

mobileNet 训练的模型,相比  lenet 模型更大。

 

 

 处理推理结果。

 

 

 

 

 

 

 

 

 

 

 

 

 

 作业要求  

 

 

 

 

 

 

作业

模型

 pkl

pth

onnx

整合成应用。

 

 

 行空板    

 m10

 

k10

 

 

 

行空板是需要安装 xedu库的 

终端

pip install xedu-python

jupyter

!pip install xedu-python

 pinpong

 

 

 

 

 

 

 

 

 

 物联网    

 

 

 

 

 

 

 

   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 总结

 1. 整理数据

2. 训练

3. 模型  

推理

4. 应用

 

 

机器学习  模型  pkl

深度学习,  onnx , pth

 

训练时,数据图片的尺寸很重要,要注意统一图片像素; 

验证

 

 

 

 

 

   
   涉及XEduHub、PySimpleGUI、PySimpleGUIWeb等工具。
 XEduHub

 https://xedu.readthedocs.io/zh-cn/master/xedu_hub.html

 

XEduHub支持两类任务(task),分为预置任务和通用任务两种。顾名思义,预置任务指预置的各种优质开源AI模型,包含了图像分类、目标检测、关键点检测、OCR等。通用任务指用XEdu系列工具训练的模型,如MMEdu(计算机视觉)、BaseNN(自定义神经网络)和BaseML(传统机器学习),还支持用其他工具训练的模型。考虑到兼容性,大部分模型以ONNX为主。不管使用哪类任务,XEduHub都使用Workflow工具进行推理,核心代码仅4行,语法非常简洁。

 

 

 PySimpleGUI  
 PySimpleGUIWeb  
   
   
   
   
   
   
   
   

 模型文件

*.pth

*.onnx

*.pkl

 
在深度学习和机器学习中,.pkl.pth.onnx 是常见的文件扩展名,它们分别代表不同类型的数据文件。以下是对这些扩展名的详细解释:

1. .pkl 文件

含义:.pkl 文件是 Python 的 Pickle 文件格式,通常用于保存 Python 对象。Pickle 是 Python 的一种数据序列化方式,可以将 Python 对象转换为字节流,以便可以将其保存到文件中或通过网络传输。
用途:
  • 保存模型参数:在机器学习和深度学习中,.pkl 文件常用于保存模型的参数(权重和偏置)。
  • 保存训练数据:也可以用于保存训练数据或其他 Python 对象。
示例:
Python复制
import pickle# 保存对象
data = {'key': 'value'}
with open('data.pkl', 'wb') as f:pickle.dump(data, f)# 加载对象
with open('data.pkl', 'rb') as f:loaded_data = pickle.load(f)
print(loaded_data)

2. .pth 文件

含义:.pth 文件是 PyTorch 的模型权重文件格式。它通常用于保存 PyTorch 模型的参数(权重和偏置)。
用途:
  • 保存模型参数:在 PyTorch 中,.pth 文件用于保存模型的参数,以便后续加载和使用。
  • 模型微调:可以加载 .pth 文件中的参数,对模型进行微调或继续训练。
示例:
Python复制
import torch# 保存模型参数
model = torch.nn.Linear(10, 2)
torch.save(model.state_dict(), 'model.pth')# 加载模型参数
model.load_state_dict(torch.load('model.pth'))

3. .onnx 文件

含义:.onnx 文件是 Open Neural Network Exchange(ONNX)格式的文件。ONNX 是一种开放的模型格式,用于在不同的深度学习框架之间交换和部署模型。.onnx 文件不仅包含模型的参数,还包含模型的结构和计算图。
用途:
  • 跨框架共享模型:可以将模型从一个框架(如 PyTorch 或 TensorFlow)导出为 .onnx 格式,然后在另一个框架中加载和使用。
  • 高效推理:ONNX 模型可以用于高效的推理,特别是在生产环境中。
示例:
Python复制
import torch
import torch.onnx# 定义模型
class MyModel(torch.nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc1 = torch.nn.Linear(10, 5)self.fc2 = torch.nn.Linear(5, 2)def forward(self, x):x = torch.relu(self.fc1(x))x = self.fc2(x)return xmodel = MyModel()# 导出为 ONNX 格式
dummy_input = torch.randn(1, 10)
torch.onnx.export(model, dummy_input, 'model.onnx', input_names=['input'], output_names=['output'])# 加载 ONNX 模型
import onnxruntime as ort
session = ort.InferenceSession('model.onnx')

总结

  • .pkl 文件:用于保存 Python 对象,常用于保存模型参数或训练数据。
  • .pth 文件:用于保存 PyTorch 模型的参数,常用于模型的保存和加载。
  • .onnx 文件:用于保存模型的参数和结构,支持跨框架共享和高效推理。
 模型转 onnx 并推理  
是的,.pkl.pth 和其他常见的模型文件格式都可以转换为 .onnx 格式,以便进行跨框架推理。以下是如何将这些格式的文件转换为 .onnx 格式的详细步骤:

1. 将 .pth 文件转换为 .onnx 文件

.pth 文件通常包含 PyTorch 模型的参数。你可以使用 PyTorch 的 torch.onnx.export 方法将 .pth 文件转换为 .onnx 文件。

示例代码:

Python复制
import torch
import torch.onnx# 定义模型结构
class MyModel(torch.nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc1 = torch.nn.Linear(10, 5)self.fc2 = torch.nn.Linear(5, 2)def forward(self, x):x = torch.relu(self.fc1(x))x = self.fc2(x)return x# 加载模型参数
model = MyModel()
model.load_state_dict(torch.load('model.pth'))# 准备一个输入张量
dummy_input = torch.randn(1, 10)# 导出为 ONNX 格式
torch.onnx.export(model, dummy_input, 'model.onnx', input_names=['input'], output_names=['output'])

2. 将 .pkl 文件转换为 .onnx 文件

.pkl 文件通常包含 Python 对象,如模型参数或训练数据。如果 .pkl 文件包含的是 PyTorch 模型的参数,你可以先加载这些参数,然后使用 torch.onnx.export 方法将其转换为 .onnx 文件。

示例代码:

Python复制
import torch
import torch.onnx
import pickle# 加载 .pkl 文件中的模型参数
with open('model.pkl', 'rb') as f:model_state_dict = pickle.load(f)# 定义模型结构
class MyModel(torch.nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc1 = torch.nn.Linear(10, 5)self.fc2 = torch.nn.Linear(5, 2)def forward(self, x):x = torch.relu(self.fc1(x))x = self.fc2(x)return x# 加载模型参数
model = MyModel()
model.load_state_dict(model_state_dict)# 准备一个输入张量
dummy_input = torch.randn(1, 10)# 导出为 ONNX 格式
torch.onnx.export(model, dummy_input, 'model.onnx', input_names=['input'], output_names=['output'])

3. 将其他框架的模型转换为 .onnx 文件

如果你的模型是用其他框架(如 TensorFlow、Keras 等)训练的,你也可以将它们转换为 .onnx 格式。以下是一些常见框架的转换方法:

TensorFlow/Keras 模型转换为 ONNX

使用 tf2onnx 工具将 TensorFlow/Keras 模型转换为 ONNX 格式。
  1. 安装 tf2onnx
    bash复制
    pip install tf2onnx
  2. 转换代码:
    Python复制
    import tensorflow as tf
    import tf2onnx# 加载 TensorFlow 模型
    model = tf.keras.models.load_model('model.h5')# 转换为 ONNX 格式
    spec = (tf.TensorSpec((None, 28, 28, 1), tf.float32, name="input"),)
    onnx_model, _ = tf2onnx.convert.from_keras(model, input_signature=spec, opset=13)
    tf2onnx.utils.save_onnx_model("model.onnx", onnx_model)

Caffe 模型转换为 ONNX

使用 onnx-caffe 工具将 Caffe 模型转换为 ONNX 格式。
  1. 安装 onnx-caffe
    bash复制
    pip install onnx-caffe
  2. 转换代码:
    Python复制
    from onnx_caffe import convert# 转换 Caffe 模型为 ONNX 格式
    convert('model.prototxt', 'model.caffemodel', 'model.onnx')

4. 使用 ONNX 模型进行推理

一旦你将模型转换为 .onnx 格式,你可以使用 onnxruntime 进行推理。

示例代码:

Python复制
import onnxruntime as ort
import numpy as np# 加载 ONNX 模型
session = ort.InferenceSession('model.onnx')# 准备输入数据
input_name = session.get_inputs()[0].name
dummy_input = np.random.randn(1, 10).astype(np.float32)# 进行推理
output = session.run(None, {input_name: dummy_input})
print(output)

总结

  • .pth 文件:使用 torch.onnx.export 将 PyTorch 模型转换为 .onnx 格式。
  • .pkl 文件:先加载 .pkl 文件中的模型参数,然后使用 torch.onnx.export 转换为 .onnx 格式。
  • 其他框架:使用相应的工具(如 tf2onnxonnx-caffe)将模型转换为 .onnx 格式。
通过这些方法,你可以将不同格式的模型文件转换为 .onnx 格式,从而利用 ONNX 的跨框架特性进行高效的推理。
   

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

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

相关文章

DeepSeek 不再卡顿,从此告别服务器繁忙,请稍后再试(建议收藏!)

大家好,我是六哥。 由于DeepSeek真的太火了,也许你也跟我一样,常会遇到这样的情况:真的让人抓狂,10条回复里常常有9条是“服务器blabla,请稍后重试”,看到这话,就问你,谁能不崩溃? 其实仔细想想,DeepSeek的目标是AGI,算力资源更多用在探索模型上,很难兼顾几亿用户…

踩坑---注意芯片复位后引脚初始化功能

踩坑---注意复位后引脚初始化功能 背景 ​ 做综合案例训练的时候,把PB3和PB4当做了普通IO进行了配置,运行过程中发现很奇怪,怎么输出和配置的不一致。debug调试显示的IO输出和万用表量的都不一样。由于添加了其他功能代码,还把每个部分代码都抽出来单独调试,最后发现就是那…

【字符串、栈】单个char字符转为string表示

单个char转string char x = a; string c = string(1, x);string转单个char string s = "abc"; char x = s[0];string转char[](字符数组) string s = "abc"; s.c_str();(字符数组)char[]转string //直接赋值即可 char s1[4] = "abc"; string …

CF2008-Solution

【萌新场!】CF2008解析 今天带来的是 CF2008:Codeforces Round 970(Div 3)的前 8 题解析!非常入门,适合基础较弱的同学食用! Div3 的题目,往往思维含量较低,更多的是套路的教学,适合扩充知识面。 时间匆忙,难免有错漏之处,仅供娱乐! 时间限制均为 2s,内存限制均为…

WHUWC T3 极差划分

WHUWC T3 极差划分 汇集了优秀资源,懒得自己手写了 cf题目

哥斯拉流量JAVA_AES解密-日志分析

solar应急响应-日志流量分析-2 题目:新手运维小王的Geoserver遭到了攻击 小王拿到了当时被入侵时的流量,其中一个IP有访问webshell的流量,已提取部分放在了两个pcapng中了。请帮他解密该流量。 由上一题得到一个后门文件 String code="ZiFsXmEqZ3tBN2I0X1g5ektfMnY4Tl9…

第九节 文字生成 (第四部分 生成任务,大模型)

输入经过encoder得到特征,4个特征当作decoder的输入(打辅助),把标签拿过来做输入得到序列 自回归区别一步错步步错 只能串行输出多长 分类/回归(不太行)输入选到END表示结束输入:start+label 输出:label+END测试测试时没有label Beam Search在有些生成的时候,不是单纯的推测,会…

Linux驱动---字符设备

本文介绍了学习字符设备驱动的基础知识,阐述了字符设备驱动的框架结构,并通过代码示例讲解了其关键实现细节。目录一、基础简介1.1、Linux设备驱动分类1.2、字符设备驱动概念二、驱动基本组成2.1、驱动模块的加载和卸载2.2、添加LICENNSE以及其他信息三、字符设备驱动开发步骤…

2.8 系统基本完成

今天将系统进行完善并通过了测试。 部分界面:数据库成功插入:在测试过程中遇到了一个问题:数据库中查到的某些元素无法正确传递(即为null值),在多次检查测试后发现是命名格式问题(我的程序主要是因为名字中带了“_”符号),在传递过程中无法识别,导致值出现错误,这让…

探索5款强大的报表软件:助力企业决策和数据分析

概述: 随着数据分析和决策的重要性不断提升,报表软件已经成为企业管理不可或缺的工具。报表软件能够将复杂的数据转化为直观的图表和报告,帮助管理层做出准确决策。以下是5款功能强大的报表软件,其中包括了山海鲸报表,每款软件都有其独特的优势,适用于不同的使用场景。 1…

1分钟学会DeepSeek本地部署,小白也能搞定!

DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型,具备数学推理、代码生成等深度能力,堪称"AI界的六边形战士"。 DeepSeek 身上的标签有很多,其中最具代表性的标签有以下两个:低成本(不挑硬件、开源) 高性能(推理能力极强、回答准确)一、为什么要…

内存占用与监控方式介绍

1.内存占用 神经网络模型常见的内存占用可以分为以下几个部分: 1.1 模型参数内存定义:神经网络的权重和偏置等参数会占用内存。 计算方法:参数总量 = 各层参数数量的总和。 每个参数的大小取决于数据类型(如 float32 为 4 字节,float16 为 2 字节,int8 为 1 字节)。公式…