在LabVIEW中调用OpenVINO™ 模型

网友投稿 346 2022-11-28

在LabVIEW中调用OpenVINO™ 模型

1.1

LabVIEW测试测量与自动化行业常用,图形化开发环境,其优点有:

1

图形化开发环境,学习容易入门快

2

LabVIEW详细介绍参考:

1.2

准备开发环境

要完成在LabVIEW中调用OpenVINO 模型,需要安装:

1

2

Visual Studio 2019 Community;

3

OpenVINO 2021.4.2 LTS

1.2.1

安装LabVIEW

需要注意的是:选择LabVIEW 64位版本,并同时安装Vision Development模块,安装完毕后至少保证如图1-1所示的打钩模块都已安装。

图1-1 安装LabVIEW和Vision Development模块

“以管理员身份运行”JKI VI Package Manager,搜索并安装NIVision OpenCV Utilities,如图1-2所示。

图1-2 安装NIVision OpenCV Utilities

图1-3 安装NIVision OpenCV Utilities成功

1.2.1

安装Visual Studio 2019 Community

和OpenVINO工具套件

1.3

准备OpenVINO IR模型

请参考本文的姊妹篇《PPYOLOv2模型从训练到OpenVINO部署-上篇》完成PPYOLOv2模型的部署,《PPYOLOv2模型从训练到OpenVINO部署-下篇》完成将PPYOLOv2飞桨模型转换为OpenVINO IR模型。

1.4

1.4.1

定义存储InferenceEngine的结构体

定义存储Inference Engine的结构体如代码清单1-1所示,方便创建和删除。

代码清单1-1 Inference Engine结构体

//定义结构体,存储与InferenceEngine相关的变量

typedefstructlv_infer_engine{

Coreie;//ie对象

ExecutableNetworkexec_net;

InferRequestinfer_request;

}InferEngineStruct;

1.4.2

创建ppyolov2_init函数

创建ppyolov2_init函数,主要是创建指向InferEngine的指针,并反回给LabVIEW。

代码清单1-2 ppyolov2_init函数

//创建指向InferEngine的指针,并反馈给LabVIEW

EXTERN_CNI_EXPORTvoid*ppyolov2_init(char*model_xml_file,char*device_name,NIErrorHandleerrorHandle){

InferEngineStruct*p=newInferEngineStruct();

p->exec_net=p->ie.LoadNetwork(model_xml_file,device_name);

p->infer_request=p->exec_net.CreateInferRequest();

return(void*)p;

}

1.4.3

创建ppyolov2_predict函数

创建ppyolov2_predict函数,用于执行ppyolov2模型预测功能。

代码清单1-3 ppyolov2函数

EXTERN_CvoidNI_EXPORTppyolov2_predict(NIImageHandlesourceHandle,void*pInferEngine,char*bbox_name,char*bbox_num_name,float*detections,NIErrorHandleerrorHandle){

NIERRORerror=NI_ERR_SUCCESS;

ReturnOnPreviousError(errorHandle);

try{

NIImagesource(sourceHandle);

MatsourceMat;

InferEngineStruct*p=(InferEngineStruct*)pInferEngine;

//从NIImage对象中浅拷贝图像数据到

Mat对象

ThrowNIError(source.ImageToMat(sourceMat));

autotype=source.type;

Blob::Ptrimage_blob=p->infer_request.GetBlob("image");

autoinput_H=image_blob->getTensorDesc().getDims()[2];

autoinput_W=image_blob->getTensorDesc().getDims()[3];

//交换RB通道

cv::Matblob;

cv::cvtColor(sourceMat,blob,cv::COLOR_BGRA2RGB);

//放缩图片到(input_H,input_W)

//图像数据归一化,减均值mean,除以方差std

//PaddleDetection模型使用imagenet数据集的Mean=[0.485,0.456,0.406]和std=[0.229,0.224,0.225]

vectormean_values{0.485*255,0.456*255,0.406*255};

vectorstd_values{0.229*255,0.224*255,0.225*255};

vectorrgbChannels(3);

split(blob,rgbChannels);

for(autoi=0;i< rgbChannels.size(); i++)

{

rgbChannels[i].convertTo(rgbChannels[i],CV_32FC1,1.0/std_values[i],(0.0-mean_values[i])/std_values[i]);

}

merge(rgbChannels,blob);

fillBlobImage(image_blob,blob);

constfloatscale_h=float(input_H)/float(sourceMat.rows);

constfloatscale_w=float(input_W)/float(sourceMat.cols);

autoscale_factor_blob=p->infer_request.GetBlob("scale_factor");

fillBlobImInfo(scale_factor_blob,scale_factor);

constpairim_shape(input_H,input_W);

autoim_shape_blob=p->infer_request.GetBlob("im_shape");

fillBlobImInfo(im_shape_blob,im_shape);

p->infer_request.Infer();

constfloat*infer_results=p->infer_request.GetBlob(bbox_name)->buffer().as();

constint*bbox_nums=p->infer_request.GetBlob(bbox_num_name)->buffer().as();

autobbox_num=bbox_nums[0];

for(inti=0;i< bbox_num; i++) {

detections[i*6+0]=infer_results[i*6+0];

detections[i*6+1]=infer_results[i*6+1];

detections[i*6+2]=infer_results[i*6+2];

detections[i*6+3]=infer_results[i*6+3];

detections[i*6+4]=infer_results[i*6+4];

detections[i*6+5]=infer_results[i*6+5];

}

}

catch(NIERROR_err){

error=_err;

}

catch(...){

error=NI_ERR_OCV_USER;

}

ProcessNIError(error,errorHandle);

}

1.4.4

创建ppyolov2_delete函数

创建ppyolov2_delete函数,用于释放ppyolov2_init创建的内存。

代码清单1-4 ppyolov2_delete函数

EXTERN_CvoidNI_EXPORTppyolov2_delete(void*pInferEngine,NIErrorHandleerrorHandle){

NIERRORerror=NI_ERR_SUCCESS;

ReturnOnPreviousError(errorHandle);

InferEngineStruct*p=(InferEngineStruct*)pInferEngine;

deletep;

}

1.4.5

LabVIEW 中调用三个函数

在Visual Studio中将三个函数编译为dll,并在LabVIEW中调用,参考范例lv_opencv_demo.vi,运行结果如下所示。

图1-4 LabVIEW中调用三个API函数

以上代码可以从代码仓中下载:

审核编辑 :李倩

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Qt 有多少人折腾-qt for s60终于安装成功
下一篇:Localhost与数据库连接
相关文章

 发表评论

暂时没有评论,来抢沙发吧~