onnx 测试_ONNX 现场演示教程
ONNX 現(xiàn)場演示教程
譯者:馮寶寶
本教程將向您展示如何使用ONNX將已從PyTorch導(dǎo)出的神經(jīng)模型傳輸模型轉(zhuǎn)換為Apple CoreML格式。這將允許您在Apple設(shè)備上輕松運行深度學(xué)習(xí)模型,在這種情況下,可以從攝像機直播演示。
什么是ONNX
ONNX(開放式神經(jīng)網(wǎng)絡(luò)交換)是一種表示深度學(xué)習(xí)模型的開放格式。借助ONNX,AI開發(fā)人員可以更輕松地在最先進的工具之間移動模型,并選擇最適合它們的組合。ONNX由合作伙伴社區(qū)開發(fā)和支持。 您可以訪問 onnx.ai,了解有關(guān)ONNX的更多信息以及支持的工具。
教程預(yù)覽
本教程將帶你走過如下主要4步:
環(huán)境準備
我們將在虛擬環(huán)境工作,以避免與您的本地環(huán)境沖突。在本教程中使用Python 3.6,但其他版本也應(yīng)該可以正常工作。
python3.6 -m venv venv
source ./venv/bin/activate
我們需要安裝Pytorch和 onnx->coreml 轉(zhuǎn)換器:
pip install torchvision onnx-coreml
如果要在iPhone上運行iOS樣式傳輸應(yīng)用程序,還需要安裝XCode。您也可以在Linux中轉(zhuǎn)換模型,但要運行iOS應(yīng)用程序本身,您將需要一臺Mac。
下載(或訓(xùn)練)Pytorch風(fēng)格裝換模型
在本教程中,我們將使用與pytorch一起發(fā)布的樣式傳輸模型,地址為https://github.com/pytorch/examples/tree/master/fast_neural_style。如果您想使用其他PyTorch或ONNX模型,請隨意跳過此步驟。
這些模型用于在靜態(tài)圖像上應(yīng)用樣式傳輸,并且實際上沒有針對視頻進行優(yōu)化以獲得足夠快的速度。但是,如果我們將分辨率降低到足夠低,它們也可以很好地處理視頻。
我們先下載模型:
git clone https://github.com/pytorch/examples
cd examples/fast_neural_style
如果您想自己訓(xùn)練模型,您剛剛克隆下載的的pytorch/examples存儲庫有更多關(guān)于如何執(zhí)行此操作的信息。目前,我們只需使用存儲庫提供的腳本下載預(yù)先訓(xùn)練的模型:
./download_saved_models.sh
此腳本下載預(yù)先訓(xùn)練的PyTorch模型并將它們放入saved_models文件夾中。 你的目錄中現(xiàn)在應(yīng)該有4個文件,candy.pth,mosaic.pth,rain_princess.pth和udnie.pth。
將PyTorch模型轉(zhuǎn)換至ONNX模型
現(xiàn)在我們已將預(yù)先訓(xùn)練好的PyTorch模型作為saved_models文件夾中的.pth文件,我們需要將它們轉(zhuǎn)換為ONNX格式。模型定義在我們之前克隆的pytorch/examples存儲庫中,通過幾行python我們可以將它導(dǎo)出到ONNX。在這種情況下,我們將調(diào)用torch.onnx._export而不是實際運行神經(jīng)網(wǎng)絡(luò),它將PyTorch作為api提供,以直接從PyTorch導(dǎo)出ONNX格式的模型。但是,在這種情況下,我們甚至不需要這樣做,因為腳本已經(jīng)存在Neural_style / neural_style.py,它將為我們執(zhí)行此操作。如果要將其應(yīng)用于其他模型,也可以查看該腳本。
從PyTorch導(dǎo)出ONNX格式本質(zhì)上是追蹤您的神經(jīng)網(wǎng)絡(luò),因此這個api調(diào)用將在內(nèi)部運行網(wǎng)絡(luò)“虛擬數(shù)據(jù)”以生成圖形。為此,它需要輸入圖像來應(yīng)用樣式轉(zhuǎn)移,其可以簡單地是空白圖像。但是,此圖像的像素大小很重要,因為這將是導(dǎo)出的樣式傳輸模型的大小。為了獲得良好的性能,我們將使用250x540的分辨率。如果您不太關(guān)心FPS,可以隨意采取更大的分辨率,更多關(guān)于風(fēng)格轉(zhuǎn)移質(zhì)量。
讓我們使用ImageMagick創(chuàng)建我們想要的分辨率的空白圖像:
convert -size 250x540 xc:white png24:dummy.jpg
然后用它來導(dǎo)出PyTorch模型用它來導(dǎo)出PyTorch模型:
python ./neural_style/neural_style.py eval --content-image dummy.jpg --output-image dummy-out.jpg --model ./saved_models/candy.pth --cuda 0 --export_onnx ./saved_models/candy.onnx
python ./neural_style/neural_style.py eval --content-image dummy.jpg --output-image dummy-out.jpg --model ./saved_models/udnie.pth --cuda 0 --export_onnx ./saved_models/udnie.onnx
python ./neural_style/neural_style.py eval --content-image dummy.jpg --output-image dummy-out.jpg --model ./saved_models/rain_princess.pth --cuda 0 --export_onnx ./saved_models/rain_princess.onnx
python ./neural_style/neural_style.py eval --content-image dummy.jpg --output-image dummy-out.jpg --model ./saved_models/mosaic.pth --cuda 0 --export_onnx ./saved_models/mosaic.onnx
你應(yīng)該得到4個文件,candy.onnx,mosaic.onnx,rain_princess.onnx和udnie.onnx,由相應(yīng)的.pth文件創(chuàng)建。
將ONNX模型轉(zhuǎn)換至CoreML模型
現(xiàn)在我們有了ONNX模型,我們可以將它們轉(zhuǎn)換為CoreML模型,以便在Apple設(shè)備上運行它們。為此,我們使用之前安裝的onnx-coreml轉(zhuǎn)換器。轉(zhuǎn)換器附帶一個convert-onnx-to-coreml腳本,上面的安裝步驟添加到我們的路徑中。遺憾的是,這對我們不起作用,因為我們需要將網(wǎng)絡(luò)的輸入和輸出標(biāo)記為圖像,并且雖然這是轉(zhuǎn)換器支持的,但只有在從python調(diào)用轉(zhuǎn)換器時才支持它。
通過查看樣式傳輸模型(例如在像Netron這樣的應(yīng)用程序中打開.onnx文件),我們看到輸入名為'0',輸出名為'186'。這些只是PyTorch分配的數(shù)字ID。我們需要將它們標(biāo)記為圖像。
所以讓我們創(chuàng)建一個python小文件并將其命名為onnx_to_coreml.py。這可以通過使用touch命令創(chuàng)建,并使用您喜歡的編輯器進行編輯,以添加以下代碼行。
import sys
from onnx import onnx_pb
from onnx_coreml import convert
model_in = sys.argv[1]
model_out = sys.argv[2]
model_file = open(model_in, 'rb')
model_proto = onnx_pb.ModelProto()
model_proto.ParseFromString(model_file.read())
coreml_model = convert(model_proto, image_input_names=['0'], image_output_names=['186'])
coreml_model.save(model_out)
現(xiàn)在來運行:
python onnx_to_coreml.py ./saved_models/candy.onnx ./saved_models/candy.mlmodel
python onnx_to_coreml.py ./saved_models/udnie.onnx ./saved_models/udnie.mlmodel
python onnx_to_coreml.py ./saved_models/rain_princess.onnx ./saved_models/rain_princess.mlmodel
python onnx_to_coreml.py ./saved_models/mosaic.onnx ./saved_models/mosaic.mlmodel
現(xiàn)在,您的saved_models目錄中應(yīng)該有4個CoreML模型:candy.mlmodel,mosaic.mlmodel,rain_princess.mlmodel和udnie.mlmodel。
在支持風(fēng)格轉(zhuǎn)換iOS App中運行CoreML模型
此存儲庫(即您當(dāng)前正在閱讀README.md的存儲庫)包含一個iOS應(yīng)用程序,可以在手機攝像頭的實時攝像頭流上運行CoreML樣式傳輸模型。
git clone https://github.com/onnx/tutorials
并在XCode中打開tutorials/examples/CoreML/NNXLive/ONNXLive.xcodeproj項目。我們建議使用XCode 9.3和iPhone X。在舊設(shè)備或XCode版本上可能會出現(xiàn)問題。
在Models/文件夾中,項目包含一些.mlmodel文件。我們將用我們剛剛創(chuàng)建的模型替換它們。
然后你在iPhone上運行應(yīng)用程序就可以了。點擊屏幕可切換模型。
結(jié)論
我們希望本教程能夠概述ONNX的內(nèi)容以及如何使用它來在框架之間轉(zhuǎn)換神經(jīng)網(wǎng)絡(luò),在這種情況下,神經(jīng)風(fēng)格的傳輸模型從PyTorch轉(zhuǎn)移到CoreML。
您可以隨意嘗試這些步驟并在自己的模型上進行測試。如果您遇到任何問題或想要提供反饋,請告訴我們。我們傾聽你的想法。
總結(jié)
以上是生活随笔為你收集整理的onnx 测试_ONNX 现场演示教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为手机归来:能与苹果硬刚的还得是华为?
- 下一篇: vs2013怎么清理解决方案_厕所漏水怎