ONNX から NCNN へのレコード

        [pytorch から onnx] pytorch-onnx

        [onnx から ncnn] onnx-ncnn

        [ncnnロードモデル] ncnn-load

 1. Python インストールの依存関係

pip install onnxruntime onnx opencv-python

2. モデルを作成してトレーニングし、モデルパラメータをロードしてNXに出力します。

#### pytorch 转 onnx
import torch
import torch.onnx
from model.efficientnet_model import EfficientNet_FV
model = EfficientNet_FV(num_classes=4800).cuda()

path_checkpoint = "..path\\best.ckpt"
checkpoint = torch.load(path_checkpoint)
model.load_state_dict(checkpoint)  # 加载训练好的模型

model.eval()
##### 生成 onnx 文件
x = torch.randn(1, 3, 128, 128).cuda()
with torch.no_grad():
    torch.onnx.export(
        model, x,
        "EfficientNet_b0.onnx",
        opset_version=11, 
        export_params=True,
        input_names=["input"],
        output_names=["output1"], 
    )

        このうち、torch.onnx.export は 、モデルを ONNX 形式に変換するために PyTorch に付属している関数です。最初の 3 つのパラメーターは、変換するモデル、モデルへの入力セット、およびエクスポートされた ONNX ファイルのファイル名です。モデルを変換する場合、元のモデルと出力ファイル名が必要であることは簡単に理解できますが、モデルに一連の入力を提供する必要があるのはなぜでしょうか? これには ONNX 変換の原理が関係します。PyTorch モデルから ONNX モデルまで、これは本質的に言語翻訳です。直感的なアイデアは、コンパイラーのように元のモデルのコードを徹底的に解析し、すべての制御フローを記録することです。ただし、前述したように、通常は制御フローを考慮しない静的グラフを記録するために ONNX のみを使用します。したがって、PyTorch はトレースと呼ばれるモデル変換メソッドを提供します。一連の入力が与えられると、モデルは実際に再度実行されます。つまり、この一連の入力に対応する計算グラフが記録され、ONNX 形式で保存されます。エクスポート関数は追跡エクスポート メソッドを使用します。これには、モデルを実行するために任意の入力セットを与える必要があります。私のテスト画像は 3 チャネル、サイズ 3*128*128 で、同じ形状のランダム テンソルもここで構築されます。

        上記のコードが正常に実行されると、ONNX モデル ファイル「EfficientNet_b0.onnx」がディレクトリに追加されます。次のスクリプトを使用して、モデル ファイルが正しいことを確認できます。

import onnx 
 
onnx_model = onnx.load("EfficientNet_b0.onnx") 
try: 
    onnx.checker.check_model(onnx_model) 
except Exception: 
    print("Model incorrect") 
else: 
    print("Model correct")

ONNX モデルは、 Netron  (オープンソース モデル視覚化ツール) を使用して視覚化        できます 。

3.オンン×2ncnn

        onnx2ncnn について: これが重要なポイントです。onnx モデルを取得した後、pytorch フレームワークに別れを告げます。次に、onnx 形式のモデルを ncnn がロードできる .bin および .param に変換する必要があります。ncnn が正常にコンパイルされている場合は、以前にコンパイルした ncnn ツールを使用します。ncnn/build/tools/onnx/ にはコンパイルされた onnx2ncnn があります。次のコマンドを入力してください (model は onnx の名前です)。何も出力されなければ成功です。一般に、ネットワーク以外の部分を onnx にパッケージ化することは推奨されません。

        .param と .bin は正常に生成されますが、ncnn を使用してモデルをロードすると通常は失敗します。ncnn は現在特定の操作をサポートしていないため、ここでは別のツールである ONNX Simplifier を紹介します。

GitHub - daquexian/onnx-simplifier: onnx モデルを簡素化する

pip install onnxsim
onnxsim input_onnx_model output_onnx_model

4、NCNNローディングモデル

参考:https://blog.csdn.net/Enchanted_ZhouH/article/details/106063552

おすすめ

転載: blog.csdn.net/weixin_44855366/article/details/130169723