天天看點

pytorch——訓練第一個分離器講解_PyTorch專欄(十三):使用ONNX将模型轉移至Caffe2和移動端...

pytorch——訓練第一個分離器講解_PyTorch專欄(十三):使用ONNX将模型轉移至Caffe2和移動端...

作者 | News

編輯 | 奇予紀

出品 | 磐創AI團隊出品

【磐創AI 導讀】:本篇文章講解了PyTorch專欄的第四章中的使用ONNX将模型轉移至Caffe2和移動端。檢視專欄曆史文章,請點選下方藍色字型進入相應連結閱讀。檢視關于本專欄的介紹:PyTorch專欄開篇。想要更多電子雜志的機器學習,深度學習資源,大家歡迎點選上方藍字關注我們的公衆号:磐創AI。

專欄目錄: 第一章: PyTorch之簡介與下載下傳

  • PyTorch簡介
  • PyTorch環境搭建

第二章:PyTorch之60分鐘入門

  • PyTorch入門
  • PyTorch自動微分
  • PyTorch神經網絡
  • PyTorch圖像分類器
  • PyTorch資料并行處理

第三章:PyTorch之入門強化

  • 資料加載和處理
  • PyTorch小試牛刀
  • 遷移學習
  • 混合前端的seq2seq模型部署
  • 儲存和加載模型

第四章:PyTorch之圖像篇

  • 微調基于torchvision 0.3的目标檢測模型
  • 微調TorchVision模型
  • 空間變換器網絡
  • 使用PyTorch進行神經傳遞
  • 生成對抗示例
  • 使用ONNX将模型轉移至Caffe2和移動端

第五章:PyTorch之文本篇

  • 聊天機器人教程
  • 使用字元級RNN生成名字
  • 使用字元級RNN進行名字分類
  • 在深度學習和NLP中使用Pytorch
  • 使用Sequence2Sequence網絡和注意力進行翻譯

第六章:PyTorch之生成對抗網絡 第七章:PyTorch之強化學習

使用ONNX将模型轉移至Caffe2和移動端

在本教程中,我們将介紹如何使用 ONNX 将 PyTorch 中定義的模型轉換為 ONNX 格式,然後将其加載到 Caffe2 中。 一旦進入 Caffe2,我們就可以運作模型來仔細檢查它是否正确導出,然後我們展示了如何使用 Caffe2 功能(如移動導出器)在移動裝置上執行模型。

在本教程中,您需要安裝onnx和Caffe2。您可以使用

pip install onnx

來擷取 onnx。

注意:本教程需要 PyTorch master 分支,可以按照這裡說明進行安裝。

1.引入模型

1.1 `SuperResolution`模型

超分辨率是一種提高圖像、視訊分辨率的方法,廣泛用于圖像處理或視訊剪輯。在本教程中,我們将首先使用帶有虛拟輸入的小型超分辨率模型。

首先,讓我們在 PyTorch 中建立一個

SuperResolution

模型。這個模型直接來自 PyTorch 的例子,沒有修改:

1.2 訓練模型

通常,你現在會訓練這個模型; 但是,對于本教程我們将下載下傳一些預先訓練的權重。請注意,此模型未經過充分訓練來獲得良好的準确性,此處僅用于示範目的。

1.3 導出模型

在 PyTorch 中通過跟蹤工作導出模型。要導出模型,請調用

torch.onnx._export()

函數。這将執行模型,記錄運算符用于計算輸出的軌迹。因為

_export

運作模型,我們需要提供輸入張量

x

。這個張量的值并不重要; 它可以是圖像或随機張量,隻要它大小是正确的。

要了解有關PyTorch導出界面的更多詳細資訊,請檢視torch.onnx documentation文檔。

torch_out

是執行模型後的輸出。通常您可以忽略此輸出,但在這裡我們将使用它來驗證我們導出的模型在Caffe2中運作時是否計算出相同的值。

1.4 采用ONNX表示模型并在Caffe2中使用

現在讓我們采用 ONNX 表示并在 Caffe2 中使用它。這部分通常可以在一個單獨的程序中或在另一台機器上完成,但我們将在同一個程序中繼續,以便我們可以驗證 Caffe2 和 PyTorch 是否為網絡計算出相同的值:

我們應該看到 PyTorch 和 Caffe2 的輸出在數字上比對最多3位小數。作為旁注,如果它們不比對則存在 Caffe2 和 PyTorch 中的運算符以不同方式實作的問題,請在這種情況下與我們聯系。

2.使用ONNX轉換SRResNET

使用與上述相同的過程,我們參考文章中提出的超分辨率轉移了一個有趣的新模型

“SRResNet”

(感謝Twitter上的作者為本教程的目的提供了代碼和預訓練參數)。可在此處找到模型定義和預訓練模型。下面是 SRResNet 模型的輸入、輸出。

pytorch——訓練第一個分離器講解_PyTorch專欄(十三):使用ONNX将模型轉移至Caffe2和移動端...

3.在移動裝置上運作模型

到目前為止,我們已經從 PyTorch 導出了一個模型,并展示了如何加載它并在 Caffe2 中運作它。現在模型已加載到 Caffe2 中,我們可以将其轉換為适合在移動裝置上運作的格式。

我們将使用 Caffe2 的mobile_exporter生成可在移動裝置上運作的兩個模型

protobufs

。第一個用于使用正确的權重初始化網絡,第二個實際運作執行模型。在本教程的其餘部分,我們将繼續使用小型超分辨率模型。

init_net

具有模型參數和嵌入在其中的模型輸入,

predict_net

将用于指導運作時的

init_net

執行。在本教程中,我們将使用上面生成的

init_net

predict_net

,并在正常的 Caffe2 後端和移動裝置中運作它們,并驗證兩次運作中生成的輸出高分辨率貓咪圖像是否相同。

在本教程中,我們将使用廣泛使用的著名貓咪圖像,如下所示:

pytorch——訓練第一個分離器講解_PyTorch專欄(十三):使用ONNX将模型轉移至Caffe2和移動端...

3.1 加載圖像并預處理

首先,讓我們加載圖像,使用标準的

skimage python

庫對其進行預處理。請注意,此預處理是處理用于訓練/測試神經網絡的資料的标準做法。

3.2 在Caffe2運作并輸出

現在,作為下一步,讓我們拍攝調整大小的貓圖像并在 Caffe2 後端運作超分辨率模型并儲存輸出圖像。這裡的圖像處理步驟已經從 PyTorch 實作的超分辨率模型中采用。

從上面的輸出中,我們可以看到輸入名為“9”,輸出名為“27”(我們将數字作為blob名稱有點奇怪,但這是因為跟蹤

JIT

為模型生成了編号條目)。

現在,我們将在這裡回顧PyTorch實作超分辨率模型的後處理步驟,以建構最終輸出圖像并儲存圖像。

3.3 在移動端上執行模型

我們已經完成了在純Caffe2後端運作我們的移動網絡,現在,讓我們在Android裝置上執行該模型并擷取模型輸出。

注意:對于 Android 開發,需要

adb shell

,否則教程的以下部分将無法運作。

在我們在移動裝置上運作模型的第一步中,我們把基于移動裝置的本機速度測試基準二進制檔案推送到 adb 。

這個二進制檔案可以在移動裝置上執行模型,也可以導出我們稍後可以檢索的模型輸出。二進制檔案可在此處獲得。要建構二進制檔案,請按照此處的說明執行

build_android.sh

腳本。

注意:你需要已經安裝了

ANDROID_NDK

,并且設定環境變量

ANDROID_NDK=path to ndk root

現在,您可以比較圖像 cat_superres.jpg(來自純caffe2後端執行的模型輸出)和 cat_superres_mobile.jpg(來自移動執行的模型輸出),并看到兩個圖像看起來相同。

如果它們看起來不一樣,那麼在移動裝置上執行會出現問題,在這種情況下,請聯系Caffe2社群。你應該期望看

pytorch——訓練第一個分離器講解_PyTorch專欄(十三):使用ONNX将模型轉移至Caffe2和移動端...

使用上述步驟,您可以輕松地在移動裝置上部署模型。另外,有關caffe2移動後端的更多資訊,請檢視caffe2-android-demo。

pytorch——訓練第一個分離器講解_PyTorch專欄(十三):使用ONNX将模型轉移至Caffe2和移動端...
pytorch——訓練第一個分離器講解_PyTorch專欄(十三):使用ONNX将模型轉移至Caffe2和移動端...
pytorch——訓練第一個分離器講解_PyTorch專欄(十三):使用ONNX将模型轉移至Caffe2和移動端...

相關連結:

  • SuperResolution模型:https://github.com/pytorch/examples/blob/master/super_resolution/model.py
  • torch.onnx documentation文檔:

    https://pytorch.org/docs/master/onnx.html

  • “SRResNet”參考文章:

    https://arxiv.org/pdf/1609.04802.pdf

  • “SRResNet”模型定義和預訓練模型:https://gist.github.com/prigoyal/b245776903efbac00ee89699e001c9bd
  • PyTorch實作超分辨率模型的後處理步驟:https://github.com/pytorch/examples/blob/master/super_resolution/super_resolve.py
  • 二進制檔案:https://github.com/caffe2/caffe2/blob/master/caffe2/binaries/speed_benchmark.cc
  • 二進制檔案說明:https://github.com/caffe2/caffe2/blob/master/scripts/build_android.sh
  • caffe2-android-demo:

    https://caffe2.ai/docs/AI-Camera-demo-android.html

也許你還想 看 : ●  PyTorch專欄(八):微調基于torchvision 0.3的目标檢測模型 ●   PyTorch專欄(七):模型儲存與加載那些事 ●  PyTorch專欄(六): 混合前端的seq2seq模型部署 ●  PyTorch專欄(五):遷移學習 ●  PyTorch專欄(四):小試牛刀 ●   PyTorch專欄開篇 歡迎掃碼關注:

pytorch——訓練第一個分離器講解_PyTorch專欄(十三):使用ONNX将模型轉移至Caffe2和移動端...
pytorch——訓練第一個分離器講解_PyTorch專欄(十三):使用ONNX将模型轉移至Caffe2和移動端...

  下方點選  |  閱讀原文 |  了解更多