专栏算法工具链【J6】quantized.bc与nv12_quantized.bc比对一致性

【J6】quantized.bc与nv12_quantized.bc比对一致性

Jade-self2024-12-23
135
0

在使用J6工具链进行模型转换编译链路中,有插入图像前处理节点的步骤,若不细究其中的参数原理,很有可能在这儿出现问题,本文将具体介绍插入图像前处理节点前后quantized.bc与nv12_quantized.bc的比对过程以及推荐方案。

1. 插入图像前处理

preprocess处理流程:输入 -> 图像类型转换 -> 数据格式转换 (int 转 float, 即除 divisor) -> 减均值 mean -> 除标准差 standard deviation -> 输出(数据类型为 float)

以输入为 si8 为例,处理流程为:

  • 将数据归一化至 [0, 1] 区间:X' = (X(si8) + 128) / divisor(255)

  • 再将归一化后的数据标准化: Y = (X' - mean) / std

地平线工具链提供的方式为:insert_image_preprocess 方法,包括以下参数:

  • mode,可选值包含:

    • "yuvbt601full2rgb" YUVBT601Full 转 RGB (默认)

    • "yuvbt601full2bgr" YUVBT601Full 转 BGR

    • "yuvbt601video2rgb" YUVBT601Video 转 RGB 模式

    • "yuvbt601video2bgr" YUVBT601Video 转 BGR 模式

    • "bgr2rgb" BGR转RGB

    • "rgb2bgr" RGB转BGR

    • None 不进行图像格式的转换,仅进行 preprocess 处理

  • 数据转换除数divisor,int 类型,默认为 255

  • 均值mean,double 类型,长度与输入c方向对齐,默认为 [0.485, 0.456, 0.406]

  • 标准差值std,double 类型,长度与输入c方向对齐,默认为 [0.229, 0.224, 0.225]

  • 返回值:返回替代原函数参数的新参数

insert_image_convert图像转换不是本文介绍的重点。

使用示例如下:

理论上介绍到这儿,大家应该就已经理解了,毕竟上述代码中的注释介绍的也很清楚,但通常大家是:遇到问题,回头排查问题出在哪儿。如何排查呢?

2. 比对两个bc的输出

比对两个bc的输出,首先要保证输入是符合预期的,毕竟二者的输入是不同的,一个加入了前处理节点,一个没加入前处理节点。

参考代码如下:

从上述代码中可以看到,比对了模型输出的数值差异与相似度两个指标。为什么做不到数值一致呢?这是由于nv12数据量只有YUV444/RGB等格式的一半,因此输出正确与否,可以重点关注下相似度以及数据集精度。

需要特别在意的配置参数如下:

3. 推荐图像前处理方式

图像金字塔的输出图像是 centered YUV444 格式,数据范围是 [-128, 127],但在训练阶段中,您的训练数据集可能是 RGB 格式的。此时有两种处理方式:

  • 方式1:在训练模型时就采用centered YUV444格式。

  • 方式2:依旧使用RGB训练,参考本文第一节在模型部署期间。(YUV444 转 RGB 几乎无损,轻微误差通常来源于计算机精度和颜色空间定义差异)

通常,推荐用户训练时,在图像预处理阶段将 RGB 格式的图片转为 YUV 格式,与推理时 BPU 的数据流对齐,也就是推荐上述方式1。

YUV 一般用来描述模拟电视系统的颜色空间,在 BT.601 中 YUV 主要有两种制式:YUV studio swing(Y:16235,UV:16240)和 YUV full swing(YUV:0~255)。在训练时,您可以使用 horizon.functional.rgb2centered_yuv 或 horizon.functional.bgr2centered_yuv 将 RGB 图像转换为 BPU 所支持的 YUV 格式。

BPU 支持的 YUV 格式是 full swing,因此在调用地平线工具链plugin工具中 YUV 的相关函数时,应确保指定了 full 作为 swing 格式,以 rgb2centered_yuv 为例,该函数的定义如下:

函数输入为 RGB 图像,输出为 centered YUV 图像。其中,centered YUV 是指减去了 128 的偏置的 YUV 图像,这是 BPU 图像金字塔输出的标准图像格式。对于 full swing 而言,其范围应为 -128~127。您可以通过 swing 参数控制 full 和 studio 的取向。为了和 BPU 数据流格式对齐,请您将 swing 设为 “full”。

以上内容就是quantized.bc与nv12_quantized.bc之间,在图像前处理层面可能存在问题的介绍,希望阅读完后,能够了解二者的比对过程以及推荐方案。

算法工具链
社区征文杂谈技术深度解析征程6
+1
评论0
0/1000