在使用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。
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之间,在图像前处理层面可能存在问题的介绍,希望阅读完后,能够了解二者的比对过程以及推荐方案。



