我正在使用posenet并将其从tflite
转换为pb
。它有4个输出节点offset_2,displacement_fwd_2,displacement_bwd_2,heatmap。
要能够将图形移植到movidius,我需要将图形转换为具有单个输出节点。
我尝试过tf.group
和tf.stack
,在这种情况下似乎没有用。我可能在这里错过了一些东西。
加载模型:
with tf.Session() as sess:
print("Loading graph...")
with gfile.FastGFile("./posenet-mobilenet_v1_075.pb") as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
sess.graph.as_default()
# Original input node has dynamic input size, which is not supported by Movidius. Make it static.
new_input = tf.placeholder(tf.float32,
[None, 300, 300, 3],
name="new_image")
tf.import_graph_def(graph_def,
name="",
input_map={"image:0": new_input})
添加组:
tf.group(offset_tensor,
displacement_bwd_tensor,
displacement_fwd_tensor,
heatmap_tensor,
name="grouped_output")
frozen_graph_def = convert_variables_to_constants(sess, graph_def, ["grouped_output"])
with tf.gfile.GFile("./tmp/" + "frozen.pb", "wb") as f:
f.write(frozen_graph_def.SerializeToString())
我也尝试过tf.tuple()
。在组和元组中,如果在推理优化期间指定的节点为grouped_output
,则optimize_for_inference后跟summerize_graph均不显示任何输出节点。
我可能对此想法完全不满意,但是我的思考过程是我可以添加一个新操作,该操作将采用前4个节点(get_operation_by_name
)的值,并且use将它们组合在一起的列表或字典。然后可以将此新操作视为输出节点,这可能会使NCSDK再次满意。但是看来操作不能是输出节点?