【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. 高效读写数据 四、消费者…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
