Search code examples
pythonnumpytensorflowonnxonnxruntime

Run inference using ONNX model in python input incompatibility problem?


I am a beginner in programming, I am trying to run the "tinyyolov2-8.onnx" model, I am struggling with the input formating, can anyone suggest how to formate the input for this model. code is given below,

import numpy as np
from PIL import Image
import tensorflow as tf



sess_ort = ort.InferenceSession("tinyyolov2-8.onnx")
# sess_ort = ort.InferenceSession("mobilenetv2-7 .onnx")

in__1 = sess_ort.get_inputs()[0].name;
print(in__1)

out__1= sess_ort.get_outputs()[0].name;
img= np.array(Image.open('416_416.png'), np.float)
img= img/255;

# img = np.random.random((1,3,416,416)).astype(np.float32)
img= img.reshape(1,3,416,416);
print(np.shape(img))
res =  sess_ort.run(out__1, {in__1 : img})[0]```

ERROR is:

```runfile('D:/ANN/ONNX_files/ONNX_model_RUN.py', wdir='D:/ANN/ONNX_files')
image
tensor(float)
['None', 3, 416, 416]

grid
tensor(float)
['None', 125, 13, 13]

(1, 3, 416, 416)
Traceback (most recent call last):

  File "D:\ANN\ONNX_files\ONNX_model_RUN.py", line 47, in <module>
    res =  sess_ort.run(out__1, {in__1 : img})[0]

  File "D:\ProgramData\Anaconda3\envs\tensor_python3_6\lib\site-packages\onnxruntime\capi\session.py", line 111, in run
    return self._sess.run(output_names, input_feed, run_options)

TypeError: run(): incompatible function arguments. The following argument types are supported:
    1. (self: onnxruntime.capi.onnxruntime_pybind11_state.InferenceSession, arg0: List[str], arg1: Dict[str, object], arg2: onnxruntime.capi.onnxruntime_pybind11_state.RunOptions) -> List[object]

Invoked with: <onnxruntime.capi.onnxruntime_pybind11_state.InferenceSession object at 0x000001F4803CE960>, 'grid', {'image': array([[[[0.38823529, 0.71372549, 0.68235294, ..., 0.79607843,```





Solution

  • help(sess_ort)
    ...
     |  run(self, output_names, input_feed, run_options=None)
     |      Compute the predictions.
     |      
     |      :param output_names: name of the outputs
     |      :param input_feed: dictionary ``{ input_name: input_value }``
     |      :param run_options: See :class:`onnxruntime.RunOptions`.
     |      
     |      ::
     |      
     |          sess.run([output_name], {input_name: x})
    

    'run' takes a collection of output names. Update the call to this:

    res = sess_ort.run([out__1], {in__1 : img})[0]

    Also note that most likely you're loading an image in HWC format and ONNX runtime wants CHW so you may need to transpose it (instead of just reshaping).

    i.e. if you check the shape of 'img' it's probably {416, 416, 3}, and if so you need to do numpy.transpose(img1, (2, 0, 1)) to make it {3, 416, 416}. After that you can reshape to {1, 3, 416, 416}.

    No idea what the purpose of this line is: img= img/255;