Pytorch使用c++调用模型

news/2024/5/4 18:38:12/文章来源:https://blog.csdn.net/qq_29788741/article/details/128194998

之前说过一个c++上调用pytorch现在又反过来了~~ 其实还是仅用c代码哈 生产环境还是用这个

C++推理框架ncnn为例,介绍一下部署的大致流程

PyTorch模型 --> ONNX格式 --> C++推理框架

其它C++推理框架的思路类似,唯一的学习成本是推理框架本身的API。

一、PyTorch模型转ONNX

ONNX is an open format built to represent machine learning models. ONNX defines a common set  of operators - the building blocks of machine learning and deep  learning models - and a common file format to enable AI developers to  use models with a variety of frameworks, tools, runtimes, and compilers.

简单来说,可以把ONNX当做一个中间格式。绝大多数的机器学习/深度学习框架都可以将自身的模型转换成ONNX,同样也能把ONNX转换成自身框架的格式,如下图所示。

图1 不同框架的模型利用ONNX进行相互转换 

ONNX官网地址:https://onnx.ai/

在PyTorch中,可以用如下方法非常方便地将一个PyTorch模型存储为ONNX格式:

import torch# 指定输入尺寸,ONNX需要这个信息来确定输入大小
# 参数对应于 (batch_size, channels, H, W)
dummy_input = torch.randn(1, 3, 224, 224, device="cuda")# model为模型自身
# dummy_input根据自己的需求更改其尺寸
# "model.onnx"为输出文件,更改为自己的路径即可
torch.onnx.export(model, dummy_input, "model.onnx")

torch.onnx.export还有一些额外的参数可以实现更灵活的使用方法,详见https://pytorch.org/docs/stable/onnx.html。本文的示例足以让您能够成功部署自己的模型。

需要注意的是,ONNX的目的是“通用”,所以难免会在一些情况出现算子不兼容的情况。具体的表现是,当你把某个框架(例如PyTorch)的模型转成ONNX后,再将ONNX转成另一框架模型(例如ncnn)时,可能会报错(xxx算子不支持)。不兼容的情况多种多样,这里不举例说明了,需要具体情况具体分析。

一些有效的解决方法:

  1. 使用ONNXSIM对ONNX模型进行精简。非常有效。个人建议:只要使用了ONNX,都用ONNXSIM对ONNX模型进行处理一次。Github地址:https://github.com/daquexian/onnx-simplifier。使用非常方便,使用“pip install onnxsim”安装,然后使用命令“onnxsim input_onnx_model_path output_onnx_model_path”即可。代码中调用也很简单,参考Git地址里的示例。

  2. 避免依赖于中间变量的尺寸来进行运算。比如,在一些Image to Image的任务中,可能会根据中间tensor的尺寸来对另一些tensor进行resize。这时我们的做法是先去获取中间tensor的尺寸H、W,然后将它们作为参数送给其它方法。当遇到这种运算时,ONNX似乎会创建两个与H、W相关的变量,但它们的值会绑定为用dummy_input去forward一次时得到的H、W。这个值一旦绑定就不会改变。所以后续当使用不同尺寸输入时极大概率会报错(这点没有仔细验证过,但看中间结果很像是这种情况)。

另外强烈建议使用一些网络可视化工具。当遇到模型转换报错时可以用来方便定位出错的位置。个人比较喜欢的是netron,地址:https://github.com/lutzroeder/netron

放一张仓库中的图,效果如下:

二、ONNX转ncnn

ncnn是腾讯开源的轻量级推理框架。简单易用是它最大的特点。但当功耗、时耗是主要考虑点的时候,需要多尝试其它框架,如TensorFlow Lite。

ncnn地址:https://github.com/Tencent/ncnn

ncnn提供了将onnx转换为ncnn格式的工具。可以在此处找到:https://github.com/Tencent/ncnn/releases。例如,在Windows下,可以下载https://github.com/Tencent/ncnn/releases/download/20221128/ncnn-20221128-windows-vs2017.zip。解压后在x64或x86的bin文件夹中能够找到onnx2ncnn.exe。在命令行中使用如下命令即可将onnx转换为ncnn格式:

onnx2ncnn.exe onnx_model_path [ncnn.param] [ncnn.bin]

onnx_model_path 替换为自己的onnx模型地址。后两个参数可选。如果不写,那么会在onnx2ncnn.exe同目录下产生转换后的ncnn模型文件:一个.param文件和一个.bin文件。也可以自己填后两个参数来自己指定文件输出路径。

三、在ncnn下进行模型推理

在任何框架下推理都只需要两步:加载模型和将数据转化为框架格式。

ncnn下加载模型的方法为(还有其它方法):

ncnn::Net model;  // 定义一个模型
model.load_param("model.param");   // 加载模型的param文件
model.load_model("model.bin");        // 加载模型的bin文件

加载模型后,只需要将数据转化为ncnn的格式即可。ncnn模型输入的格式是ncnn::Mat。

OpenCV的Mat转ncnn::Mat的方法全列于此处:

https://github.com/Tencent/ncnn/wiki/use-ncnn-with-opencv

如:

// cv::Mat a(h, w, CV_8UC3);
ncnn::Mat in = ncnn::Mat::from_pixels(a.data, ncnn::Mat::PIXEL_BGR2RGB, a.cols, a.rows);

在JNI中要将一个android bitmap转换为ncnn::Mat可参考官方示例:https://github.com/nihui/ncnn-android-squeezenet/blob/master/app/src/main/jni/squeezencnn_jni.cpp

代码如:

// ncnn from bitmap
ncnn::Mat in = ncnn::Mat::from_android_bitmap(env, bitmap, ncnn::Mat::PIXEL_BGR);

有了模型和输入,最后forward一次,再取结果即可:

ncnn::Extractor ex = model.create_extractor();// input_name 可以通过netron对.param或.bin文件进行查看
// 将input_name替换为模型的第一个输入位置的名字即可ex.input(input_name, in);ncnn::Mat out;  // 用来存放输出结果// output_name可以通过netron对.param或.bin文件进行查看
// 将output_name替换为模型的输出位置的名字即可
ex.extract(output_name, out);

只要是转换模型,大多数路径都是如此,学习成本并不高。主要是学习推理框架的成本。芯片厂商自身的推理框架相对复杂点,各种奇奇怪怪的条条框框。

whaosoft aiot http://143ai.com  

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

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

相关文章

2.2.2同向放大器、同向放大器的设计

笔者电子信息专业硕士毕业,获得过多次电子设计大赛、大学生智能车、数学建模国奖,现就职于南京某半导体芯片公司,从事硬件研发,电路设计研究。对于学电子的小伙伴,深知入门的不易,特开次博客交流分享经验&a…

网络安全中接口测试的解决方案

Eolink新一代API测试神器一、接口测试1、接口2、接口测试二、网络安全中的接口测试,具体场景1、接口安全测试2、传统测试工具3、具体测试场景三、Eolink的解决方案1、解决传统测试的痛点2、Eolink 测试接口四、Eolink的使用体验五、Eolink评价1、网络安全行业内2、就…

BUG系列路径规划算法原理介绍(六)——BugFlood算法

本系列文章主要对Bug类路径规划算法的原理进行介绍,在本系列的第一篇文章中按照时间顺序梳理了自1986年至2018年Bug类路径规划算法的发展,整理了13种BUG系列中的典型算法,从本系列的第二篇文章开始依次详细介绍了其中具有代表性的BUG1、BUG2、…

confluence的几个高危漏洞复现

序言 本次复现涉及了好几个confluence的相关漏洞,从复现利用到提权,有兴趣的可以自行搭建环境测试。 1.CVE-2021-26084 Confluence OGNL 注入漏洞 1.1 漏洞描述 在某些情况下,远程攻击者在经过身份验证或在特定环境下未经身份验证的情况下…

原生JavaScript JS导出blob后台文件流xlsx、xls文件自动下载(且规避乱码),解决导出Excel文件里面有[object Object]。

解决上面的问题&#xff0c;请用如下代码&#xff1a; <script>let exportExcel function (apiUrl, postData, downloadFileName, headers, cb) {//apiUrl, postData, downloadFileName, headers, cb&#xff08;传参说明&#xff1a;接口路径,接口传参,下载文件名,头部…

2022还有必要学JSP吗?

问题又来了&#xff0c;那JSP如果是『老东西』&#xff0c;那被什么替代了呢&#xff1f;要么就是用常见的模板引擎『freemarker』『Thymeleaf』『Velocity』&#xff0c;用法其实跟『JSP』差不太多&#xff0c;只是它们的性能会更好。要么前后端分离&#xff0c;后端只需要返回…

2022年创新药行业研究报告

第一章 行业概况 创新药&#xff0c;也称为原研药&#xff0c;是一个相对于仿制药的概念&#xff0c;指的是从机理开始源头研发&#xff0c;具有自主知识产权&#xff0c;具备完整充分的安全性有效性数据作为上市依据&#xff0c;首次获准上市的药物。新药上市要经历化合物的发…

Python.02.语法进阶

目录 基本运算符 比较运算符 赋值运算符 多变量赋值 逻辑运算符 案例&#xff1a; 案例实现源码如下 三元运算符 条件语句 循环语句 1.计算0-100的求和 2.for循环数组求和 3.range定义一个1-100的奇数数组,for循环求出数组的和 4.while...else...语法 基本运算符 比较…

最新中文版本FLStudio21水果音乐软件更新下载

导读&#xff1a;昨晚Image-Line发布FL Studio 2023&#xff0c;而今年也是他们成立第23周年。FL21一经发行便引起了广大制作人的关注&#xff0c;今天我们来介绍一下这款软件。FL Studio是一款音乐编曲软件&#xff0c;全称&#xff1a;Fruity Loops Studio&#xff0c;也是我…

百度前端二面常考面试题

HTTP分层 第一层&#xff1a;物理层&#xff0c;TCP/IP 里无对应&#xff1b;第二层&#xff1a;数据链路层&#xff0c;对应 TCP/IP 的链接层&#xff1b;第三层&#xff1a;网络层&#xff0c;对应 TCP/IP 的网际层&#xff1b;第四层&#xff1a;传输层&#xff0c;对应 TCP…

ARM基础(1):Cortex-M3的核心寄存器和特殊寄存器

Cortex-M3处理器的寄存器包括R0~R15和一些特殊的寄存器。其中R0到R12是通用寄存器&#xff0c;但是一些16位的Thumb指令只能访问R0到R7(低寄存器)&#xff0c;而32位的Thumb-2指令则可以访问所有这些寄存器。特殊寄存器只能通过特殊访问指令访问。 文章目录1 核心寄存器1.1 R13…

用友NC6.5 Linux服务器环境部署

用友NC6.5 Linux服务器环境部署 1.环境配置要求  1.1 操作系统平台 应用服务器操作系统版本&#xff08;补丁&#xff09;中间件类型JDK 版本Linux-RedHat(x64&#xff0c;多核)Enterprise Linux Server release 6.3Websphere 8.5.0.1/UAP/Weblogic11SUN JDK1.7_51/IBM SDK,V…

ArgoDB 5.1 正式发布:多模融合、实时分析和数据安全多重升级

Transwarp ArgoDB是星环科技自主研发的高性能分布式分析型数据库&#xff0c;在PB级数据量上提供极致的数据分析能力。ArgoDB支持标准SQL语法和分布式事务&#xff0c;提供高并发高速数据写入、复杂查询、多模分析、数据联邦、隐私计算和动态脱敏等能力。基于星环科技ArgoDB数据…

PacBio HiFi 测序动植物基因组项目真实案例测评

HiFi Reads全称High fidelity reads, 是PacBio公司基于Sequel II平台产出的兼具长读长和高准确度的测序序列&#xff0c;该测序模式&#xff08;CCS测序模式&#xff09;一经问世&#xff0c;备受广大组学科研用户关注——其超长读长完美规避了二代测序short reads的天生不足&a…

PWN利器-pwntools安装、调试教程一览

关于pwntools Documentation: pwntools — pwntools 4.10.0dev documentation Github: https://github.com/Gallopsled/pwntools#readme GitHub - Gallopsled/pwntools-tutorial: Tutorials for getting started with Pwntools pwntools是一个CTF框架和漏洞利用的python开发…

基于java(ssm)学生在线课程学习系统源码(java毕业设计)

基于java&#xff08;ssm&#xff09;学生在线课程学习系统 学生在线课程学习系统是基于java编程语言&#xff0c;mysql数据库&#xff0c;ssm框架&#xff0c;和idea工具开发&#xff0c;本项目主要分为学生&#xff0c;管理员两个角色&#xff0c;学生的功能是登陆&#xff…

5款高效率,但是名气不大的小众软件

今天推荐5款十分小众的软件&#xff0c;但是每个都是非常非常好用的&#xff0c;用完后觉得不好用你找我。 1.多窗口文件整理——Q-Dir Q-Dir 是一款多窗口文件整理工具&#xff0c;特别适合用户频繁在各个文件夹中跳转进行复制粘贴的文件归档操作。如果你的电脑硬盘中文件已经…

红队渗透靶场之SickOs1.1

靶场考察知识 shellshock漏洞 shellshock即unix系统下的bash shell的一个漏洞, Bash 4.3以及之前的版本在处理某些构造的环境变量时存在安全漏洞, 向环境变量值内的函数定义后添加多余的字符串会触发此漏洞, 攻击者可利用此漏洞改变或绕过环境限制&#xff0c;以执行任意的sh…

vue中pc端大屏怎么进行rem适配(lib-flexible + postcss-plugin-px2rem)

npm i lib-flexible -Spostcss-plugin-px2rem在main.js中引入 import lib-flexible/flexible.js找到node_modules里找到lib-flexible&#xff0c;修改flexible.js 搜索540找到refreshRem函数修改 function refreshRem() {var width docEl.getBoundingClientRect().width;if (…