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

          

 - 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:
        break
    elif 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()
                    break
        except 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 == "取消":
        break
    elif 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 == "取消":
        break
    elif 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 x

model = 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 的跨框架特性进行高效的推理。
   
posted @ 2025-02-08 21:07  aiplus  阅读(222)  评论(0)    收藏  举报
悬浮按钮示例