【模型部署入门 一】:Pytorch图像分类模型转换ImageNet1000类预训练模型转ONNX

本文主要是介绍【模型部署入门 一】:Pytorch图像分类模型转换ImageNet1000类预训练模型转ONNX,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

入门学习主要是跟随同济子豪兄,很感谢该博主,本博客代码主体是子豪兄的,我只是总结加工整理记录。

子豪兄对应学习视频链接地址为:ImageNet1000类预训练模型转ONNX

我自己总结的教程中代码使用任何python编译环境都可以直接打开使用,子豪兄视屏教程中的源码需要使用Jupyter打开,关于Jupyter的安装及使用,推荐参考博客:Jupyter Notebook的安装及使用教程

目录

  • 一、安装配置环境
    • 1.1 安装Pytorch
    • 1.2 安装ONNX
    • 1.3 安装推理引擎ONNX Runtime
    • 1.4 安装其它包
    • 1.5 检验是否安装成功
    • 1.6 检验CUDA是否被调用
  • 二、ONNX官网
  • 三、ImageNet1000类预训练模型转ONNX
  • 四、可视化网络结构
  • 五、总结

一、安装配置环境

如果还没有安装CUDA,CUDNN,推荐安装教程:安装CUDA+CUDNN教程

1.1 安装Pytorch

pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html

1.2 安装ONNX

pip install onnx -i https://pypi.tuna.tsinghua.edu.cn/simple

1.3 安装推理引擎ONNX Runtime

pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple

1.4 安装其它包

pip install numpy pandas matplotlib tqdm opencv-python pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

1.5 检验是否安装成功

import torch
print('PyTorch 版本', torch.__version__)import onnx
print('ONNX 版本', onnx.__version__)import onnxruntime as ort
print('ONNX Runtime 版本', ort.__version__)

1.6 检验CUDA是否被调用

import torch# 检查GPU是否可用
if torch.cuda.is_available():print("PyTorch is using GPU")
else:print("PyTorch is using CPU")# 检查当前使用的GPU设备的索引
try:device_index = torch.cuda.current_device()print("Current GPU index: ", device_index)
except RuntimeError:print("No GPU available, using CPU")# 检查当前系统中可用的GPU设备数量
num_devices = torch.cuda.device_count()
print("Number of available GPUs: ", num_devices)

如果电脑GPU能被正常调用,运行代码后的输出如下:

在这里插入图片描述

二、ONNX官网

ONNX官网地址:ONNX

打开后的样子如下:

在这里插入图片描述

查看算子版本:

在这里插入图片描述

在这里插入图片描述

三、ImageNet1000类预训练模型转ONNX

下面代码中有详细注释,学者可直接运行使用。

import torch
from torchvision import models
import onnx## 有GPU就用GPU,无就用CPU
device = torch.device("cuda:0" if torch.cuda.is_available() else 'cpu')
print(torch.cuda.is_available())
print(device)## 载入ImageNet预训练Pytorch图像分类模型
model = models.resnet18(pretrained=True)      # 从PyTorch的模型库中加载一个预训练的ResNet-18模型。pretrained=True表示加载的模型已经在ImageNet数据集上进行了预训练
model = model.eval().to(device)               # 调用eval()方法将模型设置为评估模式。在评估模式下,模型的某些层(如Dropout层和BatchNorm层)会改变行为。然后,to(device)方法将模型移动到指定的设备上## 构造一个输入图像Tensor
x = torch.randn(1,3,256,256).to(device)
print(x.shape)     # torch.Size([1, 3, 256, 256])## 输入Pytorch模型推理预测,获得1000个类别的预测结果
output = model(x)  # 将随机张量x输入到模型中运行前向推理  output就是1000个类别的预测分数
print(output)
print(output.shape)     # torch.Size([1, 1000])## Pytorch模型转ONNX格式
with torch.no_grad():torch.onnx.export(model,                      # 要转换的模型x,                          # 模型的任意一组输入 张量的维度一定要和模型指定输入的维度一致'resnet18_imagenet.onnx',  # 导出的ONNX文件名,自定义名称opset_version = 11,         # ONNX 算子集版本,ONNC算子官网地址:https://onnx.ai/input_names = ['input'],    # 输入Tensor的名称   # 自定义名称output_names = ['output']   # 输出Tensor的名称   # 自定义名称)## 验证导出的onnx模型是否导出成功
onnx_model = onnx.load('resnet18_imagenet.onnx')   # 读取上一步导出的ONNX模型
onnx.checker.check_model(onnx_model)               # 检测模型格式是否正确print("恭喜你,ONNX模型载入成功!")## 以可读形式打印计算图
print(onnx.helper.printable_graph(onnx_model.graph))## 网页端打开
# 网址:https://netron.app/

运行上面代码后会在此代码的同级目录下生成一个.onnx文件,如下:

在这里插入图片描述

四、可视化网络结构

可视化网络结构,使用Netron,网址:Netron

打开后的样子如下:

在这里插入图片描述

打开本地网络结构有两种方法,一种是如上图所示,通过页面的open model选项打开,另一种是将.onnx文件直接拖到Netron页面中即可打开,打开后的样子如下:

在这里插入图片描述

通过上面方法就可以在Netron中直观的查看网络结构。

五、总结

以上就是Pytorch图像分类模型转换ImageNet1000类预训练模型转ONNX的详细过程,此系列持续更新中。

总结不易,多多支持,谢谢!

这篇关于【模型部署入门 一】:Pytorch图像分类模型转换ImageNet1000类预训练模型转ONNX的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/540635

相关文章

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结