Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 52 additions & 16 deletions tools/onnx2tnn/onnx-coreml/coreml2onnx.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,10 @@ def main():
net_output = helper.make_tensor_value_info(net_layers[-1]['top'], TensorProto.FLOAT, [net_output_shape_dict['n'], net_output_shape_dict['k'], net_output_shape_dict['h'], net_output_shape_dict['w']])
net_outputes = [net_output]

net_output_name = net_layers[-2]['top']
# check the model.espresso.net file to adjust the index #
print('check the model.espresso.net file to adjust the index')
# net_output_name = net_layers[-2]['top']
net_output_name = net_layers[-1]['top']
if net_output_name.isdigit() != True:
net_output2_shape_dict = net_layer_shapes[net_output_name]
net_output2 = helper.make_tensor_value_info(net_output_name, TensorProto.FLOAT, [net_output2_shape_dict['n'], net_output2_shape_dict['k'], net_output2_shape_dict['h'], net_output2_shape_dict['w']])
Expand All @@ -106,7 +109,11 @@ def main():
#创建nodes NodeProto
onnx_net_nodes = []
onnx_net_weights = []
layer_info = net_layers[1]

# check the model.espresso.net file to adjust the index #
print('check the model.espresso.net file to adjust the index')
# layer_info = net_layers[1]
layer_info = net_layers[0]

for layer_info in net_layers:
print(layer_info['type'])
Expand Down Expand Up @@ -287,31 +294,60 @@ def main():
)
onnx_net_nodes.append(layer_node)
elif layer_info['type'] == 'activation':
node_inputs = layer_info['bottom'].split(',')
node_outputs = layer_info['top'].split(',')

activation_mode = layer_info['mode']
if activation_mode == 0:
node_type = 'Relu'
layer_node = helper.make_node('Relu', # node type
node_inputs, # inputs
node_outputs, # outputs
)
elif activation_mode == 1:
node_type = 'Tanh'
layer_node = helper.make_node('Tanh', # node type
node_inputs, # inputs
node_outputs, # outputs
)
elif activation_mode == 2:
node_type = 'LeakyRelu'
layer_node = helper.make_node('LeakyRelu', # node type
node_inputs, # inputs
node_outputs, # outputs
)
elif activation_mode == 3:
node_type = 'Sigmoid'
layer_node = helper.make_node('Sigmoid', # node type
node_inputs, # inputs
node_outputs, # outputs
)
elif activation_mode == 4:
node_type = 'PRelu'
layer_node = helper.make_node('PRelu', # node type
node_inputs, # inputs
node_outputs, # outputs
)
elif activation_mode == 8:
node_type = 'Elu'
layer_node = helper.make_node('Elu', # node type
node_inputs, # inputs
node_outputs, # outputs
)
elif activation_mode == 9:
layer_node = helper.make_node('ThresholdedRelu', # node type
node_inputs, # inputs
node_outputs, # outputs
alpha = layer_info['alpha']
)
elif activation_mode == 10:
node_type = 'Softplus'
layer_node = helper.make_node('Softplus', # node type
node_inputs, # inputs
node_outputs, # outputs
)
elif activation_mode == 12:
layer_node = helper.make_node('Softsign', # node type
node_inputs, # inputs
node_outputs, # outputs
)
else:
print('Error: unsupported activation mode: ' + str(activation_mode))
assert(0)

node_inputs = layer_info['bottom'].split(',')
node_outputs = layer_info['top'].split(',')
layer_node = helper.make_node(node_type, # node type
node_inputs, # inputs
node_outputs, # outputs
)
onnx_net_nodes.append(layer_node)
elif layer_info['type'] == 'load_constant':
# constant_blob
Expand All @@ -332,7 +368,7 @@ def main():

#创建model (ModelProto)
# onnx_model = helper.make_model(graph_def, producer_name='YouTu Tencent')
onnx_model = helper.make_model(graph_def, producer_name='YouTu Tencent', opset_imports=[helper.make_operatorsetid("", 9)])
onnx_model = helper.make_model(graph_def, producer_name='YouTu Tencent', opset_imports=[helper.make_operatorsetid("", 12)])

# print('The model is:\n{}'.format(onnx_model))
onnx.checker.check_model(onnx_model)
Expand Down
13 changes: 7 additions & 6 deletions tools/onnx2tnn/onnx-coreml/onnx2coreml.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,22 @@
import onnx
from onnx import helper, shape_inference
# from onnx import version_converter
from onnx_coreml import convert
import coremltools
from coremltools.models import MLModel

def main():
parser = argparse.ArgumentParser()
parser.add_argument('onnx_model_path', help='Input ONNX model path')
parser.add_argument('onnx_model_path', help='Input ONNX model full path')
parser.add_argument('-mlmodelc', help='Save model wiht mlmodelc, 1:default yes, 0: no')
args = parser.parse_args()

onnx_net_path = args.onnx_model_path
mlmodelc = args.mlmodelc
if mlmodelc == None:
mlmodelc = 1
mlmodelc = '1'

onnx_net_dir = onnx_net_path[0:onnx_net_path.rfind('/')];
onnx_net_dir = onnx_net_path[0:onnx_net_path.rfind('.')];
print("dir: "+onnx_net_dir)

cml_net_path = onnx_net_path+'.mlmodel'
if onnx_net_path.endswith('.onnx'):
Expand All @@ -38,13 +38,14 @@ def main():
# onnx.checker.check_model(onnx_model)
# onnx_model = shape_inference.infer_shapes(onnx_model)

cml_model = convert(onnx_model)
cml_model = coremltools.converters.onnx.convert(model=onnx_net_path)
# cml_model = convert(onnx_model, image_input_names=[onnx_inputs[0].name])
cml_model.save(cml_net_path)
# new_cml_spec = cml_model.get_spec()
# coremltools.utils.save_spec(new_cml_spec, cml_net_path)

if mlmodelc == 1:
# print("dir: "+onnx_net_dir)
if mlmodelc == '1':
cmd = '/Applications/Xcode.app/Contents/Developer/usr/bin/coremlc compile '+cml_net_path+' '+onnx_net_dir
os.system(cmd)

Expand Down
85 changes: 85 additions & 0 deletions tools/onnx2tnn/onnx-coreml/onnx_net.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

import os
import argparse
import sys
import time

import struct
import json

import onnx
from onnx import helper, shape_inference
from onnx import AttributeProto, TensorProto, GraphProto
from onnx import numpy_helper

def main():
# parser = argparse.ArgumentParser()
# parser.add_argument('coreml_folder', help='Input coreml model folder')
# args = parser.parse_args()
# coreml_folder = args.coreml_folder
#
# coreml_net = coreml_folder + '/model.espresso.net'
# coreml_shape = coreml_folder + '/model.espresso.shape'
# coreml_weights = coreml_folder + '/model.espresso.weights'

# print(net_layer_data[1])
# tensor_shape = [16]
# tensor = helper.make_tensor('1', TensorProto.FLOAT, tensor_shape, net_layer_data[1])
# print(tensor)

#构建onnx
#创建输入 (ValueInfoProto)
net_inputes = []
net_input = helper.make_tensor_value_info("input", TensorProto.FLOAT, [1, 13, 4, 4])
net_inputes.append(net_input)

#创建输出 (ValueInfoProto)
net_output = helper.make_tensor_value_info("output", TensorProto.FLOAT, [1, 13, 4, 4])
net_outputes = [net_output]

onnx_blob_shapes = [net_input, net_output]

#创建nodes NodeProto
onnx_net_nodes = []
onnx_net_weights = []

node_inputs = ["input"]
node_outputs = ["output"]
layer_node = helper.make_node("ThresholdedRelu", # node type
node_inputs, # inputs
node_outputs, # outputs
alpha = 1.5
)
onnx_net_nodes.append(layer_node)

#创建graph GraphProto
graph_def = helper.make_graph(
onnx_net_nodes,
'onnx-model',
net_inputes,
net_outputes,
initializer = onnx_net_weights,
value_info = onnx_blob_shapes,
)

#创建model (ModelProto)
# onnx_model = helper.make_model(graph_def, producer_name='YouTu Tencent')
onnx_model = helper.make_model(graph_def, producer_name='YouTu Tencent', opset_imports=[helper.make_operatorsetid("", 12)])

# print('The model is:\n{}'.format(onnx_model))
onnx.checker.check_model(onnx_model)
print('Before shape inference, the shape info of Y is:\n{}'.format(onnx_model.graph.value_info))

# Apply shape inference on the model
inferred_model = shape_inference.infer_shapes(onnx_model)
onnx.checker.check_model(inferred_model)
print('After shape inference, the shape info of Y is:\n{}'.format(inferred_model.graph.value_info))
onnx.save(inferred_model, 'onnx_net.onnx')


if __name__ == '__main__':
main()
1 change: 1 addition & 0 deletions tools/onnx2tnn/onnx-coreml/安装说明-CoreML.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ export https_proxy=https://web-proxy.oa.com:8080/
<!-- 编译+运行 -->
1. 安装coremltools //https://pypi.org/project/coremltools/
pip3 install -U coremltools
pip3 install -U onnx-coreml