Can't convert Core ML model to Onnx
See original GitHub issueHello,
I’m trying to convert a trained Core ML model (activity classification) to Onnx in order to convert it to TensorFlow Lite. The problems is that I get errors. I’ve tried with different versions of python, onnxmltools, winmltools and it doesn’t seems to work. I also tried docker image of onnx ecosystem with same result. Can any one help me with it? Thanks in advance.
Script
import coremltools
import onnxmltools
input_coreml_model = '../model.mlmodel'
output_onnx_model = '../model.onnx'
coreml_model = coremltools.utils.load_spec(input_coreml_model)
onnx_model = onnxmltools.convert_coreml(coreml_model)
onnxmltools.utils.save_model(onnx_model, output_onnx_model)
Error Messages
IndexError Traceback (most recent call last)
<ipython-input-11-94a6dc527869> in <module>
3
4 # Convert the CoreML model into ONNX
----> 5 onnx_model = onnxmltools.convert_coreml(coreml_model)
6
7 # Save as protobuf
/usr/local/lib/python3.6/dist-packages/onnxmltools/convert/main.py in convert_coreml(model, name, initial_types, doc_string, target_opset, targeted_onnx, custom_conversion_functions, custom_shape_calculators)
16 from .coreml.convert import convert
17 return convert(model, name, initial_types, doc_string, target_opset, targeted_onnx,
---> 18 custom_conversion_functions, custom_shape_calculators)
19
20
/usr/local/lib/python3.6/dist-packages/onnxmltools/convert/coreml/convert.py in convert(model, name, initial_types, doc_string, target_opset, targeted_onnx, custom_conversion_functions, custom_shape_calculators)
58 target_opset = target_opset if target_opset else get_opset_number_from_onnx()
59 # Parse CoreML model as our internal data structure (i.e., Topology)
---> 60 topology = parse_coreml(spec, initial_types, target_opset, custom_conversion_functions, custom_shape_calculators)
61
62 # Parse CoreML description, author, and license. Those information will be attached to the final ONNX model.
/usr/local/lib/python3.6/dist-packages/onnxmltools/convert/coreml/_parse.py in parse_coreml(model, initial_types, target_opset, custom_conversion_functions, custom_shape_calculators)
465 # Instead of using CoremlModelContainer, we directly pass the model in because _parse_model is CoreML-specific.
466 _parse_model(topology, scope, model)
--> 467 topology.compile()
468
469 for variable in topology.find_root_and_sink_variables():
/usr/local/lib/python3.6/dist-packages/onnxconverter_common/topology.py in compile(self)
630 self._resolve_duplicates()
631 self._fix_shapes()
--> 632 self._infer_all_types()
633 self._check_structure()
634
/usr/local/lib/python3.6/dist-packages/onnxconverter_common/topology.py in _infer_all_types(self)
506 pass # in Keras converter, the shape calculator can be optional.
507 else:
--> 508 operator.infer_types()
509
510 def _resolve_duplicates(self):
/usr/local/lib/python3.6/dist-packages/onnxconverter_common/topology.py in infer_types(self)
108 def infer_types(self):
109 # Invoke a core inference function
--> 110 registration.get_shape_calculator(self.type)(self)
111
112
/usr/local/lib/python3.6/dist-packages/onnxmltools/convert/coreml/shape_calculators/neural_network/Concat.py in calculate_concat_output_shapes(operator)
22 if variable.type.shape[0] != 'None' and variable.type.shape[0] != output_shape[0]:
23 raise RuntimeError('Only dimensions along C-axis can be different')
---> 24 if variable.type.shape[2] != 'None' and variable.type.shape[2] != output_shape[2]:
25 raise RuntimeError('Only dimensions along C-axis can be different')
26 if variable.type.shape[3] != 'None' and variable.type.shape[3] != output_shape[3]:
IndexError: list index out of range
Issue Analytics
- State:
- Created 4 years ago
- Comments:12
Top Results From Across the Web
Can't convert Core ML model to Onnx (then to Tensorflow Lite)
I'm trying to convert a trained Core ML model to TensorFlow Lite. I find I need convert it to Onnx first. The problems...
Read more >onnxmltools: Convert your model into ONNX
ONNXMLTools enables you to convert models from different machine learning toolkits into ONNX. Currently the following toolkits are supported: Apple Core ML ......
Read more >Convert Yolov5 to CoreML. Also add a decode layer. | by MLBoy
Use the export code in the Yolov5 repository to convert the Pytorch model to a CoreML model. Defines the decode layer. Defines Non...
Read more >FAQ (Frequently Asked Questions) | Microsoft Learn
You can use WinMLTools to convert models of several different formats, such as Apple CoreML and scikit-learn, to ONNX. I am getting errors...
Read more >How to Deploy PyTorch Models with Core ML Conversion ...
As the stack trace indicates, the error is now in the package onnx-coreml. The layer in question is early on, likely in the...
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Investigating a little more, I have found that the problem is clearly inside the “optimize_onnx” routine from the file “optimizer.py” in imported project “onnxconverter_common”.
As this “optimize_onnx” routine takes a topology in input to generate an “optimized” topology in output, both belonging to the same class and as this operation seems to be optional (it is controlled through flag “container.enable_optimizer” but I do not see what would make this flag false), there is a workaround which is simply to skip this optimization step.
To implement the work around, I have replaced line 796 in topology.py by content of line 798.
My network now is properly converted and operational. A look in Netron shows its structure is what I was expecting.
I apologize for this long delay before answering.
I have upgraded now to releases 1.8.0 of onnxconverter-common and onnxmltools. This problem appears to be solved on my side.
Thank you !