71|0

27

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【读书】《计算机视觉之PyTorch数字图像处理》7.模型部署 [复制链接]

【读书】《计算机视觉之PyTorch数字图像处理》7.模型部署
在深度学习任务中,无论是图像分类、分割还是目标检测,完成模型的训练和测试并不是终点。训练只是模型开发的第一步,真正的挑战在于如何让模型在实际场景中高效、稳定地运行。这就需要我们进行模型部署
模型部署是指将训练好的深度学习模型集成到具体的项目或系统中,作为系统的一部分,提供实际的推理服务。与模型训练不同,部署的核心目标是让模型能够高效执行推理任务,提升系统的整体智能性和稳定性。
在模型部署中,ONNX(Open Neural Network Exchange)作为一款开源的标准化模型格式,逐渐成为了行业的热门选择。它能够将训练好的模型转换为高效的推理格式,支持跨平台、跨硬件部署,让模型真正从“实验室”走向“生产环境”。
ONNX简介
ONNX 是由微软Facebook联合推出的开源模型交换格式,旨在实现不同深度学习框架之间的互操作性。它为我们提供了一个标准化的表示方式,可以轻松将模型从一个框架(如 PyTorch、TensorFlow)导出,然后在另一个框架或推理引擎(如 ONNX Runtime)中高效运行。
ONNX的核心优势
  • 框架无关:支持主流的深度学习框架,如 PyTorch、TensorFlow 等。
  • 高效推理:通过计算图优化,大幅提升推理速度和效率。
  • 跨平台支持:无论是服务器、移动端还是嵌入式设备,ONNX 都能轻松部署。
ONNX的工作流程
使用ONNX进行模型部署大致分为以下几步:
  1. 模型导出
    从训练框架(如 PyTorch、TensorFlow)将模型导出为 ONNX 格式。
    示例:在PyTorch中,使用 torch.onnx.export() 函数轻松实现模型转换。
  2. 模型优化
    使用 ONNX 工具链(如 onnxruntime-tools)对模型进行优化,包括计算图简化、量化等操作,以提升推理性能。
  3. 模型部署
    利用 ONNX Runtime 等推理引擎加载和执行 ONNX 模型,实现高效推理。
接下来,让我们详细看看 ONNX 的导出与部署过程
模型导出
在 PyTorch 中,ONNX 提供了一个简单易用的工具包,利用 torch.onnx.export() 函数即可完成模型的导出。这个函数的原理与 PyTorch 的 TorchScript 类似,都是通过追踪输入数据,导出模型的运行流程并记录到 ONNX 文件中。部分参数如下:
示例代码:导出ResNet18模型
Python
from torchvision import models
import torch as tc
#创建一个模型
res18=models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
res18.eval()
#生成一个正确尺寸的伪造图像
img=tc.ones((1,3,224,224))
tc.onnx.export(res18, img, "res18.onnx", input_names=['img'], output_names=['out'])
以上代码会将训练好的 ResNet18 模型导出为一个名为 res18.onnx 的 ONNX 文件。导出后的模型可以被其他框架或推理引擎加载,进行高效部署。
导出的onnx模型如下:
模型部署
ONNX Runtime 是由微软推出的高性能推理引擎,可以加载 ONNX 格式的模型并执行推理任务。ONNX Runtime 支持 CPU 和 GPU 两种推理加速方式,安装方法如下:
Bash
pip install onnxruntime #安装支持CPU
pip install onnxruntime-gpu #安装支持GPU
在安装完onnxruntime库后,就可以使用InferenceSession()方法加载ONNX模型,得到用于模型推断的会话,调用会话的run()方法进行输入数据的计算,并返回模型的输出。
对于输入数据,不能直接使用numpy数组,需要使用OrtValue.ortvalue_from_numpy()函数进行格式转化后才能作为模型的输入。
此外,在调用run()方法时,指定输入和输出数据的名称,要与模型导出时设置的名称一致。
Python
from PIL import Image
import numpy as np

# 打开图像文件
image = Image.open('1.jpeg')
image = image.resize([224,224])
# 将图像转换为NumPy数组
image_array = np.array(image).astype(np.float32)
image_array = image_array/255

# 2. 改变通道顺序,从 (224, 224, 3) 转换为 (3, 224, 224)
image_array = np.transpose(image_array, (2, 0, 1))

# 3. 添加批次维度,从 (3, 224, 224) 转换为 (1, 3, 224, 224)
image_array = np.expand_dims(image_array, axis=0)

# 输出数组的形状和数据类型
print(image_array.shape) # 输出图像的尺寸(高度, 宽度, 通道数)
print(image_array.dtype) # 输出数组的数据类型,通常是uint8

import onnxruntime
import numpy as np
#导入onnx格式的res18模型
session=onnxruntime.InferenceSession('./res18.onnx',providers=['CPUExecutionProvider'])# providers=['CPUExecutionProvider','CUDAExecutionProvider']
#创建并转换数据
# img=np.ones((1,3,224,224)).astype(np.float32)
img = image_array
ortimg = onnxruntime.OrtValue.ortvalue_from_numpy(img)
#使模型执行输入数据,得到结果
results = session.run(["out"], {"img": ortimg})
#得到模型运行结果
results[0][0].argmax()
上述代码首先读取了名为1.jpeg的图片并处理成输入的大小,之后执行onnxruntime推理,得到输出结果。
输入图片如下:
输出结果如下:

export_onnx.ipynb

3.73 KB, 下载次数: 4

点赞 关注(1)

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表