在AI爱克斯开发板上用OpenVINO加速YOLOv8分类模型

小o 更新于 11月前

作者:英特尔物联网行业创新大使 杨雪锋

1.1 简介

本系列文章将在AI爱克斯开发板上使用OpenVINO™ 开发套件依次部署并测评YOLOv8的分类模型、目标检测模型、实例分割模型和人体姿态估计模型。

接下来,本文将介绍在AI爱克斯开发板上搭建OpenVINO推理程序的开发环境、导出并优化YOLOv8分类模型、完成YOLOv8分类模型的推理程序,最后给出实测性能。

1.2 YOLOv8简介

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

只需要几行Python代码,或者一行命令,即可完成在自己的数据集上从头训练(Training a model from scratch)或者微调(Fine-tune)YOLOv8模型。

用Python代码训练YOLOv8模型

用命令行训练YOLOv8模型

导出训练好的YOLOv8模型,并用OpenVINO部署在英特尔硬件平台上,也非常方便,下面依次介绍。请先下载本文的范例代码仓:

git clone https://gitee.com/ppov-nuc/yolov8_cls_ov.git

1.3 准备YOLOv8的OpenVINO推理程序开发环境

请基于本文范例代码仓提供的requirements.txt文件,通过一行命令完成开发环境安装。

# Usage: pip install -r requirements.txt

ultralytics

# Base ----------------------------------------

matplotlib>=3.2.2

numpy>=1.21.6

opencv-python>=4.6.0

Pillow>=7.1.2

PyYAML>=5.3.1

requests>=2.23.0

scipy>=1.4.1

torch==1.13.1

torchvision==0.14.1

tqdm>=4.64.0

# Plotting ------------------------------------

pandas>=1.1.4

seaborn>=0.11.0

# Export --------------------------------------

onnx>=1.12.0  # ONNX export

onnxruntime

openvino-dev==2023.0.0.dev20230407  # modify the openvino-dev version to the latest one

# Extras --------------------------------------

psutil  # system utilization

thop>=0.1.1  # FLOPs computation

一行命令完成开发环境安装。

pip install -r requirements.txt

1.4 导出YOLOv8 OpenVINO IR模型

YOLOv8的分类模型有5种,在ImageNet数据集上的精度如下表所示。

首先使用命令:yolo classify export model=yolov8n-cls.pt format=onnx imgsz=224,完成yolov8n-cls.onnx模型导出,如下图所示。

然后使用命令:mo -m yolov8n-cls.onnx --compress_to_fp16,优化并导出FP16精度的OpenVINO IR格式模型,如下图所示。

1.5 benchmark_app测试yolov8分类模型推理计算性能

     benchmark_app是OpenVINOTM工具套件自带的AI模型推理计算性能测试工具,可以指定在不同的计算设备上,在同步或异步模式下,测试出不带前后处理的纯AI模型推理计算性能。

使用命令:benchmark_app -m yolov8n-cls.xml -d GPU,获得yolov8n-cls.xml模型在AI爱克斯开发板的集成显卡上的异步推理计算性能,如下图所示。

1.6 使用OpenVINO Python API编写YOLOv8分类模型推理程序

基于OpenVINO Python API的YOLOv8分类模型范例程序yolov8_cls_ov_sync_infer_demo.py的核心源代码,如下所示:

# 实例化Core对象

core = Core()

# 载入并编译模型

net = core.compile_model(f'{MODEL_NAME}-cls.xml', device_name="GPU")

# 获得模型输入输出节点

input_node = net.inputs[0]    # yolov8n-cls只有一个输入节点

N, C, H, W = input_node.shape # 获得输入张量的形状

output_node = net.outputs[0]  # yolov8n-cls只有一个输出节点

ir = net.create_infer_request()

##########################################

#   ---根据模型定义预处理和后处理函数-------

##########################################

# 定义预处理函数

def preprocess(image, new_shape=(W,H)):

    # Preprocess image data from OpenCV

    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)   # BGR->RGB

    resized = cv2.resize(image, new_shape)           # Resize Image

    norm = (resized - IMAGENET_MEAN) / IMAGENET_STD  # Normalization

    blob = np.transpose(norm, (2, 0, 1))             # HWC->CHW

    blob = np.expand_dim***lob, 0)                   # CHW->NCHW

    return blob

# 定义后处理函数

def postprocess(outs):

    score = np.max(outs)

    id = np.argmax(outs)

    return score, id, imagenet_labels[id]

##########################################

#   ----- AI同步推理计算 ------------

##########################################

# 采集图像

image = cv2.imread("bus.jpg")

# 数据预处理

blob = preprocess(image)

# 执行推理计算并获得结果

outs = ir.infer(blob)[output_node]

# 对推理结果进行后处理

score, id, label = postprocess(outs)

# 显示处理结果

msg = f"YOLOv5s-cls Result:{label}, Score:{score:4.2f}, FPS:{FPS:4.2f}"

cv2.putText(image, msg, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (100, 100, 200), 2)

cv2.imshow("YOLOv5s-cls OpenVINO Sync Infer Demo",image)

cv2.waitKey()

cv2.destroyAllWindows()

运行结果如下图所示:


1.7 使用OpenVINO 预处理 API提升推理计算性能

参考《将数据预处理嵌入AI模型的常见技巧》,使用OpenVINO™预处理 API,将数据预处理嵌入YOLOv8分类模型,可以进一步提高推理设备(例如,英特尔® 集成显卡/独立显卡)的利用率,进而提高包含前后处理的端到端的AI推理计算性能。

使用 OpenVINO™ 预处理 API 将预处理嵌入模型的范例程序export_yolov8_cls_ppp.py的核心代码,如下所示:

# ========  Step 0: read original model =========

core = Core()

model = core.read_model(f"{MODEL_NAME}-cls.xml")

# Step 1: Add Preprocessing steps to a model ==

ppp = PrePostProcessor(model)

# Declare User’s Data Format

ppp.input().tensor() \

    .set_element_type(Type.u8) \

    .set_spatial_dynamic_shape() \

    .set_layout(Layout('NHWC')) \

    .set_color_format(ColorFormat.BGR)

# Declaring Model Layout

ppp.input().model().set_layout(Layout('NCHW'))

# Explicit preprocessing steps. Layout conversion will be done automatically as last step

ppp.input().preprocess() \

    .convert_element_type()     \

    .convert_color(ColorFormat.RGB) \

    .resize(ResizeAlgorithm.RESIZE_LINEAR) \

    .mean([123.675, 116.28, 103.53]) \

    .scale([58.624, 57.12, 57.375])

# Integrate preprocessing Steps into a Model

print(f'Dump preprocessor: {ppp}')

model_with_ppp = ppp.build()

# ======== Step 2: Save the model with preprocessor================

serialize(model_with_ppp, f'{MODEL_NAME}-cls_ppp.xml', f'{MODEL_NAME}-cls_ppp.bin')

运行结果,如下图所示:


基于内嵌预处理模型的推理程序yolov8_cls_ppp_sync_infer_demo.py的核心代码,如下所示

##########################################

#   ----- AI同步推理计算 ------------

##########################################

# 采集图像

image = cv2.imread("bus.jpg")

blob = np.expand_dims(image,0)

# 执行推理计算并获得结果

outs = ir.infer(blob)[output_node]

# 对推理结果进行后处理

score, id, label = postprocess(outs)

##########################################

#   ----- 统计带前后预处理的AI推理性能------

##########################################

start = time.time()

N = 1000

for i in range(N):

    blob = np.expand_dims(image,0)

    outs = ir.infer(blob)[output_node]

    score, id, label = postprocess(outs)

FPS = N / (time.time() - start)

运行结果,如下所示:



1.8 结论:

AI爱克斯开发板借助N5105处理器的集成显卡(24个执行单元)和OpenVINO,可以在YOLOv8的分类模型上获得相当不错的性能。通过异步处理AsyncInferQueue,还能进一步提升计算设备的利用率,提高AI推理程序的吞吐量。下一篇将继续介绍在《在AI爱克斯开发板上用OpenVINO加速YOLOv8目标检测模型》。

0个评论