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
编写openvino api 的labview wrapper
1.4.1
定义存储inference engine的结构体
定义存储inference engine的结构体如代码清单1-1所示,方便创建和删除。
代码清单1-1 inference engine结构体
//定义结构体,存储与inference engine相关的变量
typedef struct lv_infer_engine {
core ie; //ie对象
executablenetwork exec_net;
inferrequest infer_request;
} inferenginestruct;
1.4.2
创建ppyolov2_init函数
创建ppyolov2_init函数,主要是创建指向inferengine的指针,并反回给labview。
代码清单1-2 ppyolov2_init函数
// 创建指向inferengine的指针,并反馈给labview
extern_c ni_export void* ppyolov2_init(char* model_xml_file, char* device_name, nierrorhandle errorhandle) {
inferenginestruct* p = new inferenginestruct();
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_c void ni_export ppyolov2_predict(niimagehandle sourcehandle, void* pinferengine, char* bbox_name, char* bbox_num_name, float* detections, nierrorhandle errorhandle) {
nierror error = ni_err_success;
returnonpreviouserror(errorhandle);
try {
niimage source(sourcehandle);
mat sourcemat;
inferenginestruct* p = (inferenginestruct*)pinferengine;
//从niimage对象中浅拷贝图像数据到
mat对象
thrownierror(source.imagetomat(sourcemat));
auto type = source.type;
blob::ptr image_blob = p->infer_request.getblob(image);
auto input_h = image_blob->gettensordesc().getdims()[2];
auto input_w = image_blob->gettensordesc().getdims()[3];
// 交换rb通道
cv::mat blob;
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]
vector mean_values{ 0.485 * 255, 0.456 * 255, 0.406 * 255 };
vector std_values{ 0.229 * 255, 0.224 * 255, 0.225 * 255 };
vector rgbchannels(3);
split(blob, rgbchannels);
for (auto i = 0; i infer_request.getblob(scale_factor);
fillblobiminfo(scale_factor_blob, scale_factor);
const pair im_shape(input_h, input_w);
auto im_shape_blob = p->infer_request.getblob(im_shape);
fillblobiminfo(im_shape_blob, im_shape);
p->infer_request.infer();
const float* infer_results = p->infer_request.getblob(bbox_name)->buffer().as();
const int* bbox_nums = p->infer_request.getblob(bbox_num_name)->buffer().as();
auto bbox_num = bbox_nums[0];
for (int i = 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_c void ni_export ppyolov2_delete(void* pinferengine, nierrorhandle errorhandle) {
nierror error = ni_err_success;
returnonpreviouserror(errorhandle);
inferenginestruct* p = (inferenginestruct*)pinferengine;
delete p;
}
1.4.5
labview 中调用三个函数
在visual studio中将三个函数编译为dll,并在labview中调用,参考范例lv_opencv_demo.vi,运行结果如下所示。
图1-4 labview中调用三个api函数
以上代码可以从代码仓中下载:
https://github.com/dlod-openvino/ppyolov2_openvino_samples
新兴拦截武器系统技术介绍
2021 OPPO开发者大会时间地点
丽清桃园观音新厂预估明年5月起大批量产 大陆LED头灯透率获快速提升
如何利用振荡电路频率调制实现室温长波红外探测与成像?
低配荣耀8来袭 舍弃双摄或将售价1499
在LabVIEW中调用OpenVINO™ 模型
Linux开发_文件目录操作介绍、创建BMP图片
简单上云第一步的华为云服务器,助力中小企业提升业务
百度Apollo2.5全球首发:比亚迪成第100位合作伙伴,进一步提升自动驾驶安全性
龙芯3A5000高端控制器亮相第13届中国国际机器人高峰论坛
人工智能带来发展新范式 成为突破边界的关键
AI大模型加持!人形机器人、四足机器狗显身
以换代修政策:iPad 4坏了没关系,直接给你换一台新的iPad Air2
炭黑含量测试仪:测定材料中炭黑含量的关键仪器
PCB走线过孔影响电流承载能力因素分析
电缆故障测试仪FB18的应用广泛,作用非常之大
LoRa模块LoRa1280通讯距离测试
无线通信究竟如何传得更远?
自己动手制作路由器2.4G定向天线
雅克科技称明年是半导体材料技术迭代的关键时间点