Toybrick

楼主: ddcat1991

onnx模型转换为rknn模型, 输出结果不正确

aijle1981

新手上路

积分
28
楼主
发表于 2021-8-13 20:52:47 | 显示全部楼层
参考楼主的代码做转换是可以的,但是加了pre_compile,输出全部变成了0,不知道为什么。
  1. import onnx
  2. from onnx import helper, TensorProto
  3. import numpy as np


  4. # Common - Input Setting
  5. np.random.seed(1234)
  6. image = np.random.random((1, 3, 240, 320))*2 - 1.0  # 原模型输入为归一化后 -1~1之间的结果
  7. image = image.astype(np.float32)

  8. intermidiate_y = '187'
  9. intermidiate_shape = [1, 16, 120, 160]
  10. # intermidiate_shape = [1, 4, 8, 10]
  11. new_model_name = 'toto_%s.onnx' % intermidiate_y

  12. modelName = "version-RFB-320_without_postprocessing"

  13. # load model
  14. model = onnx.load_model(modelName +".onnx")

  15. # add output
  16. intermediate_layer_value_info = helper.make_tensor_value_info(intermidiate_y, TensorProto.FLOAT, intermidiate_shape)
  17. # intermediate_layer_value_info = helper.ValueInfoProto()
  18. # intermediate_layer_value_info.name = intermidiate_y

  19. # model.graph.output.extend([intermediate_layer_value_info])
  20. onnx.save(model, new_model_name)
  21. onnx.checker.check_model(model)


  22. # run model
  23. import onnxruntime as ort
  24. ort_session = ort.InferenceSession(new_model_name)
  25. input_name = ort_session.get_inputs()[0].name

  26. conf_onnx, boxes_onnx = ort_session.run(None, {input_name: image})


  27. # ================ rknn model ========================
  28. from rknn.api import RKNN
  29. # Create RKNN object
  30. rknn1 = RKNN(verbose=False)
  31. print('--> Loading model')
  32. rknn1.load_onnx(model=new_model_name)
  33. print('done')
  34. rknn1.config(batch_size=1,reorder_channel='0 1 2', mean_values=[[0, 0, 0]], std_values=[[1, 1, 1]], target_platform="rv1109")

  35. # Build model
  36. print('--> Building model')
  37. rknn1.build(do_quantization=False)
  38. print('done')
  39. rknn1.export_rknn('./tmp.rknn')
  40. rknn1.release()

  41. # Create RKNN object
  42. rknn2 = RKNN(verbose=False)
  43. print('--> Loading model2')
  44. rknn2.load_onnx(model=new_model_name)
  45. print('done')
  46. rknn2.config(batch_size=1,reorder_channel='0 1 2', mean_values=[[0, 0, 0]], std_values=[[1, 1, 1]], target_platform="rv1109")

  47. # Build model
  48. print('--> Building pre_compile model')
  49. rknn2.build(do_quantization=False, pre_compile=True)
  50. print('done')
  51. rknn2.export_rknn(modelName +'.rknn')
  52. rknn2.release()

  53. rknn = RKNN(verbose=True)
  54. rknn.load_rknn('./tmp.rknn')
  55. rknn.config(batch_size=1,reorder_channel='0 1 2', mean_values=[[0, 0, 0]], std_values=[[1, 1, 1]], target_platform="rv1109")
  56. rknn.init_runtime()
  57. print('image.shape:', image.shape)
  58. conf_rknn, boxes_rknn = rknn.inference(inputs=[image],data_format='nchw')
  59. rknn.release()

  60. tmp_onnx = conf_onnx
  61. tmp_rknn = conf_rknn
  62. ## ========================== Result Compare ===============================
  63. print('********************* Intermidiante Layer Number: %s *******************' % intermidiate_y)
  64. tmp_onnx = np.squeeze(tmp_onnx)
  65. tmp_rknn = np.squeeze(tmp_rknn)
  66. tmp_onnx = tmp_onnx.reshape(-1,tmp_onnx.shape[-1])
  67. tmp_rknn = tmp_rknn.reshape(-1,tmp_rknn.shape[-1])

  68. # for idx in range(tmp_onnx.shape[0],2):
  69. for idx in range(0,4):
  70.     print('********************* Onnx:%d ****************************' % idx)
  71.     print(tmp_onnx[idx,:20])
  72.     print('********************* Rknn:%d ****************************' % idx)
  73.     print(tmp_rknn[idx,:20])

  74. difference = np.sum(np.abs(tmp_onnx-tmp_rknn))
  75. total_weight = np.sum(np.abs(tmp_onnx))
  76. print('totoal-difference:', difference)
  77. print('totoal-weight:', total_weight)
  78. print('drift-rate: %.4f%%' % (difference/total_weight*100))
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表