1.1
什么是LabVIEW?
LabVIEW測(cè)試測(cè)量與自動(dòng)化行業(yè)常用,圖形化開(kāi)發(fā)環(huán)境,其優(yōu)點(diǎn)有:
1
圖形化開(kāi)發(fā)環(huán)境,學(xué)習(xí)容易入門快
2
自帶機(jī)器視覺(jué)函數(shù)庫(kù),并提供OpenCV接口庫(kù),開(kāi)發(fā)機(jī)器視覺(jué)與自動(dòng)化應(yīng)用程序速度快
使用LabVIEW調(diào)用OpenVINO IR模型,可以快速完成深度學(xué)習(xí)項(xiàng)目開(kāi)發(fā)與交付。
LabVIEW詳細(xì)介紹參考:
https://www.ni.com/zhcn/shop/labview.html
1.2
準(zhǔn)備開(kāi)發(fā)環(huán)境
要完成在LabVIEW中調(diào)用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請(qǐng)從下列網(wǎng)址下載安裝文件,通過(guò)NI Package Manager完成安裝。
https://www.ni.com/zh-cn/support/downloads/software-products/download.labview.html#411431
需要注意的是:選擇LabVIEW 64位版本,并同時(shí)安裝Vision Development模塊,安裝完畢后至少保證如圖1-1所示的打鉤模塊都已安裝。
圖1-1 安裝LabVIEW和Vision Development模塊
“以管理員身份運(yùn)行”JKI VI Package Manager,搜索并安裝NIVision OpenCV Utilities,如圖1-2所示。
圖1-2 安裝NIVision OpenCV Utilities
從C:Program FilesNational InstrumentsLabVIEW 2021examplesVisionNIVision OpenCV Utilities文件夾中打開(kāi)任意一個(gè)范例程序,若成功運(yùn)行,證明安裝成功,如圖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
準(zhǔn)備OpenVINO IR模型
請(qǐng)參考本文的姊妹篇《PPYOLOv2模型從訓(xùn)練到OpenVINO部署-上篇》完成PPYOLOv2模型的部署,《PPYOLOv2模型從訓(xùn)練到OpenVINO部署-下篇》完成將PPYOLOv2飛槳模型轉(zhuǎn)換為OpenVINO IR模型。
讀者可以從https://github.com/dlod-openvino/ppyolov2_openvino_samples中下載已轉(zhuǎn)換好的OpenVINO IR模型
1.4
編寫OpenVINOAPI的LabVIEWWrapper
1.4.1
定義存儲(chǔ)InferenceEngine的結(jié)構(gòu)體
定義存儲(chǔ)Inference Engine的結(jié)構(gòu)體如代碼清單1-1所示,方便創(chuàng)建和刪除。
代碼清單1-1 Inference Engine結(jié)構(gòu)體
//定義結(jié)構(gòu)體,存儲(chǔ)與InferenceEngine相關(guān)的變量
typedefstructlv_infer_engine{
Coreie;//ie對(duì)象
ExecutableNetworkexec_net;
InferRequestinfer_request;
}InferEngineStruct;
1.4.2
創(chuàng)建ppyolov2_init函數(shù)
創(chuàng)建ppyolov2_init函數(shù),主要是創(chuàng)建指向InferEngine的指針,并反回給LabVIEW。
代碼清單1-2 ppyolov2_init函數(shù)
//創(chuàng)建指向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
創(chuàng)建ppyolov2_predict函數(shù)
創(chuàng)建ppyolov2_predict函數(shù),用于執(zhí)行ppyolov2模型預(yù)測(cè)功能。
代碼清單1-3 ppyolov2函數(shù)
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對(duì)象中淺拷貝圖像數(shù)據(jù)到
Mat對(duì)象
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);
//圖像數(shù)據(jù)歸一化,減均值mean,除以方差std
//PaddleDetection模型使用imagenet數(shù)據(jù)集的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[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
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
創(chuàng)建ppyolov2_delete函數(shù)
創(chuàng)建ppyolov2_delete函數(shù),用于釋放ppyolov2_init創(chuàng)建的內(nèi)存。
代碼清單1-4 ppyolov2_delete函數(shù)
EXTERN_CvoidNI_EXPORTppyolov2_delete(void*pInferEngine,NIErrorHandleerrorHandle){
NIERRORerror=NI_ERR_SUCCESS;
ReturnOnPreviousError(errorHandle);
InferEngineStruct*p=(InferEngineStruct*)pInferEngine;
deletep;
}
1.4.5
LabVIEW 中調(diào)用三個(gè)函數(shù)
在Visual Studio中將三個(gè)函數(shù)編譯為dll,并在LabVIEW中調(diào)用,參考范例lv_opencv_demo.vi,運(yùn)行結(jié)果如下所示。
圖1-4 LabVIEW中調(diào)用三個(gè)API函數(shù)
以上代碼可以從代碼倉(cāng)中下載:
https://github.com/dlod-openvino/ppyolov2_openvino_samples
審核編輯 :李倩
-
LabVIEW
+關(guān)注
關(guān)注
1970文章
3654瀏覽量
323282 -
自動(dòng)化
+關(guān)注
關(guān)注
29文章
5562瀏覽量
79239 -
模型
+關(guān)注
關(guān)注
1文章
3226瀏覽量
48806
原文標(biāo)題:在LabVIEW中調(diào)用OpenVINO? 模型 | 開(kāi)發(fā)者實(shí)戰(zhàn)
文章出處:【微信號(hào):英特爾物聯(lián)網(wǎng),微信公眾號(hào):英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論