1.1概述
在《基于OpenVINO 2022.1實(shí)現(xiàn)YOLOv5推理程序》中詳述了:
■ YOLOv5框架的安裝和如何導(dǎo)出YOLOv5.onnx模型
■ OpenVINO 2022.1的安裝以及如何編寫YOLOv5模型的推理程序
本文將介紹如何使用OpenVINO 2022.1的預(yù)處理API,進(jìn)一步提升YOLOv5模型的推理計(jì)算性能。
1.2什么是預(yù)處理API函數(shù)?
OpenVINO 2022.1之前版本不提供OpenVINO Runtime原生的用于數(shù)據(jù)預(yù)處理的API函數(shù)1 ,如圖1-1所示,開發(fā)者必須通過第三方庫(例如:OpenCV)來實(shí)現(xiàn)數(shù)據(jù)預(yù)處理。

圖1-1 OpenVINO Runtime預(yù)處理API
假設(shè)沒有預(yù)處理API,那么輸入數(shù)據(jù)的預(yù)處理操作只能放在CPU上實(shí)現(xiàn),CPU完成數(shù)據(jù)預(yù)處理后,再將預(yù)處理后的數(shù)據(jù)傳給iGPU、VPU等AI加速計(jì)算設(shè)備進(jìn)行推理計(jì)算。
有了預(yù)處理API后,就能將預(yù)處理操作集成到在模型執(zhí)行圖中,這樣iGPU、VPU 或即將發(fā)布的Intel獨(dú)立顯卡都能進(jìn)行數(shù)據(jù)預(yù)處理,無需依賴CPU,提高了執(zhí)行效率,如圖1-2所示。

圖1-2 預(yù)處理OpenCV vs OpenVINO
1.3數(shù)據(jù)預(yù)處理的典型操作
由于輸入數(shù)據(jù)的Shape、Precision等特征,與模型輸入張量的要求不一致,所以需要通過預(yù)處理,將輸入數(shù)據(jù)按照模型輸入張量的要求進(jìn)行轉(zhuǎn)換,如圖1-3所示。

圖1-3 輸入數(shù)據(jù) vs 模型輸入張量
從圖1-3中可見,數(shù)據(jù)預(yù)處理的典型操作有:
■改變輸入數(shù)據(jù)的形狀:[720, 1280,3] → [1, 3, 640, 640]
■改變輸入數(shù)據(jù)的精度:U8 → f32
■ 改變輸入數(shù)據(jù)的顏色通道順序:BGR → RGB
■改變輸入數(shù)據(jù)的布局(layout):HWC → NCHW
■ 歸一化數(shù)據(jù):減去均值(mean),除以標(biāo)準(zhǔn)差(std)
1.4數(shù)據(jù)預(yù)處理API的使用方法
對(duì)應(yīng)數(shù)據(jù)預(yù)處理的典型操作,OpenVINO 工具套件預(yù)處理API提供了相應(yīng)的類,方便開發(fā)者快速使用,其主要流程有6步2 ,如圖1-4所示,依次是:
1 實(shí)例化PrePostProcessor對(duì)象;
2 申明輸入數(shù)據(jù)的信息
3 指定模型的數(shù)據(jù)布局(layout)
4 設(shè)置模型輸出張量的信息
5 定義預(yù)處理的具體步驟
6 將預(yù)處理步驟集成到模型

圖1-4 使用預(yù)處理API的流程
本文將按照上述順序依次介紹。
1.4.1 實(shí)例化PrePostProcessor對(duì)象
實(shí)例化PrePostProcessor對(duì)象的Python代碼,如代碼清單1-1所示。
代碼清單1-1 實(shí)例化PrePostProcessor對(duì)象

1.4.2 申明輸入數(shù)據(jù)的信息
申明輸入數(shù)據(jù)的信息的Python代碼,如代碼清單1-2所示。
代碼清單1-2 申明輸入數(shù)據(jù)的信息

1.4.3 指定模型的數(shù)據(jù)布局(layout)
指定模型的數(shù)據(jù)布局(layout) 的Python代碼,如代碼清單1-3所示。
代碼清單1-3 指定模型的數(shù)據(jù)布局(layout)

1.4.4 設(shè)置模型輸出張量的信息
設(shè)置模型輸出張量的信息的Python代碼,如代碼清單1-4所示。
代碼清單1-4 設(shè)置模型輸出張量的信息

1.4.5 定義預(yù)處理的具體步驟
定義預(yù)處理的具體步驟的Python代碼,如代碼清單1-5所示。
代碼清單1-5 定義預(yù)處理的具體步驟


1.4.6 將預(yù)處理步驟集成到模型
將預(yù)處理步驟集成到模型的Python代碼,如代碼清單1-6所示。
代碼清單1-6 將預(yù)處理步驟集成到模型

1.4.7 將集成了預(yù)處理步驟的模型導(dǎo)出
使用serialize()函數(shù),可以將集成了預(yù)處理步驟的模型導(dǎo)出,方便后續(xù)調(diào)用,如代碼清單1-7所示。
代碼清單1-7 導(dǎo)出包含預(yù)處理步驟的模型

使用Netron打開導(dǎo)出模型,可以看到預(yù)處理步驟已經(jīng)集成到執(zhí)行圖中,如圖1-5所示。

圖1-5 預(yù)處理集成到執(zhí)行圖中
導(dǎo)出集成預(yù)處理模型的完整源代碼:
1.5完整范例代碼和測試結(jié)果
本文隨附使用OpenVINO 2022.1預(yù)處理API實(shí)現(xiàn)YOLOv5s推理程序的完整源代碼,參見:https://gitee.com/ppov-nuc/yolov5_infer/blob/main/infer_with_openvino_preprocess.py。
表1-1 使用OpenVINO 2022.1預(yù)處理API和
使用OpenCV實(shí)現(xiàn)預(yù)處理的性能對(duì)比
操作系統(tǒng):Windows10;Python版本:3.8;OpenVINO版本:2022.1
模型:yolov5s.onnx

執(zhí)行命令, 將yolov5s.onnx轉(zhuǎn)換為FP16精度的yolov5s.xml后
mo --input_model yolov5s.onnx --data_type FP16
操作系統(tǒng):Windows10;Python版本:3.8;OpenVINO版本:2022.1
模型:yolov5s.xml @ FP16

1.6總結(jié)
本文完整介紹了什么是OpenVINO工具套件預(yù)處理API和為什么推薦使用預(yù)處理API將預(yù)處理操作集成到模型執(zhí)行圖中,然后詳細(xì)介紹了使用步驟并提供了完整范例源代碼。
通過運(yùn)行源代碼,可以看到,使用了OpenVINO 工具套件預(yù)處理API,使輸入數(shù)據(jù)預(yù)處理操作不再依賴CPU,可以由推理設(shè)備(如GPU/VPU)完成,提高了推理計(jì)算效率,減少了運(yùn)行時(shí)間。
原文標(biāo)題:使用OpenVINO? 預(yù)處理API進(jìn)一步提升YOLOv5推理性能 | 開發(fā)者實(shí)戰(zhàn)
文章出處:【微信公眾號(hào):英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
英特爾
+關(guān)注
關(guān)注
61文章
10272瀏覽量
179163 -
API
+關(guān)注
關(guān)注
2文章
2131瀏覽量
66174 -
預(yù)處理
+關(guān)注
關(guān)注
0文章
33瀏覽量
10755
原文標(biāo)題:使用OpenVINO? 預(yù)處理API進(jìn)一步提升YOLOv5推理性能 | 開發(fā)者實(shí)戰(zhàn)
文章出處:【微信號(hào):英特爾物聯(lián)網(wǎng),微信公眾號(hào):英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄

OpenVINO工具套件預(yù)處理API的概念及使用方法
評(píng)論