当前位置: 首页 > news >正文

【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署

【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署

提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论

文章目录

  • 【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署
  • 前言
  • Windows平台搭建依赖环境
  • 模型转换--pytorch转onnx
  • ONNXRuntime推理代码
  • 总结


前言

本期将讲解深度学习图像分类网络VggNet模型的部署,对于该算法的基础知识,可以参考博主【VggNet模型算法Pytorch版本详解】博文。
读者可以通过学习 【onnx部署】部署系列学习文章目录的onnxruntime系统学习–Python篇 的内容,系统的学习OnnxRuntime部署不同任务的onnx模型。


Windows平台搭建依赖环境

在【入门基础篇】中详细的介绍了onnxruntime环境的搭建以及ONNXRuntime推理核心流程代码,不再重复赘述。


模型转换–pytorch转onnx

import torch
import torchvision as tv
def resnet2onnx():# 使用torch提供的预训练权重 1000分类model = tv.models.vgg16(pretrained=True)model.eval()model.cpu()dummy_input1 = torch.randn(1, 3, 224, 224)torch.onnx.export(model, (dummy_input1), "vgg16.onnx", verbose=True, opset_version=11)
if __name__ == "__main__":resnet2onnx()


如下图,torchvision本身提供了不少经典的网络,为了减少教学复杂度,这里博主直接使用了torchvision提供的ResNet网络,并下载和加载了它提供的训练权重。这里可以替换成自己的搭建的ResNet网络以及自己训练的训练权重。


ONNXRuntime推理代码

需要配置imagenet_classes.txt【百度云下载,提取码:rkz7 】文件存储1000类分类标签,假设是用户自定的分类任务,需要根据实际情况作出修改,并将其放置到工程目录下(推荐)。

这里需要将vgg16.onnx放置到工程目录下(推荐),并且将以下推理代码拷贝到新建的py文件中,并执行查看结果。

import onnxruntime as ort
import cv2
import numpy as np# 加载标签文件获得分类标签
def read_class_names(file_path="./imagenet_classes.txt"):class_names = []try:with open(file_path, 'r') as fp:for line in fp:name = line.strip()if name:class_names.append(name)except IOError:print("could not open file...")import syssys.exit(-1)return class_names# 主函数
def main():# 预测的目标标签数labels = read_class_names()# 测试图片image_path = "./lion.jpg"image = cv2.imread(image_path)# cv2.imshow("输入图", image)# cv2.waitKey(0)# 设置会话选项sess_options = ort.SessionOptions()# 0=VERBOSE, 1=INFO, 2=WARN, 3=ERROR, 4=FATALsess_options.log_severity_level = 3# 优化器级别:基本的图优化级别sess_options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_BASIC# 线程数:4sess_options.intra_op_num_threads = 4# 设备使用优先使用GPU而是才是CPU,列表中的顺序决定了执行提供者的优先级providers = ['CUDAExecutionProvider', 'CPUExecutionProvider']# onnx训练模型文件onnxpath = "./vgg16.onnx"# 加载模型并创建会话session = ort.InferenceSession(onnxpath, sess_options=sess_options, providers=providers)input_nodes_num = len(session.get_inputs())     # 输入节点输output_nodes_num = len(session.get_outputs())   # 输出节点数input_node_names = []                           # 输入节点名称output_node_names = []                          # 输出节点名称# 获取模型输入信息for i in range(input_nodes_num):# 获得输入节点的名称并存储input_name = session.get_inputs()[i].nameinput_node_names.append(input_name)# 显示输入图像的形状input_shape = session.get_inputs()[i].shapech, input_h, input_w = input_shape[1], input_shape[2], input_shape[3]print(f"input format: {ch}x{input_h}x{input_w}")# 获取模型输出信息for i in range(output_nodes_num):# 获得输出节点的名称并存储output_name = session.get_outputs()[i].nameoutput_node_names.append(output_name)# 显示输出结果的形状output_shape = session.get_outputs()[i].shapenum, nc = output_shape[0], output_shape[1]print(f"output format: {num}x{nc}")input_shape = session.get_inputs()[0].shapeinput_h, input_w = input_shape[2], input_shape[3]print(f"input format: {input_shape[1]}x{input_h}x{input_w}")# 预处理输入数据# 默认是BGR需要转化成RGBrgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 对图像尺寸进行缩放blob = cv2.resize(rgb, (input_w, input_h))blob = blob.astype(np.float32)# 对图像进行标准化处理blob /= 255.0   # 归一化blob -= np.array([0.485, 0.456, 0.406])  # 减去均值blob /= np.array([0.229, 0.224, 0.225])  # 除以方差#CHW-->NCHW 维度扩展timg = cv2.dnn.blobFromImage(blob)# ---blobFromImage 可以用以下替换---# blob = blob.transpose(2, 0, 1)# blob = np.expand_dims(blob, axis=0)# -------------------------------# 模型推理try:ort_outputs = session.run(output_names=output_node_names, input_feed={input_node_names[0]: timg})except Exception as e:print(e)ort_outputs = None# 后处理推理结果prob = ort_outputs[0]max_index = np.argmax(prob)     # 获得最大值的索引print(f"label id: {max_index}")# 在测试图像上加上预测的分类标签label_text = labels[max_index]cv2.putText(image, label_text, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 2, 8)cv2.imshow("输入图像", image)cv2.waitKey(0)if __name__ == '__main__':main()

图片预测为猎豹(cheetah),没有准确预测出狮子(lion),但是这个图片难度很大,在1000分类中预测的比较接近的。

其实图像分类网络的部署代码基本是一致的,几乎不需要修改,只需要修改传入的图片数据已经训练模型权重即可。


总结

尽可能简单、详细的讲解了Python下onnxruntime环境部署VggNet模型的过程。

相关文章:

【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署

【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONN…...

手写排班日历

手写排班日历&#xff1a; 效果图&#xff1a; vue代码如下&#xff1a; <template><div class"YSPB"><div class"title">排班日历</div><div class"banner"><span classiconfont icon-youjiantou click&qu…...

SpringBoot多数据源配置

1、添加依赖 <!-- 数据库驱动 --><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-connector-java.version}</version><scope>runtime</sco…...

影响画布微信小程序canvas及skyline和webview用户界面布局的关键流程

影响微信小程序画布canvas及skyline和webview用户界面布局的关键流程 目录 影响微信小程序画布canvas及skyline和webview用户界面布局的关键流程 一、微信小程序canvas开发流程 1.1、官方指南 1.2、客制化开发 第一步&#xff1a;在 WXML 中添加 canvas 组件 第二步&…...

MATLAB图像处理

MATLAB图像处理 MATLAB&#xff0c;作为美国MathWorks公司出品的商业数学软件&#xff0c;以其强大的矩阵运算能力和丰富的函数库&#xff0c;在图像处理领域得到了广泛的应用。MATLAB不仅提供了基础的图像处理功能&#xff0c;还通过图像处理工具箱&#xff08;Image Process…...

【编程底层思考】性能监控和优化:JVM参数调优,诊断工具的使用等。JVM 调优和线上问题排查实战经验总结

JVM性能监控和优化是确保Java应用程序高效运行的关键环节。以下是一些JVM性能监控和优化的方法&#xff0c;以及使用诊断工具和实战经验的总结&#xff1a; 一、JVM参数调优&#xff1a; 堆大小设置 : - Xms&#xff1a;设置JVM启动时的初始堆大小。 - -Xmx&#xff1a;设置J…...

数据库的实施过程分析

在完成了数据库的逻辑结构设计和物理结构设计后&#xff0c;下一步就是将设计成果转化为现实&#xff0c;这一步骤被称为数据库的实施。数据库实施是数据库开发过程中至关重要的一环&#xff0c;它标志着从设计阶段向实际应用的过渡。本文将为你详细讲解数据库实施的各个关键步…...

【Kubernetes】常见面试题汇总(十二)

目录 36.简述 Kubernetes 的负载均衡器&#xff1f; 37.简述 Kubernetes 各模块如何与 APl Server 通信&#xff1f; 38.简述 Kubernetes Scheduler 作用及实现原理&#xff1f; 36.简述 Kubernetes 的负载均衡器&#xff1f; &#xff08;1&#xff09;负载均衡器是暴露服务…...

基于SpringBoot+Vue+MySQL的美术馆管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着文化艺术产业的蓬勃发展&#xff0c;美术馆作为展示与传播艺术的重要场所&#xff0c;其管理工作变得日益复杂。为了提升美术馆的运营效率、优化参观体验并加强艺术品管理&#xff0c;我们开发了基于SpringBootVueMySQL的美…...

golang面试

算法&#xff1a; 1.提取二进制位最右边的 r i & (~i 1) 2.树上两个节点最远距离&#xff0c;先考虑头结点参与不参与。 3.暴力递归改dp。 1.确定暴力递归方式。 2.改记忆化搜索 3.严格表方式&#xff1a; 分析可变参数变化范围&#xff0c;参数数量决定表维度、 …...

基于"WT2605C的智能血压计:AI对话引领个性化健康管理新时代,健康守护随时在线

在当今快节奏的生活中&#xff0c;健康管理已成为我们日常不可或缺的一部分。随着科技的进步&#xff0c;智能设备正逐步融入我们的日常生活&#xff0c;为健康管理带来前所未有的便捷与智能化。今天&#xff0c;让我们共同探索WT2605C AI在线方案如何在血压计中发挥革命性作用…...

redis高级教程

一 关系型数据库和 NoSQL 数据库 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 关系型数据库 &#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库中的数据主流的 MySQL 、 Oracle 、 MS SQL Server 和 D…...

prfm命令初探

1. 前言 在查看一段neon代码时&#xff0c;发现有如下片段&#xff0c;为使用汇编进行数据预取操作。这是一个新的知识点&#xff0c;记录一下学习过程。 __asm__ volatile("prfm pldl2keep,[%0, #8192] \n""prfm pldl1keep,[%0, #1024] \n":"r"…...

AI大模型需要学什么?怎么学?从零基础入门大模型(保姆级),从这开始出发!

一.初聊大模型 1.为什么要学习大模型&#xff1f; 在学习大模型之前&#xff0c;你不必担心自己缺乏相关知识或认为这太难。我坚信&#xff0c;只要你有学习的意愿并付出努力&#xff0c;你就能够掌握大模型&#xff0c;并能够用它们完成许多有意义的事情。在这个快速变化的时代…...

python自述3

Python 条件控制 if语句的一般形式如下所示: if condition_1: statement_block_1 elif condition_2: statement_block_2 else: statement_block_3 Python 中用 elif 代替了 else if,所以if语句的关键字为:if – elif – else。 注意: 1、每个条件后面要使用冒号 :,表…...

Redis常见的数据结构

Redis底层的数据结构是Redis高效存储和操作数据的基础,Redis提供了五种基本的数据类型&#xff0c;每种类型在底层都有对应的数据结构来实现。这五种数据类型分别是&#xff1a;字符串&#xff08;String&#xff09;、哈希&#xff08;Hash&#xff09;、列表&#xff08;List…...

批量插入insert到SQLServer数据库,BigDecimal精度丢失解决办法,不动代码,从驱动层面解决

概述 相信很多人都遇到过&#xff0c;使用sql server数据库&#xff0c;批量插入数据时&#xff0c;BigDecimal类型出现丢失精度的问题&#xff0c;网上也有很多人给出过解决方案&#xff0c;但一般都要修改应用代码&#xff0c;不推荐。 丢失精度的本质是官方的驱动有BUG造成…...

随手记:uniapp小程序登录方式和小程序使用验证码登录

小程序登录方式&#xff1a; 方式一&#xff1a;小程序授权登录 通过uni.login获取 临时登录凭证code&#xff0c;向后端换取token。 <u-button type"primary" shape"circle" click"login">登 录</u-button>login() {uni.login({p…...

【Hadoop|HDFS篇】DataNode概述

1. DataNode的工作机制 1&#xff09;一个数据块在DataNode上以文件形式存储在磁盘上&#xff0c;包括两个文件&#xff0c;一个是数据本身&#xff0c;一个是元数据包括数据块的长度&#xff0c;块数据的校验和&#xff0c;以及时间戳。 2&#xff09;DataNode启动后向NameNod…...

Vue2 VueRouter学习笔记

VueRouter 官方文档 版本对应 vue2&#xff1a;3.x.x vue3&#xff1a;4.x.x 路由&#xff1a;访问路径与vue组件&#xff08;页面&#xff09;之间的映射关系 VueRouter&#xff1a;Vue官方提供的插件&#xff0c;本质上是一个 JavaScript 库&#xff0c;用于在 Vue.js 应用…...

3D培训大师,化工企业安全教育与应急演练的新助力

化工企业的生产安全培训&#xff0c;作为保障员工生命安全与企业稳定运营的基石&#xff0c;其重要性不言而喻。传统的培训方式内容僵化、形式单一缺乏互动、效果难以评估&#xff0c;越来越不适应化工企业的实际需求。因此&#xff0c;探索和应用更为高效、创新的培训工具&…...

斯坦福大学论文润色chat-gpt指令

Quick Prompts快速提示 To enhance text clarity-为了增强文本清晰度 As a non-native English speaker, kindly help me revise the following text for improved understand clarity. Please check for spelling and sentence structure errors and suggest alternatives.为…...

简单硬件在环搭建(ROS+Prescan+Carsim+simulink)

本文通过ROSPrescanCarsimsimulink搭建简单的硬件在环仿真测试平台。 系统架构如下&#xff1a; 在Windows中运行prescan场景仿真软件&#xff0c;在jetson Nano中运行ROS&#xff0c;硬件上两台电脑通过一根网线相连传输信息&#xff1b; 1.prescan与carsim的集成 在C:\car…...

【Python 数据分析学习】Pandas基础与应用(1)

题目 1 Pandas 简介1.1 主要特征1.2 Pandas 安装 2 Pandas中的数据结构2.1 Series 数据结构和操作2.1.1 Series的数据结构2.1.2 Seres的操作 2.2 DataFrame 数据结构和操作2.2.1 DataFrame 数据结构2.2.2 Dataframe 操作2.2.3 DateFrame 的特殊操作 2.3 Series 和 DataFrame 的…...

pytorch入门(1)——pytorch加载数据初认识

环境配置及其安装&#xff1a; 2023最新pytorch安装&#xff08;超详细版&#xff09;-CSDN博客 pytorch加载数据初认识 Dataset&#xff1a;创建可被Pytorch使用的数据集 提供一种方式获取数据及其label Dataloader&#xff1a;向模型传递数据 为网络提供不同的数据形式 …...

Spring下载文件

1、controller /*** 下载文件通过ID** param auditInformationDTO 靓号稽核文件DTO* param servletResponse 响应体*/ GetMapping(value "/downloadAuditFileByAuditFileId") public void downloadAuditFileByAuditFileId(ModelAttribute final GoodNumberAuditInf…...

如何在数据库中备份表:操作指南与注意事项

在数据库管理中&#xff0c;备份表是一种常见的操作&#xff0c;它可以帮助我们保存数据的当前状态&#xff0c;以便在需要时进行恢复或分析。备份表可以通过创建一个新表并复制原表的所有数据到新表中来实现。 以下是具体的SQL语句&#xff1a; CREATE TABLE backup_table A…...

【数据结构】第八节:链式二叉树

个人主页&#xff1a; NiKo 数据结构专栏&#xff1a; 数据结构与算法 源码获取&#xff1a;Gitee——数据结构 一、二叉树的链式结构 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left; // 左子树根节点struct BinaryT…...

Fair Graph RepresentationLearning via Diverse Mixture-of-Experts

发表于&#xff1a;WWW23 推荐指数&#xff1a; #paper/⭐⭐ 问题背景&#xff1a; 背景 现实世界的数据很多样&#xff0c;阻止GNN学习公平的表示。当去偏见化后&#xff0c;他们面临着可学知识不足且属性有限的重大问题 解决方法&#xff1a; 应对公平训练导致可学习知识…...

电机驱动开发之驱动板

目录 1.主要器件选型2.原理图设计3.PCB绘制电源调理驱动电路电流反馈位置反馈 4.PCB绘制5.打板验证6.总结 1.主要器件选型 器件参数封装理由LDOLM317DCYR &#xff08;24V-12V 12V-5V&#xff09;SOT-223小电流应用 LDO比DCDC噪声小响应快更为稳定预驱FD6288TTssop-20常见无刷…...