Paddle2.0: ONNX モデルのエクスポートと展開

導入

  • 動的グラフを静的グラフに変換して推論モデルをエクスポートすることに加えて、
  • ONNXモデルのエクスポート機能もPaddle2.0に正式搭載
  • この記事では、例を通じて Paddle モデルを ONNX モデルにエクスポートする方法を説明します。
  • そしてONNXRunTime上でモデルの推論予測を完了します

ONNX

  • 機械学習モデルのオープンスタンダードである Open Neural Network Exchange (ONNX) により、異なるフレームワーク間のモデル交換が容易になります。
  • ONNX モデルのエクスポートをサポートする多くのフレームワークでモデルを構築し、予測展開のために ONNX モデルをエクスポートできます。

パドル2ONNX

  • 現在、Paddle エクスポート ONNX モデルでは追加サポートのために Paddle2ONNX をインストールする必要があります
  • Paddle2ONNX は、PaddlePaddle モデル形式から ONNX モデル形式への変換をサポートしています。
    • モデル形式は、Paddle の静的および動的グラフ モデルの ONNX への変換をサポートしており、save_inference_model によってエクスポートされた静的グラフ モデルを変換できます。動的グラフ変換は現在実験段階にあり、Paddle 2.0 の正式版のリリースに伴い詳細なチュートリアルが提供される予定です。
    • オペレーターのサポート。現在、安定して ONNX Opset 9 ~ 11 のエクスポートをサポートしています。一部の Paddle オペレーターは、より低い ONNX Opset 変換をサポートしています。詳細については、オペレーター リストを参照してください。
    • モデルタイプ、公式テストコンバーチブルモデルについてはモデルライブラリを参照してください。
  • 詳細については、 Paddle2ONNX のGithub ホームページを参照してください。
# PIP 安装
$ pip install paddle2onnx
# 源码安装
$ git clone https://github.com/paddlepaddle/paddle2onnx
$ cd paddle2onnx 
$ python setup.py install

動的グラフ ONNX モデルのエクスポート

import os
import time
import paddle

# 从模型代码中导入模型
from u2net import U2NETP

# 实例化模型
model = U2NETP()

# 加载预训练模型参数
model.set_dict(paddle.load([path to the pretrained model]))

# 将模型设置为评估状态
model.eval()

# 定义输入数据
input_spec = paddle.static.InputSpec(shape=[None, 3, 320, 320], dtype='float32', name='image')

# ONNX模型导出
paddle.onnx.export(model, [path to the save onnx model], input_spec=[input_spec], opset_version=[opset version])
2021-01-09 17:12:24 [INFO]	ONNX model saved in u2netp.onnx

静的グラフモデルの変換

  • 動的グラフに加えて、モデルを ONNX モデルとしてエクスポートできます
  • もちろん静的グラフの推論モデルもONNXモデルに変換可能
  • 変換は、コマンドラインから次のコマンドを実行することで完了できます。
  • 詳細については、paddle2onnx 公式 Github ドキュメントを参照してください。
$ paddle2onnx \
    --model_dir [model dir] \
    --model_filename [model filename] \
    --params_filename [params filename] \
    --save_file [save file] \
    --opset_version [opset version]
2021-01-09 17:12:28 [INFO]	ONNX model saved in u2netp_static.onnx

モデルの視覚化

  • モデル構造の視覚的な表示は、VisualDL ツールを通じて簡単に実行できます。
  • 保存したばかりのサフィックス .onnx を持つモデル ファイルを選択します
  • 具体的な可視化イメージは以下の図のとおりです。


モデルのテスト

  • ここで ONNXRunTime は ONNX モデル検証テストに使用されます
# 安装ONNXRunTime
$ pip install onnxruntime
import time
import numpy as np
from onnxruntime import InferenceSession

# 加载ONNX模型
model = InferenceSession([path to the save onnx model])

# 准备输入
x = np.random.random((1, 3, 320, 320)).astype('float32')

# 模型预测
d0, _, _, _, _, _, _ = model.run(output_names=None, input_feed={
    
    'image': x})

# 打印输出形状
print(d0.shape)

# 速度测试
start = time.time()
d0, _, _, _, _, _, _ = model.run(output_names=None, input_feed={
    
    'image': x})
end = time.time()
print('predict time: %.04f s' % (end - start))
(1, 1, 320, 320)
predict time: 0.7178 s

デプロイメントインスタンス

  • 次に、データの前処理と後処理を追加して、モデル推論のデプロイを完了します。
import cv2
import time
import numpy as np
import matplotlib.pyplot as plt

from onnxruntime import InferenceSession
from processor import preprocess, postprocess

# 输入输出设置
img_path = [path to the input image]
output_dir = [output dir]

# 数据预处理
img = preprocess(img_path)

# 加载模型
model = InferenceSession([path to the save onnx model])

# 模型推理
start = time.time()
d0, _, _, _, _, _, _ = model.run(output_names=None, input_feed={
    
    'image': img})
end = time.time()
print('predict time: %.04f s' % (end - start))

# 结果后处理
mask_path, result_path = postprocess(d0, img_path, output_dir)

# 图像显示
img = np.concatenate([
    cv2.imread(img_path),
    cv2.imread(mask_path),
    cv2.imread(result_path)
], 1)
plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
predict time: 0.7305 s

ここに画像の説明を挿入

要約する

  • 現在、Paddle2.0 には ONNX モデルをエクスポートするためのインターフェイスが組み込まれており、ONNX モデルを簡単にエクスポートできます。
  • 以前の静的グラフ モデルの場合、Paddle2ONNX ツールも変換に使用できます。
  • ONNX モデルを推論展開に使用することも比較的簡単で便利です。
  • ただし、一部の Paddle オペレーターとの互換性の問題が依然として存在しており、一部のモデルが正常にエクスポートできません。
  • 全体的なエクスペリエンスは良好であり、この機能が将来的により完璧になり、より多くのオペレーターをサポートすることを願っています

おすすめ

転載: blog.csdn.net/jm_12138/article/details/112396913