引言
在近期工具链实践过程中,频繁出现 BC 模型在插入 NV12 预处理节点后精度崩溃的现象。经分析,此类问题可分为两类:其一为用户侧 BGR/RGB 转 NV12 的代码实现缺陷;其二为 BGR/RGB 与 NV12 格式转换过程中固有的不可逆误差所致。后者的根本原因在于模型训练阶段存在严重过拟合现象,导致模型泛化能力薄弱,无法容忍格式转换带来的微小数据偏差。
此类问题的传统排查流程耗时较长,且往往需要重新训练浮点模型,对用户开发进度造成显著影响。基于此,本文提供一套标准化的快速排查方案,旨在缩短问题定位周期,降低对开发节奏的干扰。
问题确定与现象
关键术语定义
- qat_nv12.bc/quantized_nv12.bc:插入 NV12 预处理节点的伪量化 / 定点 BC 模型
- qat_feat.bc/quantized_feat.bc:未插入 NV12 预处理节点的伪量化 / 定点 BC 模型
典型现象
问题通常表现为:在对插入 NV12 预处理节点的 HBM 或 qat_nv12.bc/quantized_nv12.bc 进行精度验证时,出现quantized_feat.bc 精度正常而 quantized_nv12.bc 精度异常的特征性差异。
NV12 节点插入规范
在 qat.bc 中插入 NV12 预处理节点的标准代码如下:
核心验证思路
通过单帧图像分别推理两类模型(含 NV12 节点与不含 NV12 节点),对比输出结果的可视化效果及数值相似度。预期异常特征为:
quantized_nv12.bc 与 quantized_feat.bc 推理结果差异显著
qat_nv12.bc 与 quantized_nv12.bc 推理结果一致性差
推理时需要注意两个问题:
quantized_nv12.bc已经插入了NV12->bgr/rgb和归一化节点了,所以其输入为NV12图像;quantized_feat.bc的输入需要对齐浮点模型,为手动做过归一化操作的bgr/rgb图像;
bgr/rgb->NV12图像的方式有多种,推荐使用以下方式;
原因验证与示例
验证原理
当确定是插入NV12预处理节点导致的bc/hbm精度下降后,且确定输入数据处理过程完全正确,为了进一步确定原因,可以通过以下方式来证明:在输入数据中加入2-3个像素值的随机噪声推理浮点模型。
rgb->NV12的过程是有损的,所以我们可以在输入图像中加小幅的随机噪声(2-3个像素值即可),然后输入到浮点模型或者原始浮点onnx,如果加小噪声前后的模型输出相差很大(可以观察cos相似度、L1等),证明确实为浮点模型过拟合导致。
参考实现代码
以下为对比输入数据加噪前后,比较浮点onnx推理结果的示例代码:
一般来说,若输出余弦相似度低于99.9%,则可判定为浮点模型过拟合。此时建议在模型训练阶段增加BGR/RGB→NV12→YUV444的预处理流程,使模型在训练过程中学习并适应 NV12 转换带来的固有误差,从而提升部署时的精度稳定性。
