1.1
什么是LabVIEW?
LabVIEW测试测量与自动化行业常用,图形化开发环境,其优点有:
1
图形化开发环境,学习容易入门快
2
自带机器视觉函数库,并提供OpenCV接口库,开发机器视觉与自动化应用程序速度快
使用LabVIEW调用OpenVINO IR模型,可以快速完成深度学习项目开发与交付。
LabVIEW详细介绍参考:
https://www.ni.com/zhcn/shop/labview.html
1.2
准备开发环境
要完成在LabVIEW中调用OpenVINO 模型,需要安装:
1
LabVIEW、Vision Development Module和NIVision OpenCV Utilities
2
Visual Studio 2019 Community;
3
OpenVINO 2021.4.2 LTS
1.2.1
安装LabVIEW
LabVIEW请从下列网址下载安装文件,通过NI Package Manager完成安装。
https://www.ni.com/zh-cn/support/downloads/software-products/download.labview.html#411431
需要注意的是:选择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
从C:Program FilesNational InstrumentsLabVIEW 2021examplesVisionNIVision OpenCV Utilities文件夹中打开任意一个范例程序,若成功运行,证明安装成功,如图1-3所示。
图1-3 安装NIVision OpenCV Utilities成功
1.2.1
安装Visual Studio 2019 Community
和OpenVINO工具套件
从https://visualstudio.microsoft.com/zh-hans/downloads/中下载并安装Visual Studio 2019 Community。
从https://www.intel.cn/content/www/cn/zh/developer/tools/openvino-toolkit/overview.html 中下载并安装OpenVINO工具套件
1.3
准备OpenVINO IR模型
请参考本文的姊妹篇《PPYOLOv2模型从训练到OpenVINO部署-上篇》完成PPYOLOv2模型的部署,《PPYOLOv2模型从训练到OpenVINO部署-下篇》完成将PPYOLOv2飞桨模型转换为OpenVINO IR模型。
读者可以从https://github.com/dlod-openvino/ppyolov2_openvino_samples中下载已转换好的OpenVINO IR模型
1.4
编写OpenVINOAPI的LabVIEWWrapper
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)
cv::resize(blob,blob,cv::Size(input_H,input_W),0,0,cv::INTER_LINEAR);
//图像数据归一化,减均值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);
constpairscale_factor(scale_h,scale_w);
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函数
以上代码可以从代码仓中下载:
https://github.com/dlod-openvino/ppyolov2_openvino_samples
审核编辑 :李倩
-
LabVIEW
+关注
关注
1970文章
3654浏览量
323260 -
自动化
+关注
关注
29文章
5562浏览量
79239 -
模型
+关注
关注
1文章
3226浏览量
48806
原文标题:在LabVIEW中调用OpenVINO™ 模型 | 开发者实战
文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论