0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何將Pytorch自訓(xùn)練模型變成OpenVINO IR模型形式

SDNLAB ? 來源:英特爾物聯(lián)網(wǎng) ? 2023-06-07 09:31 ? 次閱讀

簡 介


本文章將依次介紹如何將Pytorch自訓(xùn)練模型經(jīng)過一系列變換變成OpenVINO IR模型形式,而后使用OpenVINO Python API 對IR模型進(jìn)行推理,并將推理結(jié)果通過OpenCV API顯示在實(shí)時畫面上。

本文Python程序的開發(fā)環(huán)境是Ubuntu20.04 LTS + PyCharm,硬件平臺是AIxBoard愛克斯板開發(fā)者套件。

本文項(xiàng)目背景:針對2023第十一屆全國大學(xué)生光電設(shè)計(jì)競賽賽題2“迷宮尋寶”光電智能小車題目。基于該賽項(xiàng)寶藏樣式,我通過深度學(xué)習(xí)訓(xùn)練出能分類四種不同顏色不同標(biāo)記形狀骨牌的模型,骨牌樣式詳見圖1.1。

13bd2a62-0486-11ee-90ce-dac502259ad0.png

| 圖1.1 四種骨牌類型

Pytorch pth模型轉(zhuǎn)換成OpenVINO IR模型

Pytorch是一個基于Torch的開源Python學(xué)習(xí)庫,是一個以Python優(yōu)先的深度學(xué)習(xí)框架。Pth模型文件是Pytorch進(jìn)行模型保存時的一種模型格式,OpenVINO暫不支持直接對Pth模型文件進(jìn)行推理,所以我們要將Pth格式的模型先轉(zhuǎn)換成ONNX格式文件,再通過OpenVINO自帶的Model Optimizer(模型優(yōu)化器)進(jìn)一步轉(zhuǎn)變成OpenVINO IR模型。處理過程如下所示:

通過Pytorch將Pth模型轉(zhuǎn)換成ONNX模型

轉(zhuǎn)換后的文件(Pth —> ONNX):

import torch.onnx

# SZTU LIXROBO 23.5.14 #

#******************************************#

# 1. 模型加載

model = torch.load('Domino_best.pth', map_location=torch.device('cpu'))

# 2. 設(shè)置模型為評估模式而非訓(xùn)練模式

model.eval()

# 3. 生成隨機(jī)從標(biāo)準(zhǔn)正態(tài)分布抽取的張量

dummy_input = torch.randn(1,3,224,224,device='cpu')

# 4. 導(dǎo)出ONNX模型(保存訓(xùn)練參數(shù)權(quán)重)

torch.onnx.export(model,dummy_input,"Domino_best.onnx",export_params=True)

13e5b982-0486-11ee-90ce-dac502259ad0.png

通過終端來將ONNX模型轉(zhuǎn)化成OpenVINO IR模型格式

在終端中輸入(Terminal):

mo --input_model Domino_best.onnx --compress_to_fp16

# mo 啟動OpenVINO 的Model Optimizer(模型優(yōu)化器) # input_model 輸入您轉(zhuǎn)換的ONNX模型內(nèi)容根的路徑 # compress _to_fp16 將模型輸出精度變?yōu)镕P16 等后一會,終端輸出:

13f02caa-0486-11ee-90ce-dac502259ad0.png ?

代表ONNX模型轉(zhuǎn)換成OpenVINO IR模型成功。這里的信息告訴我們該Model是IR 11的形式,并分別保存在.xml和.bin文件下。

轉(zhuǎn)換后的文件(ONNX —> IR 11):

140620dc-0486-11ee-90ce-dac502259ad0.png ?

mapping文件是一些轉(zhuǎn)換信息,暫時不會用到該文件。

至此,我們模型轉(zhuǎn)換的全部工作已經(jīng)完成,接下來就是運(yùn)用OpenVINO Runtime對IR 11模型進(jìn)行推理。

使用OpenVINO Runtime對IR 11模型進(jìn)行推理

在這一章節(jié)里我們將在Pycharm中使用OpenVINO Runtime對我們在1.2章中轉(zhuǎn)換得來的IR 11模型進(jìn)行推理,并將推理結(jié)果實(shí)時展現(xiàn)在攝像頭畫面中。

在開始之前,我們不妨了解推理程序的整個工作流程:

導(dǎo)入必要的功能庫(如openvino.runtime 以及 cv2和numpy)

探測硬件平臺所能使用的可搭載設(shè)備

創(chuàng)建核心對象以及加載模型和標(biāo)簽

輸入圖像進(jìn)行預(yù)處理,正則化,轉(zhuǎn)變成網(wǎng)絡(luò)輸入形狀

將處理后的圖像交由推理程序進(jìn)行推理,得到推理結(jié)果和處理時間并顯示出來

導(dǎo)入功能包

import openvino.runtime as ov

import numpy as np

import cv2

import time

這里一共導(dǎo)入4個功能包:

1. openvino.runtime 這是openvino runtime推理的主要功能包,也可用openvino.inference_engine進(jìn)行推理,過程大體是一致的。

2.numpy 這是常用的一個Python開源科學(xué)計(jì)算庫

3.cv2 也即OpenCV,用來處理有關(guān)圖像的一些信息

4.time 記錄系統(tǒng)運(yùn)行時間

設(shè)備檢測以及模型載入

我們可以使用Core對象中的available_devices函數(shù)來獲取當(dāng)前硬件平臺可供推理引擎使用的設(shè)備。

core = ov.Core()

print(core.available_devices)

如圖所示我們能得到在AlxBoard愛克斯開發(fā)板上可供我們使用的推理設(shè)備有CPU和GPU

14220dba-0486-11ee-90ce-dac502259ad0.png ?

將模型進(jìn)行載入:

# SZTU LIXROBO 23.5.19 #

#************************************#

# 1. 創(chuàng)建核心對象

core = ov.Core()

# 2. 規(guī)定IR 11模型的模型文件和權(quán)重文件

model = "Domino_best.xml"

weights = "Domino_best.bin"

# 3. 將模型文件和權(quán)重文件進(jìn)行讀取

model_ir = core.read_model(model= model,weights=weights)

# 4. 把模型加載到設(shè)備上

(此處使用HETERO插件進(jìn)行異構(gòu),加載到GPU和CPU上)

com_model_ir= core.compile_model(model=model_ir,device_name="HETERO:GPU,CPU")

# 5. 獲取模型輸出層

output_layer_ir = com_model_ir.outputs[0]

# 6. 由于是簡單模型,故label手動注入,也可使用導(dǎo)入標(biāo)簽文件等其他方式

label = ['BlueFake','BlueTrue','RedFake','RedTrue']

圖像預(yù)處理

得到的圖像我們需要做一些預(yù)先處理才能輸入到推理引擎中進(jìn)行推理并得到結(jié)果。這一小節(jié)我們將展示如何把圖像進(jìn)行處理。

#************************************#

# 圖像預(yù)處理、歸一化 #

def normalize(img: np.ndarray) ->np.ndarray:

# 1. 類型轉(zhuǎn)換成np.float32

img = img.astype(np.float32)

# 2. 設(shè)置常用均值和標(biāo)準(zhǔn)差來正則化

mean =(0.485,0.456,0.406)

std =(0.299,0.224,0.255)

img /=255.0

img -=mean

img /=std

# 3. 返回處理后的img

return img

#************************************#

# 圖像處理函數(shù) #

def img_pre(img):

# 1. 對OV輸入圖像顏色模型從BGR轉(zhuǎn)變成RGB

img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

# 2. 對圖像進(jìn)行裁切

res_img = cv2.resize(img, (224, 224))

# 3. 使用我們定義的預(yù)處理函數(shù)對圖像進(jìn)行處理

nor_img = normalize(res_img)

# 4. 將處理好的圖像轉(zhuǎn)變?yōu)榫W(wǎng)絡(luò)輸入形狀

nor_input_img = np.expand_dims(np.transpose(nor_img, (2, 0, 1)), 0)

# 5. 返回處理結(jié)果

return nor_input_img

推理過程以及結(jié)果展示

在上一節(jié)中我們把輸入圖像所要進(jìn)行的預(yù)處理圖像進(jìn)行了一個定義,在這一小節(jié)則是OpenVINO Runtime推理程序的核心。

#************************************#

# 推理主程序 #

def image_infer(img):

# 1. 設(shè)置記錄起始時間

start_time = time.time()

# 2. 將圖像進(jìn)行處理

imgb = img_pre(img)

# 3. 輸入圖像進(jìn)行推理,得到推理結(jié)果

res_ir = com_model_ir([imgb])[output_layer_ir]

# 4. 對結(jié)果進(jìn)行歸一化處理,使用Sigmod歸一

Confidence_Level = 1/(1+np.exp(-res_ir[0]))

# 5. 將結(jié)果進(jìn)行從小到大的排序,便于我們獲取置信度最高的類別

result_mask_ir = np.squeeze(np.argsort(res_ir, axis=1)).astype(np.uint8)

# 6. 用CV2的putText方法將置信度最高對應(yīng)的label以及其置信度繪制在圖像上

img = cv2.putText(img,str(label[result_mask_ir[3]])+' '+ str(Confidence_Level[result_mask_ir[3]]),(50,80), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2,cv2.LINE_AA)

# 7. 記錄推理結(jié)束時間

end_time = time.time()

# 8. 計(jì)算出攝像頭運(yùn)行幀數(shù)

FPS = 1 / (end_time - start_time)

# 9. 將幀數(shù)繪制在圖像上

img = cv2.putText(img, 'FPS ' + str(int(FPS)), (50, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2,cv2.LINE_AA)

# 10. 返回圖像

return img

以上推理函數(shù)編寫已經(jīng)完成。以下是運(yùn)行主程序:

#********************主程序***********************#

# 1. 獲取攝像頭

cap = cv2.VideoCapture(0)

# 2. 循環(huán)判斷

while 1:

# 1. 獲得實(shí)時畫面

success,frame = cap.read()

# 2. 把實(shí)時畫面交由推理函數(shù)進(jìn)行推理

frame = image_infer(frame)

# 3. 將畫面顯示在窗口

cv2.imshow("img",frame)

cv2.waitKey(1)

當(dāng)我們運(yùn)行該程序時,會得到如下畫面。

14308dea-0486-11ee-90ce-dac502259ad0.png143e7b1c-0486-11ee-90ce-dac502259ad0.png

如圖所示,我們的Pytorch模型成功在OpenVINO的優(yōu)化以及推理下成功部署在AlxBoard愛克斯開發(fā)板,幀數(shù)在40-60之間,推理的結(jié)果非常好,很穩(wěn)定。

與Pytorch模型 CPU推理進(jìn)行比較

原先推理的過程我們是通過torch功能庫進(jìn)行推理,我們將兩者進(jìn)行比較。

143e7b1c-0486-11ee-90ce-dac502259ad0.png14833f4a-0486-11ee-90ce-dac502259ad0.png

| 左為OpenVINO優(yōu)化推理,右為torch推理

如圖所示OpenVINO優(yōu)化推理過后的結(jié)果從實(shí)際幀數(shù)上看大約有5-8倍的提升,推理精度也有少許加強(qiáng)。

結(jié) 論

自訓(xùn)練Pytorch模型在通過OpenVINO Model Optimizer 模型優(yōu)化后用OpenVINO Runtime進(jìn)行推理,推理過程簡單清晰。推理僅需幾個核心函數(shù)便可實(shí)現(xiàn)基于自訓(xùn)練Pytorch模型的轉(zhuǎn)化以及推理程序。OpenVINO簡單易上手,提供了強(qiáng)大的資料庫供學(xué)者查閱,其包含了從模型建立到模型推理的全過程。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    635

    瀏覽量

    41350
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84688
  • Ubuntu系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    91

    瀏覽量

    3939
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    808

    瀏覽量

    13226

原文標(biāo)題:自訓(xùn)練Pytorch模型使用OpenVINO優(yōu)化并部署在AIxBoard?

文章出處:【微信號:SDNLAB,微信公眾號:SDNLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    請問電腦端Pytorch訓(xùn)練模型如何轉(zhuǎn)化為能在ESP32S3平臺運(yùn)行的模型?

    由題目, 電腦端Pytorch訓(xùn)練模型如何轉(zhuǎn)化為能在ESP32S3平臺運(yùn)行的模型? 如何把這個Pytorch
    發(fā)表于 06-27 06:06

    Pytorch模型訓(xùn)練實(shí)用PDF教程【中文】

    ?模型部分?還是優(yōu)化器?只有這樣不斷的通過可視化診斷你的模型,不斷的對癥下藥,才能訓(xùn)練出一個較滿意的模型。本教程內(nèi)容及結(jié)構(gòu):本教程內(nèi)容主要為在 Py
    發(fā)表于 12-21 09:18

    pytorch模型轉(zhuǎn)化為onxx模型的步驟有哪些

    首先pytorch模型要先轉(zhuǎn)化為onxx模型,然后從onxx模型轉(zhuǎn)化為rknn模型直接轉(zhuǎn)化會出現(xiàn)如下問題,環(huán)境都是正確的,論壇詢問后也沒給出
    發(fā)表于 05-09 16:36

    怎樣使用PyTorch Hub去加載YOLOv5模型

    使用 PyTorch Hub 加載自定義 20 類VOC訓(xùn)練的YOLOv5s 模型'best.pt'。TensorRT、ONNX 和 OpenVINO
    發(fā)表于 07-22 16:02

    通過Cortex來非常方便的部署PyTorch模型

    的工作。那么,問題是如何將 RoBERTa 部署為一個 JSON API,而不需要手動滾動所有這些自定義基礎(chǔ)設(shè)施? PyTorch 模型與 Cortex 一起投入生產(chǎn)你可以使用 Co
    發(fā)表于 11-01 15:25

    Pytorch模型轉(zhuǎn)換為DeepViewRT模型時出錯怎么解決?

    我最終可以在 i.MX 8M Plus 處理器上部署 .rtm 模型。 我遵循了 本指南,我 Pytorch 模型轉(zhuǎn)換為 ONNX 模型
    發(fā)表于 06-09 06:42

    如何將PyTorch模型OpenVINO trade結(jié)合使用?

    無法確定如何轉(zhuǎn)換 PyTorch 掩碼 R-CNN 模型以配合OpenVINO?使用。
    發(fā)表于 08-15 07:04

    無法使用MYRIAD在OpenVINO trade中運(yùn)行YOLOv7自定義模型怎么解決?

    無法確定如何將 YOLOv7 模型的重量(.pt 文件)轉(zhuǎn)換為OpenVINO?中間表示 (IR) 并推斷有 MYRIAD 的 IR
    發(fā)表于 08-15 08:29

    如何將Detectron2和Layout-LM模型轉(zhuǎn)換為OpenVINO中間表示(IR)和使用CPU插件進(jìn)行推斷?

    無法確定如何將 Detectron2* 和 Layout-LM* 模型轉(zhuǎn)換為OpenVINO?中間表示 (IR) 和使用 CPU 插件進(jìn)行推斷。
    發(fā)表于 08-15 06:23

    pytorch模型轉(zhuǎn)換需要注意的事項(xiàng)有哪些?

    和記錄張量上的操作,不會記錄任何控制流操作。 為什么不能是GPU模型? 答:BMNETP的編譯過程不支持。 如何將GPU模型轉(zhuǎn)成CPU模型? 答:在加載
    發(fā)表于 09-18 08:05

    OpenVINO模型優(yōu)化實(shí)測:PC/NB當(dāng)AI辨識引擎沒問題!

    這次我們將會自制一個CNN分類器,并透過OpenVINO模型轉(zhuǎn)換程序轉(zhuǎn)換成IR模型,并進(jìn)行模型效能與正確率分析。依據(jù)Intel官方網(wǎng)站的說
    的頭像 發(fā)表于 12-09 16:13 ?2399次閱讀

    訓(xùn)練Pytorch模型使用OpenVINO?優(yōu)化并部署在AI愛克斯開發(fā)板

    本文章依次介紹如何將 Pytorch 訓(xùn)練模型經(jīng)過一系列變換
    的頭像 發(fā)表于 05-26 10:23 ?942次閱讀
    <b class='flag-5'>自</b><b class='flag-5'>訓(xùn)練</b><b class='flag-5'>Pytorch</b><b class='flag-5'>模型</b>使用<b class='flag-5'>OpenVINO</b>?優(yōu)化并部署在AI愛克斯開發(fā)板

    沒有“中間商賺差價(jià)”, OpenVINO? 直接支持 PyTorch 模型對象

    體驗(yàn)—— OpenVINO 的 mo 工具可以直接 PyTorch 模型對象轉(zhuǎn)化為 OpenVINO
    的頭像 發(fā)表于 06-27 16:39 ?764次閱讀
    沒有“中間商賺差價(jià)”, <b class='flag-5'>OpenVINO</b>? 直接支持 <b class='flag-5'>PyTorch</b> <b class='flag-5'>模型</b>對象

    解讀PyTorch模型訓(xùn)練過程

    PyTorch作為一個開源的機(jī)器學(xué)習(xí)庫,以其動態(tài)計(jì)算圖、易于使用的API和強(qiáng)大的靈活性,在深度學(xué)習(xí)領(lǐng)域得到了廣泛的應(yīng)用。本文深入解讀PyTorch模型
    的頭像 發(fā)表于 07-03 16:07 ?1071次閱讀

    PyTorch神經(jīng)網(wǎng)絡(luò)模型構(gòu)建過程

    PyTorch,作為一個廣泛使用的開源深度學(xué)習(xí)庫,提供了豐富的工具和模塊,幫助開發(fā)者構(gòu)建、訓(xùn)練和部署神經(jīng)網(wǎng)絡(luò)模型。在神經(jīng)網(wǎng)絡(luò)模型中,輸出層是尤為關(guān)鍵的部分,它負(fù)責(zé)
    的頭像 發(fā)表于 07-10 14:57 ?502次閱讀