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