VS c++ onnxruntime 环境配置、onnx教程、部署推理模型、sklearn pkl模型转onnx、问题汇总

这篇具有很好参考价值的文章主要介绍了VS c++ onnxruntime 环境配置、onnx教程、部署推理模型、sklearn pkl模型转onnx、问题汇总。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、初步认识ONNX

二、pkl转ONNX+可视化模型

三、ONNX Runtime运行时

3.1 相关介绍(了解此运行时):

3.2 VS、c++部署onnxruntime

3.3 头文件引用的一些问题

四、问题汇总:

1. 类没有成员

2. 版本兼容问题

3. 3.“GetInputName“: 不是 “Ort::Session“ 的成员


官网:ONNX Runtime | Home

GitHub - microsoft/onnxruntime

一、初步认识ONNX

一图看懂ONNX模型格式

ONNX学习笔记

Onnx模型介绍_HelloWorldQAQ。的博客-CSDN博客

ONNX(Open Neural Network Exchange)是一个开放的深度学习模型交换格式,它的目标是提供一个标准化的桥梁,使得不同深度学习框架之间能够更轻松地共享和部署模型。

ONNX 的主要特点和目标包括:

  1. 开放性: ONNX 是一个开放标准,由微软、Facebook和其他合作伙伴共同推动。它的目标是促进深度学习生态系统的互操作性。
  2. 跨平台: ONNX 支持在不同的深度学习框架之间交换模型。目前,它支持诸如PyTorch、TensorFlow、MXNet等流行的深度学习框架。
  3. 灵活性: ONNX 支持多种深度学习模型的表示,包括卷积神经网络(CNN)、循环神经网络(RNN)和其他常见的神经网络架构。
  4. 部署: ONNX 不仅仅是一个模型表示格式,还提供了一些工具和库,使得用户能够在不同的硬件和软件环境中有效地部署模型。

一些学习资料:[推理部署]🔥🔥🔥 全网最详细 ONNXRuntime C++/Java/Python 资料!

二、pkl转ONNX+可视化模型

python onnx版本:1.15.0

import joblib
import onnxmltools
from onnxmltools.convert.common.data_types import FloatTensorType
import netron
from sklearn.model_selection import train_test_split  # 如果使用 scikit-learn 0.23 以上版本,请改用 sklearn.model_selection 而不是 sklearn.externals

# 加载.pkl模型
model = joblib.load('LinearRegressor.pkl')

# 定义输入特征的类型和形状
num_features = 1  # 你的特征数量
initial_type = [('float_input', FloatTensorType([None, num_features]))]

# 导出ONNX模型
onnx_model = onnxmltools.convert.convert_sklearn(model, initial_types=initial_type)

# 保存ONNX模型为文件
onnxmltools.utils.save_model(onnx_model, 'do_LinearRegressor.onnx')

# 指定你的 ONNX 模型路径
onnx_model_path = 'do_LinearRegressor.onnx'

# 启动 Netron 服务并在浏览器中打开可视化界面
netron.start(onnx_model_path)

三、ONNX Runtime运行时

3.1 相关介绍(了解此运行时):

想深入了解可以看一下,如果想快速实践可以简单看一下或者跳过

模型部署之 ONNX ONNXRuntime

推理模型部署(一):ONNX runtime 实践

Everything You Want to Know About ONNX
MicroSoft onnx and onnx runtim

3.2 VS、c++部署onnxruntime

c++ onnxruntime版本:1.15.1

网址:Releases · microsoft/onnxruntime · GitHub

下载onnxruntime-win-x64-1.15.1.zip
将压缩包解压得到include与lib文件夹,添加到环境变量中,然后将lib中的dll放入release与debug中

#include <iostream>
#include <assert.h>
#include <onnxruntime_cxx_api.h>
#include <onnxruntime_c_api.h>

int main() {
    const wchar_t* model_path = L"do_LinearRegressor.onnx";

    try {
        Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "ONNX_C_API");

        std::wcout << L"Attempting to load model from: " << model_path << std::endl;

        Ort::SessionOptions session_options;
        Ort::Session session(env, model_path, session_options);
        std::wcout << L"Model loaded successfully." << std::endl;

        Ort::AllocatorWithDefaultOptions allocator;

        // 获取输入节点信息
        size_t num_input_nodes = session.GetInputCount();
        size_t num_output_nodes = session.GetOutputCount();


        // 定义输入和输出节点的名称向量
        std::vector<const char*> input_node_names;
        std::vector<const char*> output_node_names;

        // 获取输入节点信息并填充到向量中
        for (size_t i = 0; i < num_input_nodes; i++) {
            Ort::AllocatedStringPtr in_name = session.GetInputNameAllocated(i, allocator);
            const char* in_name_cstr = in_name.get(); // 获取字符串指针
            std::cout << "Input Name: " << in_name_cstr << std::endl;
            input_node_names.push_back(in_name_cstr);
        }

        // 获取输出节点信息并填充到向量中
        for (size_t i = 0; i < num_output_nodes; i++) {
            Ort::AllocatedStringPtr out_name = session.GetOutputNameAllocated(i, allocator);
            const char* out_name_cstr = out_name.get(); // 获取字符串指针
            std::cout << "Output Name: " << out_name_cstr << std::endl;
            output_node_names.push_back(out_name_cstr);
        }


        // 设置输入数据的维度,这里以单条数据为例
        std::vector<int64_t> input_node_dims = { 1, 1 };
        size_t input_tensor_size = 1 * 1;
        // 构造输入数据
        std::vector<float> input_tensor_values(input_tensor_size);
        for (unsigned int i = 0; i < input_tensor_size; i++)
        {
            input_tensor_values[i] = 30000;
            std::cout << input_tensor_values[i] << std::endl;
        }

        // create input tensor object from data values
        auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
        Ort::Value input_tensor = Ort::Value::CreateTensor<float>(
            memory_info,
            input_tensor_values.data(),
            input_tensor_size,
            input_node_dims.data(),
            input_node_dims.size()
        );
        assert(input_tensor.IsTensor());

        std::vector<Ort::Value> ort_inputs;
        ort_inputs.push_back(std::move(input_tensor));
        // score model & input tensor, get back output tensor
        auto output_tensors = session.Run(
            Ort::RunOptions{ nullptr }, 
            input_node_names.data(), 
            ort_inputs.data(), 
            ort_inputs.size(), 
            output_node_names.data(), 
            1
        );

        // Get pointer to output tensor float values
        float* floatarr = output_tensors[0].GetTensorMutableData<float>();
        std::cout << "推理结果:" << *floatarr << std::endl;
    }
    catch (const Ort::Exception& e) {
        // 处理 Ort::Exception 异常
        std::cerr << "Caught Ort::Exception: " << std::string(e.what()) << std::endl;

        // 在异常描述信息中查找错误代码
        size_t pos = std::string(e.what()).find("ErrorCode: ");
        if (pos != std::string::npos) {
            std::string error_code_str = std::string(e.what()).substr(pos + 12); // 12 是 "ErrorCode: " 的长度
            int error_code = std::stoi(error_code_str);
            std::cerr << "Error Code: " << error_code << std::endl;
        }

        // 可选:进行其他异常处理或返回错误码
        return -1;
    }

    return 0;
}

可以参照这个:VS2019 快速配置Onnxruntime环境_onnxruntime_cxx_api.h_小wu学cv的博客-CSDN博客

c++通过onnxruntime调用sklearn_c++调用sklearn模型_欧拉欧拉木大的博客-CSDN博客

3.3 头文件引用的一些问题

网上有很多头文件就不是

#include <onnxruntime_c_api.h>

这样的而是这样的

#include <onnxruntime/core/providers/providers.h>

所以他下的是一个完整的资源,什么设备环境都有的包括各种docs文档,不是一个针对性的库,比如说x64,win,gpu的版本的库。我们用的时候主要还是要用到3.2中下载的include文件夹中的.h文件,providers.h是一个集合库,包含了很多.h文件的整合文件,并不是核心库。

那他们这些文件都在这里:

onnxruntime c++,c++,sklearn,机器学习,人工智能,python,深度学习

Releases · microsoft/onnxruntime · GitHub

然后我们可以根据官网的说明编译出自己想要的库,自定义性质比较强。一个简单的例子:
onnxruntime (C++/CUDA) 编译安装及部署_initcxxruntime_白色小靴的博客-CSDN博客

四、问题汇总:

1. 类没有成员

换个写法,1.15.1版本好像不这么写了,除非你换回旧版本

onnxruntime c++,c++,sklearn,机器学习,人工智能,python,深度学习

2. 版本兼容问题

c++onnxruntime加载onnx模型的时候发现加载的模型是未知版本,说明这个c++onnxruntime不认识,那么就需要知道生成oonx模型的库版本和推理部署的onnxruntime版本是否兼容

比如我的onnx文件是py生成的onnx版本是1.15.0,那么我的c++中的onnxruntime就需要下载部署1.15.0,如果你的c++中的onnxruntime是1.8.0,运行时onnxruntime不认识太新的onnx文件

onnxruntime c++,c++,sklearn,机器学习,人工智能,python,深度学习

3. 3.“GetInputName“: 不是 “Ort::Session“ 的成员

不要用GetInputName,因为已弃用,指针不安全,改成GetInputNameAllocated

不要用GetOutputName,因为已弃用,指针不安全,改成GetOutputNameAllocated

“GetInputName“: 不是 “Ort::Session“ 的成员-CSDN博客文章来源地址https://www.toymoban.com/news/detail-845614.html

到了这里,关于VS c++ onnxruntime 环境配置、onnx教程、部署推理模型、sklearn pkl模型转onnx、问题汇总的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【模型部署 01】C++实现GoogLeNet在OpenCV DNN、ONNXRuntime、TensorRT、OpenVINO上的推理部署

    深度学习领域常用的基于CPU/GPU的推理方式有OpenCV DNN、ONNXRuntime、TensorRT以及OpenVINO。这几种方式的推理过程可以统一用下图来概述。整体可分为模型初始化部分和推理部分,后者包括步骤2-5。 以GoogLeNet模型为例,测得几种推理方式在推理部分的耗时如下: 结论: GPU加速首选

    2024年02月06日
    浏览(38)
  • TRT4-trt-integrate - 3 使用onnxruntime进行onnx的模型推理过程

    onnx是microsoft开发的一个中间格式,而onnxruntime简称ort是microsoft为onnx开发的推理引擎。 允许使用onnx作为输入进行直接推理得到结果。 建立一个InferenceSession,塞进去的是onnx的路径,实际运算的后端选用的是CPU 也可以选用cuda等等 之后就是预处理 session.run就是运行的inference过程

    2024年02月15日
    浏览(31)
  • 【模型部署 01】C++实现分类模型(以GoogLeNet为例)在OpenCV DNN、ONNXRuntime、TensorRT、OpenVINO上的推理部署

    深度学习领域常用的基于CPU/GPU的推理方式有OpenCV DNN、ONNXRuntime、TensorRT以及OpenVINO。这几种方式的推理过程可以统一用下图来概述。整体可分为模型初始化部分和推理部分,后者包括步骤2-5。 以GoogLeNet模型为例,测得几种推理方式在推理部分的耗时如下: 结论: GPU加速首选

    2024年02月06日
    浏览(42)
  • YOLOv8 人体姿态估计(关键点检测) python推理 && ONNX RUNTIME C++部署

    目录   1、下载权重 ​编辑2、python 推理 3、转ONNX格式 4、ONNX RUNTIME C++ 部署 utils.h utils.cpp detect.h detect.cpp main.cpp CmakeList.txt 我这里之前在做实例分割的时候,项目已经下载到本地,环境也安装好了,只需要下载pose的权重就可以 输出:   用netron查看一下:  如上图所是,YOLO

    2024年02月07日
    浏览(35)
  • ONNX:C++通过onnxruntime使用.onnx模型进行前向计算【下载的onnxruntime是编译好的库文件,可直接使用】

    微软联合Facebook等在2017年搞了个深度学习以及机器学习模型的格式标准–ONNX,旨在将所有模型格式统一为一致,更方便地实现模型部署。现在大多数的深度学习框架都支持ONNX模型转出并提供相应的导出接口。 ONNXRuntime(Open Neural Network Exchange)是微软推出的一款针对ONNX模型格式

    2024年02月15日
    浏览(36)
  • Ubuntu环境下C++使用onnxruntime和Opencv进行YOLOv8模型部署

    目录 环境配置 系统环境 项目文件路径  文件环境  config.txt  CMakeLists.txt type.names  读取config.txt配置文件 修改图片尺寸格式 读取缺陷标志文件 生成缺陷随机颜色标识 模型推理 推理结果获取 缺陷信息还原并显示 总代码 Ubuntu18.04 onnxruntime-linux-x64 1.12.1:https://github.com/microsof

    2024年01月17日
    浏览(33)
  • ONNX格式模型 学习笔记 (onnxRuntime部署)---用java调用yolov8模型来举例

    ONNX(Open Neural Network Exchange)是一个开源项目,旨在建立一个开放的标准,使深度学习模型 可以在不同的软件平台和工具之间轻松移动和重用 。 ONNX模型可以用于各种应用场景,例如机器翻译、图像识别、语音识别、自然语言处理等。 由于ONNX模型的互操作性,开发人员 可以

    2024年01月22日
    浏览(33)
  • 【OnnxRuntime】在linux下编译并安装C++版本的onnx-runtime

    安装CMake:可以通过包管理器(如apt、yum等)安装CMake。 安装C++编译器:确保系统中已安装C++编译器,如GCC或Clang。 克隆ONNX Runtime的GitHub仓库,指定版本是为了适配python3.8: 进入ONNX Runtime的源代码目录: // 首先创建一个conda环境,因为./build.sh实际上调用的是./tools/cl_build/bui

    2024年02月08日
    浏览(30)
  • Yolov7如期而至,奉上ONNXRuntime的推理部署流程(CPU/GPU)

    一、V7效果真的的v587,识别率和速度都有了极大的提升,这里先放最新鲜的github链接: https://github.com/WongKinYiu/yolov7 二、v7的训练我这里就不做过多的赘述了,这里主要是进行讲解怎么把.pt文件转为onnx和后续的推理问题:  2.1首先是pip的版本非常重要,博主亲自测试了,发现

    2024年02月10日
    浏览(31)
  • YOLOv5在C++中通过Onnxruntime在window平台上的cpu与gpu推理

    本项目gitee链接:点击跳转 本项目资源链接:点击跳转 欢迎批评指正。 CPU:i5-9400F GPU:GTX1060 yolov5使用onnxruntime进行c++部署:跳转链接 详细介绍 Yolov5 转 ONNX模型 + 使用 ONNX Runtime 的 C++ 部署(包含官方文档的介绍):跳转链接 yolov5-v6.1-opencv-onnxrun:跳转链接 【推理引擎】从源码看

    2024年02月14日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包