[2024_08_12日志]ONNX Runtime的使用

news2024/9/23 23:27:47

问题:Segmentation 错误。在 C++ API 上使用自定义 onnx 模型运行。模型在 Python 上按预期工作,但在 C++ API 上运行相同的模型时,会收到一个分段错误

python的模型代码如下:

class Facenet(nn.Module):
    def __init__(self, backbone="mobilenet", dropout_keep_prob=0.5, embedding_size=128, num_classes=None, pretrained=False):
        super(Facenet, self).__init__()
        if backbone == "mobilenet":
            self.backbone = mobilenet(pretrained)
            flat_shape = 1024
        elif backbone == "inception_resnetv1":
            self.backbone = inception_resnet(pretrained)
            flat_shape = 1792
        else:
            raise ValueError('Unsupported backbone - `{}`, Use mobilenet, inception_resnetv1.'.format(backbone))
        # 自适应平均池化层 参数(1, 1)表示输出的目标尺寸为1x1
        self.avg = nn.AdaptiveAvgPool2d((1, 1))
        # 正则化技术,用于减少深度神经网络中的过拟合问题,以一定的概率(通常在0.5到0.8之间)随机选择一些隐藏层神经元,并将其输出置为零
        self.Dropout = nn.Dropout(1 - dropout_keep_prob)  # 仅在训练时有用,防止模型的过拟合
        # 全连接层作为模型的Bottleneck层 (flat_shape该层的输入维度大小、embedding_size该层的输出维度大小、bias是否使用偏置项)
        # 将输入的特征向量从flat_shape维度变换为embedding_size维度的向量
        self.Bottleneck = nn.Linear(flat_shape, embedding_size, bias=False)
        # 进行标准化处理。使得每一层网络的输入分布保持相同的均值和方差,从而加速网络收敛并提高模型泛化能力
        self.last_bn = nn.BatchNorm1d(embedding_size, eps=0.001, momentum=0.1, affine=True)

    def forward(self, x, mode="predict"):
        x = self.backbone(x)
        x = self.avg(x)
        # reshape,将其变为一个二维张量,其中第一维大小为原始张量的batch_size,第二维大小为剩余维度的乘积
        x = x.view(x.size(0), -1)
        x = self.Dropout(x)
        x = self.Bottleneck(x)
        x = self.last_bn(x)
        x = F.normalize(x, p=2, dim=1)  # l2标准化
        return x

    def forward_feature(self, x):
        x = self.backbone(x)
        x = self.avg(x)
        x = x.view(x.size(0), -1)
        x = self.Dropout(x)
        x = self.Bottleneck(x)
        before_normalize = self.last_bn(x)
        x = F.normalize(before_normalize, p=2, dim=1)
        return before_normalize, x

    def forward_classifier(self, x):
        x = self.classifier(x)
        return x

导出onnx文件后,计划使用ONNX Runtime C++ API进行模型的部署、推理

部分代码如下:

#include <iostream>
#include <vector>
#include <onnxruntime/core/session/onnxruntime_cxx_api.h>
using namespace std;
using namespace Ort;


namespace imageHandle
{
    class ImageHandler
    {
    public:
        ImageHandler():
            _memoryInfo(MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault))
        {
            Env env(ORT_LOGGING_LEVEL_ERROR, "ONNXRuntime")
            
            // 创建 ONNX Runtime 会话选项
            SessionOptions sessionOptions;
            sessionOptions.SetIntraOpNumThreads(2);  // 设置内部操作的线程数
            sessionOptions.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);  // 设置图优化级别

            // 加载 ONNX 模型
            const string modelPath = "/home/bjy/FaceRecSysOnnx/HandleServer/models/inception_resnerv1/inception_resnerv1.onnx";
            _session = new Session(env, modelPath.c_str(), sessionOptions);


            //...
        }
    };
}

出现类似下面的段错误(gdb调试core文件可见)

 onnxruntime::logging::LoggingManager::Log(std::string const&, onnxruntime::logging::Capture const&) const (in /home/palermo/Programing_Workspace/TeseMestrado/na_high_evel/src/extra/onnxruntime/lib/libonnxruntime.so.1.5.2)

Segmentation Fault on session.Run() with custom model on c++ API · Issue #5630 · microsoft/onnxruntime · GitHubicon-default.png?t=N7T8https://github.com/microsoft/onnxruntime/issues/5630

误以为env的作用仅仅是注册会话,导致编写时将其仅仅作为一个构造函数中的局部变量,实际上需维护到不再进行推理(参考上面的issue可知)

修改后代码:

#include <iostream>
#include <vector>
#include <onnxruntime/core/session/onnxruntime_cxx_api.h>
using namespace std;
using namespace Ort;


namespace imageHandle
{
    class ImageHandler
    {
    public:
        ImageHandler():
            _env(Env(ORT_LOGGING_LEVEL_ERROR, "ONNXRuntime")),// 初始化 ONNX Runtime 环境
            _memoryInfo(MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault))
        {
            // 创建 ONNX Runtime 会话选项
            SessionOptions sessionOptions;
            sessionOptions.SetIntraOpNumThreads(2);  // 设置内部操作的线程数
            sessionOptions.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED);  // 设置图优化级别

            // 加载 ONNX 模型
            const string modelPath = "/home/bjy/FaceRecSysOnnx/HandleServer/models/inception_resnerv1/inception_resnerv1.onnx";
            _session = new Session(_env, modelPath.c_str(), sessionOptions);

            //...
        }
    };
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lvs详解及实例配置

目录 1.什么是负载均衡 1.1为什么用负载均衡 1.2.负载均衡类型 1.2.1.四层负载均衡 1.2.2.七层负载均衡 1.3 四层和七层的区别 2.LVS介绍 2.1LVS 的优势与不足 2.2LVS 核心组件和专业术语 3.ipvsadm命令 4.LVS集群中的增删改 4.1.管理集群服务中的增删改 4.2.管理集…

C:每日一题:单身狗

​​​​ 一、题目&#xff1a; 在一个整型数组中&#xff0c;只有一个数字出现一次&#xff0c;其他数组都是成对出现的&#xff0c;请找出那个只出现一次的数字。 整型数组 int arr[ ] {1,1,2,2,3,4,4} 二、思路分析&#xff1a; 1.&#xff0c;明确目标&#xff0c;选择…

【linux】nvidia AGX orin 多方法开机自启 .sh 文件

背景&#xff1a; 安装搜狗输入法时候&#xff0c;发现etc/xdg/autostart路径下写desktop文件的方式&#xff0c;于是把所有方案整理一下 为了让 .sh 文件在用户登录时自动执行&#xff0c;可以采用如下多种方法。 1. 使用 .desktop 文件 创建一个 .desktop 文件&#xff0c;将…

链表的奇偶节点重新排列及空指针问题分析【链表、空指针】

在处理链表问题时&#xff0c;重组链表节点是一种常见需求。本文将详细探讨如何在链表中将奇数索引节点放在偶数索引节点之前&#xff0c;并深入分析实现过程中的空指针问题及其解决方案。 1. 问题描述 给定一个单链表&#xff0c;要求将链表中的节点按照奇数索引节点在前、偶…

掌握 PyTorch 张量乘法:八个关键函数与应用场景对比解析

PyTorch提供了几种张量乘法的方法&#xff0c;每种方法都是不同的&#xff0c;并且有不同的应用。我们来详细介绍每个方法&#xff0c;并且详细解释这些函数有什么区别&#xff1a; 1、torch.matmul torch.matmul 是 PyTorch 中用于矩阵乘法的函数。它能够处理各种不同维度的张…

HTML零基础自学笔记(下)篇一 -8.8

HTML零基础自学笔记&#xff08;下&#xff09;---之表格标签详解 参考&#xff1a;pink老师篇一、表格标签是什么&#xff1f;基础内容&#xff08;主要作用、基本语法、标签释义、属性&#xff09;主要作用基本语法标签释义表格结构标签属性 合并单元格代码练习代码运行效果&…

IDEA 报错,无效的源发行版 无效的目标发行版:22

报错内容&#xff1a; 在编译项目的时候出现报错&#xff1a; 解决办法&#xff1a; 无效的源发行版 原因&#xff1a;编译的JDK版本与发布版本不一致 File -> Project Structure ->Project Settings 让其中的三处版本保持一致&#xff0c;具体操作如下&#xff1a; …

Vue3+Element-plus+setup使用vuemap/vue-amap实现高德地图API相关操作

首先要下载依赖并且引入 npm安装 // 安装核心库 npm install vuemap/vue-amap --save// 安装loca库 npm install vuemap/vue-amap-loca --save// 安装扩展库 npm install vuemap/vue-amap-extra --save cdn <script src"https://cdn.jsdelivr.net/npm/vuemap/vue-a…

linux反向代理原理:帮助用户更好地优化网络架构

Linux反向代理原理详解 反向代理是一种在网络架构中常用的技术&#xff0c;尤其在Linux环境下被广泛应用。它可以帮助实现负载均衡、安全防护和请求缓存等功能。本文将深入探讨Linux反向代理的原理、工作机制以及其应用场景。 1. 什么是反向代理 反向代理是指代理服务器接收客…

HarmonyOS Developer之图片帧动画播放器

创建image-animator组件 在pages/index目录下的hml文件中创建一个image-animator组件&#xff0c;css文件中编写组件样式&#xff0c;js文件中引用图片。 设置image-animator组件属性 添加iteration&#xff08;播放次数&#xff09;、reverse&#xff08;播放顺序&#xf…

SSM宠物商城-计算机毕业设计源码23666

摘 要 近年来&#xff0c;社会的发展和进步以及人们生活水平的提高&#xff0c;人们饲养宠物的习惯也越来越重视。很多家庭都把宠物视为家庭的重要成员。宠物不仅能给自己作伴&#xff0c;而且在生活中能充当自己精神的支柱&#xff0c;缓解压力、放松心态的伙伴。宠物不同于一…

Koa商城项目-轮播图模块(前端)

前言 通过这次独自做前后端发现有很多需要提升的地方&#xff0c;很多细节处理不到位。下面简单看一下本人自己做的效果吧~~ Git地址 https://gitee.com/ah-ah-bao/koa_system 效果图 前端代码 api/banner.ts import request from "../utils/request";export con…

Mapreduce_wordcount自定义单词计数

自定义的wordcount 数据处理过程 加载jar包 查看后面的pom文件 以上为需要的jar包路径&#xff0c;将其导入至idea中 Map package com.hadoop;import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; im…

计算机毕业设计选题推荐-宠物管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【彻底关闭win10 or 11系统自动更新】

直接上干货 win10或者win11自动更新后系统有bug&#xff0c;太闹心了&#xff0c;是时候选择一个稳定版本彻底关闭更新了 第一步&#xff1a; 在win11左下方搜索框输入&#xff1a;powershell&#xff0c; 选择「Windows PowerShell (管理员)」 第二步&#xff1a; 在 Wind…

FreeSWITCH

1概述 FreeSWITCH https://signalwire.com/freeswitch是一个开源的电话交换平台。官方给它的定义是–世界上第一个跨平台的、伸缩性极好的、免费的、多协议的电话软交换平台。由这个定义我们可以得出以下几点: FreeSWITCH是跨平台的。它能原生地运行于Windows、MaxOSX、Linux、…

智启万象 | Web 开发智能升级、简单易用

AI 的融入使 Web 的功能更加强大 同时也更加简单易用 一起回顾 2024 Google 开发者大会 了解 Web 开发 UI 功能和 OS 集成的最新创新 以及如何通过这些创新来打造卓越的应用体验 Web 不断的革新与发展&#xff0c;不仅为全球数十亿用户提供了丰富多样的在线体验&#xff0c;也为…

HCIP | 重发布实验

要求&#xff1a; 1.如图搭建网络拓扑&#xff0c;所有路由器各自创建一个环回接口&#xff0c;合理规划IP地址 2.R1-R2-R3-R4-R6之间使用OSPF协议&#xff0c;R4-R5-R6之间使用RIP协议 3.R1环回重发布方式引入OSPF网络 4.R4/R6上进行双点双向重发布 5.分析网络中出现路由…

人工智能在肿瘤亚型分类领域的研究进展|顶刊速递·24-08-13

小罗碎碎念 文献日推主题&#xff1a;人工智能在肿瘤亚型分类领域的研究进展 昨天晚上在研究鼻咽癌的病理学诊断指南&#xff0c;看到了下面这段话的时候&#xff0c;我问了自己一个问题——通过AI识别出肿瘤亚型的根本目的是什么&#xff1f;可以衔接哪些具体的下游任务&#…

「栈」实现LIFO栈(先进后出栈|堆栈|stack)的功能 / 手撕数据结构(C++)

概述 栈&#xff0c;是一种基本的数据结构&#xff0c;也是一种数据适配器。它在底层上以链表方法或动态数组方法实现。 队列的显著特点是他的添加元素与删除元素操作&#xff1a;先加入的元素总是被先弹出。 一个队列应该应该是这样的&#xff1a; --------------STACK----…