成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Pytorch使用c++調(diào)用模型-創(chuàng)新互聯(lián)

之前說過一個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)ONNX

ONNX 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算子不支持)。不兼容的情況多種多樣,這里不舉例說明了,需要具體情況具體分析。

一些有效的解決方法:

  1. 使用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地址里的示例。

  2. 避免依賴于中間變量的尺寸來進行運算。比如,在一些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)ncnn

ncnn是騰訊開源的輕量級推理框架。簡單易用是它大的特點。但當功耗、時耗是主要考慮點的時候,需要多嘗試其它框架,如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)

h5響應式網(wǎng)站建設
孝感市| 留坝县| 德州市| 兰州市| 大埔区| 大姚县| 汉川市| 汾阳市| 赫章县| 朝阳市| 砚山县| 磐安县| 娱乐| 定陶县| 克山县| 龙陵县| 灵石县| 和平县| 嘉义县| 吉水县| 祁阳县| 和硕县| 芮城县| 蒙城县| 巢湖市| 茂名市| 宁晋县| 台南市| 定边县| 西充县| 光山县| 响水县| 凤阳县| 囊谦县| 奎屯市| 百色市| 唐河县| 达拉特旗| 娱乐| 德阳市| 页游|