专栏算法工具链HB_ONNXRuntime 使用数据类型错误求助

HB_ONNXRuntime 使用数据类型错误求助

已解决
yy12342024-01-26
225
15
1.芯片型号:J5
2.天工开物开发包OpenExplorer版本:J5_OE_1.1.68
3.问题定位:模型转换
4.问题具体描述

horizon-tc-ui版本:1.21.6

图像 + Featuremap 混合多输入时,对插入预处理节点的***_original_float_***.onnx进行推理,按照以下要求进行数据准备:

运行报错:

Traceback (most recent call last):

File "onnx_inference_series_frame.py", line 353, in

onnx_inference()

File "onnx_inference_series_frame.py", line 179, in onnx_inference

result = sess.hb_session.run(output_names, {input_name[0]: inputs['img'],

File "/usr/local/lib/python3.8/dist-packages/horizon_nn/horizon_onnxruntime/session.py", line 146, in run

return self._sess.run(output_names, input_feed, run_options)

horizon_nn.horizon_onnxruntime.onnxruntime_pybind11_state.InvalidArgument: [ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Unexpected input data type. Actual: (N11onnxruntime17PrimitiveDataTypeIaEE) , expected: (N11onnxruntime17PrimitiveDataTypeIfEE)

报错意思是输入数据类型错误,要浮点数据,实际输入了int8。


检查模型输入准备,作为特征图输入的都是float32类型,图像预处理代码:

img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
img = cv2.resize(img, (h, w))
img = np.rollaxis(img, 2, 0)
img_int8 = img -128

img = img_int8.astype(np.int8)


即最终输入的图像是int8的,报错应该也是这个地方,但是图像应该就是要int8的。


使用uint8图像会报错:Actual: (N11onnxruntime17PrimitiveDataTypeIhEE) 。


另外上面的预处理代码,推理插入预处理节点的***_original_float_***.onnx,使用sess.run_feature(output_names, feed_dict, input_offset=0)推理的结果是正确的。
上面的预处理,去掉img_int8 = img -128
img = img_int8.astype(np.int8)这两个步骤后,使用sess.run(output_names, feed_dict, input_offset=128)推理的结果也是正确的。

数据类型错误是什么原因,我们没有思路了,麻烦帮忙看一下,谢谢

算法工具链
征程5
评论2
0/1000
  • yy1234
    Lv.2
    我们量化yaml配置的img的input_type_rt是nv12,查表,original_float_***.onnx的img输入应该准备yuv444_128的数据,但是可视化onnx看出,img输入是要float32的。yuv444_128 应该是int8类型,和onnx要求的float不一致,所以有报错。尝试过把yuv444直接转换成float32,结果也是不对的
    2024-01-26
    0
    11
    • GOYU\XU回复yy1234:

      ***_original_float_***.onnx模型要求输入给模型的数据是float型的。图像是int8没错,但是数据送到模型输入层必须为float的。

      2024-01-27
      0
    • GOYU\XU回复yy1234:

      如上您说的几种情况的出现,需要了解sess.run_feature,sess.run, sess.hb_session.sun几个函数的区别:

      2024-01-27
      0
    • GOYU\XU回复yy1234:

      上述3个函数都是对公版ONNXRuntime中run函数的封装。内部做了一定的数据转换。地平线sess.run函数有一个条件判断,判段模型为float则会将数据转换为float, 如果为int模型则-128的时候会将数据转换为int8。地平线sess.run_feature内部会直接将数据转换为float型,sess.hb_session.run则不会进行数据转换。所以您上述使用hb_session.run时数据没有转换,但是模型输入需要float,您给到的是int8,推理就会报错。其他两个函数sess.run和sess.run_feature内部数据会转换为float因此推理正常。建议您在推理时进入对应函数内部调试就能发现函数内部具体操作!

      2024-01-27
      1
    • yy1234回复yy1234:

      好的,非常感谢回复。看下来释放的docker环境中sess.run_feature,sess.run, sess.hb_session.run这几个函数应该是集成到onnxruntime_pybind11_state.so库中了,我们拿到的环境应该看不到具体实现,没法进去调试。 还需要请教一下sess.run或者sess.hb_session.sun函数中将int转为float的操作是怎么实现的,因为我试着将yuv444_128转换成float32:img = img.astype(np.float32),推理结果也是错误的。是否-128及数据排布nchw/nhwc等都排列组合尝试推理过了,依旧无法获取正确结果。

      2024-01-29
      0
    • GOYU\XU回复yy1234:

      yuv444_128转换成float32是在哪一步完成的, 可以发下完整事例吗

      2024-01-29
      0
    • yy1234回复yy1234:

      yuv444_128转换成float32是在对图像分支输入进行预处理的最后一步,主要流程是这样: def preprocess(img): img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV) # BGR转YUV444 img = cv2.resize(img, (w, h)) # resize img = np.rollaxis(img, 2, 0) #nhwc->nchw img_int8 = img -128 #uint8->int8 img = img_int8.astype(np.float32) #int8->float32 return img

      2024-01-29
      0
    • GOYU\XU回复yy1234:

      yuv444_128转换成float32后调用hb_session.run函数不对, 提示什么错误呀?

      2024-01-29
      0
    • yy1234回复yy1234:

      转换成float32后,调用sess.hb_session.run接口运行不报错,只是推理的结果不正确。同一个***_original_float_***.onnx使用sess.run接口推理结果是正确的,sess.run接口预处理是这样: def img_preprocess(img): img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV) img = cv2.resize(img, (w, h)).astype(np.float32) #resize img = np.rollaxis(img, 2, 0) # nhwc->nchw return img

      2024-01-29
      0
    • GOYU\XU回复yy1234:

      那你使用 def img_preprocess(img): img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV) img = cv2.resize(img, (w, h)).astype(np.float32) #resize img = np.rollaxis(img, 2, 0) img = img-128,然后调用sess.hb_session.run看下结果是否正确

      2024-01-29
      0
    • yy1234回复yy1234:

      推理结果正确了,十分感谢!

      2024-01-29
      0
    • GOYU\XU回复yy1234:

      好的,那没什么问题这个帖子就可以关闭了哈。

      2024-01-29
      0
  • TROS.Enid
    Lv.1

    分析中

    2024-01-26
    0
    2
    • yy1234回复TROS.Enid:

      谢谢。我们配置的img

      2024-01-26
      0
    • yy1234回复TROS.Enid:

      谢谢。我们配置的img的input_type_rt是nv

      2024-01-26
      0