欢迎光临散文网 会员登陆 & 注册

用 OpenVINO C++ API 编写 YOLOv8-Seg 实例分割模型推理程序

2023-07-06 09:31 作者:oneAPI技术汇  | 我要投稿

1.1

简介

 

本文章将介绍使用 OpenVINO™ 2023.0 C++ API 开发YOLOv8-Seg 实例分割(Instance Segmentation)模型的AI推理程序。本文 C++ 范例程序的开发环境是 Windows + Visual Studio Community 2022,请读者先配置基于 Visual Studio的OpenVINO C++ 开发环境。

 

请克隆本文的代码仓:git clone https://gitee.com/ppov-nuc/yolov8_openvino_cpp.git

 

1.2

导出 YOLOv8-Seg OpenVINO IR 模型

 

YOLOv8是 Ultralytics 公司基于 YOLO 框架,发布的一款面向物体检测与跟踪、实例分割、图像分类和姿态估计任务的 SOTA 模型工具套件。

 

首先用命令pip install -r requirements.txt 安装ultralytics 和 openvino-dev。

 

然后使用命令:yolo export model=yolov8n-seg.pt format=openvino half=True,导出FP16精度的  OpenVINO IR 模型,如下图所示。

 

接着使用命令:benchmark_app -m yolov8n-seg.xml -d GPU.1,获得yolov8n-seg.xml 模型在 A770m 独立显卡上的异步推理计算性能,如下图所示。

 

1.3

使用 OpenVINO C++ API 编写 YOLOv8-Seg 实例分割模型推理程序

 

使用 OpenVINO C++ API 编写 YOLOv8-Seg 实例分割模型推理程序主要有5个典型步骤:

1. 采集图像&图像解码

2. 图像数据预处理

3. AI推理计算(基于 OpenVINO C++ API)

4. 对推理结果进行后处理

5. 将处理后的结果可视化

 

 

YOLOv8-Seg 实例分割模型推理程序的图像数据预处理和AI推理计算的实现方式跟 YOLOv8 目标检测模型推理程序的实现方式几乎一模一样,可以直接复用。

 

1.3.1 图像数据预处理


 

使用 Netron 打开 yolov8n-seg.onnx,如下图所示,可以看到:

  •  输入节点的名字:“images”;数据:float32[1,3,640,640]

  •  输出节点1的名字:“output0”;数据:float32[1,116,8400]。其中116的前84个字段跟 YOLOv8目标检测模型输出定义完全一致,即cx,cy,w,h和80类的分数;后32个字段为掩膜置信度,用于计算掩膜数据。

  • 输出节点2的名字:“output1”;数据:float32[1,32,160,160]。output0后32个字段与output1的数据做矩阵乘法后得到的结果,即为对应目标的掩膜数据                                     

 

图像数据预处理的目标就是将任意尺寸的图像数据转变为形状为[1,3,640,640],精度为 FP32的张量。YOLOv8-Seg 模型的输入尺寸为正方形,为了解决将任意尺寸数据放缩为正方形带来的图像失真问题,在图像放缩前,采用 letterbox 算法先保持图像的长宽比,如下图所示,然后再使用 cv::dnn::blobFromImage 函数对图像进行放缩。

 

图像数据预处理的范例程序如下所示

 

1.3.2  AI同步推理计算


 

用 OpenVINO C++ API 实现同步推理计算,主要有七步:

1.实例化 Core 对象:ov::Core core;

2.编译并载入模型:core.compile_model();

3.创建推理请求:infer_request = compiled_model.create_infer_request();

4.读取图像数据并完成预处理;

5.将输入数据传入模型:infer_request.set_input_tensor(input_tensor);

6.启动推理计算:infer_request.infer();

7.获得推理结果:output0 = infer_request.get_output_tensor(0); 

output1 = infer_request.get_output_tensor(1);

 

范例代码如下所示:

 

1.3.3 推理结果后处理


 

实例分割推理程序的后处理是从结果中拆解出预测别类(class_id),类别分数(class_score),类别边界框(box)和类别掩膜(mask),范例代码如下所示:

 

完整范例参考参见:yolov8_seg_ov_infer.cpp,运行结果如下图所示:

 

1.4

结论

 

OpenVINO C++ API 简单清晰,易学易用。本文用不到100行(不含可视化检测结果) C++ 代码就实现了基于OpenVINO的 YOLOv8-Seg 实例分割模型推理程序,在英特尔独立显卡 A770m 上获得了较好的推理计算性能。

 


用 OpenVINO C++ API 编写 YOLOv8-Seg 实例分割模型推理程序的评论 (共 条)

分享到微博请遵守国家法律