专栏算法工具链J6P自己转换的hbm模型上位机推理结果正常,板端推理结果完全错误

J6P自己转换的hbm模型上位机推理结果正常,板端推理结果完全错误

已解决
2026-05-13
118
2
芯片:J6P
工具链版本:horizon_j6_open_explorer_v3.5.0-py310_20250927
板端linux版本(/proc/version):
问题:通过hb_compile将自己魔改的yolo的onnx模型转换为hbm模型,在上位机docker环境中使用Python里HBRuntime测试hbm模型输出一切正常,到板端部署后输出结果完全错误刚开始在想是不是板端的cpp代码写错了,但是用同样的代码尝试了示例中给出的resnet50_224x224_rgb.hbm模型,上位机和板端却又输出了相同的结果。
附件:通过网盘分享的文件:J6P
链接: https://pan.baidu.com/s/1b8GD0d_J6tXDjEY513JlHA?pwd=3g13 提取码: 3g13

Question:是否因相关依赖库版本不一致导致?以及如何解决?

代码功能

上位机与板端代码均为:推理后获取每个输出节点中的最大值、最大值索引以及最小值并打印(代码在附件中已经给出)

推理结果对比

自己转换的hbm模型

  • 上位机输出结果(正常):

附上上位机结果可视化图:
alt text
  • 板端输出结果(完全错误):

工具链给出的resnet50_224x224_rgb.hbm模型

  • 上位机输出结果(正常):

  • 下位机输出结果(依旧正常):

代码实现

  • 上位机代码 infer.py(已经在附件压缩包里给出)

  • 下位机代码 infer_test.cpp(已经在附件压缩包里给出)

补充说明

  • 模型量化使用的校准图片(.npy)在上位机文件夹output/coco_tl/384x640中,量化结果均在output/coco_tl中,实际使用上位机文件夹中onnx2j6.py脚本进行转换(其中还是调用os.system执行hb_compile命令),命令为:

算法工具链
技术深度解析征程6
评论5
0/600
  • Lv.1
    补充一点,板端的libbpu.so版本为2.2.11,而工具链中提供的为2.0.5,当我强行把板端的替换为2.0.5版本运行程序会报错
    2026-05-13
    0
    0
  • YCJ
    Lv.4

    问题收到,我这边复现一下,有进展和你同步

    2026-05-14
    0
    0
  • YCJ
    Lv.4
    你可以用hrt工具看一下模型的输入输出,输入和输出都有padding。
    1.先说前处理。问题1:应该按照带padding的方式去准备前处理。
    问题2:python里有一段代码是int(img.shape[1] r)
    int(img.shape[0] r)这是是截断操作,c++里是int unpad_w = (int)round(r * img.cols);int unpad_h = (int)round(r * img.rows);这是四舍五入操作。这里应该也保持一致,可以改成int unpad_w = static_cast(r * img.cols);int unpad_h = static_cast(r * img.rows);并且明确resize的插值方式cv::resize(img, resized, cv::Size(unpad_w, unpad_h), 0, 0, cv::INTER_LINEAR);
    2.关于你通过最大最小值的验证方式,对于带padding的输出也是不合理的,因为padding占位的数值每次推理都是随机的。
    我的建议是你可以避开padding的问题,重新生成一个不带padding的模型,这样你的验证方式就有效了。但是C++前处理中的四舍五入还是需要和python改成一致,插值方式也应该一致。
    2026-05-15
    0
    1
    • YCJ回复YCJ:

      我看你前处理的代码中,是考虑了stride的。我建议你先转一个输出不带padding的hbm

      2026-05-15
      0
  • HuangHui
    Lv.5

    客户您好,长时间未收到你的答复,相信问题已解。如对此尚存疑问欢迎新帖讨论,感谢您的参与!

    2026-07-03
    0
    0
  • YCJ
    Lv.4

    用hb_verifier对比了同一输入下hbm在docker中和在板端的输出,是一致的。大概率是C++代码的问题

    2026-05-14
    0
    7
    • YCJ回复YCJ:

      重点排查前后处理代码

      2026-05-14
      0
    • 回复YCJ:
      首先我的测试代码没有后处理,直接看输出的最大最小值,其次我也说明了与示例中给出的resnet50_224x224_rgb.hbm使用相同代码,前处理过程相同,但是示例模型输出是对的而我自己转换的模型是错的,这不就是说明我的c++代码没问题吗
      2026-05-14
      0
    • 回复YCJ:

      而且我的前处理后处理代码都在J5的板子上用过的,J5上是没问题的,这次移植到J6上就有问题了也说不过去吧

      2026-05-14
      0
    • 回复YCJ:

      我这儿没法用hb_verifier工具,天准的控制器给/map路径分配的空间太小了,我把里面东西全删了也一直报No space left on device

      2026-05-14
      0
    • 回复YCJ:

      所以我一直怀疑到底是不是库的版本有问题,还麻烦您们那边看一下,我给的输出结果里应该有

      2026-05-14
      0
    • 回复:

      infer_test.cpp中前处理就是照抄的工具链示例中的,不可能有问题

      2026-05-14
      0
    • YCJ回复:

      首先,你这种通过获取最大最小值的输出的验证方式就是错误的,因为你的hbm推理输出中有padding,并不是紧凑排列的,每次推理padding占位的数值都是随机的。我这边再帮你试着查一下。

      2026-05-15
      0