【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 环境配置:CSharp算子SDK开发环境配置方法3.1.2 算子封装:使用C封装算子SDK的方法3.1.3 异常中断:算子SDK软件运行报错“托管调试助手”中断的解决方法3.1.4 深度学习:GPU运行深度学习算子引发StackOverFlow异常的方法 …...
Java核心书籍1
1.《Java核心技术》是一本深入浅出的Java编程指南,适合初学者和有一定Java编程基础的读者。这本书的主要作者是Cay S. Horstmann和Gary Cornell,他们都是Java领域的知名专家。这本书的最新版本是第10版,其中涵盖了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 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。 数值类型 MySQL 支持所有标准 SQL 数值数据类型。 这些类型包括严格数值数据类型(INTEGER、S…...
【C++ Primer(第5版) 课后习题题目及答案 第一章】
C Primer5th 课后习题答案 第一章 1.1:查阅你使用的编译器的文档,确定它所使用的文件命名约定。编译并运行main程序。1.2:改写程序,让它返回-1。返回值-1通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系…...
【英语】100个句子记完7000个托福单词
其实主要的7000词其实是在主题归纳里面,不过过一遍100个句子也挺好的,反正也不多。 文章目录 Sentence 01Sentence 02Sentence 03Sentence 04Sentence 05Sentence 06Sentence 07Sentence 08Sentence 09Sentence 10Sentence 11Sentence 12Sentence 13Sent…...
六、CANdelaStudio入门-通信参数编辑
本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的通信参数编辑,欢迎各位朋友订阅、评论,…...
【致敬未来的攻城狮计划】— 连续打卡第十三天:FSP固件库开发启动文件详解
系列文章目录 1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下 2.开发环境的选择和调试(从零开始,加油) 3.欲速则不达,今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…...
Java中mybatis是否支持延迟加载?延迟加载的原理是什么?
是的,MyBatis支持延迟加载。延迟加载是指在查询对象时,只加载其基本属性,而将关联对象的数据暂不加载,等到真正需要使用关联对象时再去查询加载其数据的一种技术。 MyBatis通过在映射文件中配置lazyLoadingEnabled属性来开启延迟加…...
真题详解(磁盘)-软件设计(五十八)
真题详解(MTTR)-软件设计(五十七)https://blog.csdn.net/ke1ying/article/details/130354940 1、2021年上半年 解析: 哈希地址 0 1 2 3 4 5 6 7 8 9 10 构建哈希表 第一步:3%11 3 ,放在哈希地址3的位置…...
MATLAB连续时间信号的实现和时域基本运算(八)
1、实验目的: 1)熟悉常用连续时间信号的实现方法; 2)掌握连续时间信号的时域基本运算; 3)掌握实现基本函数及其运算的函数的使用方法; 4)加深对信号基本运算的理解。 2、实验内容&am…...
MongoDB 聚合管道中使用字符串表达式运算符
字符串表达式运算符主要用于实现字符串操作,主要包括了大小写转换、字符串截取、拼接、替换等 一、准备工作 初始化字符串数据 db.strings.insertMany([{ "_id": "1", "comment": " Abc" },{ "_id": "2&…...
用Python分析周杰伦歌曲并进行数据可视化
大家好,今天我们用python分析下周杰伦歌曲。为了尽量完整地呈现从原始数据到可视化的过程,接下来我们会先简单讲解数据的预处理过程,即如何将 JSON 数据转化为Excel 格式,以及如何对周杰伦的歌曲进行分词。 本案例中的歌词数据来…...
培训技能 GET
技巧 调整语速和语调:讲解者需要注意语速和语调的调整,以便让听众更好地理解和接受内容。 使用案例和实例:讲解者可以使用案例和实例来帮助听众更好地理解和记忆内容,同时也可以增强听众的兴趣和参与度。 互动式讲解:…...
数据库安全性案例分享
1 概述1.1 适用范围 本规范明确了Oracle数据库安全配置方面的基本要求。 1.2 符号和缩略语 缩写 英文描述 中文描述 DBA Database Administrator 数据库管理员 VPD Virtual Private Database 虚拟专用数据库 OLS Oracle Label Security Oracle标签…...
2023,你了解Kafka吗?深入详解
- 消息队列的核心价值 - 解耦合。 异步处理 例如电商平台,秒杀活动。一般流程会分为:1: 风险控制、2:库存锁定、3:生成订单、4:短信通知、5:更新数据。 通过消息系统将秒杀活动业务拆分开&#x…...
奇舞周刊第 491 期 初探 Web 客户端追踪技术
记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 初探 Web 客户端追踪技术 浏览器的追踪技术是一把双刃剑,它建立了用户个人信息和网站之间的连接,合理地使用能够大大提高用户的体验,但是同时也…...
【Java】什么是SOA架构?与微服务有什么关系?
文章目录 服务化架构微服务架构 我的一个微服务项目,有兴趣可以一起做 服务化架构 我们知道,早期的项目,我们都是把前后端的代码放在同一个项目中,然后直接打包运行这个项目,这种项目我们称之为单体项目,比…...
【中间件】kafka
目录 一、概述二、生产者1. 发送原理2. 生产者分区 Partition分区好处分区策略 3. 生产者如何提高吞吐量4. 数据可靠性ACK应答级别数据不丢失:ACK ISR数据不重复:幂等性数据有序 三、broker1. 工作流程2. 副本相关3. 底层存储4. 高效读写数据 四、消费者…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
