之前說過一個c++上調(diào)用pytorch現(xiàn)在又反過來了~~ 其實還是僅用c代碼哈 生產(chǎn)環(huán)境還是用這個
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設,馬關企業(yè)網(wǎng)站建設,馬關品牌網(wǎng)站建設,網(wǎng)站定制,馬關網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,馬關網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。C++推理框架ncnn為例,介紹一下部署的大致流程
PyTorch模型 -->ONNX格式 -->C++推理框架
其它C++推理框架的思路類似,唯一的學習成本是推理框架本身的API。
一、PyTorch模型轉(zhuǎn)ONNXONNX is an open format built to represent machine learning models. ONNX defines a common set ?of operators - the building blocks of machine learning and deep ?learning models - and a common file format to enable AI developers to ?use models with a variety of frameworks, tools, runtimes, and compilers.
簡單來說,可以把ONNX當做一個中間格式。絕大多數(shù)的機器學習/深度學習框架都可以將自身的模型轉(zhuǎn)換成ONNX,同樣也能把ONNX轉(zhuǎn)換成自身框架的格式,如下圖所示。
圖1 不同框架的模型利用ONNX進行相互轉(zhuǎn)換?
ONNX官網(wǎng)地址:https://onnx.ai/
在PyTorch中,可以用如下方法非常方便地將一個PyTorch模型存儲為ONNX格式:
import?torch
#?指定輸入尺寸,ONNX需要這個信息來確定輸入大小
#?參數(shù)對應于?(batch_size,?channels,?H,?W)
dummy_input?=?torch.randn(1,?3,?224,?224,?device="cuda")
#?model為模型自身
#?dummy_input根據(jù)自己的需求更改其尺寸
#?"model.onnx"為輸出文件,更改為自己的路徑即可
torch.onnx.export(model,?dummy_input,?"model.onnx")
torch.onnx.export還有一些額外的參數(shù)可以實現(xiàn)更靈活的使用方法,詳見https://pytorch.org/docs/stable/onnx.html。本文的示例足以讓您能夠成功部署自己的模型。
需要注意的是,ONNX的目的是“通用”,所以難免會在一些情況出現(xiàn)算子不兼容的情況。具體的表現(xiàn)是,當你把某個框架(例如PyTorch)的模型轉(zhuǎn)成ONNX后,再將ONNX轉(zhuǎn)成另一框架模型(例如ncnn)時,可能會報錯(xxx算子不支持)。不兼容的情況多種多樣,這里不舉例說明了,需要具體情況具體分析。
一些有效的解決方法:
使用ONNXSIM對ONNX模型進行精簡。非常有效。個人建議:只要使用了ONNX,都用ONNXSIM對ONNX模型進行處理一次。Github地址:https://github.com/daquexian/onnx-simplifier。使用非常方便,使用“pip install onnxsim”安裝,然后使用命令“onnxsim input_onnx_model_path output_onnx_model_path”即可。代碼中調(diào)用也很簡單,參考Git地址里的示例。
避免依賴于中間變量的尺寸來進行運算。比如,在一些Image to Image的任務中,可能會根據(jù)中間tensor的尺寸來對另一些tensor進行resize。這時我們的做法是先去獲取中間tensor的尺寸H、W,然后將它們作為參數(shù)送給其它方法。當遇到這種運算時,ONNX似乎會創(chuàng)建兩個與H、W相關的變量,但它們的值會綁定為用dummy_input去forward一次時得到的H、W。這個值一旦綁定就不會改變。所以后續(xù)當使用不同尺寸輸入時極大概率會報錯(這點沒有仔細驗證過,但看中間結果很像是這種情況)。
另外強烈建議使用一些網(wǎng)絡可視化工具。當遇到模型轉(zhuǎn)換報錯時可以用來方便定位出錯的位置。個人比較喜歡的是netron,地址:https://github.com/lutzroeder/netron
放一張倉庫中的圖,效果如下:
二、ONNX轉(zhuǎn)ncnnncnn是騰訊開源的輕量級推理框架。簡單易用是它大的特點。但當功耗、時耗是主要考慮點的時候,需要多嘗試其它框架,如TensorFlow Lite。
ncnn地址:https://github.com/Tencent/ncnn
ncnn提供了將onnx轉(zhuǎn)換為ncnn格式的工具。可以在此處找到:https://github.com/Tencent/ncnn/releases。例如,在Windows下,可以下載https://github.com/Tencent/ncnn/releases/download/20221128/ncnn-20221128-windows-vs2017.zip。解壓后在x64或x86的bin文件夾中能夠找到onnx2ncnn.exe。在命令行中使用如下命令即可將onnx轉(zhuǎn)換為ncnn格式:
onnx2ncnn.exe?onnx_model_path?[ncnn.param]?[ncnn.bin]
onnx_model_path 替換為自己的onnx模型地址。后兩個參數(shù)可選。如果不寫,那么會在onnx2ncnn.exe同目錄下產(chǎn)生轉(zhuǎn)換后的ncnn模型文件:一個.param文件和一個.bin文件。也可以自己填后兩個參數(shù)來自己指定文件輸出路徑。
三、在ncnn下進行模型推理在任何框架下推理都只需要兩步:加載模型和將數(shù)據(jù)轉(zhuǎn)化為框架格式。
ncnn下加載模型的方法為(還有其它方法):
ncnn::Net?model;??//?定義一個模型
model.load_param("model.param");???//?加載模型的param文件
model.load_model("model.bin");????????//?加載模型的bin文件
加載模型后,只需要將數(shù)據(jù)轉(zhuǎn)化為ncnn的格式即可。ncnn模型輸入的格式是ncnn::Mat。
OpenCV的Mat轉(zhuǎn)ncnn::Mat的方法全列于此處:
https://github.com/Tencent/ncnn/wiki/use-ncnn-with-opencv
如:
//?cv::Mat?a(h,?w,?CV_8UC3);
ncnn::Mat?in?=?ncnn::Mat::from_pixels(a.data,?ncnn::Mat::PIXEL_BGR2RGB,?a.cols,?a.rows);
在JNI中要將一個android bitmap轉(zhuǎn)換為ncnn::Mat可參考官方示例:https://github.com/nihui/ncnn-android-squeezenet/blob/master/app/src/main/jni/squeezencnn_jni.cpp
代碼如:
//?ncnn?from?bitmap
ncnn::Mat?in?=?ncnn::Mat::from_android_bitmap(env,?bitmap,?ncnn::Mat::PIXEL_BGR);
有了模型和輸入,最后forward一次,再取結果即可:
ncnn::Extractor?ex?=?model.create_extractor();
//?input_name?可以通過netron對.param或.bin文件進行查看
//?將input_name替換為模型的第一個輸入位置的名字即可
?ex.input(input_name,?in);
ncnn::Mat?out;??//?用來存放輸出結果
//?output_name可以通過netron對.param或.bin文件進行查看
//?將output_name替換為模型的輸出位置的名字即可
ex.extract(output_name,?out);
只要是轉(zhuǎn)換模型,大多數(shù)路徑都是如此,學習成本并不高。主要是學習推理框架的成本。芯片廠商自身的推理框架相對復雜點,各種奇奇怪怪的條條框框。
whaosoft aiot?http://143ai.com??
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
本文標題:Pytorch使用c++調(diào)用模型-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://jinyejixie.com/article40/dcggho.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、營銷型網(wǎng)站建設、品牌網(wǎng)站建設、外貿(mào)建站、網(wǎng)站導航、網(wǎng)站設計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容