From 15f82dc1b44818681325b17d0adba14021607f69 Mon Sep 17 00:00:00 2001 From: zha0q1 Date: Tue, 26 Jan 2021 20:04:11 +0000 Subject: [PATCH 1/4] bare bone implementation --- .../contrib/onnx/mx2onnx/_op_translations.py | 30 +++++++++++++++++++ tests/python-pytest/onnx/test_operators.py | 8 +++++ 2 files changed, 38 insertions(+) diff --git a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py index a1d5320d9f94..b862013d0802 100644 --- a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py +++ b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py @@ -3275,3 +3275,33 @@ def convert_gather_nd(node, **kwargs): ] return nodes + + +@mx_op.register('UpSampling') +def convert_upsampling(node, **kwargs): + """Map MXNet's UpSampling operator to onnx. + """ + from onnx.helper import make_node + from onnx import TensorProto + name, input_nodes, attrs = get_inputs(node, kwargs) + + scale = int(attrs.get('scale', '1')) + sample_type = attrs.get('sample_type') + num_args = int(attrs.get('num_args', '1')) + + if num_args > 1: + raise NotImplementedError('Upsampling conversion does not currently support num_args > 1') + + if sample_type != 'nearest': + raise NotImplementedError('Upsampling conversion does not currently support \ + sample_type != nearest') + + nodes = [ + create_tensor([], name+'_roi', kwargs['initializer'], dtype='float32'), + create_tensor([1, 1, scale, scale], name+'_scales', kwargs['initializer'], + dtype='float32'), + make_node('Resize', [input_nodes[0], name+'_roi', name+'_scales'], [name],mode='nearest', + coordinate_transformation_mode='half_pixel') + ] + + return nodes diff --git a/tests/python-pytest/onnx/test_operators.py b/tests/python-pytest/onnx/test_operators.py index 2c363a96ba04..4feca742df96 100644 --- a/tests/python-pytest/onnx/test_operators.py +++ b/tests/python-pytest/onnx/test_operators.py @@ -539,3 +539,11 @@ def test_onnx_export_gather_nd(tmp_path, dtype): M2 = def_model('gather_nd') op_export_test('gather_nd2', M2, [x2, y2], tmp_path) + +@pytest.mark.parametrize('dtype', ['float16', 'float32']) +@pytest.mark.parametrize('shape', [(3, 4, 5, 6), (1, 1, 1, 1)]) +@pytest.mark.parametrize('scale', [1, 2, 3]) +def test_onnx_export_upsampling(tmp_path, dtype, shape, scale): + A = mx.random.uniform(0, 1, shape).astype(dtype) + M = def_model('UpSampling', scale=scale, sample_type='nearest', num_args=1) + op_export_test('UpSampling', M, [A], tmp_path) From 8a598ad7df60b5f127d7ae3e39b7ee6f36b68f7b Mon Sep 17 00:00:00 2001 From: Zhaoqi Zhu Date: Tue, 26 Jan 2021 19:55:41 -0800 Subject: [PATCH 2/4] Update _op_translations.py --- python/mxnet/contrib/onnx/mx2onnx/_op_translations.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py index b862013d0802..c5a56fa91724 100644 --- a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py +++ b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py @@ -3282,7 +3282,6 @@ def convert_upsampling(node, **kwargs): """Map MXNet's UpSampling operator to onnx. """ from onnx.helper import make_node - from onnx import TensorProto name, input_nodes, attrs = get_inputs(node, kwargs) scale = int(attrs.get('scale', '1')) @@ -3300,7 +3299,7 @@ def convert_upsampling(node, **kwargs): create_tensor([], name+'_roi', kwargs['initializer'], dtype='float32'), create_tensor([1, 1, scale, scale], name+'_scales', kwargs['initializer'], dtype='float32'), - make_node('Resize', [input_nodes[0], name+'_roi', name+'_scales'], [name],mode='nearest', + make_node('Resize', [input_nodes[0], name+'_roi', name+'_scales'], [name], mode='nearest', coordinate_transformation_mode='half_pixel') ] From ca1cf7810908b5e049f5561ea13e8dfbb6328c40 Mon Sep 17 00:00:00 2001 From: Zhaoqi Zhu Date: Fri, 29 Jan 2021 20:18:31 -0800 Subject: [PATCH 3/4] Update _op_translations.py --- python/mxnet/contrib/onnx/mx2onnx/_op_translations.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py index 30782167809e..d2680eba3c72 100644 --- a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py +++ b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py @@ -3404,6 +3404,9 @@ def convert_gather_nd(node, **kwargs): def convert_upsampling(node, **kwargs): """Map MXNet's UpSampling operator to onnx. """ + from onnx.helper import make_node + name, input_nodes, _ = get_inputs(node, kwargs) + scale = int(attrs.get('scale', '1')) sample_type = attrs.get('sample_type') num_args = int(attrs.get('num_args', '1')) From e208605c2f2d3a55715882f83d49e3da56386887 Mon Sep 17 00:00:00 2001 From: Zhaoqi Zhu Date: Fri, 29 Jan 2021 23:34:40 -0800 Subject: [PATCH 4/4] Update _op_translations.py --- python/mxnet/contrib/onnx/mx2onnx/_op_translations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py index d2680eba3c72..39723321923e 100644 --- a/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py +++ b/python/mxnet/contrib/onnx/mx2onnx/_op_translations.py @@ -3405,7 +3405,7 @@ def convert_upsampling(node, **kwargs): """Map MXNet's UpSampling operator to onnx. """ from onnx.helper import make_node - name, input_nodes, _ = get_inputs(node, kwargs) + name, input_nodes, attrs = get_inputs(node, kwargs) scale = int(attrs.get('scale', '1')) sample_type = attrs.get('sample_type')