泡沫侠客
1
1.芯片型号:J5
2.天工开物开发包OpenExplorer版本:J5_OE_1.1.49
3.问题定位:板端部署
4.问题具体描述:针对yolov5s采用PTQ量化得到对应的.bin模型,并采用hb_verifie工具与quanti.onnx模型(改模型可正常推理)进行验证,结果显示通过。但是目前部署到板端进行推理,采用的是ai_benchmark里面的PTQYolo5PostProcessMethod方法进行的后处理,并针对自己的任务做了相应的修改,结果出现了很多预测框,而且置信度都很大,请问应该从哪儿进行排查呢?
颜值即正义
2
你好,请问PTQ生成的quantized_model.onnx模型在X86端使用Python推理的精度正常吗?因为quantized_model和bin模型推理输出结果是严格一致的,在将.bin模型部署到板端之前建议先在PC端使用Python验证quantized_model.onnx模型的精度,排查是否是由量化导致的模型精度掉点
泡沫侠客
3
PTQ生成的quantized_model.onnx模型在X86端使用Python推理精度是正常的,其中量化类型采用的是default,现在就是部署到板端精度不行
颜值即正义
4
quantized_model.onnx模型精度没问题,hb_verifier通过,那问题就定位在板端的后处理代码上了,建议您检查后处理代码的正确性
泡沫侠客
5
后处理代码采用的PTQYolo5PostProcessMethod,修改了类别、anchor大小等内容,和X86端python推理修改的内容保持了一致,自己也看了一下代码,也没发现问题,请问一般还应该修改哪一块的代码?
颜值即正义
7
请排查一下:板端的图像前处理代码,PTQYolo5PostProcessMethod中几个重要参数stride、score_threshold和nms_threshold。尝试调高score_threshold和nms_threshold,看看可视化效果的变化。
此外想问一下,你提供的这个板端可视化图是怎么实现的,49版本OE我们还没有提供太多的ai_benchmark可视化示例,我看看是不是这部分出了问题
泡沫侠客
8
量化模型用的49版本的OE包,现在板端部署的后处理以及可视化都是用的62版本的OE包
泡沫侠客
9
stride参数不是固定的8 16 32吗?调大了score_threshold和nms_threshold,效果和之前是差不多的,框依然很多
颜值即正义
10
这里给出几个建议:
1、量化和部署使用同一个版本的OE包,建议都基于62进行
2、对比python后处理和C++后处理每一步的结果差异,可以在后处理代码中间加入保存结果到本地的代码,一段一段对比后处理每个步骤是否存在精度差异,定位到问题代码。
泡沫侠客
11
目前量化和部署均采用了62版本的OE包,效果和之前是一样的,模型目前的输入为640*640,应该不会影响板端的推理结果吧?
颜值即正义
12
只要quantized onnx的输出结果是正常的,bin的输出结果就没问题,关键是后处理代码
泡沫侠客
13
除了PTQYolo5PostProcessMethod,还有其他的yolov5后处理代码可以参考的吗?看了一遍前处理和后处理代码,也没看出来有什么问题
泡沫侠客
14
在后处理代码中反量化过程中,并没有减去zeroPoint,这样会不会有问题?而且,tensor里面的zeroPointLen长度为0,这是什么原因呢?
颜值即正义
15
没有减零点值,可能是因为零点值为0,你可以打印下zeroPointData看看是不是为0,另外,如果zeroPointLen长度为0,那说明零点值就是0,不需要减。
颜值即正义
16
如果模型的输出是一样的,但经过后处理就不一样了,那就是python和c++的计算过程不是完全一致的,需要一点点排查是哪里出现了差异
泡沫侠客
17
我把python推理和板端推理的结果对比了一下,两个输出不一样,但是板端推理的结果是和hb_verifier输出的结果一致的,python端推理的结果和hb_verifier输出arm_model和quanti_model结果不一样,但python推理的结果是OK的,这是怎么回事?
泡沫侠客
18
也就是模型输出是不一致的,但是hb_verifier验证的模型输出是一致的,难道是我在python推理的时候输出的地方不对吗?
泡沫侠客
19
在python后处理函数里做的打印,输出的结果和其他三种情况不一样,你看这个位置打印的结果是模型最终的一个推理结果吧?
颜值即正义
20
hb_verifier
工具是用于对指定的定点模型和runtime模型进行结果验证的工具。hb_verifier验证的模型输出是一致的,说明C++和python的后处理没有对齐。可以每隔一段代码就保存下后处理的中间结果,看下哪里没对齐。