0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

将数据预处理嵌入AI模型的常见技巧

英特尔物联网 来源:英特尔物联网 作者:战鹏州 2022-12-16 13:55 次阅读

作者: 英特尔物联网行业创新大使 战鹏州

本文将介绍基于 OpenVINO 模型优化器或预处理 API 将数据预处理嵌入 AI 模型的常见技巧,帮助读者在硬件投入不变的情况下,进一步提升端到端的 AI 推理程序的性能。本文所有范例程序已开源:

https://gitee.com/ppov-nuc/resnet_ov_ppp.git

并在基于第12 代英特尔酷睿处理器的 AI 开发者套件上完成测试。

以 YOLOv5 模型转换为例,使用模型优化器命令:

mo --input_model yolov5s.onnx --data_type FP16

向右滑动查看完整代码

将 yolov5s.onnx 模型转为 IR 格式模型,并将模型精度从 FP32 转为 FP16——这是最常见的模型优化器使用方式。基于上述 IR 模型,在编写 AI 推理程序时,由于图像数据的数值精度和形状,跟模型输入节点要求的数值精度和形状不一样,所以还需要将数据在输入模型前对其进行预处理。

以YOLOv5模型为例,使用YOLOv5代码仓自带的zidane.jpg图像,打印出图像的数值精度和形状,以及模型输入节点的数值精度和形状,对比如下,如图1-1所示。

3a394e16-7c67-11ed-8abf-dac502259ad0.png

图1-1 OpenCV 读入的图像 vs 模型输入节点

从上图可以看出,通过 OpenCV 的 imread() 函数读取的图像数据,在数据形状、数值精度、数值范围等地方,与模型输入节点的要求不一样,如下表所示:

3a5ed1d6-7c67-11ed-8abf-dac502259ad0.png

由于存在上述的差异,数据在传入模型前必须进行预处理,以满足模型输入节点的要求。数据预处理可以在推理代码中编程实现,也可以用模型优化器实现,或者用OpenVINO 预处理 API 实现,本文将依次详细介绍。

1.1用模型优化器实现数据预处理

1.1.1模型优化器预处理参数

模型优化器可以将颜色通道顺序调整、图像数据归一化等预处理操作嵌入模型,参考《OpenVINO 模型转换技术要点解读》。通过指定参数

--mean_values:所有输入数据将减去 mean_values, 即 input - mean_values

--scale_values:所有输入数据将除以 scales_values,当同时指定 mean_values 和 scale_values 时,模型优化器执行(input - mean_values)÷scales_values

--reverse_input_channels:将输入通道顺序从 RGB 转换为 BGR(反之亦然)

当上述三个操作同时指定时,预处理顺序为:

输入数据

→→reverse_input_channels→→mean_values→→scale_values→→原始模型

在转换模型时,假设推理程序使用 OpenCV 库读取图像,则可以在模型优化器中增加 mean_values、scale_values 和 reverse_input_channels 三个参数,把颜色通道顺序调整和图像数据归一化操作嵌入模型。若推理程序使用非 OpenCV 库读取图像,例如 PIL.Image,则无需添加 --reverse_input_channels 参数。

下面本文将以 ResNet 模型为例,展示使用模型优化器将预处理嵌入模型的完整过程。

1.1.2将 ResNet 模型的预处理嵌入模型

ResNet 不仅是2015年 ILSVRC 大赛冠军,还是产业实践中常用的卷积神经网络模型。PyTorch 已将 ResNet 集成到 torchvision 中,将 PyTorch 格式的 ResNet 模型转为 ONNX 格式,完整代码如下:

from torchvision.models import resnet50, ResNet50_Weights
import torch
# https://pytorch.org/vision/stable/models/generated/torchvision.models.resnet50.html
weights = ResNet50_Weights.IMAGENET1K_V2
model = resnet50(weights=weights, progress=False).cpu().eval()
# define input and output node
dummy_input = torch.randn(1, 3, 224, 224, device="cpu")
input_names, output_names = ["images"], ['output']
torch.onnx.export(model,
         dummy_input,
         "resnet50.onnx",
         verbose=True,
         input_names=input_names,
         output_names=output_names,
         opset_version=13
         )

向右滑动查看完整代码

在导出 PyTorch 格式模型为 ONNX 格式时,需要注意的是算子版本(opset_version)最好≥11。

另外,OpenVINO 2022.2支持ONNX 1.8.1,即 opset_version=13, 所以本文将 opset_version 设置为13。

基于 ImageNet 1k 数据集训练的 ResNet 模型的归一化参数为:

mean_values= [123.675,116.28,103.53]

scale_values=[58.395,57.12,57.375]

将 ONNX 模型转换为 OpenVINO IR 模型的命令为:

mo -m resnet50.onnx --mean_values=[123.675,116.28,103.53] --
scale_values=[58.395,57.12,57.375] --data_type FP16 --reverse_input_channels

向右滑动查看完整代码

当获得 ResNet50 的 IR 模型后,可以使用下面的程序,完成推理计算

from openvino.runtime import Core
import cv2
import numpy as np
core = Core()
resnet50 = core.compile_model("resnet50.xml", "CPU")
output_node = resnet50.outputs[0]
# Resize
img = cv2.resize(cv2.imread("cat.jpg"), [224,224])
# Layout: HWC -> NCHW
blob = np.expand_dims(np.transpose(img, (2,0,1)), 0)
result = resnet50(blob)[output_node]
print(np.argmax(result))

向右滑动查看完整代码

在上面的推理代码中,仍有调整图像尺寸,改变图像数据布局等操作在推理代码中实现,接下来,本文将介绍用 OpenVINO 预处理 API,将更多预处理操作嵌入模型中。

1.2用OpenVINO 预处理 API 实现数据预处理

从 OpenVINO2022.1开始,OpenVINO提供一套预处理 API,将数据预处理嵌入模型,参考《使用 OpenVINO 预处理 API 进一步提升 YOLOv5 推理性能》。将数据预处理嵌入模型的好处是:

提高 AI 模型的移植性(推理代码无需考虑编写预处理程序)

提高推理设备(例如,英特尔集成显卡/独立显卡)的利用率

提高 AI 程序端到端的性能

使用 OpenVINO 预处理 API 将预处理嵌入模型的完整范例程序 export_resnet_ov_ppp.py,如下所示:

from openvino.preprocess import PrePostProcessor, ColorFormat, ResizeAlgorithm
from openvino.runtime import Core, Layout, Type, serialize
# ======== Step 0: read original model =========
core = Core()
model = core.read_model("resnet50.onnx")
# ======== Step 1: Preprocessing ================
ppp = PrePostProcessor(model)
# Declare section of desired application's input format
ppp.input("images").tensor() 
  .set_element_type(Type.u8) 
  .set_spatial_dynamic_shape() 
  .set_layout(Layout('NHWC')) 
  .set_color_format(ColorFormat.BGR)
# Specify actual model layout
ppp.input("images").model().set_layout(Layout('NCHW'))
# Explicit preprocessing steps. Layout conversion will be done automatically as last step
ppp.input("images").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])
# Dump preprocessor
print(f'Dump preprocessor: {ppp}')
model = ppp.build()
# ======== Step 2: Save the model with preprocessor================
serialize(model, 'resnet50_ppp.xml', 'resnet50_ppp.bin')

向右滑动查看完整代码

export_resnet_ov_ppp.py 运行结果,如下图所示:

3a99728c-7c67-11ed-8abf-dac502259ad0.png

从上面的代码可见,使用 OpenVINO 预处理 API,可以将图像尺寸调整、彩色通道转换、数据归一化、数据布局转换全部集成到模型中,并且无需运行模型优化器,即可以将 ONNX 模型导出为 IR 模型。

基于 resnet50_ppp.xml 的完整推理程序,如下所示:

from openvino.runtime import Core
import cv2
import numpy as np
core = Core()
resnet50_ppp = core.compile_model("resnet50_ppp.xml", "CPU")
output_node = resnet50_ppp.outputs[0]
blob = np.expand_dims(cv2.imread("cat.jpg"),0)
result = resnet50_ppp(blob)[output_node]
print(np.argmax(result))

向右滑动查看完整代码

如上所示,基于内嵌预处理的 IR 模型,OpenVINO 推理程序变得更加简单清晰,易读易懂了。五行 Python 核心代码实现了内嵌预处理的 ResNet 模型推理!

1.3使用模型缓存技术进一步缩短首次推理时延

在《在蝰蛇峡谷上实现 YOLOv5 模型的 OpenVINO异步推理程序》讨论了 AI 应用程序端到端的性能。对于首次推理时延来说,模型的载入和编译时间,会极大增加首次推理的端到端的运行时间。

使用模型缓存技术,将极大的缩短首次推理时延,如下图所示。

3abb3016-7c67-11ed-8abf-dac502259ad0.png

使用模型缓存技术,只需要添加一行代码:

core.set_property({'CACHE_DIR': './cache/ppp'})

完整范例代码如下所示:

from openvino.runtime import Core
import cv2
import numpy as np
core = Core()
core.set_property({'CACHE_DIR': './cache/ppp'}) # 使用模型缓存技术
resnet50_ppp = core.compile_model("resnet50_ppp.xml", "CPU")
output_node = resnet50_ppp.outputs[0]
blob = np.expand_dims(cv2.imread("cat.jpg"),0)
result = resnet50_ppp(blob)[output_node]
print(np.argmax(result))

向右滑动查看完整代码

当第二次运行推理程序时,OpenVINO 运行时将从缓存文件夹直接加载已编译好的模型,极大的优化了首次推理时延。

1.4总结

本文详细介绍了通过模型优化器和 OpenVINO预处理 API,将数据预处理嵌入 AI 模型的技术。将数据预处理嵌入模型,简化了推理程序编写,提升推理计算设备利用率并提升了 AI 程序端到端的性能。最后,本文还介绍了通过模型缓存技术,进一步优化 AI 程序端到端的首次推理时延性能。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18275

    浏览量

    222158
  • 英特尔
    +关注

    关注

    60

    文章

    9421

    浏览量

    168826
  • AI
    AI
    +关注

    关注

    87

    文章

    26443

    浏览量

    264046
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47686

原文标题:将数据预处理嵌入AI模型的常见技巧 | 开发者实战

文章出处:【微信号:英特尔物联网,微信公众号:英特尔物联网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    机器学习为什么需要数据预处理

    数据预处理是准备原始数据并使其适合机器学习模型的过程。这是创建机器学习模型的第一步也是关键的一步。 创建机器学习项目时,我们并不总是遇到干净
    的头像 发表于 08-24 09:20 1153次阅读
    机器学习为什么需要<b class='flag-5'>数据</b><b class='flag-5'>预处理</b>

    请教大家一下关于数据预处理

    一般获得的加速度数据得进行数据预处理常见预处理方法有去掉趋势相、还得
    发表于 06-07 11:16

    Python数据预处理方法

    机器学习-Python实践Day3(特征工程--数据预处理2)
    发表于 06-03 15:55

    数据探索与数据预处理

    目录1数据探索与数据预处理21.1 赛题回顾21.2 数据探索性分析与异常值处理21.3 相关性分析52特征工程82.1 光伏发电领域特征8
    发表于 07-12 08:37

    如何AI模型部署到嵌入式系统中

    本期我们分享主题是如何 AI 模型部署到嵌入式系统中,下一期介绍如何在 RT-Thread 操作系统上运行 Mnist Demo(手写数
    发表于 12-14 07:55

    C预处理与C语言基本数据类型

    嵌入式系统设计师学习笔记二十九:嵌入式程序设计④——C预处理预处理指令表:(编码规范:GB/T 28169-2011)关于宏定义 #denfine 详解可点击连接查看博主的另一篇文章
    发表于 12-21 08:29

    图像预处理和改进神经网络推理的简要介绍

    为提升识别准确率,采用改进神经网络,通过Mnist数据集进行训练。整体处理过程分为两步:图像预处理和改进神经网络推理。图像预处理主要根据图像的特征,
    发表于 12-23 08:07

    嵌入式边缘AI应用开发指南

    如果在没有嵌入处理器供应商提供的合适工具和软件的支持下,既想设计高能效的边缘人工智能(AI)系统,同时又要加快产品上市时间,这项工作难免会冗长乏味。面临的一系列挑战包括选择恰当的深度学习模型
    发表于 11-03 06:53

    用于3D扫描的嵌入式图像预处理

    电子发烧友网站提供《用于3D扫描的嵌入式图像预处理.zip》资料免费下载
    发表于 11-07 10:14 0次下载
    用于3D扫描的<b class='flag-5'>嵌入</b>式图像<b class='flag-5'>预处理</b>

    Python数据清洗和预处理入门完整指南

    凡事预则立,不预则废,训练机器学习模型也是如此。数据清洗和预处理模型训练之前的必要过程,否则模型可能就「废」了。本文是一个初学者指南,将带
    的头像 发表于 12-21 13:50 659次阅读

    嵌入式C预处理器的基本概念和常用指令

    嵌入式系统开发中,C预处理器是非常重要的一部分,可以在编译之前对源代码进行宏替换、条件编译和包含等处理。在本文中,我们将介绍嵌入式C预处理
    的头像 发表于 04-13 16:11 673次阅读

    介绍嵌入式C预处理器的基本概念和常用指令

    嵌入式系统开发中,C预处理器是非常重要的一部分,可以在编译之前对源代码进行宏替换、条件编译和包含等处理
    发表于 05-20 15:14 365次阅读

    PyTorch教程之数据预处理

    电子发烧友网站提供《PyTorch教程之数据预处理.pdf》资料免费下载
    发表于 06-02 14:11 0次下载
    PyTorch教程之<b class='flag-5'>数据</b><b class='flag-5'>预处理</b>

    华为发布大模型时代ai存储技术

    OceanStor A310深度学习数据湖存储,面向基础/行业大模型数据湖场景,实现从数据归集、预处理
    发表于 07-21 14:51 420次阅读

    AI模型数据存储技术的发展趋势

    AI模型AI带入新的发展阶段。AI模型需要更高效的海量原始数据收集和
    发表于 10-23 11:26 393次阅读
    <b class='flag-5'>AI</b>大<b class='flag-5'>模型</b>对<b class='flag-5'>数据</b>存储技术的发展趋势