专栏算法工具链板端部署的.bin模型推理精度不足

板端部署的.bin模型推理精度不足

泡沫侠客2023-09-21
49
40
1.芯片型号:J5
2.天工开物开发包OpenExplorer版本:J5_OE_1.1.49
3.问题定位:板端部署
4.问题具体描述:针对yolov5s采用PTQ量化得到对应的.bin模型,并采用hb_verifie工具与quanti.onnx模型(改模型可正常推理)进行验证,结果显示通过。但是目前部署到板端进行推理,采用的是ai_benchmark里面的PTQYolo5PostProcessMethod方法进行的后处理,并针对自己的任务做了相应的修改,结果出现了很多预测框,而且置信度都很大,请问应该从哪儿进行排查呢?
算法工具链
评论1
0/1000
  • 颜值即正义
    Lv.2

    你好,请问PTQ生成的quantized_model.onnx模型在X86端使用Python推理的精度正常吗?因为quantized_model和bin模型推理输出结果是严格一致的,在将.bin模型部署到板端之前建议先在PC端使用Python验证quantized_model.onnx模型的精度,排查是否是由量化导致的模型精度掉点

    2023-09-22
    0
    39
    • 泡沫侠客回复颜值即正义:

      PTQ生成的quantized_model.onnx模型在X86端使用Python推理精度是正常的,其中量化类型采用的是default,现在就是部署到板端精度不行

      2023-09-22
      0
    • 颜值即正义回复泡沫侠客:

      quantized_model.onnx模型精度没问题,hb_verifier通过,那问题就定位在板端的后处理代码上了,建议您检查后处理代码的正确性

      2023-09-22
      0
    • 泡沫侠客回复颜值即正义:
      后处理代码采用的PTQYolo5PostProcessMethod,修改了类别、anchor大小等内容,和X86端python推理修改的内容保持了一致,自己也看了一下代码,也没发现问题,请问一般还应该修改哪一块的代码?
      2023-09-22
      0
    • 泡沫侠客回复颜值即正义:

      这一个函数会不会出现问题呢?

      2023-09-22
      0
    • 颜值即正义回复泡沫侠客:

      请排查一下:板端的图像前处理代码,PTQYolo5PostProcessMethod中几个重要参数stride、score_threshold和nms_threshold。尝试调高score_threshold和nms_threshold,看看可视化效果的变化。

      此外想问一下,你提供的这个板端可视化图是怎么实现的,49版本OE我们还没有提供太多的ai_benchmark可视化示例,我看看是不是这部分出了问题

      2023-09-22
      0
    • 泡沫侠客回复颜值即正义:

      量化模型用的49版本的OE包,现在板端部署的后处理以及可视化都是用的62版本的OE包

      2023-09-22
      0
    • 泡沫侠客回复颜值即正义:
      stride参数不是固定的8 16 32吗?调大了score_threshold和nms_threshold,效果和之前是差不多的,框依然很多
      2023-09-22
      0
    • 颜值即正义回复泡沫侠客:

      这里给出几个建议:

      1、量化和部署使用同一个版本的OE包,建议都基于62进行

      2、对比python后处理和C++后处理每一步的结果差异,可以在后处理代码中间加入保存结果到本地的代码,一段一段对比后处理每个步骤是否存在精度差异,定位到问题代码。

      2023-09-22
      0
    • 泡沫侠客回复颜值即正义:

      目前量化和部署均采用了62版本的OE包,效果和之前是一样的,模型目前的输入为640*640,应该不会影响板端的推理结果吧?

      2023-09-22
      0
    • 颜值即正义回复泡沫侠客:

      只要quantized onnx的输出结果是正常的,bin的输出结果就没问题,关键是后处理代码

      2023-09-22
      0
    • 泡沫侠客回复颜值即正义:

      除了PTQYolo5PostProcessMethod,还有其他的yolov5后处理代码可以参考的吗?看了一遍前处理和后处理代码,也没看出来有什么问题

      2023-09-22
      0
    • 泡沫侠客回复颜值即正义:

      在后处理代码中反量化过程中,并没有减去zeroPoint,这样会不会有问题?而且,tensor里面的zeroPointLen长度为0,这是什么原因呢?

      2023-09-23
      0
    • 颜值即正义回复泡沫侠客:
      没有减零点值,可能是因为零点值为0,你可以打印下zeroPointData看看是不是为0,另外,如果zeroPointLen长度为0,那说明零点值就是0,不需要减。
      2023-09-25
      0
    • 颜值即正义回复泡沫侠客:

      如果模型的输出是一样的,但经过后处理就不一样了,那就是python和c++的计算过程不是完全一致的,需要一点点排查是哪里出现了差异

      2023-09-25
      0
    • 泡沫侠客回复颜值即正义:
      我把python推理和板端推理的结果对比了一下,两个输出不一样,但是板端推理的结果是和hb_verifier输出的结果一致的,python端推理的结果和hb_verifier输出arm_model和quanti_model结果不一样,但python推理的结果是OK的,这是怎么回事?
      2023-09-25
      0
    • 泡沫侠客回复泡沫侠客:

      也就是模型输出是不一致的,但是hb_verifier验证的模型输出是一致的,难道是我在python推理的时候输出的地方不对吗?

      2023-09-25
      0
    • 泡沫侠客回复泡沫侠客:

      在python后处理函数里做的打印,输出的结果和其他三种情况不一样,你看这个位置打印的结果是模型最终的一个推理结果吧?

      2023-09-25
      0
    • 颜值即正义回复泡沫侠客:
      hb_verifier工具是用于对指定的定点模型和runtime模型进行结果验证的工具。hb_verifier验证的模型输出是一致的,说明C++和python的后处理没有对齐。可以每隔一段代码就保存下后处理的中间结果,看下哪里没对齐。
      2023-09-25
      0
    • 颜值即正义回复泡沫侠客:

      区分下“模型的输出”和“后处理的输出”这两个概念哈

      2023-09-25
      0
    • 泡沫侠客回复颜值即正义:

      现在就是模型输出,上面python打印的模型输出和板端.bin模型运行的模型输出是不一样的,但是hb_verifier工具验证的模型输出是一致的,且和板端.bin模型的模型输出一致,这是咋回事?

      2023-09-25
      0
    • 泡沫侠客回复泡沫侠客:

      现在的打印都没有经过后处理代码,都是模型输出

      2023-09-25
      0
    • 颜值即正义回复泡沫侠客:

      是不是预处理的精度没对齐?

      2023-09-25
      0
    • 泡沫侠客回复颜值即正义:

      这个怎么查看?但是我也看了一下OE包里自带的yolov5x,python端的模型输出和板端也不一样,但是两者的推理结果是一样的,满脸问号?????????

      2023-09-25
      0
    • 泡沫侠客回复颜值即正义:

      你这边先确定一下我上面发的图,打印的地方是不是模型的输出,这个对不对?

      2023-09-25
      0
    • 颜值即正义回复泡沫侠客:

      明白了,大概率是因为quanti onnx和bin模型的输出分支的顺序发生了变化,你只打印每个分支输出的前十个数,看看这两个模型的输出顺序有没有变。

      2023-09-25
      0
    • 泡沫侠客回复颜值即正义:
      我把python端quanti onnx的输出打印,然后在hb_verifier工具校验保存的txt文件里搜索,三个文件里都没有找到对应的数值,你说的的分支是什么?
      2023-09-25
      0
    • 颜值即正义回复泡沫侠客:

      就是输出的顺序

      2023-09-25
      0
    • 泡沫侠客回复颜值即正义:

      把python端quanti onnx的输出打印,然后在hb_verifier工具校验保存的txt文件里搜索,三个文件里都没有找到对应的数值,这个应该排除不是顺序问题了吧?txt中每个输出都有

      2023-09-25
      0
    • 泡沫侠客回复颜值即正义:
      现在有个问题,如果我Python打印的的地方是正确的,那为啥和hb_verifier工具校验的结果不一样,是这两种方式处理的方式不一致吗?
      2023-09-26
      0
    • 颜值即正义回复泡沫侠客:

      不需要打印具体数值,也可以只打印输出的shape进行比较

      2023-09-26
      0
    • 颜值即正义回复泡沫侠客:

      如果hb_verifier能通过,模型的精度肯定是没问题的

      2023-09-26
      0
    • 颜值即正义回复泡沫侠客:

      你好,还麻烦确认一下模型在转换编译的过程中是否删除了模型前后端的量化、反量化节点,方便的话请对bin模型使用工具hb_perf xxx.bin,提供一下hb_perf_result目录下的二进制模型文件结构图

      2023-09-26
      0
    • 颜值即正义回复颜值即正义:
      像这种python端推理正确,hb_verifier也可以通过,但是板端推理有误,还有可能是模型量化/反量化节点的问题,如果删除了量化节点,需要你在板端喂数据的时候手动在前处理中添加量化操作,请参考 PTQ&QAT方案板端验证注意事项 (horizon.cc) ;如果删除了反量化节点,则需要在后处理中融合反量化操作,删除的反量化节点保存的scale数据都在hb_model_modifier.log中
      2023-09-26
      0
    • 泡沫侠客回复颜值即正义:

      是不是缺少反量化节点?

      2023-09-26
      0
    • 泡沫侠客回复颜值即正义:
      后处理中已经做了反量化操作,而且使用的scale和hb_model_modifier.log是一致的,是不是前处理模块有点问题?
      2023-09-26
      0
    • 泡沫侠客回复颜值即正义:

      输出的分支是一样的,都是按80*80 40*40 20*20输出的

      2023-09-26
      0
    • 颜值即正义回复泡沫侠客:
      你好,对于板端自己准备的输入数据,需要在前处理中把图像数据从bgr/rgb处理成yuv444格式再输入给模型,否则是会导致推理结果出错的,包括您之前提到了自己推理的python端和板端不一致但是hb_verifier结果通过也是因为这个原因。参考 PTQ&QAT方案板端验证注意事项 (horizon.cc) 1.2.2章节的解释和脚本,修改前处理和输入的数据
      2023-09-26
      0
    • 泡沫侠客回复颜值即正义:

      这上面写的板端数据转到nv12就可以了吧,nv12->yuv444由编译器完成???

      2023-09-26
      0
    • 颜值即正义回复泡沫侠客:

      板端处理到nv12就可以了,PC端需要处理到中间形式yuv444,抱歉之前的回复笔误,给您带来了误导

      2023-09-26
      0