Toybrick

楼主: ddcat1991

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

ddcat1991

注册会员

积分
126
11#
 楼主| 发表于 2020-3-31 16:04:31 | 只看该作者
本帖最后由 ddcat1991 于 2020-3-31 16:06 编辑
jefferyzhang 发表于 2020-3-31 14:22
NPU部门回复:
在 onnx_edit.py 里, rknn.config 漏掉了一个参数 reorder_channel='0 1 2', rknn.inferen ...

是这个问题,添上就解决了,板子上推理也正确了。谢谢版主!( toolkit 1.3.0-NPU, 1.3.1-PC 都ok )
回复

使用道具 举报

zengwubin

中级会员

积分
274
12#
发表于 2020-4-6 11:04:33 | 只看该作者
ddcat1991 发表于 2020-3-31 16:04
是这个问题,添上就解决了,板子上推理也正确了。谢谢版主!( toolkit 1.3.0-NPU, 1.3.1-PC 都ok ) ...

onnx_edit.py 这个文件在哪里,没找到啊
回复

使用道具 举报

zengwubin

中级会员

积分
274
13#
发表于 2020-4-6 11:49:17 | 只看该作者
请问转换rknn时你是怎么移除softmax层的,能不能详细讲下谢谢我用1MB with landmars 转换时卡在knn-softmanx出来的结果全是1了
回复

使用道具 举报

ddcat1991

注册会员

积分
126
14#
 楼主| 发表于 2020-4-7 10:26:41 | 只看该作者
zengwubin 发表于 2020-4-6 11:49
请问转换rknn时你是怎么移除softmax层的,能不能详细讲下谢谢我用1MB with landmars 转换时卡在k ...

把1mb vision/ssd/ssd.py 里  forward函数下 从94 行开始 "confidences = F.softmax(confidences, dim=2)" 和后面的注释掉就可以了
回复

使用道具 举报

sotnly

新手上路

积分
35
15#
发表于 2020-6-5 14:26:14 | 只看该作者
大佬,我也刚好在哢这个模型,有好些问题,有偿求助,可以的话加我QQ:405631964,谢谢了
回复

使用道具 举报

sotnly

新手上路

积分
35
16#
发表于 2020-6-5 14:42:15 | 只看该作者
我也是用Ultra-Light-Fast-Generic-Face-Detector-1MB,这个的RFB-640的模型,我做了相应的裁剪,然后也用onnxsim做了模型简化,但是当我把简化的模型转为rknn的时候就报错了:

IndexError:_Map_base::at
我百度了,说是我的torch.onnx.export需要个  keep_initializers_as_inputs 这个参数,我现在的版本根本就没有这个参数,我的就是pytorch1.2.0直接转的onnx1.4.1的,所以不知道该怎么继续,如果你也有这个经历,麻烦告知,谢谢
回复

使用道具 举报

yongxin3344520

新手上路

积分
18
QQ
17#
发表于 2020-9-27 15:02:13 | 只看该作者
jefferyzhang 发表于 2020-3-2 09:52
还有我看你都是在板子上操作,请先核对下npu-drv版本号和toolkit是不是匹配,是否都是1.3.0.
驱动不对的话 ...

请问,如何查看 npu-drv版本号 和 toolkit 版本 ? npu-drv版本如何升级 ?
回复

使用道具 举报

aijle1981

新手上路

积分
28
18#
发表于 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


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