coremltools icon indicating copy to clipboard operation
coremltools copied to clipboard

Conversion from tensorflow (.pb) to coreml (.mlmodel)

Open HISYS-ES-ryuma opened this issue 11 months ago • 1 comments

Hi I'm trying to convert tensorflow model to coreml model.

OS: macOS Squoia 15.2 (Apple M1) Python: 3.8.19 (miniforge) TensorFlow: tensorflow-macos 2.12.0, tensorflow-metal 0.8.0 CoreML Tools: 8.1

This code was generated by ChatGPT.

import tensorflow as tf
import coremltools as ct

pb_model_dir = './ObjectDetection'  # Directory containing the saved_model.pb
loaded_model = tf.saved_model.load(pb_model_dir)

concrete_func = loaded_model.signatures["serving_default"]

input_shape = (1, 224, 224, 3)  # Example input shape, adjust as needed
sample_input = tf.random.uniform(input_shape, dtype=tf.float32)  # Use float32
sample_input_uint8 = tf.cast(sample_input * 255, dtype=tf.uint8)  # Convert to uint8 if required

output_tensors = concrete_func(input_tensor=sample_input_uint8)

print("Output keys:", output_tensors.keys())

output_key = 'detection_boxes'  # Use the appropriate key from the printed keys

@tf.function
def model_func(input_tensor):
    return concrete_func(input_tensor=input_tensor)[output_key]

input_layer = tf.keras.Input(shape=input_shape[1:], dtype=tf.uint8)

output_tensor = tf.keras.layers.Lambda(lambda x: model_func(x))(input_layer)

keras_model = tf.keras.Model(inputs=input_layer, outputs=output_tensor)

mlmodel = ct.convert(
    keras_model,
    inputs=[ct.ImageType(shape=input_shape)],
    minimum_deployment_target=ct.target.iOS14
)

mlmodel.save('./NewModel/coreml.mlmodel')

Then I got an error.

(tf-m1) esadmin@MacBookAir Igarashi % python  convert_20250121.py 
Metal device set to: Apple M1

systemMemory: 8.00 GB
maxCacheSize: 2.67 GB

Output keys: dict_keys(['detection_boxes_strided', 'num_detections', 'detection_boxes', 'detection_multiclass_scores', 'detection_scores', 'detection_classes'])
Running TensorFlow Graph Passes: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████| 6/6 [00:01<00:00,  4.09 passes/s]
Converting TF Frontend ==> MIL Ops:   0%|                                                                                                                 | 0/1294 [00:00<?, ? ops/s]Saving value type of int64 into a builtin type of int32, might lose precision!
Converting TF Frontend ==> MIL Ops:   8%|████████▋                                                                                               | 1/12 [00:00<00:00, 10230.01 ops/s]
Converting TF Frontend ==> MIL Ops:  56%|████████████████████████████████████████████████████████▏                                           | 727/1294 [00:00<00:00, 15145.20 ops/s]
Traceback (most recent call last):
  File "convert_20250121.py", line 41, in <module>
    mlmodel = ct.convert(
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/_converters_entry.py", line 635, in convert
    mlmodel = mil_convert(
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/converter.py", line 188, in mil_convert
    return _mil_convert(model, convert_from, convert_to, ConverterRegistry, MLModel, compute_units, **kwargs)
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/converter.py", line 212, in _mil_convert
    proto, mil_program = mil_convert_to_proto(
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/converter.py", line 288, in mil_convert_to_proto
    prog = frontend_converter(model, **kwargs)
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/converter.py", line 98, in __call__
    return tf2_loader.load()
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/frontend/tensorflow/load.py", line 82, in load
    program = self._program_from_tf_ssa()
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/frontend/tensorflow2/load.py", line 210, in _program_from_tf_ssa
    return converter.convert()
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/frontend/tensorflow/converter.py", line 524, in convert
    self.convert_main_graph(prog, graph)
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/frontend/tensorflow/converter.py", line 421, in convert_main_graph
    outputs = convert_graph(self.context, graph, self.output_names)
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/frontend/tensorflow/convert_utils.py", line 191, in convert_graph
    add_op(context, node)
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/frontend/tensorflow2/ops.py", line 136, in StatelessWhile
    x = mb.while_loop(_cond=cond, _body=body, loop_vars=loop_vars, name=node.name)
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/mil/ops/registry.py", line 183, in add_op
    return cls._add_op(op_cls_to_add, **kwargs)
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/mil/builder.py", line 236, in _add_op
    new_op.build_nested_blocks()
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/mil/ops/defs/iOS15/control_flow.py", line 471, in build_nested_blocks
    cond_block, body_block, exit_vars = self._build_block(block_inputs)
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/mil/ops/defs/iOS15/control_flow.py", line 396, in _build_block
    cond_var = cond_func(*cond_block.inputs)
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/frontend/tensorflow2/ops.py", line 126, in cond
    cond_output_vars = convert_graph(context, cond_graph)
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/frontend/tensorflow/convert_utils.py", line 191, in convert_graph
    add_op(context, node)
  File "/Users/esadmin/miniforge3/envs/tf-m1/lib/python3.8/site-packages/coremltools/converters/mil/frontend/tensorflow/ops.py", line 754, in Less
    x = context[node.inputs[0]]
IndexError: list index out of range

HISYS-ES-ryuma avatar Jan 21 '25 06:01 HISYS-ES-ryuma

I have the similar error when converting my model on Linux: Env: coremltools 6.3.0
tensorflow 2.12.0

My model is saved as keras model

--------------------------------- console --------------------------------------------------

Converting TF Frontend ==> MIL Ops: 6%|███████▉ | 1/17 [00:00<00:00, 5053.38 ops/s] Converting TF Frontend ==> MIL Ops: 72%|██████████████████████████████████████████████████████████████████████████████████████████████ | 435/606 [00:00<00:00, 2267.30 ops/s] Traceback (most recent call last): File "/media/david/Backup/project/aih/model_convert_to_ml.py", line 64, in mlmodel = ct.convert(tf_keras_model, convert_to="mlprogram",inputs=[ct.ImageType(name='input_1',shape=(1, width, height, 3), bias=bias, color_layout=ct.colorlayout.RGB), File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/_converters_entry.py", line 492, in convert mlmodel = mil_convert( File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/converter.py", line 188, in mil_convert return _mil_convert(model, convert_from, convert_to, ConverterRegistry, MLModel, compute_units, **kwargs) File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/converter.py", line 212, in _mil_convert proto, mil_program = mil_convert_to_proto( File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/converter.py", line 285, in mil_convert_to_proto prog = frontend_converter(model, **kwargs) File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/converter.py", line 98, in call return tf2_loader.load() File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/frontend/tensorflow/load.py", line 82, in load program = self._program_from_tf_ssa() File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/frontend/tensorflow2/load.py", line 210, in _program_from_tf_ssa return converter.convert() File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/frontend/tensorflow/converter.py", line 465, in convert self.convert_main_graph(prog, graph) File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/frontend/tensorflow/converter.py", line 389, in convert_main_graph outputs = convert_graph(self.context, graph, self.output_names) File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/frontend/tensorflow/convert_utils.py", line 191, in convert_graph add_op(context, node) File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/frontend/tensorflow2/ops.py", line 136, in StatelessWhile x = mb.while_loop(_cond=cond, _body=body, loop_vars=loop_vars, name=node.name) File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/mil/ops/registry.py", line 182, in add_op return cls._add_op(op_cls_to_add, **kwargs) File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/mil/builder.py", line 181, in _add_op new_op.build_nested_blocks() File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/mil/ops/defs/iOS15/control_flow.py", line 440, in build_nested_blocks cond_block, body_block, exit_vars = self._build_block(block_inputs) File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/mil/ops/defs/iOS15/control_flow.py", line 365, in _build_block cond_var = cond_func(*cond_block.inputs) File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/frontend/tensorflow2/ops.py", line 126, in cond cond_output_vars = convert_graph(context, cond_graph) File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/frontend/tensorflow/convert_utils.py", line 191, in convert_graph add_op(context, node) File "/media/david/Backup/anaconda3/envs/tf_coreml_proto/lib/python3.9/site-packages/coremltools/converters/mil/frontend/tensorflow/ops.py", line 684, in Less x = context[node.inputs[0]] IndexError: list index out of range

fdchiu avatar Mar 19 '25 18:03 fdchiu