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.
6442 Discussions

How to convert a custom model and use it properly?

Felipe
Beginner
1,708 Views

Hi, I am trying to convert a custom model and I am having some trouble. Currently I am doing like this:

 

from model.h5 to model.pb

import tensorflow as tf from tensorflow.python.framework import graph_io from tensorflow.keras.models import load_model   # Clear any previous session. tf.keras.backend.clear_session()   save_pb_dir = './model' model_fname = './model/model.h5' def freeze_graph(graph, session, output, save_pb_dir='.', save_pb_name='model.pb', save_pb_as_text=False): with graph.as_default(): graphdef_inf = tf.graph_util.remove_training_nodes(graph.as_graph_def()) graphdef_frozen = tf.graph_util.convert_variables_to_constants(session, graphdef_inf, output) graph_io.write_graph(graphdef_frozen, save_pb_dir, save_pb_name, as_text=save_pb_as_text) return graphdef_frozen   # This line must be executed before loading Keras model. tf.keras.backend.set_learning_phase(0)   model = load_model(model_fname)   session = tf.keras.backend.get_session()   INPUT_NODE = [t.op.name for t in model.inputs] OUTPUT_NODE = [t.op.name for t in model.outputs] print(INPUT_NODE, OUTPUT_NODE) frozen_graph = freeze_graph(session.graph, session, [out.op.name for out in model.outputs], save_pb_dir=save_pb_dir)

from model.pb to model.xml and model.bin 

import os   # mo_tf.py path in Linux mo_tf_path = '/opt/intel/openvino_2020/deployment_tools/model_optimizer/mo_tf.py'   pb_file = './model/model.pb' output_dir = './model' input_shape = [1,32,32,1] input_shape_str = str(input_shape).replace(' ','')   os.system("{} --input_model {} --output_dir {} --input_shape {} {} --scale {}".format(mo_tf_path, pb_file,output_dir, input_shape_str,'--generate_deprecated_IR_V7', '255'))

 And now, I was able to use it like this:

import cv2   net = cv2.dnn_ClassificationModel('./model/model.xml','./model/model.bin') net.setPreferableTarget(cv2.dnn.DNN_TARGET_MYRIAD) print(net.predict(img))

But I am getting inaccurate values.

Using my keras model I get: [0.01738145]

Using the converted network I get [0.51660156]

 

I went after another way to use the converted model and got to this:

from openvino.inference_engine import IENetwork, IEPlugin import cv2 import numpy as np     net = IENetwork(model='./model/plate_model.xml', weights='./model/plate_model.bin') plugin = IEPlugin(device="MYRIAD") exec_net = plugin.load(network=net)     img = cv2.imread('./data/test.png', 0) img = cv2.resize(img, (32, 32)) img = np.expand_dims(img, axis=0) out = exec_net.infer({"conv2d_1_input": img}) print(out)

But with the last way I get:

 

{'dense_4/Sigmoid': array([[0.51660156]], dtype=float32)}

 

  • So, is it okay to convert like this?

 

  • Why is my converted model giving wrong values?

 

 

Best regards,

 

Felipe

0 Kudos
2 Replies
Luis_at_Intel
Moderator
1,555 Views

Hi @Felipe​ ,

 

As we discussed in our conversation via Private Message, the resolution to this issue with Intel® Neural Compute Stick 2 was:

  • Disable the VPU_HW_STAGES_OPTIMIZATION
  • Convert the model with Model Optimizer using --data_type FP16

 

There are two ways of disabling VPU_HW_STAGES_OPTIMIZATION, using IEPlugin or IECore:

from openvino.inference_engine import IENetwork, IEPlugin, IECore   net = IENetwork(model='./model/plate_model.xml', weights='./model/plate_model.bin') # with IEPlugin plugin = IEPlugin(device="MYRIAD") exec_net = plugin.load(network=net, num_requests=2, config={'VPU_HW_STAGES_OPTIMIZATION': 'NO'})   # with IECore ie = IECore() ie.set_config({'VPU_HW_STAGES_OPTIMIZATION': 'NO'}, "MYRIAD") exec_net = ie.load_network(network=net, num_requests=2, device_name="MYRIAD")

 

Regards,

Luis

 

 

Felipe
Beginner
1,555 Views

Hi Luis,

 

Thank you once again. 😊

 

Regards,

Felipe

0 Kudos
Reply