Intel® Distribution of OpenVINO™ Toolkit
Community assistance about the Intel® Distribution of OpenVINO™ toolkit, OpenCV, and all aspects of computer vision-related on Intel® platforms.

Model Optimizer did not work for CenterNet

Zhiming
Beginner
1,662 Views

Hi, 

I was running the Keras version of CenterNet available here https://github.com/see--/keras-centernet. Now I am trying to run the model on the Intel Compute Stick 2. But when I tried to transform the frozen tensorflow model to the IR, I got errors 'Graph contains cycle'. 

Here are some steps to reproduce the error. 

1. Git clone the project

2. Replace the _process_sample function in keras-centernet/keras_centernet/models/decode.py with the following to avoid the data type mismatches in the model optimizer. 

def _process_sample(args):
    _hm, _reg, _wh = args
    _scores, _inds = tf.math.top_k(_hm, k=k, sorted=True)
    _classes = K.cast(_inds % cat, 'float64')
    #width = K.cast(width, 'float32')
    _inds = K.cast(_inds / cat, 'float64')
    _xs = K.cast(_inds % width, 'float64')
    _ys = K.cast(K.cast(_inds / width, 'float64'), 'float64')
    _inds = K.cast(_inds, 'int32')
    _xs = K.cast(_xs, 'float32')
    _ys = K.cast(_ys, 'float32')
    _classes = K.cast(_classes, 'float32')
    _wh = K.gather(_wh, _inds)
    _reg = K.gather(_reg, _inds)

    _xs = _xs + _reg[..., 0]
    _ys = _ys + _reg[..., 1]

    _x1 = _xs - _wh[..., 0] / 2
    _y1 = _ys - _wh[..., 1] / 2
    _x2 = _xs + _wh[..., 0] / 2
    _y2 = _ys + _wh[..., 1] / 2

    # rescale to image coordinates
    _x1 = output_stride * _x1
    _y1 = output_stride * _y1
    _x2 = output_stride * _x2
    _y2 = output_stride * _y2

    _detection = K.stack([_x1, _y1, _x2, _y2, _scores, _classes], -1)
    return _detection

  detections = K.map_fn(_process_sample, [hm_flat, reg_flat, wh_flat], dtype=K.floatx())
  return detections

 

3. In keras_centernet/bin/ctdet_image.py, generate the frozen TensorFlow model using the following code:

  num_output = 1
  predictions = [None] * num_output
  predrediction_node_names = [None] * num_output

  for i in range(num_output):
    predrediction_node_names = 'output_node' + str(i)
    predictions = tf.identity(model.outputs,
    name=predrediction_node_names)

  sess = K.get_session()

  constant_graph = graph_util.convert_variables_to_constants(sess,
  sess.graph.as_graph_def(), predrediction_node_names)
  infer_graph = graph_util.remove_training_nodes(constant_graph)

  graph_io.write_graph(infer_graph, '.', 'tf_model_new2', as_text=False)

4. Run the following command to run the keras-CenterNet and obtain the frozen tensorflow model. 

PYTHONPATH=. python keras_centernet/bin/ctdet_image.py --fn assets/demo2.jpg --inres 512,512  (Note you can run this on a docker)

5. Use the following command in the model optimizer to generate the IR

sudo python3 mo_tf.py --input_model ~/keras-centernet/model/tf_model_new2.pb --log_level=DEBUG --input_shape=[1,512,512,3] --data_type FP16

 

Kindly let me know if you need more information. Thanks!

0 Kudos
3 Replies
Shubha_R_Intel
Employee
1,662 Views

Dear Hu, Zhiming,

CenterNet is not one of the supported (validated) Model Optimizer models. You do have some options for this error, however, please see the MO FAQ # 97. Please check out Offloading Sub-Graph Inference to TensorFlow .

Thanks,

Shubha

 

 

0 Kudos
Zhiming
Beginner
1,662 Views

Shubha R. (Intel) wrote:

Dear Hu, Zhiming,

CenterNet is not one of the supported (validated) Model Optimizer models. You do have some options for this error, however, please see the MO FAQ # 97. Please check out Offloading Sub-Graph Inference to TensorFlow .

Thanks,

Shubha

 

 

Thanks very much for the reply. I have looked at the two options: tensorflow_subgraph_patterns and tensorflow_operation_patterns. As there are no error messages suggesting which operators are not supported, maybe I should use the first command line option. Is that correct?

Another question is that I have no idea about what sub-graphs should be offloaded to the tensorflow as there are too many cycles in the architecture for the model. I have attached the graph for the model. Could you please have a look at it and give some suggestions? Thanks again for your time and efforts!

0 Kudos
Shubha_R_Intel
Employee
1,662 Views

Dear Zhiming,

I haven't had a chance to investigate this yet, but please do a --log_level DEBUG in your Model Optimizer command. Does the offending cyclic node happen at the end of the model ? Somewhere in the middle ? If it's at the beginning or end, you can chop it off using the 

 Model Cutting Technique . Basically by model cutting you are defining different entry and exit points to your model, and it may be OK for inference - your model may still work as long as you're not chopping off crucial parts.

Thanks,

Shubha

0 Kudos
Reply