我使用相同的校准数据集,分别以nv12和rgb进行量化编译;在x86上用python端模拟板端c++进行测试推理时,nv12的推理结果部分会出现置信度低和小部分的漏检情况,想问一下可能是什么原因如何排查。
我使用相同的校准数据集,分别以nv12和rgb进行量化编译;在x86上用python端模拟板端c++进行测试推理时,nv12的推理结果部分会出现置信度低和小部分的漏检情况,想问一下可能是什么原因如何排查。



可能是NV12和RGB两条链路的预处理结果没有完全对齐,可以选择一张能稳定复现的图片先按RGB链路执行resize、letterbox/padding、BGR/RGB 通道转换等公共预处理,保存此时的rgb_preprocess。再将其转换为NV12,并按实际推理输入的Y plane+UV plane格式组织数据,之后将这个NV12再转回RGB去和rgb_preprocess去进行逐元素对比。还有一点需要注意就是BGR转NV12时不能直接把I420数据当作NV12使用,I420 的U、V是分平面排列,而NV12的UV是交错排列。生成NV12时需确认U、V的交错顺序。顺便一问,你使用的是bc模型在x86推理还是onnx呢?


示例代码如下:
qat_model = load("qat.bc") #此处的qat.bc需要您手动通过python api进行导出,如果通过hb_compile则只能得到最终结果nv12_quantized.bc
func = qat_model.functions[0]
for input in func.inputs[::-1]:
node = input.insert_transpose(permutes=[0, 3, 1, 2])
# 【重点检查这里】确保 mode, mean, std与你训练代码完全对应
node = node.insert_image_preprocess(mode="yuvbt601full2rgb", divisor=1, mean=[128,128,128], std=[128,128,128])
node.insert_image_convert("nv12")
nv12_model = convert(qat_model, "j6") #重新定点化以融合新节点
save(nvilz_model, "nv12_quantized.bc")