专栏算法工具链J5板端bin模型和python版*_quantied.onnx模型推理结果存在不一致

J5板端bin模型和python版*_quantied.onnx模型推理结果存在不一致

已解决
默认823682024-09-23
133
19

如题,存在不一致的情况,例如python推理结果经过NMS后的置信度为0.92,但板端的置信度可能为0.89,且板端检测框尺寸和中心点相比python存在一些偏差。

继续调试,在NMS之前,置信度最高的目标框从尺寸特征图(40*40)的w=16,h=15的网格中的第二个anchor解码得到,在python中的结果不对应。

其次,直接对比了特征图的前10行结果,发现与python的结果也不一致。

请问这可能是由于在模型量化过程中导致的误差吗?

算法工具链
征程5
评论3
0/1000
  • DR_KAN
    Lv.4
    先确定quantized.onnx和bin的输入数据是不是得到了正确处理吧,对于J5平台,推理quantized.onnx时,应当读取bgr/rgb数据,转换成nv12,再转成yuv444,最后再-128才是输入给模型的数据,板端bin的输入数据应当是bgr/rgb转成的nv12。具体可以查看这篇文章:PTQ&QAT方案板端验证注意事项 (d-robotics.cc)
    2024-09-24
    0
    13
    • 默认82368回复DR_KAN:

      我在X86用hb_verifier工具导出了模型的输出,发现使用X86的quantized.onnx和bin的输出是一致的,这里bin用的x86的libdnn推理的。这是不是说明是由于板端和x86差异造成的?

      2024-09-25
      0
    • DR_KAN回复默认82368:

      可以再用hb_verifier比较下quantized.onnx和板端运行bin的输出一致性

      2024-09-25
      0
    • 默认82368回复DR_KAN:

      我在板端用hrt_model_exec工具dump了结果,肉眼看了看也几乎是能对上,现在怀疑是不是特征图出来之后的遍历循环取值有问题。

      另外有个小问题,我在x86中用hb_verifier工具 -b的选项会报错,导致我只能打开-s:

      并且在板端我需要通过/userdata/.horizon/hrt_model_exec才能执行工具,如果直接hrt_model_exec是找不到的。我是按照OE中直接bash install.sh $ip$安装的。我怀疑这个-b报错和这个问题有关,导致无法检测到板端的dnn工具。

      2024-09-25
      0
    • DR_KAN回复默认82368:

      如果板端的bin和x86的quantized.onnx输出的数值是完全一致的,那么造成检测结果不一致的原因就只能是后处理了

      2024-09-25
      0
    • 默认82368回复DR_KAN:

      发现问题出在输出不一致

      用hb_verfier和hrt_model_exec工具dump的结果都是一致的,但是我直接在python里把特征图存成npy看就不一致了,且各自的后处理都没问题

      请问使用工具验证的onnx模型和python中推理的图像预处理是否有不同?

      2024-09-25
      0
    • DR_KAN回复默认82368:

      "直接在python里把特征图存成npy看就不一致了",这句话没太理解,可以详细说一下么

      2024-09-25
      0
    • 默认82368回复DR_KAN:

      最开始的问题是板端和x86的检出不一致,然后通过 hb_verfier和hrt_model_exec工具对比了输出特征图发现是一致的。

      但是这样就没法解释为什么检测框会不同。因此分别找到了x86和板端的输出检测框对应的特征图是model_output[1],也就是40*40大小的特征图

      板端对应的特征图结果是:

      然后在python中通过np.save直接保存model_output[1],根据检出的置信度0.92找到了对应的输出:

      根据confidence=sigmoid(2.4454216957092285)*sigmoid(13.594114303588867)=0.92

      证明python端的检出结果是正确的。

      但是在输出的板端特征图中是找不到对应的python的特征图结果,也就是结果并不一致!但这和工具得到的结果矛盾。所以怀疑hb_verfier工具是否使用了和ai_benchmark示例中不同的preprocess导致了输入不同?

      2024-09-25
      0
    • DR_KAN回复默认82368:
      你的验证方法太复杂了,容易引入问题,现在还是要优先确认板端bin模型输出的数据,和x86端quantized.onnx输出的数据是否完全一致。bin模型不要删除任何节点,把float32浮点的输出保存下来(可以借助hrt_model_exec infer的dump功能,你应该已经会了),x86端使用PTQ&QAT方案板端验证注意事项 (d-robotics.cc)提到的sess.run接口做推理,输出也以float32的浮点格式保存下来,比较这两个是否有差异。
      2024-09-25
      0
    • 默认82368回复DR_KAN:

      x86端保存结果和bin模型输出不一致:

      在这里存的output。

      x86:

      板端:

      2024-09-25
      0
    • DR_KAN回复默认82368:

      看起来确实不一致,你的input_type_rt和input_type_train是什么?最近发现有个BUG,在这两个参数都是rgb或者bgr的情况下,quantized.onnx和bin可能会出现不一致的情况,但如果rt是nv12,train是bgr/rgb,结果就一致了。

      2024-09-25
      0
    • 默认82368回复DR_KAN:

      是转模型用的配置文件吗?应该是没问题的:

      2024-09-26
      0
    • DR_KAN回复默认82368:

      那我就不明白了,按理说J5上不应该有这个问题。你能确认输入数据是按我说的准备的吗,quantized.onnx用的是bgr转的nv12转的yuv444再转的yuv444-128,bin用的是bgr转的nv12?

      2024-09-26
      0
    • 默认82368回复DR_KAN:

      在python的preprocess是:

      在C++里应该是在tensor_utils.cc里,image_data_type== HB_DNN_IMG_TYPE_NV12:

      2024-09-26
      0
  • kotei左文亮
    Lv.3

    这个有可能是量化过程中的误差。对比过输入的数据吗?是不是完全一样的。也可能输入的数据不一样导致的。

    2024-09-23
    0
    2
    • 默认82368回复kotei左文亮:

      输入的图像是一样的,C++的预处理和python版本的预处理会导致输入数据产生变化吗?

      2024-09-23
      0
    • kotei左文亮回复默认82368:

      图像是一样的,那图像经过预处理之后还是一样的吗? 有没有对比一下输入推理之前的数据?

      2024-09-24
      0
  • yy1234
    Lv.2
    我也发现输出不是完全一样的,但地平线官方说的是这两个结果应该完全一样。我猜测可能是因为输入有差异,因为*_quantied.onnx的输入是读入图片然后BGR2YUV,而板端bin的输入是读入图像,然后转nv12. YUV和nv12数据有些差异
    2024-09-24
    0
    1
    • 默认82368回复yy1234:

      我用x86的hb_verfier工具可以看到bin和quantized.onnx是一致的,在板端直接用hrt_model_exec直接输出output也是一致的,但是在C++里直接打印出来就对不上。

      2024-09-25
      0