
作者 | 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 模型的輸入、輸出。
3.在移動裝置上運作模型
到目前為止,我們已經從 PyTorch 導出了一個模型,并展示了如何加載它并在 Caffe2 中運作它。現在模型已加載到 Caffe2 中,我們可以将其轉換為适合在移動裝置上運作的格式。
我們将使用 Caffe2 的mobile_exporter生成可在移動裝置上運作的兩個模型
protobufs
。第一個用于使用正确的權重初始化網絡,第二個實際運作執行模型。在本教程的其餘部分,我們将繼續使用小型超分辨率模型。
init_net
具有模型參數和嵌入在其中的模型輸入,
predict_net
将用于指導運作時的
init_net
執行。在本教程中,我們将使用上面生成的
init_net
和
predict_net
,并在正常的 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社群。你應該期望看
使用上述步驟,您可以輕松地在移動裝置上部署模型。另外,有關caffe2移動後端的更多資訊,請檢視caffe2-android-demo。
相關連結:
- 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專欄開篇 歡迎掃碼關注:
下方點選 | 閱讀原文 | 了解更多