c语言sscanf函数的用法是什么
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~