ONNXPractice

  • 导出的onnx model是经过protobuf序列化后的二值文件(需要rb打开)

安装

ONNX IR

protoc --decode=onnx.ModelProto onnx.proto < yourfile.onnx

备注

Where onnx.proto is the file that is part of the repository.

  • 查看protobuf版本

protoc --version

查看ONNX模型结构

img

备注

实测,比较低的版本ONNX IR v4也可导入

  • 方法二:使用onnx脚本查看

pip install onnx

相关代码:

import onnx

def print_shape_info(channel):
    for input in eval(f"model.graph.{channel}"):
        print(input.name, end=": ")
        # get type of input tensor
        tensor_type = input.type.tensor_type
        # check if it has a shape:
        if tensor_type.HasField("shape"):
            # iterate through dimensions of the shape:
            for d in tensor_type.shape.dim:
                # the dimension may have a definite (integer) value or a symbolic identifier or neither:
                if d.HasField("dim_value"):
                    print(d.dim_value, end=", ")  # known dimension
                elif d.HasField("dim_param"):
                    print(d.dim_param, end=", ")  # unknown dimension with symbolic name
                else:
                    print("?", end=", ")  # unknown dimension with no name
        else:
            print("unknown rank", end="")

model_path = "....onnx"
model = onnx.load(model_path)

print_shape_info("input")
print()
print_shape_info("output")

优化

# 以往的优化器是继承到onnx模块的
# import onnx
# new_model = onnx.optimizer.optimize(model)

# 现在是单独的模块,需pip另外安装
# pip install onnxoptimizer
import onnxoptimizer
new_model = onnxoptimizer.optimize(model)

Q&A

  • [libprotobuf ERROR google/protobuf/text_format.cc:298] Error parsing text-format onnx2trt_onnx.ModelProto: 1:1: Invalid control characters encountered in text.... Error parsing text-format onnx2trt_onnx.ModelProto: 1:17: Message type "onnx2trt_onnx.ModelProto" has no field named "pytorch".

一种情况是模型在解压缩后broken了(无关onnx version和protobuf version)

实战

h5模型转onnx

# $pip install keras2onnx
import keras
import keras2onnx
import onnx
from keras.models import load_model
model = load_model('model.h5')
onnx_model = keras2onnx.convert_keras(model, model.name)
temp_model_file = 'model.onnx'
onnx.save_model(onnx_model, temp_model_file)