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

【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.设置ROI
        pLineFindTool->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异常,则需调大堆栈提交大小;
在这里插入图片描述

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


http://www.kler.cn/a/15456.html

相关文章:

  • nuget 管理全局包、缓存和临时文件夹
  • 深度学习神经网络创新点方向
  • 机器学习-37-对ML的思考之机器学习发展的三个阶段和驱动AI发展三驾马车的由来
  • 酒店行业数据仓库
  • 代码随想录第46期 单调栈
  • 15-1.Java 网络编程之 InetAddress(InetAddress 常用静态方法、InetAddress 常用方法)
  • ChatGPT探索系列之五:讨论人工智能伦理问题及ChatGPT的责任
  • Docker consul的容器集群的部署|consul-template部署
  • 【论文阅读】轻量化网络MobileNet-V1
  • IDEA弹出`Lombok requires enabled annotation processing`错误信息
  • Codeforces Round 867 (Div. 3)
  • Mysql 存储过程 / 存储函数
  • 博弈论又称对策论的入门及在军事博弈问题上的简单实战
  • conda命令
  • 【MySQL】数据表的增删查改
  • ChatGPT技术原理 第六章:对话生成技术
  • 【VQ-VAE代码实战】Neural Discrete Representation Learning
  • Kafka3.0.0版本——生产者数据有序与乱序
  • 在linux下搭建clash服务
  • 学生成绩管理系统 002
  • Java阶段二Day07
  • Java版企业电子招投标系统源码 Spring Cloud+Spring Boot 电子招标采购系统功能清单
  • 什么是FAQ页面?如何设计一个优秀的FAQ页面?
  • 【unity项目实战】3DRPG游戏开发06——敌人和攻击
  • 教你一招 | 亚马逊如何做好自有品牌?
  • FPGA基于XDMA实现PCIE X8视频采集HDMI输出 提供工程源码和QT上位机程序和技术支持