点击蓝字
关注我们,让开发变得更有趣
以下文章来源于英特尔物联网,作者英特尔物联网行业创新大使 杨雪锋
本系列文章将在 AI 爱克斯开发板上使用 OpenVINO™ 开发套件依次部署并测评 YOLOv8 的
分类模型、目标检测模型、实例分割模型和人体姿态估计模型。
接下来,本文将介绍在 AI 爱克斯开发板上搭建 OpenVINO™ 推理程序的开发环境、导出并优化 YOLOv8 分类模型、完成 YOLOv8 分类模型的推理程序,最后给出实测性能。
请先下载本文的代码仓:
git clone https://gitee.com/ppov-nuc/yolov8_openvino.git
YOLOv8 简介
YOLOv8 是 Ultralytics 公司基于 YOLO 框架,发布的一款面向物体检测与跟踪、实例分割、图像分类和姿态估计任务的 SOTA 模型工具套件。
只需要几行 Python 代码,或者一行命令,即可完成在自己的数据集上从头训练 (Training a model from scratch) 或者微调(Fine-tune) YOLOv8 模型。
用 Python 代码训练 YOLOv8 模型
用命令行训练 YOLOv8 模型
导出训练好的 YOLOv8 模型,并用 OpenVINO™ 部署在英特尔硬件平台上,也非常方便,下面依次介绍。
准备 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
onnxruntime
openvino-dev==2023.0.0.dev20230407
# Extras --------------------------------------
psutil
thop>=0.1.1
向右滑动查看完整代码
一行命令完成开发环境安装。
pip install -r requirements.txt
导出 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 格式模型,如下图所示。
用 benchmark_app 测试 YOLOv8 分类模型的推理计算性能
benchmark_app 是 OpenVINO™ 工具套件自带的 AI 模型推理计算性能测试工具,可以指定在不同的计算设备上,在同步或异步模式下,测试出不带前后处理的纯AI 模型推理计算性能。
使用命令:benchmark_app -m yolov8n-cls.xml -d GPU ,获得 yolov8n-cls.xml 模型在 AI 爱克斯开发板的集成显卡上的异步推理计算性能,如下图所示。
使用 OpenVINO™ Python API 编写 YOLOv8 分类模型推理程序
基于 OpenVINO™ Python API 的 YOLOv8 分类模型范例程序 yolov8_cls_ov_sync_infer.py 的核心源代码,如下所示:
# 实例化Core对象
core = Core()
# 载入并编译模型
net = core.compile_model(f'{MODEL_NAME}-cls.xml', device_name="GPU")
# 获得模型输入输出节点
input_node = net.inputs[0]
N, C, H, W = input_node.shape
output_node = net.outputs[0]
ir = net.create_infer_request()
##########################################
# ---根据模型定义预处理和后处理函数-------
##########################################
# 定义预处理函数
def preprocess(image, new_shape=(W,H)):
# Preprocess image data from OpenCV
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
resized = cv2.resize(image, new_shape)
norm = (resized - IMAGENET_MEAN) / IMAGENET_STD
blob = np.transpose(norm, (2, 0, 1))
blob = np.expand_dims(blob, 0)
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()
向右滑动查看完整代码
运行结果如下图所示:
使用 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.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)
向右滑动查看完整代码
运行结果,如下所示:
你也许想了解(点击蓝字查看)⬇️
➡️
以AI作画,祝她节日快乐;简单三步,OpenVINO™ 助你轻松体验AIGC
➡️
还不知道如何用OpenVINO™作画?点击了解教程。
➡️
如何给开源项目做贡献? | 开发者节日福利
➡️
几行代码轻松实现对于PaddleOCR的实时推理,快来get!
➡️
使用OpenVINO 在“端—边—云”快速实现高性能人工智能推理
➡️
图片提取文字很神奇?试试三步实现OCR!
➡️
【Notebook系列第六期】基于Pytorch预训练模型,实现语义分割任务
➡️
使用OpenVINO™ 预处理API进一步提升YOLOv5推理性能
扫描下方二维码立即体验
OpenVINO™ 工具套件 2022.3
本文分享自微信公众号 - OpenVINO 中文社区(openvinodev)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。