基于OpenVINO 2023在LabVIEW中部署YOLOv8目标检测模型

作者:英特尔物联网行业创新大使 王立奇
1.1 什么是LabVIEW
LabVIEW是测试测量与自动化行业常用的图形化开发环境,其优点有:
l 学习容易入门快,开发计算机视觉应用程序简单方便
l 自带机器视觉函数库(Vision Development模块),并提供支持GigE、USB3 Vision等标准总线的第三方相机的图像采集驱动程序(NI-IMAQdx),和OpenCV接口工具包(NIVision OpenCV Utilities),完全满足AI机器视觉应用程序的开发要求。
LabVIEW详细介绍,请参考:https://www.ni.com/zh-cn/shop/labview.html。
使用LabVIEW调用OpenVINO IR模型,可以快速完成深度学习项目开发与交付。
1.2 准备开发环境
要完成在LabVIEW中调用OpenVINO格式的YOLOv8模型,需要安装:
1. LabVIEW、Vision Development模块和NI-IMAQdx
2. OpenVINO 2023.0
3. Visual Studio 2022 Community
4. Ultralytics YOLOv8
1.2.1 安装LabVIEW
LabVIEW请从https://www.ni.com/zh-cn/support/downloads/software-products/download.labview.html,下载LabVIEW安装文件。需要注意的是:请选择LabVIEW 64位版本,并勾选Vision Development模块和NI-IMAQdx。
1.2.2 安装OpenVINO
OpenVINO分为OpenVINO™ 运行库(OpenVINO™ Runtime)和OpenVINO™开发工具集(OpenVINO™ Development Tools)。
l OpenVINO™运行库:一个提供C/C++/Python API的C++函数库。
l OpenVINO™开发工具集:一套包含模型优化器(Model Optimizer)、基准测试工具(Benchmark Tool)、训练后优化工具(Post-Training Optimization Tool)、模型下载器(Model Downloader)等工具的开发工具集。
请先用命令:pip install openvino-dev,安装OpenVINO™开发工具集。该命令在安装OpenVINO™开发工具集时,会同时将提供Python API的OpenVINO™运行库作为依赖项进行安装。
然后从OpenVINO官网,官网链接如下:
https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/overview.html。
下载并解压Windows版的OpenVINOTM 运行库,如下图所示:
本文将OpenVINO™运行库压缩包解压到了C:\Program Files (x86)\Intel\openvino,如下图所示。
1.2.3 安装Visual Studio 2022 Community
安装Visual Studio 2022 Community详细步骤请参考《在Windows中基于Visual Studio配置OpenVINO C++开发环境》。
1.2.4 安装Ultralytics并导出YOLOv8模型
YOLOv8是Ultralytics公司基于YOLO框架,发布的一款面向物体检测与跟踪、实例分割、图像分类和姿态估计任务的SOTA(State-Of-The-Art)模型工具套件。
首先,使用命令:pip install ultralytics,完成ultralytics软件包安装。
然后,使用命令:yolo export model=yolov8n.pt format=openvino half=True,导出yolov8n OpenVINO格式模型,如下图所示。
1.3 为LabVIEW调用编写OpenVINO dll封装函数
为了满足LabVIEW调用C++ dll函数的规则,需要编写OpenVINO dll封装函数。整个封装工作包括一个数据结构体和四个API函数:
1. 结构体lv_ov_engine:定义OpenVINO推理时需要传递的数据结构
2. create_ir():初始化OpenVINO Core对象并创建推理请求
3. infer():输入预处理后的图像数据,执行推理计算
4. getResult():获得推理计算结果
5. release():释放资源
1.3.1 定义结构体lv_ov_engine
定义OpenVINO推理时需要传递的数据结构,如下所示:
//定义OpenVINO推理时需要传递的数据结构
typedef struct lv_ov_engine {
ov::Core ovCore;
ov::InferRequest infer_request;
} OvEngineStruct;
1.3.2 创建create_ir()函数
创建create_ir()函数,实现将OpenVINO IR模型载入指定的计算设备,并返回初始化好的推理请求,如下所示:
//将OpenVINO IR模型载入指定的推理设备
extern "C" __declspec(dllexport) OvEngineStruct * create_ir(char* xml_file, char* device_name)
{
OvEngineStruct* p = new OvEngineStruct();
auto compiled_model = p->ovCore.compile_model(xml_file, device_name);
p->infer_request = compiled_model.create_infer_request();
return p;
}
1.3.3 创建IE_Run函数
创建infer()函数,输入预处理后的图像数据,执行推理计算,如下所示:
//输入预处理后的图像数据,执行推理计算
extern "C" __declspec(dllexport) void infer(OvEngineStruct * p, float* inputData)
{
ov::Tensor input_tensor0 = p->infer_request.get_input_tensor(0);
auto data0 = input_tensor0.data<float>();
memcpy(data0, inputData, 1 * 3 * 640 * 640 * sizeof(float));
p->infer_request.infer();
}
1.3.4 创建getResult()函数
创建getResult()函数,用于获取推理结果,如下所示:
//获取推理后的结果(yolov8输出张量的大小为1*84*8400)
extern "C" __declspec(dllexport) void getResult(OvEngineStruct * p, float* data)
{
auto output = p->infer_request.get_output_tensor(0);
const float* f = output.data<float>();
memcpy(data, f, sizeof(float) * 1 * 84 * 8400);
}
1.3.5 创建release函数
创建release函数,用于释放推理引擎资源,如下所示。
//释放推理引擎
extern "C" __declspec(dllexport) void release(OvEngineStruct * p)
{
delete p;
}
完整代码请参考:openvino_vi_wrapper.cpp,在Visual Studio中将openvino_vi_wrapper.cpp编译为dll,然后在LabVIEW中调用并封装为4个VI,如下图所示。
1.4 使用LabVIEW OpenVINO VI实现YOLOv8目标检测
请读者先克隆本文的源代码到本地:
git clone https://github.com/wangstoudamire/lv_yolov8_openvino
按照README.md文档安装相关工具包,然后运行LabVIEW_OpenVINO_Demo.vi(运行之前请确保电脑已联网),运行结果如下图所示。
1.5 结论
基于OpenVINO,创建LabVIEW 推理计算VI,实现AI推理计算简单方便。结合LabVIEW图形化开发环境,可以快速开发AI应用程序。更多AI推理计算功能,可以参考VIRobotics的LabVIEW AI工具包。