onnx / onnx-tensorflow

Tensorflow Backend for ONNX
Other
1.27k stars 296 forks source link

fail to transfer tiny-yolo-v2 model in ONNX model zoo #343

Open LexXia opened 5 years ago

LexXia commented 5 years ago

Describe the bug

I am trying to transfer onnx models (from onnx model zoo) to tensorflow through Tensorflow Session. I meet problems when transferring the tiny_yolov2 model, but the code runs correctly for ResNet-50 model. For details, I use the test samples in the model zoo but the SHAPE of the target output tensor and that of the real output tensor are not equal.

(shapes (1, 125, 13, 13), (1, 125, 6, 6) mismatch) x: array([[[[ 0.056232, 0.361873, 0.383947, ..., 0.202647, 0.031208, 0.317948], [-0.084167, 0.385165, 0.486804, ..., 0.261477, 0.253464,... y: array([[[[ 3.479987e-01, 2.631071e-01, 5.194952e-01, 6.217273e-01, 5.851656e-01, 3.590763e-01], [ 2.578035e-01, -2.500132e-02, 8.728515e-02, 1.864333e-01,...

To Reproduce

` import onnx_tf.backend import onnx import os import glob import tensorflow as tf import numpy as np from PIL import Image from onnx import numpy_helper

img_path = "tutorials/tutorials/assets/dog.jpg"

test_data_dir = "models/tiny_yolov2/tiny_yolov2/test_data_set_0/"

model_path = "models/tiny_yolov2/tiny_yolov2/model.onnx" def main():

#load ONNX model
onnx_model = onnx.load(model_path)

#prepare ONNX model to ONNX-Tensorflow model through ONNX backend API
tf_model = onnx_tf.backend.prepare(onnx_model)

# Load inputs
inputs = []
inputs_num = len(glob.glob(os.path.join(test_data_dir, 'input_*.pb')))
for i in range(inputs_num):
    input_file = os.path.join(test_data_dir, 'input_{}.pb'.format(i))
    tensor = onnx.TensorProto()
    with open(input_file, 'rb') as f:
        tensor.ParseFromString(f.read())
    inputs.append(numpy_helper.to_array(tensor))

# Load reference outputs
ref_outputs = []
ref_outputs_num = len(glob.glob(os.path.join(test_data_dir, 'output_*.pb')))
for i in range(ref_outputs_num):
    output_file = os.path.join(test_data_dir, 'output_{}.pb'.format(i))
    tensor = onnx.TensorProto()
    with open(output_file, 'rb') as f:
        tensor.ParseFromString(f.read())
    ref_outputs.append(numpy_helper.to_array(tensor))

#run ONNX-TF model through TF API
with tf.Session() as persisted_sess:
    print("load graph")
    persisted_sess.graph.as_default()
    tf.import_graph_def(tf_model.graph.as_graph_def(), name='')
    inp = persisted_sess.graph.get_tensor_by_name(
        tf_model.tensor_dict[tf_model.inputs[0]].name
    )
    out = persisted_sess.graph.get_tensor_by_name(
        tf_model.tensor_dict[tf_model.outputs[0]].name
    )
    for i in range(len(inputs)):
        res = persisted_sess.run(out, {inp: inputs[i]})
        np.testing.assert_almost_equal(ref_outputs[i],res,6)

if name == "main": main() `

ONNX model file

https://github.com/onnx/models/tree/master/tiny_yolov2 https://onnxzoo.blob.core.windows.net/models/opset_8/tiny_yolov2/tiny_yolov2.tar.gz

Python, ONNX, ONNX-TF, Tensorflow version

This section can be obtained by running get_version.py from util folder.

Additional context

Add any other context about the problem here.

fumihwh commented 5 years ago

@LexXia Try this PR #345