专栏算法工具链J5自定义YOLOV5模型板端部署后处理问题

J5自定义YOLOV5模型板端部署后处理问题

已解决
默认823682024-09-09
172
9

关于YOLOV5模型部署的一些问题:

通过OE中提供的转换示例,已经训练好的YOLOv5模型转到.bin;

修改了ai_toolchain中的python版本postprcess,已经可以在本地正确检测目标,这是否说明模型已经被正确量化?

通过ai_benchmark中提供的示例,尝试在板端推理该模型,出现了一些问题:

  • 原本的ptq_yolov5x的模型输出tensors.size()=3,且shape=(1,84,84,255),(1,42,42,255),(1,21,21,255), 但是自定义的yolov5模型输出size=4,shape分别为(1,25200,6,1),(1,3,80,80,6),(1,3,40,40,6),(1,3,20,20,6),这与python版本的输出是一致的。

  • 在后处理中尝试直接根据shape解析输出结果,对于&tensors[0]:


更新:发现tensors[0]的quanti_type = 0,也就是说应该是不需要反量化的,但这样的话直接看tensors[0]的数值又不对了:

算法工具链
评论1
0/1000
  • kotei左文亮
    Lv.3

    本地正确检测目标是用的转化后的bin文件推理的吗?如果是的,就是说明已经量化成功了。

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

      是的,用的bin。

      2024-09-09
      0
    • Huanghui回复默认82368:
      1. 修改postprcess后,在本地正确检测目标,这个你确定推理时用的是bin,而不是quantized.onnx吗?Python接口的推理目前推理的是onnx的哈。
      2. 确定清楚修改postprcess后可以推理出正确结果的模型说明你的后处理逻辑是OK的,借助hb_verifier工具对比一下quantized.onnx和bin模型的一致性吧,一致性没有问题便可以执行下一步了。注意,你yaml中是否配置remove_node_type对部署是有影响的。
      3. hrt_model_exec model_infer可以查看一下模型的输出的类型和量化类型,如果是float的,说明模型内部已经做了反量化和remove padding的操作操作,外部无需再做。

      2024-09-09
      0
    • 默认82368回复Huanghui:
      1. 确认是用的bin,推理结果有些精度下降,但大体没问题;

      2. 可以正确出结果,hb_verifier pass:
      3. hrt_model_exec infer推理模型,一个4个输出,符合C++和python版本的结果。output_0是float,output_1,2,3是int。是不是说明output_0已经做了反量化?但是通过infer输出的txt结果是ok的,但在C++中看output_0的结果,是错误的,请问推理和后处理之间是否经过了某些处理?





      2024-09-10
      0
    • Huanghui回复默认82368:
      1. 第一个问题:如果你推理的是bin,你可以看一下推理bin时调用的程序接口是哪个吗?这个问题本来可以不进一步讨论的,但是不说清楚后面的没法处理。你修改的是postprocess.py对吧,这个是在下面的脚本是被使用的,推理使用的HB_ONNXRuntime,该函数使用的就是onnx,而不是bin
      2. hb_verifier 说明*_quantized.onnx与*.bin是对齐的,也就是说同样的输入数据推理后会得到同样的输出,编译器过程没有问题。

      3. 从你描述的问题中,“修改postprcess后,在本地正确检测目标”,说明*_quantized.onnx的OK的,只不过postprcess是python代码的,既然*_quantized.onnx与*.bin是对齐的,而*_quantized.onnx又是OK,那么结论就是:你的部署代码中C++的处理有问题导致跟python代码的逻辑不一致。
      4. 当然你要注意的是yaml配置中不能remove_node_type,因为remove_node_type只对bin有效,对与*_quantized.onnx是没有remove任何节点的,这会导致*_quantized.onnx与*.bin的在同样的输入数据推理后会得到不同输出,因为hb_verifier 工具内部做了处理,发现不了该问题。但yaml配置中存在remove_node_type时如果后处理还保持*_quantized.onnx与*.bin有一样的逻辑就会出问题。
      2024-09-12
      0
    • 默认82368回复Huanghui:
      1. python推理的确实是quanti.onnx不是.bin,并且和origin_float.onnx的推理效果类似;

      2. 第4点的remove_node_type指的是在03_bilud.sh中引用的yolov5x_config.yaml中,

      model_parametersde:

      remove_node_type: "Dequantize"吗?

      目前确实发现了板端的.bin模型推理结果和*_quantized.onnx的结果不一致。

      2024-09-13
      0
    • 默认82368回复默认82368:
      2024-09-13
      0
    • Huanghui回复默认82368:

      对,目前用这个配置生成的bin模型在同样的推理数据下产生的输出就和 quanti.onnx是对齐的了,满足以下条件应该就OK了在板端出结果了:

      1. C++的后处理逻辑保持和PYTHON端后处理逻辑一致。

      2. 从你的配置文件看,模型只有一个输出,如果后面有模型是两个以及以上输出是,在output的排列顺序上,quanti.onnx和bin模型的可能不一致,所以后处理上也要注意。

      3. 因为input_type_rt: 'nv12'的存在,C++端输入到模型的是NV12的数据。 另外,理解方面要注意一下哈:PYTHON端输出到模型是YUV444_128这个也是quanti.onnx和.bin之前的在推理是的差距之一,手册上有写,但是不影响本问题。

      你可以用hrt_model_exec model_infer看一下上述配置下产出的bin模型的的输出信息,然后用netron看一下quanti.onnx的信息,两个的output信息应该是一致的
      2024-09-13
      0
    • 默认82368回复Huanghui:

      在板端用hrt_model_exec infer工具推理了bin模型并且导出了txt结果,推理同一张图像。

      发现板端推理特征图数值与python的*original.onnx和*quantized.onnx不一致(形状是对齐的)。

      请问这个可能是什么原因?

      2024-09-14
      0