openvino如何在c++中调用pytorch训练的模型
步骤1:将PyTorch模型转换为ONNX格式
转换代码示例(Python)
import torch
import torchvision
1. 加载训练好的PyTorch模型
model = torchvision.models.resnet18(pretrained=True)
model.eval() # 设置为评估模式
2. 创建虚拟输入(尺寸需匹配模型输入)
dummy_input = torch.randn(1, 3, 224, 224)
3. 导出为ONNX格式
torch.onnx.export(model,dummy_input,"resnet18.onnx",export_params=True,opset_version=11, # 推荐使用11+input_names=["input"],output_names=["output"]
)
步骤2:将ONNX转换为OpenVINO IR格式
使用OpenVINO的Model Optimizer转换模型:
mo --input_model resnet18.onnx \--output_dir ir_model \--model_name resnet18_ir \--data_type FP32 # 也可用FP16
生成文件:
resnet18_ir.xml:网络拓扑结构
resnet18_ir.bin:权重数据
步骤3:C++集成推理代码
环境配置
安装OpenVINO Runtime
CMake配置示例:
find_package(OpenVINO REQUIRED)
add_executable(inference_app main.cpp)
target_link_libraries(inference_app PRIVATE openvino::runtime)
C++推理代码
#include <openvino/openvino.hpp>
#include <vector>int main() {// 1. 初始化OpenVINO核心ov::Core core;// 2. 加载模型auto model = core.read_model("ir_model/resnet18_ir.xml");// 3. 编译模型(指定设备)ov::CompiledModel compiled_model = core.compile_model(model, "CPU"); // 也可用"GPU", "MYRIAD"// 4. 创建推理请求ov::InferRequest infer_request = compiled_model.create_infer_request();// 5. 准备输入数据auto input_tensor = infer_request.get_input_tensor();float* input_data = input_tensor.data<float>();// 填充数据(示例:随机值)std::fill_n(input_data, input_tensor.get_size(), 0.5f); // 6. 执行推理infer_request.infer();// 7. 获取输出结果auto output_tensor = infer_request.get_output_tensor();const float* output_data = output_tensor.data<const float>();// 处理输出(例如:打印前10个结果)for (int i = 0; i < 10; ++i) {std::cout << "Output[" << i << "] = " << output_data[i] << std::endl;}return 0;
}
关键注意事项
输入预处理:
需在C++中复现PyTorch的预处理逻辑(归一化/缩放)
示例:若PyTorch使用mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225],需在填充input_data前进行归一化
动态shape支持:
若需动态输入尺寸,导出ONNX时指定动态维度:
torch.onnx.export(…, dynamic_axes={“input”: {0: “batch_size”, 2: “height”, 3: “width”}})
性能优化:
使用ov::preprocess::PrePostProcessor进行图内预处理
启用异步推理:infer_request.start_async()
多设备支持:core.compile_model(model, “MULTI:CPU,GPU”)
错误排查工具:
验证ONNX:onnx.checker.check_model(onnx.load(“resnet18.onnx”))
查看IR结构:使用Netron打开.xml文件
完整流程图示
graph LR
A[PyTorch模型 .pt] -->|torch.onnx.export| B[ONNX模型]
B -->|Model Optimizer| C[OpenVINO IR XML/BIN]
C --> D[C++加载IR]
D --> E[预处理数据]
E --> F[执行推理]
F --> G[解析输出]
通过以上步骤,即可高效部署PyTorch模型到C++生产环境。建议参考OpenVINO官方文档获取最新API细节和性能调优指南。
相关文章:
openvino如何在c++中调用pytorch训练的模型
步骤1:将PyTorch模型转换为ONNX格式 转换代码示例(Python) import torch import torchvision1. 加载训练好的PyTorch模型 model torchvision.models.resnet18(pretrainedTrue) model.eval() # 设置为评估模式2. 创建虚拟输入(…...

Redisson简明教程—你家的锁芯该换了
1.简介 各位攻城狮们,你还在使用原生命令来上锁么?看来你还是不够懒,饺子都给你包好了,你非要吃大饼配炒韭菜,快点改善一下“伙食”吧,写代码也要来点幸福感。今天咱们就来聊聊Redisson提供的各种锁&#…...

48V带极性反接保护-差共模浪涌防护方案
在工业自动化(电动机驱动 / 工业机器人)、交通基础设施(充电桩 / 车载电子)、安防系统(监控摄像头 / 门禁)、储能设备(BMS / 离网控制器)等领域,DC48V 电源因安全特低电压…...

Python----目标检测(使用YOLO 模型进行线程安全推理和流媒体源)
一、线程安全推理 在多线程环境中运行YOLO 模型需要仔细考虑,以确保线程安全。Pythons threading 模块允许您同时运行多个线程,但在这些线程中使用YOLO 模型时,需要注意一些重要的安全问题。本页将指导您创建线程安全的YOLO 模型推理。 1.1、…...

jvm学习第1day jvm简介,栈溢出、堆溢出
jvm学习第1day jvm简介,栈溢出、堆溢出 jvm简介栈线程安全栈溢出线程运行诊断堆堆溢出 方法区方法区内存溢出常量池和运行时常量池 jvm简介 jvm 是编译后的字节码文件运行的环境, 因此各个平台有了jvm可以运行java.class文件,这是Java跨平台…...

用广告维持的免费 AI 图像生成工具(个人项目分享)
用广告维持的免费 AI 图像生成工具(个人项目分享) 免费 AI 图像生成工具网址:https://aiart.gcc.ac.cn/ 最近做了一个 AI 图像生成器,主要目标是“尽量简单”: 打开网页就能用不用注册、不用登录免费,不…...

分析Web3下数据保护的创新模式
在这个信息爆炸的时代,我们正站在 Web3 的门槛上,迎接一个以去中心化、用户主权和数据隐私为核心的新时代。Web3 不仅仅是技术的迭代,它更是一场关于数据权利和责任的结构性变革。本文将探讨 Web3 下数据保护的创新模式,以期为用户…...

减少交通拥堵、提高效率、改善交通安全的智慧交通开源了。
智慧交通视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上…...

协议融合驱动效能跃升:Modbus转Ethernet IP的挤出吹塑机应用
在现代工业自动化领域,Modbus作为一种串行通信协议,其稳定性和简单性被广泛应用于各种工控设备中。但随着技术的进步,对于更高速、更远传输距离的需求日益增长,这就需要将Modbus协议通过以太网进行传输,即实现Modbus T…...
Hive的TextFile格式优化方法
Hive的TextFile格式是一种简单的行式存储格式,数据以文本行形式存储,每行包含多个字段,字段间通过分隔符(如逗号、制表符)分隔。尽管TextFile在性能上不如ORC、Parquet等列式存储格式,但在特定场景下仍有其优势。以下是TextFile格式的特点、优势、使用场景及优化方法: …...

bug 记录 - 使用 el-dialog 的 before-close 的坑
需求说明 弹窗中内嵌一个 form 表单 原始代码 <script setup lang"ts"> import { reactive, ref } from "vue" import type { FormRules } from element-plus const ruleFormRef ref() interface RuleForm {name: stringregion: number | null } …...

Next.js 中间件鉴权绕过漏洞 CVE-2025-29927
前言:CVE-2025-29927 是一个影响 Next.js 的严重漏洞,源于开发者信任了客户端请求中携带的 X-Middleware-Rewrite 头部字段。攻击者可以手动构造该头部,实现绕过中间件逻辑,访问本应受保护的资源或 API。 影响版本:Next.js < …...

基于YOLO-NAS-Pose的无人机象群姿态估计:群体行为分析的突破
【导读】 应对气候变化对非洲象的生存威胁,本研究创新采用无人机航拍结合AI姿态分析技术,突破传统观测局限。团队在肯尼亚桑布鲁保护区对比测试DeepLabCut与YOLO-NAS-Pose两种模型,首次将后者引入野生动物研究。通过检测象群头部、脊柱等关键…...

8天Python从入门到精通【itheima】-71~72(数据容器“序列”+案例练习)
目录 71节-数据容器“序列”的切片 1.学习目标 2.什么是序列 3.序列的常用操作——切片 4.小节总结 72节——案例练习:序列的切片实践 1.案例需求 2.代码实战 好了,又一篇博客和代码写完了,励志一下吧,下一小节等等继续&a…...
中达瑞和SHIS高光谱相机在黑色水彩笔墨迹鉴定中的应用
在文件检验与物证溯源领域,对书写材料(如墨水)进行快速、准确、无损的鉴别至关重要。由陈维娜等人撰写的《高光谱技术结合化学计量法鉴别黑色水彩笔墨迹》(发表于《光谱学与光谱分析》2023年第7期)利用中达瑞和SHIS凝采…...

dvwa10——XSS(DOM)
XSS攻击: DOM型XSS 只在浏览器前端攻击触发:修改url片段代码不存储 反射型XSS 经过服务器攻击触发:可能通过提交恶意表单,连接触发代码不存储 存储型XSS 经由服务器攻击触发:可能通过提交恶意表单,连…...

dvwa14——JavaScript
LOW 先按提示尝试输入success,提交失败 那用bp抓包一下 ,抓到这些,发现有token验证,说明改对token才能过 返回页面f12看一下源码,发现value后面的值像密码,于是试一下md5和rot13的解密 ROT13加密/解密 - …...
外网访问内网服务器常用的三种简单操作步骤方法,本地搭建网址轻松让公网连接
当本地内网环境搭建部署好服务器后,怎么设置让外网公网上连接访问到呢?或本身处于不同局域网间的主机,需要进行数据交互通信,又应该如何实现操作?这些都离不开外网对内网的访问配置。 总的来说外网访问内网服务器主要…...

机器学习实验八--基于pca的人脸识别
基于pca的人脸识别 引言:pca1.pca是什么2.PCA算法的基本步骤 实例:人脸识别1.实验目的2.实现步骤3.代码实现4.实验结果5.实验总结 引言:pca 1.pca是什么 pca是一种统计方法,它可以通过正交变换将一组可能相关的变量转换成一组线…...
UDP包大小与丢包率的关系:原理分析与优化实践
文章目录 📦 UDP包大小与丢包率的关系:原理分析与优化实践一、核心结论:UDP包大小如何影响丢包率?二、技术原理解析:为什么大UDP包更容易丢失?1️⃣ MTU限制与IP分片(关键机制)2️⃣…...
ubuntu 端口复用
需求描述:复用服务器的 80端口,同时处理 ssh 和 http 请求,也就是 ssh 连接和 http 访问服务器的时候都可以指定 80 端口,然后服务器可以正确分发请求给 ssh 或者 http。 此时,ssh 监听的端口为 22,而 htt…...
Registry和docker有什么关系?
当遇到多个服务器需要同时传docker镜像的时候,一个一个的传效率会非常慢且压力完全在发送方的网络带宽;可以参考git hub,通常我们会用git push将代码传到git hub,如果谁需要代码用git pull就可以拉到自己的机器上,dock…...
C++11实现TCP网络通讯服务端处理逻辑简化版
以下是使用C11实现的TCP服务端处理逻辑,包含循环读取数据、帧头检测(AABBCC)及4376字节数据包处理: cpp #include <iostream>#include <vector>#include <cstring>#include <unistd.h>#include <arp…...
python3.9带 C++绑定的基础镜像
FROM ubuntu:20.04 # 设置非交互式环境变量(避免apt安装时提示时区选择) ENV DEBIAN_FRONTENDnoninteractive RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 安装基础编译工具和依赖 # 添加Python 3.9 PPA并安装依赖 RUN apt-get upda…...
Elasticsearch中的语义搜索(Semantic Search)介绍
Elasticsearch中的**语义搜索(Semantic Search)**是一种基于文本语义理解的搜索技术,它能够超越传统的关键词匹配,识别查询与文档之间的语义相关性,从而提供更精准、更符合用户意图的搜索结果。这种技术通过捕捉文本背后的含义、上下文和概念关联,解决了传统搜索中常见的…...

LabVIEW的AMC架构解析
此LabVIEW 程序基于消息队列(Message Queue)机制构建 AMC 架构,核心包含消息生成(MessageGenerator )与消息处理(Message Processor )两大循环,通过队列传递事件与指令,实…...

MySQL 索引:为使用 B+树作为索引数据结构,而非 B树、哈希表或二叉树?
在数据库的世界里,性能是永恒的追求。而索引,作为提升查询速度的利器,其底层数据结构的选择至关重要。如果你深入了解过 MySQL(尤其是其主流存储引擎 InnoDB),你会发现它不约而同地选择了 B树 作为索引的主…...

ubuntu屏幕复制
在ubnuntu20中没有办法正常使用镜像功能,这里提供一下复制屏幕的操作. 使用xrandr查看所有的显示器情况 这里我发现自己的电脑没有办法直接设置分辨率,但是外接的显示器可以设置,从命令行来说就是设置: xrandr --output HDMI-0 --mode 1920x1080那怎么样才能将原生电脑屏幕换…...
Flutter嵌入式开发实战 ——从树莓派到智能家居控制面板,打造工业级交互终端
一、为何选择Flutter开发嵌入式设备? 1. 跨平台能力降维打击 特性传统方案Flutter方案开发效率需分别开发Android/Linux一套代码多端部署内存占用200MB (QtWeb引擎)<80MB (Release模式)热重载支持不支持支持 2. 工业级硬件支持实测 树莓派4B:1080…...

Spring WebFlux 整合AI大模型实现流式输出
前言 最近赶上AI的热潮,很多业务都在接入AI大模型相关的接口去方便的实现一些功能,后端需要做的是接入AI模型接口,并整合成流式输出到前端,下面有一些经验和踩过的坑。 集成 Spring WebFlux是全新的Reactive Web技术栈…...