当前位置: 首页 > news >正文

【VM服务管家】VM4.x算子SDK开发_3.1 环境配置类

目录

  • 3.1.1 环境配置:CSharp算子SDK开发环境配置方法
  • 3.1.2 算子封装:使用C++封装算子SDK的方法
  • 3.1.3 异常中断:算子SDK软件运行报错“托管调试助手”中断的解决方法
  • 3.1.4 深度学习:GPU运行深度学习算子引发StackOverFlow异常的方法

3.1.1 环境配置:CSharp算子SDK开发环境配置方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:WinForm下的算子SDK开发环境配置方法
解答
WinForm下进行算子SDK开发的环境配置分为三步
第一步,使用VS新建一个窗体类项目
第二步,为该项目添加算子的dll引用,将该路径C:\Program Files (x86)\MVDAlgorithmSDK\ReferencedAssemblies\Algorithms下的所有dll文件添加到项目中,将该路径C:\Program Files (x86)\MVDAlgorithmSDK\ReferencedAssemblies
Common下的引用除了第一个和第二个其他全部引用都加到项目中,第一个和第二个不能添加,否则引用会报错。
第三步,此时,我们会在工具箱内看到一些封装好的控件,将这些控件拉到窗体上生成并启动即可。注意,所有的控件都在C:\Program Files (x86)\MVDAlgorithmSDK
\ReferencedAssemblies\Control文件夹下的,只有一个控件在Common文件夹下,这个控件叫MvRenderActiveX.Net.dll,是一个图形处理的渲染控件,大家需要单独将这个控件添加到工具箱中。
第一步
在这里插入图片描述

第二步
在这里插入图片描述
在这里插入图片描述

第三步
在这里插入图片描述

问题原因
缺少引用或者缺少控件

3.1.2 算子封装:使用C++封装算子SDK的方法

描述
环境:MVDAlgrithm SDK 3.4及以上 + VS2013及以上
问题:有的用户在使用算子SDK开发时,为了使各个算法模块更加的统一和抽象,将不同的算子工具抽象出共同的接口,例如:
初始化-Initialize,
加载配置-LoadConfiguration,
训练模型-Trian,
加载模型-LoadModel,
执行算法-Run。
解答
我们的算子SDK已经是封装程度比较高的了,算子工具的程序调用是完全面向对象的,通过操作对象的方法和属性就能实现特定的算法流程,可能有些客户需要对算子做进一步的抽象,将算子工具的内部属性的赋值,参数的保存与加载,模型的加载与保存,结果的获取都抽象为共同的几个接口函数,如上描述的那样。使用C++是很容易做到的,使用虚函数将上面提到的提到的几个接口抽象,然后在具体的类中实现接口即可。我们用代码来说明,如下:

C++
class IVisionTool
{
public:IVisionTool() = default;virtual ~IVisionTool() = default;//使用参数文件初始化配置virtual int Initilize(std::string& paramFilePath = "") = 0;//导入数据,数据可以是训练好的模型文件、标定文件、参数配置文件等等virtual int ImportData(int &fileType,const std::string &inputPath) = 0;//导出数据,数据可以是训练的模型文件、标定文件、参数配置文件等等virtual int ExportData(int &fileType,const std::string &inputPath) = 0;//训练模型virtual int Train(IMVdImage& image,IMvdShape* roi,IMvdShape* mask) = 0;//执行算法工具
virtual int Run(IMVdImage &image,IMvdShape* roi,IMvdShape* mask[],int maskCount) = 0;
//获取算法工具运行结果virtual int GetResult(AlgToolResult &result) = 0;
};

接着,我们通过具体的算法工具类,实现一个特定的算法工具,以直线查找工具为例,我们可以设计一个LineFindTool继承IVisionTool, 代码如下:

C++
class FindLineTool:public IVisionTool
{
public:FindLineTool();~FindLineTool();int Initilize(const std::string& paramFilePath = "") override;int ImportData(const int &fileType,const std::string &inputPath) override;int ExportData(const int &fileType,const std::string &inputPath) override;int Train(const IMVdImage& image,IMvdShape* roi,IMvdShape* mask) override;int Run(const IMVdImage &image,IMvdShape* roi,IMvdShape* mask[],int maskCount) override;int GetResult(AlgToolResult &result) override;
private:ILineFindTool* pLineFindTool;
};

这里篇幅所限,就不将FindLineTool的所有接口全部实现罗列在这里了,这里将重要的构造函数,析构函数,Initialize和Run方法实现罗列出来,代码如下:

C++
//构造函数
FindLineTool::FindLineTool()
{try{int nRet = CreateLineFindToolInstance(&pLineFindTool);if (nRet != 0){throw std::exception("Create FindLineTool instance failed");}}catch (IMVDException& ex){throw std::exception(ex);}}
//析构函数
FindLineTool::~FindLineTool()
{if (pLineFindTool != nullptr){DestroyLineFindToolInstance(pLineFindTool);}
}
//初始化
int FindLineTool::Initilize(const std::string& paramFilePath = "")
{//加载参数文件unsigned char* paramBuffer = new unsigned char[1024 * 100];try{FILE* pFile;errno_t err = fopen_s(&pFile, inputPath.c_str(), "rb");fseek(pFile, 0, SEEK_END);long bytes = ftell(pFile);fseek(pFile, 0, SEEK_SET);fread(paramBuffer, 1, bytes, pFile);pLineFindTool->LoadConfiguration(paramBuffer, bytes);fclose(pFile);delete[] paramBuffer;paramBuffer = nullptr;return 0;}catch (IMVDException&ex){if (paramBuffer != nullptr)delete[] paramBuffer;return ex.GetErrorCode();}
}
//运行一次
int Run(const IMVdImage &image, IMvdShape* roi, IMvdShape* mask[], int maskCount)
{try{//1.设置输入图像pLineFindTool->SetInputImage(image);//2.设置ROIpLineFindTool->SetROI(roi);//3.设置屏蔽区//设置屏蔽区之前先移除vMaskShapes所有元素pLineFindTool->ClearMasks();for (int i = 0; i < maskCount; i++){pLineFindTool->AddMask(mask[i]);}//4.运行算子pLineFindTool->Run();return 0;}catch (IMVDException&ex){return ex.GetErrorCode();}
}

需要注意的地方:算子SDK大部分输入都是指针,因此一定要记得释放指针占用的内存,否则会内存泄漏,上面的例子中,指针的释放放在了调用层,由调用者负责释放,因此调用的时候,记得在调用结束后释放作为函数参数传入的IMvdImage*,IMvdShape*等指针所占用的内存,需要显式调用DestroyImageInstance,DestroyShapeInstance等API函数。
问题根因
不了解C++ 中虚函数的用法
不熟悉算子SDK的常用接口函数

3.1.3 异常中断:算子SDK软件运行报错“托管调试助手”中断的解决方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:运行算子SDK 软件Demo时,Visual Studio软件出现“托管调试助手”中断。
解答
运行算子SDK 软件Demo时,Visual Studio软件出现“托管调试助手”中断,如下图所示。
在这里插入图片描述

解决办法:打开异常设置,取消勾选【ContextSwitchDeadlock】和【DisconnectedContext】。
在这里插入图片描述

问题根因
不熟悉Visual Studio软件的异常设置。

3.1.4 深度学习:GPU运行深度学习算子引发StackOverFlow异常的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:深度学习算子运行报StackOverFlow异常,如何解决?
在这里插入图片描述

解答
第一步,深度学习算子需要在×64平台下运行,检查平台是否为×64,win32则需改为x64;
第二步,第一步修改后仍然报StackOvreFlow异常,则需调大堆栈提交大小;
在这里插入图片描述

问题根因
不熟悉内存环境配置。

相关文章:

【VM服务管家】VM4.x算子SDK开发_3.1 环境配置类

目录 3.1.1 环境配置&#xff1a;CSharp算子SDK开发环境配置方法3.1.2 算子封装&#xff1a;使用C封装算子SDK的方法3.1.3 异常中断&#xff1a;算子SDK软件运行报错“托管调试助手”中断的解决方法3.1.4 深度学习&#xff1a;GPU运行深度学习算子引发StackOverFlow异常的方法 …...

Java核心书籍1

1.《Java核心技术》是一本深入浅出的Java编程指南&#xff0c;适合初学者和有一定Java编程基础的读者。这本书的主要作者是Cay S. Horstmann和Gary Cornell&#xff0c;他们都是Java领域的知名专家。这本书的最新版本是第10版&#xff0c;其中涵盖了Java SE 9、10和11的新特性&…...

crontab详细用法 定时任务

使用crontab可以在指定时间执行一个shell脚本或者一系列Linux命令 crontab的使用方法 方法1.使用crontab命令 例如添加一个新的或者编辑已有的,使用: crontab -e就可以进入配置文件.此时配置crontab的执行者是当前登入用户,如果当前有用户是root,需要为其他用户配置,可以使用…...

基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局

查看原文>>>基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局 目录 第一章、生态安全评价理论及方法介绍 第二章、平台基础 第三章、数据获取与清洗 第四章、基于USLE模型的土壤侵蚀评价 第五章、基于风蚀修正模型的防风固…...

开心档之MySQL 创建数据类型

MySQL 数据类型 MySQL 中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL 支持多种类型&#xff0c;大致可以分为三类&#xff1a;数值、日期/时间和字符串(字符)类型。 数值类型 MySQL 支持所有标准 SQL 数值数据类型。 这些类型包括严格数值数据类型(INTEGER、S…...

【C++ Primer(第5版) 课后习题题目及答案 第一章】

C Primer5th 课后习题答案 第一章 1.1&#xff1a;查阅你使用的编译器的文档&#xff0c;确定它所使用的文件命名约定。编译并运行main程序。1.2&#xff1a;改写程序&#xff0c;让它返回-1。返回值-1通常被当作程序错误的标识。重新编译并运行你的程序&#xff0c;观察你的系…...

【英语】100个句子记完7000个托福单词

其实主要的7000词其实是在主题归纳里面&#xff0c;不过过一遍100个句子也挺好的&#xff0c;反正也不多。 文章目录 Sentence 01Sentence 02Sentence 03Sentence 04Sentence 05Sentence 06Sentence 07Sentence 08Sentence 09Sentence 10Sentence 11Sentence 12Sentence 13Sent…...

六、CANdelaStudio入门-通信参数编辑

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的通信参数编辑,欢迎各位朋友订阅、评论,…...

【致敬未来的攻城狮计划】— 连续打卡第十三天:FSP固件库开发启动文件详解

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…...

Java中mybatis是否支持延迟加载?延迟加载的原理是什么?

是的&#xff0c;MyBatis支持延迟加载。延迟加载是指在查询对象时&#xff0c;只加载其基本属性&#xff0c;而将关联对象的数据暂不加载&#xff0c;等到真正需要使用关联对象时再去查询加载其数据的一种技术。 MyBatis通过在映射文件中配置lazyLoadingEnabled属性来开启延迟加…...

真题详解(磁盘)-软件设计(五十八)

真题详解&#xff08;MTTR&#xff09;-软件设计&#xff08;五十七)https://blog.csdn.net/ke1ying/article/details/130354940 1、2021年上半年 解析&#xff1a; 哈希地址 0 1 2 3 4 5 6 7 8 9 10 构建哈希表 第一步&#xff1a;3%11 3 &#xff0c;放在哈希地址3的位置…...

MATLAB连续时间信号的实现和时域基本运算(八)

1、实验目的&#xff1a; 1&#xff09;熟悉常用连续时间信号的实现方法&#xff1b; 2&#xff09;掌握连续时间信号的时域基本运算&#xff1b; 3&#xff09;掌握实现基本函数及其运算的函数的使用方法&#xff1b; 4&#xff09;加深对信号基本运算的理解。 2、实验内容&am…...

MongoDB 聚合管道中使用字符串表达式运算符

字符串表达式运算符主要用于实现字符串操作&#xff0c;主要包括了大小写转换、字符串截取、拼接、替换等 一、准备工作 初始化字符串数据 db.strings.insertMany([{ "_id": "1", "comment": " Abc" },{ "_id": "2&…...

用Python分析周杰伦歌曲并进行数据可视化

大家好&#xff0c;今天我们用python分析下周杰伦歌曲。为了尽量完整地呈现从原始数据到可视化的过程&#xff0c;接下来我们会先简单讲解数据的预处理过程&#xff0c;即如何将 JSON 数据转化为Excel 格式&#xff0c;以及如何对周杰伦的歌曲进行分词。 本案例中的歌词数据来…...

培训技能 GET

技巧 调整语速和语调&#xff1a;讲解者需要注意语速和语调的调整&#xff0c;以便让听众更好地理解和接受内容。 使用案例和实例&#xff1a;讲解者可以使用案例和实例来帮助听众更好地理解和记忆内容&#xff0c;同时也可以增强听众的兴趣和参与度。 互动式讲解&#xff1a…...

数据库安全性案例分享

1 概述1.1 适用范围 本规范明确了Oracle数据库安全配置方面的基本要求。 1.2 符号和缩略语 缩写 英文描述 中文描述 DBA Database Administrator 数据库管理员 VPD Virtual Private Database 虚拟专用数据库 OLS Oracle Label Security Oracle标签…...

2023,你了解Kafka吗?深入详解

- 消息队列的核心价值 - 解耦合。 异步处理 例如电商平台&#xff0c;秒杀活动。一般流程会分为&#xff1a;1: 风险控制、2&#xff1a;库存锁定、3&#xff1a;生成订单、4&#xff1a;短信通知、5&#xff1a;更新数据。 通过消息系统将秒杀活动业务拆分开&#x…...

奇舞周刊第 491 期 初探 Web 客户端追踪技术

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 初探 Web 客户端追踪技术 浏览器的追踪技术是一把双刃剑&#xff0c;它建立了用户个人信息和网站之间的连接&#xff0c;合理地使用能够大大提高用户的体验&#xff0c;但是同时也…...

【Java】什么是SOA架构?与微服务有什么关系?

文章目录 服务化架构微服务架构 我的一个微服务项目&#xff0c;有兴趣可以一起做 服务化架构 我们知道&#xff0c;早期的项目&#xff0c;我们都是把前后端的代码放在同一个项目中&#xff0c;然后直接打包运行这个项目&#xff0c;这种项目我们称之为单体项目&#xff0c;比…...

【中间件】kafka

目录 一、概述二、生产者1. 发送原理2. 生产者分区 Partition分区好处分区策略 3. 生产者如何提高吞吐量4. 数据可靠性ACK应答级别数据不丢失&#xff1a;ACK ISR数据不重复&#xff1a;幂等性数据有序 三、broker1. 工作流程2. 副本相关3. 底层存储4. 高效读写数据 四、消费者…...

Html5版音乐游戏制作及分享(H5音乐游戏)

这里实现了Html5版的音乐游戏的核心玩法。 游戏的制作借鉴了&#xff0c;很多经典的音乐游戏玩法&#xff0c;通过简单的代码将音乐的节奏与操作相结合。 可以通过手机进行游戏&#xff0c;准确点击下落时的目标&#xff0c;进行得分。 点击试玩 游戏内的下落数据是通过手打记…...

Python基于Pytorch Transformer实现对iris鸢尾花的分类预测,分别使用CPU和GPU训练

1、鸢尾花数据iris.csv iris数据集是机器学习中一个经典的数据集&#xff0c;由英国统计学家Ronald Fisher在1936年收集整理而成。该数据集包含了3种不同品种的鸢尾花&#xff08;Iris Setosa&#xff0c;Iris Versicolour&#xff0c;Iris Virginica&#xff09;各50个样本&am…...

【运动规划算法项目实战】如何实现简单的状态机

文章目录 简介一、状态机1.1 简介1.2 原理介绍1.3 使用方法二、行为树2.1 简介2.2 原理介绍2.3 使用方法三、如何实现一个简单的状态机四、其他的决策模型简介四、总结简介 在机器人算法中,状态机和行为树是常用的两种设计模式。它们能够帮助机器人在复杂的环境中更好地执行任…...

JavaScript实现用while语句计算1+n的和的代码

以下为用while语句计算1n的和实现结果的代码和运行截图 目录 前言 一、实现用while语句计算1n的和 1.1运行流程及思想 1.2代码段 1.3 JavaScript语句代码 1.4运行截图 【附加】用while计算110的和 1.1代码段 1.3 运行截图 前言 1.若有选择&#xff0c;您可以在目录里…...

Three.js教程:顶点索引复用顶点数据

推荐&#xff1a;将 NSDT场景编辑器 加入你3D工具链 其他工具系列&#xff1a; NSDT简石数字孪生 顶点索引复用顶点数据 通过几何体BufferGeometry的顶点索引属性BufferGeometry.index可以设置几何体顶点索引数据&#xff0c;如果你有WebGL基础很容易理解顶点索引的概念&#…...

机器学习中的数学——学习曲线如何区别欠拟合与过拟合

通过这篇博客&#xff0c;你将清晰的明白什么是如何区别欠拟合与过拟合。这个专栏名为白话机器学习中数学学习笔记&#xff0c;主要是用来分享一下我在 机器学习中的学习笔记及一些感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎私信或者评论区留言&…...

【Java】类和对象,封装

目录 1.类和对象的定义 2.关键字new 3.this引用 4.对象的构造及初始化 5.封装 //包的概念 //如何访问 6.static成员 7.代码块 8.对象的打印 1.类和对象的定义 对象&#xff1a;Java中一切皆对象。 类&#xff1a;一般情况下一个Java文件一个类&#xff0c;每一个类…...

Python小姿势 - 知识点:

知识点&#xff1a; Python的字符串格式化 标题&#xff1a; Python字符串格式化实例解析 顺便介绍一下我的另一篇专栏&#xff0c; 《100天精通Python - 快速入门到黑科技》专栏&#xff0c;是由 CSDN 内容合伙人丨全站排名 Top 4 的硬核博主 不吃西红柿 倾力打造。 基础知识…...

【Python】【进阶篇】9、Django路由系统精讲

目录 Django路由系统精讲1. Django 路由系统应用1&#xff09;配置第一个URL实现页面访问2&#xff09;正则与正则分组使用3&#xff09;正则捕获组使用 2. path()与re_path() Django路由系统精讲 在《URL是什么》一节中&#xff0c;我们对 URL 有了基本的认识&#xff0c;在本…...

在Linux操作系统上部署wgcloud监控

1.wgcloud监控介绍 1.1 介绍 ​ 这是一款开源的主机监控系统&#xff0c;可以支持主机各种指标监测&#xff08;cpu使用率&#xff0c;cpu温度&#xff0c;内存使用率&#xff0c;磁盘容量空间&#xff0c;磁盘IO&#xff0c;硬盘SMART健康状态&#xff0c;系统负载&#xff…...