ONNX 运行时报错 ORT_RUNTIME_EXCEPTION Ort::Exception 未经处理的异常

2023-11-15

1.运行报错

前段时候推理时遇到一个非常奇怪的bug,ONNX模型在运行时会报ORT_RUNTIME_EXCEPTION的异常:

2.错误排查

继续运行,断点看到是在Session.Run()的时候报错。

断点逐语句跟踪没有更多详情的信息,重新看了好几遍代码后都没有看出任何问题。于是去看其他能正常推理的代码, 参数和流程都一致,不知道哪里导致的问题。

只能推断Session对象是全局变量,类的构造函数中初始化后,在其它地方调用Session.Run()方法引起。

// <summary>
/// ONNX模型的初始化。
/// </summary>
/// <param name="modelFile">模型文件的绝对路径,可空,如果为空则从当前目录查找,默认文件名是model.onnx。</param>
/// <param name="threadNum">启用线程数</param>
ONNXDetect::ONNXDetect(std::string modelName, int threadNum) {

	string modelPathStr;
	if (!FindModel(modelName, modelPathStr))
		throw exception("未找到模型文件");
	 
	初始化环境 
	Ort::SessionOptions sessionOptions;
	sessionOptions.SetIntraOpNumThreads(threadNum);
	启用所有可能的优化。
	sessionOptions.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL);
	 
	env=Ort::Env(ORT_LOGGING_LEVEL_ERROR, "test");

	//string 转 wchart_t;
	wchar_t* wc = new wchar_t[modelPathStr.size()];
	//wc指向的内存区域存储这wchar_t类型的 string。
	swprintf(wc, modelPathStr.size() + 1, L"%S", modelPathStr.c_str()); //注意大写

	session = new Ort::Session(env, wc, sessionOptions);

}



    ///运行推理
  vector<Value> ONNXDetect::Detect(Mat src)
{
	//预处理。
	PreProcessRBC(src, inputData);
	 
	array<int64_t, 4> input_shape{ 1, 3, inputHeight, inputWidth };
	MemoryInfo allocator_info = MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeCPU);
	Value input = Value::CreateTensor<float>(allocator_info, inputData.data(),
		inputData.size(), input_shape.data(), input_shape.size());

	vector<Value> output = session->Run(RunOptions{ nullptr }, inputNames, &input,
		inputBatch, outputNames, outputBatch);

	return output;
}

花了点时间终于逐步对比排查发现是初始化Session的变量Env对象的问题:

不知为何,如果env设置为局部变量,Session对象为全局变量,env初始化Session就会异常

3.解决方法

 方法1:Env对象的的初始化在这里是局部变量,需要把这个对象设置为全局变量

方法2:不把这个对象设置为全局变量,只在头文件.h中定义一个空的Env对象,也能正常运行。

希望对遇到相同问题的人有帮助。

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

ONNX 运行时报错 ORT_RUNTIME_EXCEPTION Ort::Exception 未经处理的异常 的相关文章

随机推荐

  • spring注解及扩展

    1 spring配置注解 spring建议通过注解配置 替代原xml配置方式 使用配置类替代xml配置的优势大体 1 xml配置维护容易出错而且不易检查 java配置类基于java语法检查 对于java程序员更友好 易于维护 2 注解配置
  • NISEDIT如何发布,Qt如何发布文章?难道还有人不会(超详细教学,跟着走,不会你怪我)

    一 自动发布 直接运行即可 不过多阐述 二 手动发布 文件清单 ExamSys exe account txt exam txt Qt5Core dll Qt5Gui dll Qt5Widgets dll libstdc 6 dll lib
  • LeetCode中函数题中“多出来的参数“---returnsize

    转载 关于returnSize 第一次在leetcode上瞎逛就遇到了就遇到了它 int twoSum int nums int numsSize int target int returnSize 1 这个代码的实现并不是什么难解的方法
  • JVM 由哪些部分组成?

    JVM 由哪些部分组成 解析 这是对 JVM 体系结构的考察 答 JVM 的结构基本上由 4 部分组成 类加载器 在 JVM 启动时或者类运行时将需要的 class 加载到 JVM 中 执行引擎 执行引擎的任务是负责执行 class 文件中
  • Zynq7000硬件开发之芯片供电电源功耗(电流)评估

    案头语 单板硬件的主控芯片集成度越来越高 多核处理器越来越多 一块单板可能只需要1块芯片就能满足整体需求 一方面减少设计复杂度 另一面节省PCB面积成本 能同时掌握硬件原理设计以及PCB Layout设计逐渐成为主流 本系列文章同时包含有两
  • ES6详解 快速上手!

    一 Es6 1 1 ES6的概述 ECMAScript的快速发展 编程语言JavaScript是ECMAScript的实现和扩展 ECMAScript是由ECMA 一个类似W3C的标准组织 参与进行标准化的语法规范 ECMAScript定义
  • 【python量化】用python搭建一个股票舆情分析系统

    写在前面 下面的这篇文章将手把手教大家搭建一个简单的股票舆情分析系统 其中将先通过金融界网站爬取指定股票在一段时间的新闻 然后通过百度情感分析接口 用于评估指定股票的正面和反面新闻的占比 以此确定该股票是处于利好还是利空的状态 1 环境准备
  • C++(Liunx) 使用cut截 取出Ubuntu用户的家目录,要求:不能使用“:“作为分割.

    使用cut截 取出Ubuntu用户的家目录 要求 不能使用 作为分割
  • 43.MQ—RabbitMQ

    目录 一 MQ RabbitMQ 1 同步调用与异步调用 1 1 同步调用 1 2 异步调用 2 MQ之间的区别 3 RabbitMQ学习 3 1 docker下载rabbitmq容器 并启动 3 2 RabbitMQ中的几个概念 3 3
  • Python遥感开发之分段读取和保存遥感数据

    Python遥感开发之分段读取和保存遥感数据 1 分段读取数据 2 实现分批读取数据以及进行计算 3 实现分批保存成TIF文件 所有完整代码 4 分段TIF整合到一个TIF 5 生成一个空白TIF 每个像元值为0的TIF 前言 当遇到批量读
  • Supervisord进程管理工具的安装使用

    先来介绍 supervisord Supervisor 是一个进程监控程序 满足的需求是 我现在有一个进程需要每时每刻不断的跑 但是这个进程又有可能由于各种原因有可能中断 当进程中断的时候我希望能自动重新启动它 此时 我就需要使用到了 Su
  • dataloader的使用

    dataloader 构建可迭代的数据装载器 我们在训练的时候 每一个for循环 每一次iteration 就是从DataLoader中获取一个batch size大小的数据的 dataloader官网 torch utils data P
  • 【MySQL基础】常用函数

    文章目录 单行函数 字符函数 LENGTH CONCAT UPPER LOWER SUBSTR SUBSTRING INSTR TRIM LPAD RPAD REPLACE 数学函数 ABS ROUND CEIL FLOOR TRUNCAT
  • [每日两题系列]刷算法题咯~~

    今日题目 卡片 直线 本系列所选题目均来自力扣或者牛客网站 所选题目主要是以其中的简单题为主 中等题为辅 包含少数困难题 原因是 本人目前能力还不够 开展这个系列的目的是督促自己 在暑假的时间里也要保持有一定的刷题量 拒绝摆烂 话不多说 直
  • python矩阵教程_numpy教程:矩阵matrix及其运算

    numpy矩阵简介 NumPy函数库中存在两种不同的数据类型 矩阵matrix和数组array 都可以用于处理行列表示的数字元素 虽然它们看起来很相似 但是在这两个数据类型上执行相同的数学运算可能得到不同的结果 其中NumPy函数库中的ma
  • 插入MySQL数据库前去除重复数据的几种方法

    在数据存储过程中 可能会遇到数据主键重复的情况 我们可以通过下面几个方法进行处理 1 若数据不存在插入 存在更新 2 使用duplicate key关键字 如插入数据时发生主键冲突就更新数据 3 使用Ingore关键字 4 使用replac
  • BoxFit(缩放模式、自适应模式)

    类似于Android原生的ImageView ScaleType 以下是Flutter提供的Box缩放类型 fill Box被完全填充 相当于ScaleType的FIT XY contain 保持Box的纵横比至至少有一边填充满父控件 相当
  • 单例模式 -- 懒汉模式&饿汉模式

    目录 一 单例模式是什么 二 饿汉模式 三 懒汉模式 一 单例模式是什么 单例模式是一种设计模式 用于将类的实例化限制为一个对象 它确保一个类只有一个实例 并提供了该实例的全局访问点 这种模式被广泛用于创建对象的唯一实例 例如数据库连接和日
  • LCD(五)Backlight背光子系统

    一 Backlight背光子系统概述 LCD的背光原理主要是由核心板的一根引脚控制背光电源 一根PWM引脚控制背光亮度组成 应用程序可以通过改变PWM的频率达到改变背光亮度的目的 Backlight背光子系统构建过程结构关系图 黑色加粗部分
  • ONNX 运行时报错 ORT_RUNTIME_EXCEPTION Ort::Exception 未经处理的异常

    1 运行报错 前段时候推理时遇到一个非常奇怪的bug ONNX模型在运行时会报ORT RUNTIME EXCEPTION的异常 2 错误排查 继续运行 断点看到是在Session Run 的时候报错 断点逐语句跟踪没有更多详情的信息 重新看