使用 C++ 解析 ONNX 模型。使用 C++ 从 onnx 模型中提取层、输入和输出形状

2024-02-17

我正在尝试从 onnx 模型中提取输入层、输出层及其形状等数据。我知道有 python 接口可以做到这一点。我想做类似的事情code https://stackoverflow.com/questions/56734576/find-input-shape-from-onnx-file但在c++中。我还粘贴了链接中的代码。我已经在 python 中尝试过了,它对我有用。我想知道是否有 C++ API 可以做同样的事情。

import onnx

model = onnx.load(r"model.onnx")

# The model is represented as a protobuf structure and it can be accessed
# using the standard python-for-protobuf methods

# iterate through inputs of the graph
for input in model.graph.input:
    print (input.name, end=": ")
    # get type of input tensor
    tensor_type = input.type.tensor_type
    # check if it has a shape:
    if (tensor_type.HasField("shape")):
        # iterate through dimensions of the shape:
        for d in tensor_type.shape.dim:
            # the dimension may have a definite (integer) value or a symbolic identifier or neither:
            if (d.HasField("dim_value")):
                print (d.dim_value, end=", ")  # known dimension
            elif (d.HasField("dim_param")):
                print (d.dim_param, end=", ")  # unknown dimension with symbolic name
            else:
                print ("?", end=", ")  # unknown dimension with no name
    else:
        print ("unknown rank", end="")
    print()

我也是c++新手,请帮助我。


ONNX 格式本质上是protobuf https://developers.google.com/protocol-buffers,因此可以用协议编译器支持的任何语言打开。

如果是 C++

  1. 获取 onnx 原型文件(onnx 仓库 https://github.com/onnx/onnx/blob/master/onnx/onnx.proto3)
  2. 编译它protoc --cpp_out=. onnx.proto3命令。它将生成onnx.proto3.pb.cc and onnx.proto3.pb.h files
  3. 链接protobuf库(可能是protobuf-lite),生成的cpp文件和以下代码:
#include <fstream>
#include <cassert>

#include "onnx.proto3.pb.h"

void print_dim(const ::onnx::TensorShapeProto_Dimension &dim)
{
  switch (dim.value_case())
  {
  case onnx::TensorShapeProto_Dimension::ValueCase::kDimParam:
    std::cout << dim.dim_param();
    break;
  case onnx::TensorShapeProto_Dimension::ValueCase::kDimValue:
    std::cout << dim.dim_value();
    break;
  default:
    assert(false && "should never happen");
  }
}

void print_io_info(const ::google::protobuf::RepeatedPtrField< ::onnx::ValueInfoProto > &info)
{
  for (auto input_data: info)
  {
    auto shape = input_data.type().tensor_type().shape();
    std::cout << "  " << input_data.name() << ":";
    std::cout << "[";
    if (shape.dim_size() != 0)
    {
      int size = shape.dim_size();
      for (int i = 0; i < size - 1; ++i)
      {
        print_dim(shape.dim(i));
        std::cout << ", ";
      }
      print_dim(shape.dim(size - 1));
    }
    std::cout << "]\n";
  }
}

int main(int argc, char **argv)
{
  std::ifstream input("mobilenet.onnx", std::ios::ate | std::ios::binary); // open file and move current position in file to the end

  std::streamsize size = input.tellg(); // get current position in file
  input.seekg(0, std::ios::beg); // move to start of file

  std::vector<char> buffer(size);
  input.read(buffer.data(), size); // read raw data

  onnx::ModelProto model;
  model.ParseFromArray(buffer.data(), size); // parse protobuf

  auto graph = model.graph();

  std::cout << "graph inputs:\n";
  print_io_info(graph.input());

  std::cout << "graph outputs:\n";
  print_io_info(graph.output());
  return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C++ 解析 ONNX 模型。使用 C++ 从 onnx 模型中提取层、输入和输出形状 的相关文章

  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • jquery DomWindow 用于网页上的所有链接

    是否可以实现本页的示例3 http swip codylindley com DOMWindowDemo html http swip codylindley com DOMWindowDemo html适用于网页上的所有链接 不仅仅是带有
  • 如何使用回调机制?

    我必须实施一项信用卡申请 其中我必须只处理一个信用卡帐户 类似的操作credit debit pinChange 但对我来说问题是我必须使用 JAVA CALLBACK 机制在两种情况下通知用户 引脚更改时 当余额低于 5000 时 如何使
  • SaveFileDialog 阻止可移动驱动器

    我使用 SaveFileDialog 让用户在可移动驱动器上选择目录和文件名 然后我创建该文件 写入该文件 然后再次关闭它 到那时 文件本身尚未锁定 可编辑 可删除 但我无法弹出驱动器 因为 Windows 声称它仍在使用中 我必须先退出应
  • java中System.gc()和finalize()方法有什么区别?

    我对 java 的 system gc 和 Finalize 方法感到困惑 我们不能强制将垃圾对象收集到 JVM 我们可以在java代码中编写这两种方法 那么如果它们都用于垃圾收集 那么java提供两种垃圾收集方法有什么意义呢 请告诉我这两
  • Sublime Text - 修改 tmTheme 文件

    In the tmTheme file
  • 为什么不使用 django-admin startapp mysite 生成 urls.py?

    但必须由用户创建 project settings py mysite views py apps py models py user created urls py file 应用程序不需要有 url 视图或任何东西 它也可以只是模板的集
  • 何时删除 Git 中的分支?

    假设我们有一个稳定的应用程序 明天 有人报告了一个大错误 我们决定立即修复 因此 我们为 master 的修补程序创建了一个分支 将其命名为 2011 Hotfix 并将其向上推送 以便所有开发人员都可以协作修复它 我们修复了该错误 并将
  • UpSetR 按颜色集分组

    我盯着这个问题看了几个小时 似乎没有找到解决方案 我希望 upSet 图按集合着色 例如 library UpSetR movies lt read csv system file extdata movies csv package Up
  • 谱系图数据库[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人可以向我指出谱系图数据库的有效使用吗 我想学习 neo4j 并且使用 python 所以我想为自己制
  • Flutter - InkWell 对 Flex 内的 onTap 没有反应

    我想弄清楚 为什么onTap 我的 InkWell 内部的方法不起作用 InkWell 小部件位于Flexible小部件 这Flexible小部件也在里面 ARow 这是我的代码 TextEditingController controll
  • 对于小 x、大 y 值,有效的 HashCode() 是什么?

    我使用 HashMap 将 x y 值映射到笛卡尔平面上 对于非常小的 x 和非常大的 y 值 有效的 HashCode 是什么 目前我正在使用 public int hashCode return y 31 x Typical x y v
  • 计算 .Net BitArray 类中设置的位

    我正在实现一个库 其中广泛使用 Net BitArray 类 并且需要与 Java BitSet Cardinality 方法等效的方法 即返回设置的位数的方法 我正在考虑将其实现为 BitArray 类的扩展方法 简单的实现是迭代和计算位
  • Matlab 匿名函数 If else

    在 MATLAB 中 我尝试对元胞数组执行一个函数 但运气不佳 我想创建一个cellfun它检查是否str2double回报NaN值 然后执行str2double关于不存在的值NaNs 我试图使用一个匿名函数 其中包含 IF Else 类型
  • 在短语中搜索单词并返回匹配项

    我需要建立一个公式 如果在X列中 有B列的值 无论位置 则返回A的值 Column A Amoxicilina Azitromicina Cetoconazol Column B Amoxicilina Esomeprazol Clarit
  • 计算二维数组(矩阵)每列的总计

    给定下面的数组 如何创建具有匹配键的求和数组 arr alpha 1 2 3 4 5 beta 1 2 3 4 5 gamma 1 2 3 4 5 delta 1 2 3 4 5 这就是我最终想要的 4 8 12 16 20 这是最有效的方
  • CSS 类选择器

    我想选择一个divclass c id i c color red border 1px font size 25px background color yellow width 200px div class c change div 现
  • 如何为每个成员选择最新的输入?

    假设我有一个 MySQL 表 time mid field 1 field 2 100 1 32 54 100 2 0 34 100 3 44 99 200 1 0 45 200 2 0 45 200 3 4 59 200 4 45
  • Intellij idea 堆大小无法更改

    有一天 我运行一些巨大的东西 弹出一个窗口说堆内存内存不足 我在该窗口中将其设置为 2014M 然后单击继续 一切都很好 但我不喜欢数字 2014 我想要 2048 所以 我更改了 Xmx 选项idea64 exe vmoptions 如下
  • Facebook Graph API - 通过一次查询访问评论及其回复

    以下 Facebook Graph API v2 6 查询 POST ID fields comments summary true access token ACCESS TOKEN 将获取指定帖子的评论 及其 ID 然后查询 COMME
  • 使用 C++ 解析 ONNX 模型。使用 C++ 从 onnx 模型中提取层、输入和输出形状

    我正在尝试从 onnx 模型中提取输入层 输出层及其形状等数据 我知道有 python 接口可以做到这一点 我想做类似的事情code https stackoverflow com questions 56734576 find input