<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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

    文章

    18538

    瀏覽量

    223696
  • 英特爾
    +關注

    關注

    60

    文章

    9556

    瀏覽量

    169485
  • AI
    AI
    +關注

    關注

    87

    文章

    27061

    瀏覽量

    264828
  • 模型
    +關注

    關注

    1

    文章

    2790

    瀏覽量

    47922

原文標題:將數據預處理嵌入AI模型的常見技巧 | 開發者實戰

文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    機器學習為什么需要數據預處理

    數據預處理是準備原始數據并使其適合機器學習模型的過程。這是創建機器學習模型的第一步也是關鍵的一步。 創建機器學習項目時,我們并不總是遇到干凈
    的頭像 發表于 08-24 09:20 ?1252次閱讀
    機器學習為什么需要<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 ?698次閱讀

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

    嵌入式系統開發中,C預處理器是非常重要的一部分,可以在編譯之前對源代碼進行宏替換、條件編譯和包含等處理。在本文中,我們將介紹嵌入式C預處理
    的頭像 發表于 04-13 16:11 ?706次閱讀

    介紹嵌入式C預處理器的基本概念和常用指令

    嵌入式系統開發中,C預處理器是非常重要的一部分,可以在編譯之前對源代碼進行宏替換、條件編譯和包含等處理。
    發表于 05-20 15:14 ?392次閱讀

    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 ?444次閱讀

    AI模型數據存儲技術的發展趨勢

    AI模型AI帶入新的發展階段。AI模型需要更高效的海量原始數據收集和
    發表于 10-23 11:26 ?491次閱讀
    <b class='flag-5'>AI</b>大<b class='flag-5'>模型</b>對<b class='flag-5'>數據</b>存儲技術的發展趨勢
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>