使用 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 模型中提取层、输入和输出形状 的相关文章

随机推荐

  • 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