国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

python pytorch模型轉(zhuǎn)onnx模型(多輸入+動(dòng)態(tài)維度)

這篇具有很好參考價(jià)值的文章主要介紹了python pytorch模型轉(zhuǎn)onnx模型(多輸入+動(dòng)態(tài)維度)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

(多輸入+動(dòng)態(tài)維度)整理的自定義神經(jīng)網(wǎng)絡(luò)pt轉(zhuǎn)onnx過(guò)程的python代碼,記錄了pt文件轉(zhuǎn)onnx全過(guò)程,簡(jiǎn)單的修改即可應(yīng)用。

1、編寫(xiě)預(yù)處理代碼

預(yù)處理代碼 與torch模型的預(yù)處理代碼一樣

def preprocess(img):
	img = (cv2.cvtColor(img, cv2.COLOR_BGR2RGB)).transpose(2, 0, 1)
	img = np.expand_dims(img, 0)
	sh_im = img.shape
	if sh_im[2]%2==1:
    	img = np.concatenate((img, img[:, :, -1, :][:, :, np.newaxis, :]), axis=2)

	if sh_im[3]%2==1:
    	img = np.concatenate((img, img[:, :, :, -1][:, :, :, np.newaxis]), axis=3)

	img = normalize(img)
	img = torch.Tensor(img)
	return img

2、用onnxruntime導(dǎo)出onnx

def export_onnx(net, model_path, img, nsigma, onnx_outPath):
	nsigma /= 255.
	if torch.cuda.is_available():
    	state_dict = torch.load(model_path)
    	model = net.cuda()
    	dtype = torch.cuda.FloatTensor
    else:
    	state_dict = torch.load(model_path, map_location='cpu')
    	state_dict = remove_dataparallel_wrapper(state_dict)
    	model = net
    	dtype = torch.FloatTensor

	img = Variable(img.type(dtype))
	nsigma = Variable(torch.FloatTensor([nsigma]).type(dtype))

	# 我這里預(yù)訓(xùn)練權(quán)重中參數(shù)名字與網(wǎng)絡(luò)名字不同
	# 相同的話可直接load_state_dict(state_dict)
	new_state_dict = {}
	for k, v in state_dict.items():
    	new_state_dict[k[7:]] = v
	model.load_state_dict(new_state_dict)
		
	# 設(shè)置onnx的輸入輸出列表,多輸入多輸出就設(shè)置多個(gè)
	input_list = ['input', 'nsigma']
	output_list = ['output']

	# onnx模型導(dǎo)出
	# dynamic_axes為動(dòng)態(tài)維度,如果自己的輸入輸出是維度變化的建議設(shè)置,否則只能輸入固定維度的tensor
	torch.onnx.export(model, (img, nsigma), onnx_outPath, verbose=True, opset_version=11, export_params=True,
		 				input_names=input_list, output_names=output_list,
		 				dynamic_axes={'input_img': {0: 'batch', 1: 'channel', 2: 'height', 3: 'width'},
		 				'output': {0: 'batch', 1: 'channel', 2: 'height', 3: 'width'}}) 

導(dǎo)出結(jié)果
onnx多個(gè)輸入,python,pytorch,開(kāi)發(fā)語(yǔ)言
onnx多個(gè)輸入,python,pytorch,開(kāi)發(fā)語(yǔ)言

3、對(duì)導(dǎo)出的模型進(jìn)行檢查

此處為檢查onnx模型節(jié)點(diǎn),后面如果onnx算子不支持轉(zhuǎn)engine時(shí),方便定位節(jié)點(diǎn),找到不支持的算子進(jìn)行修改

def check_onnx(onnx_model_path):
	model = onnx.load(onnx_model_path)
	onnx.checker.check_model((model))
	print(onnx.helper.printable_graph(model.graph))

下面貼出輸出結(jié)果
onnx多個(gè)輸入,python,pytorch,開(kāi)發(fā)語(yǔ)言
onnx多個(gè)輸入,python,pytorch,開(kāi)發(fā)語(yǔ)言
netron可視化
onnx多個(gè)輸入,python,pytorch,開(kāi)發(fā)語(yǔ)言

4、推理onnx模型,查看輸出是否一致

    def run_onnx(onnx_model_path, test_img, nsigma):
		nsigma /= 255.
		with torch.no_grad:
    	# 這里默認(rèn)是cuda推理torch.cuda.FloatTensor
    	img = Variable(test_img.type(torch.cuda.FloatTensor))
    	nsigma = Variable(torch.FloatTensor([nsigma]).type(torch.cuda.FloatTensor))
    	# 設(shè)置GPU推理
    	device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    	providers = ['CUDAExecutionProvider'] if device != "cpu" else ['CPUExecutionProvider']

    	# 通過(guò)創(chuàng)建onnxruntime session來(lái)運(yùn)行onnx模型
    	ort_session = ort.InferenceSession(onnx_model_path, providers=providers)
    	output = ort_session.run(output_names=['output'],
                             	input_feed={'input_img': np.array(img.cpu(), dtype=np.float32),
                                'nsigma':  np.array(nsigma.cpu(), dtype=np.float32)})
		return output

5、對(duì)onnx模型的輸出進(jìn)行處理,顯示cv圖像

def postprocess(img, img_noise_estime):
    out = torch.clamp(img-img_noise_estime, 0., 1.)
    outimg = variable_to_cv2_image(out)
    cv2.imshow(outimg)

6、編輯主函數(shù)進(jìn)行測(cè)試

def main():

    ##############################
    #
    #        onnx模型導(dǎo)出
    #
    ##############################

    # pt權(quán)重路徑:自己的路徑 + mypt.pt
    model_path = "D:/python/ffdnet-pytorch/models/net_rgb.pth"
    # export onnx模型時(shí)輸入進(jìn)去數(shù)據(jù),用于onnx記錄網(wǎng)絡(luò)的計(jì)算過(guò)程
    export_feed_path = "D:/python/ffdnet-pytorch/noisy.png"
    # onnx模型導(dǎo)出的路徑
    onnx_outpath = "D:/python/ffdnet-pytorch/models/myonnx.onnx"

    # 實(shí)例化自己的網(wǎng)絡(luò)模型并設(shè)置輸入?yún)?shù)
    net = FFDNet(num_input_channels=3)
    nsigma = 25

    # onnx 導(dǎo)出
    img = cv2.imread(export_feed_path)
    input = preprocess(img)

    export_onnx(net, model_path, input, nsigma, onnx_outpath)
    print("export success!")
    ##############################
    #
    #        檢查onnx模型
    #
    ##############################

    check_onnx(onnx_outpath)
    # netron可視化網(wǎng)絡(luò),可視化用節(jié)點(diǎn)記錄的網(wǎng)絡(luò)推理流程
    netron.start(onnx_outpath)

    ##############################
    #
    #        運(yùn)行onnx模型
    #
    ##############################

    # 此處過(guò)程是數(shù)據(jù)預(yù)處理 ---> 調(diào)用run_onnx函數(shù) ---> 對(duì)模型輸出后處理
    # 具體代碼就不再重復(fù)了

#完整代碼文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-754149.html

import time
import netron
import cv2
import torch
import onnx
import numpy as np
from torch.autograd import Variable
import onnxruntime as ort

from models import FFDNet
from utils import remove_dataparallel_wrapper, normalize, variable_to_cv2_image


# 此處為預(yù)處理代碼 與torch模型的預(yù)處理代碼一樣
def preprocess(img):
    img = (cv2.cvtColor(img, cv2.COLOR_BGR2RGB)).transpose(2, 0, 1)
    img = np.expand_dims(img, 0)
    sh_im = img.shape
    if sh_im[2]%2==1:
        img = np.concatenate((img, img[:, :, -1, :][:, :, np.newaxis, :]), axis=2)

    if sh_im[3]%2==1:
        img = np.concatenate((img, img[:, :, :, -1][:, :, :, np.newaxis]), axis=3)

    img = normalize(img)
    img = torch.Tensor(img)
    return img

# 此處為onnx模型導(dǎo)出的代碼,包括torch模型的pt權(quán)重加載,onnx模型的導(dǎo)出
def export_onnx(net, model_path, img, nsigma, onnx_outPath):

    nsigma /= 255.
    if torch.cuda.is_available():
        state_dict = torch.load(model_path)
        model = net.cuda()
        dtype = torch.cuda.FloatTensor
    else:
        state_dict = torch.load(model_path, map_location='cpu')
        state_dict = remove_dataparallel_wrapper(state_dict)
        model = net
        dtype = torch.FloatTensor

    img = Variable(img.type(dtype))
    nsigma = Variable(torch.FloatTensor([nsigma]).type(dtype))

    # 我這里預(yù)訓(xùn)練權(quán)重中參數(shù)名字與網(wǎng)絡(luò)名字不同
    # 相同的話可直接load_state_dict(state_dict)
    new_state_dict = {}
    for k, v in state_dict.items():
        new_state_dict[k[7:]] = v

    model.load_state_dict(new_state_dict)

    # 設(shè)置onnx的輸入輸出列表,多輸入多輸出就設(shè)置多個(gè)
    input_list = ['input', 'nsigma']
    output_list = ['output']

    # onnx模型導(dǎo)出
    # dynamic_axes為動(dòng)態(tài)維度,如果自己的輸入輸出是維度變化的建議設(shè)置,否則只能輸入固定維度的tensor
    torch.onnx.export(model, (img, nsigma), onnx_outPath, verbose=True, opset_version=11, export_params=True,
                      input_names=input_list, output_names=output_list,
                      dynamic_axes={'input_img': {0: 'batch', 1: 'channel', 2: 'height', 3: 'width'},
                                    'output': {0: 'batch', 1: 'channel', 2: 'height', 3: 'width'}})


# 此處為檢查onnx模型節(jié)點(diǎn),后面如果onnx算子不支持轉(zhuǎn)engine時(shí),方便定位節(jié)點(diǎn),找到不支持的算子進(jìn)行修改
def check_onnx(onnx_model_path):
    model = onnx.load(onnx_model_path)
    onnx.checker.check_model((model))
    print(onnx.helper.printable_graph(model.graph))

# 此處為推理onnx模型的代碼,檢查輸出是否跟torch模型相同
def run_onnx(onnx_model_path, test_img, nsigma):
    nsigma /= 255.
    with torch.no_grad:
        # 這里默認(rèn)是cuda推理torch.cuda.FloatTensor
        img = Variable(test_img.type(torch.cuda.FloatTensor))
        nsigma = Variable(torch.FloatTensor([nsigma]).type(torch.cuda.FloatTensor))

        # 設(shè)置GPU推理
        device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
        providers = ['CUDAExecutionProvider'] if device != "cpu" else ['CPUExecutionProvider']

        # 通過(guò)創(chuàng)建onnxruntime session來(lái)運(yùn)行onnx模型
        ort_session = ort.InferenceSession(onnx_model_path, providers=providers)
        output = ort_session.run(output_names=['output'],
                                 input_feed={'input_img': np.array(img.cpu(), dtype=np.float32),
                                             'nsigma':  np.array(nsigma.cpu(), dtype=np.float32)})
    return output

# 此處是后處理代碼,將onnx模型的輸出處理成可顯示cv圖像
# 與torch模型的后處理一樣
def postprocess(img, img_noise_estime):
    out = torch.clamp(img-img_noise_estime, 0., 1.)
    outimg = variable_to_cv2_image(out)
    cv2.imshow(outimg)

def main():

    ##############################
    #
    #        onnx模型導(dǎo)出
    #
    ##############################

    # pt權(quán)重路徑:自己的路徑 + mypt.pt
    model_path = "D:/python/ffdnet-pytorch/models/net_rgb.pth"
    # export onnx模型時(shí)輸入進(jìn)去數(shù)據(jù),用于onnx記錄網(wǎng)絡(luò)的計(jì)算過(guò)程
    export_feed_path = "D:/python/ffdnet-pytorch/noisy.png"
    # onnx模型導(dǎo)出的路徑
    onnx_outpath = "D:/python/ffdnet-pytorch/models/myonnx.onnx"

    # 實(shí)例化自己的網(wǎng)絡(luò)模型并設(shè)置輸入?yún)?shù)
    net = FFDNet(num_input_channels=3)
    nsigma = 25

    # onnx 導(dǎo)出
    img = cv2.imread(export_feed_path)
    input = preprocess(img)

    export_onnx(net, model_path, input, nsigma, onnx_outpath)
    print("export success!")
    ##############################
    #
    #        檢查onnx模型
    #
    ##############################
    onnx_outpath = "D:/python/ffdnet-pytorch/models/myonnx.onnx"
    check_onnx(onnx_outpath)
    # netron可視化網(wǎng)絡(luò),可視化用節(jié)點(diǎn)記錄的網(wǎng)絡(luò)推理流程
    netron.start(onnx_outpath)

    ##############################
    #
    #        運(yùn)行onnx模型
    #
    ##############################

    # 此處過(guò)程是數(shù)據(jù)預(yù)處理 ---> 調(diào)用run_onnx函數(shù) ---> 對(duì)模型輸出后處理
    # 具體代碼就不再重復(fù)了

if __name__ == '__main__':
    main()

到了這里,關(guān)于python pytorch模型轉(zhuǎn)onnx模型(多輸入+動(dòng)態(tài)維度)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • pytorch模型(.pt)轉(zhuǎn)onnx模型(.onnx)的方法詳解(1)

    1.?pytorch模型轉(zhuǎn)換到onnx模型 2.運(yùn)行onnx模型 3.比對(duì)onnx模型和pytorch模型的輸出結(jié)果 ?我這里重點(diǎn)是第一點(diǎn)和第二點(diǎn),第三部分? 比較容易 首先你要安裝 依賴(lài)庫(kù):onnx 和 onnxruntime, 也可以使用清華源鏡像文件安裝? 速度會(huì)快些。 開(kāi)始: 1.?pytorch模型轉(zhuǎn)換到onnx模型 pytorch 轉(zhuǎn) onnx

    2023年04月09日
    瀏覽(15)
  • 【深度學(xué)習(xí)】pytorch pth模型轉(zhuǎn)為onnx模型后出現(xiàn)冗余節(jié)點(diǎn)“identity”,onnx模型的冗余節(jié)點(diǎn)“identity”

    【深度學(xué)習(xí)】pytorch pth模型轉(zhuǎn)為onnx模型后出現(xiàn)冗余節(jié)點(diǎn)“identity”,onnx模型的冗余節(jié)點(diǎn)“identity”

    onnx模型的冗余節(jié)點(diǎn)“identity”如下圖。 首先,確保您已經(jīng)安裝了onnx-simplifier庫(kù): 然后,您可以按照以下方式使用onnx-simplifier庫(kù): 通過(guò)這個(gè)過(guò)程,onnx-simplifier庫(kù)將會(huì)檢測(cè)和移除不必要的\\\"identity\\\"節(jié)點(diǎn),從而減少模型中的冗余。 請(qǐng)注意,使用onnx-simplifier庫(kù)可能會(huì)改變模型的計(jì)算

    2024年02月09日
    瀏覽(60)
  • 【ONNX】使用 C++ 調(diào)用 ONNX 格式的 PyTorch 深度學(xué)習(xí)模型進(jìn)行預(yù)測(cè)(Windows, C++, PyTorch, ONNX, Visual Studio, OpenCV)

    【ONNX】使用 C++ 調(diào)用 ONNX 格式的 PyTorch 深度學(xué)習(xí)模型進(jìn)行預(yù)測(cè)(Windows, C++, PyTorch, ONNX, Visual Studio, OpenCV)

    要使用 ONNX 模型進(jìn)行預(yù)測(cè),就需要使用 onnx runtime 首先到 ONNX 官網(wǎng)查詢(xún)所需的版本 這里使用的 Windows,同時(shí)裝了 CUDA 下面的鏈接可以進(jìn)入到安裝網(wǎng)址 https://www.nuget.org/packages/Microsoft.ML.OnnxRuntime.Gpu 安裝命令為: 首先打開(kāi) Visual Studio 2019 新建一個(gè)用于測(cè)試的項(xiàng)目 右鍵點(diǎn)擊項(xiàng)目,可

    2024年02月09日
    瀏覽(21)
  • onnxruntime推理時(shí)切換CPU/GPU以及修改onnx輸入輸出為動(dòng)態(tài)

    前言 onnx模型作為中間模型,相較于pytorch直接推理,是有加速度效果的,且推理代碼簡(jiǎn)單,不需要load各種網(wǎng)絡(luò)。最近某些項(xiàng)目因?yàn)轱@存不夠,onnxruntime推理時(shí)切換CPU/GPU,實(shí)現(xiàn)某些模型在CPU上推理,某些在GPU上推理。 查了一些別人的文章發(fā)現(xiàn)很多人都說(shuō)onnxruntime推理沒(méi)法像py

    2024年02月12日
    瀏覽(28)
  • Pytorch圖像分類(lèi)模型轉(zhuǎn)ONNX(同濟(jì)子豪兄學(xué)習(xí)筆記)

    安裝配置環(huán)境 代碼運(yùn)行云GPU平臺(tái):公眾號(hào) 人工智能小技巧 回復(fù) gpu 同濟(jì)子豪兄 2022-8-22 2023-4-28 2023-5-8 安裝 Pytorch 安裝 ONNX 安裝推理引擎 ONNX Runtime 安裝其它第三方工具包 驗(yàn)證安裝配置成功 Pytorch圖像分類(lèi)模型轉(zhuǎn)ONNX-ImageNet1000類(lèi) 把Pytorch預(yù)訓(xùn)練ImageNet圖像分類(lèi)模型,導(dǎo)出為ONNX格

    2024年02月09日
    瀏覽(55)
  • pytorch框架:conv1d、conv2d的輸入數(shù)據(jù)維度是什么樣的

    Conv1d 的輸入數(shù)據(jù)維度通常是一個(gè)三維張量,形狀為 (batch_size, in_channels, sequence_length),其中: batch_size 表示當(dāng)前輸入數(shù)據(jù)的批次大??; in_channels 表示當(dāng)前輸入數(shù)據(jù)的通道數(shù),對(duì)于文本分類(lèi)任務(wù)通常為 1,對(duì)于圖像分類(lèi)任務(wù)通常為 3(RGB)、1(灰度)等; sequence_length 表示當(dāng)前輸

    2024年01月16日
    瀏覽(23)
  • 【深度學(xué)習(xí)】ONNX 模型文件修改節(jié)點(diǎn)的名稱(chēng),修改輸入名稱(chēng),修改輸出名稱(chēng)

    【深度學(xué)習(xí)】ONNX 模型文件修改節(jié)點(diǎn)的名稱(chēng),修改輸入名稱(chēng),修改輸出名稱(chēng)

    想要修改onnx模型文件的節(jié)點(diǎn)名稱(chēng),要么在最初的pytorch代碼里去改,要么就直接在onnx模型文件里改。 而我這里直接在onnx模型文件改,我有一個(gè)onnx文件,輸出節(jié)點(diǎn)的名字是這樣的: 這不改就看著真難受,那么就用python改: 改完后: 其實(shí)修改其他節(jié)點(diǎn)的名稱(chēng)也可以這樣去做,

    2024年02月15日
    瀏覽(27)
  • PyTorch開(kāi)放神經(jīng)網(wǎng)絡(luò)交換(Open Neural Network Exchange)ONNX通用格式模型的熟悉

    PyTorch開(kāi)放神經(jīng)網(wǎng)絡(luò)交換(Open Neural Network Exchange)ONNX通用格式模型的熟悉

    我們?cè)谏疃葘W(xué)習(xí)中可以發(fā)現(xiàn)有很多不同格式的模型文件,比如不同的框架就有各自的文件格式: .model、.h5、.pb、.pkl、.pt、.pth等等 ,各自有標(biāo)準(zhǔn)就帶來(lái)互通的不便,所以微軟、Meta和亞馬遜在內(nèi)的合作伙伴社區(qū)一起搞一個(gè) ONNX(Open Neural Network Exchange) 文件格式的通用標(biāo)準(zhǔn),這樣

    2024年02月12日
    瀏覽(28)
  • python使用onnx模型進(jìn)行推理

    我們可以看到基于YoloV7訓(xùn)練的cfg有兩種yaml文件,一個(gè)是training文件夾,一個(gè)是deploy文件夾,這兩種文件夾有啥不一樣呢??? 大家可以看下下面別人的issuse,,記住這個(gè)很關(guān)鍵,就是你選擇哪個(gè)yaml訓(xùn)練對(duì)你后面導(dǎo)出的onnx是很關(guān)鍵的,后面我們會(huì)說(shuō)到。 1、training中的yaml文件

    2024年02月12日
    瀏覽(17)
  • 深度學(xué)習(xí)-Python調(diào)用ONNX模型

    目錄 ONNX模型使用流程 獲取ONNX模型方法 使用ONNX模型 手動(dòng)編寫(xiě)ONNX模型 Python調(diào)用ONNX模型 常見(jiàn)錯(cuò)誤 錯(cuò)誤raise ValueError...: 錯(cuò)誤:Load model model.onnx failed 錯(cuò)誤:\\\'CUDAExecutionProvider\\\' is not in available provider 錯(cuò)誤:ONNXRuntimeError 錯(cuò)誤:\\\'CUDAExecutionProvider\\\' is not in available provider ONNX(Open Ne

    2024年02月05日
    瀏覽(17)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包