c++推理接口,对于输入tensor的数据预处理操作的疑问

  1. 系统软件版本: x3_ubuntu_v1.1.6
  2. OE发布包:horizon_xj3_openexplorer_v2.5.2_py38_20230331.tar.gz

配置板端模型推理输入为NHWC,BGR,640*640图像,模型转换配置见附件:ps_config.yaml;

调用c++接口,加载模型,获取模型输入的hbDNNTensorProperties,其中:validShape:[1, 640, 640, 3], alignedShape:[1, 640, 640, 4],alignedByteSize:1638400;

调用c++接口,推理测试:

(1)通过opencv读取图像,直接把数据(640*640*3)拷贝到输入tensor,执行推理,没有结果;

(2)通过opencv读取图像,通过cvtColor将BGR转BGRA,把数据(640*640*4)拷贝到输入tensor,执行推理,没有结果;

(3)通过opencv读取图像,将所有数据加上128,再通过cvtColor将BGR转BGRA,把数据(640*640*4)拷贝到输入tensor,执行推理,有输出结果,且结果为正确的;

(之所以做步骤(3),是因为在测试hbDNNResize接口,发现调用hbDNNResize接口后,输出的数据是这样的。)

我的问题是:c++推理接口(python接口没有这个问题),对于NHWC BGR输入数据是必须要做步骤(3)的操作吗?其他格式的数据是否也有类似的要求,能否详细说明?

ps_config_20230516110643.yaml

您好,关于为rgb/bgr分配内存空间的示例,可以查看horizon_runtime_sample/code/01/tensor示例,rgb/bgr数据只需要按照valid shape分配tensor的内存空间即可,也不需要用户自己转成4通道,在板端推理时推理库内部会再单独再做一次aligned相关的处理。另外注意到你的yaml中,rt是bgr,可train是rgb,和你的叙述似乎有点矛盾,而且opencv读到的图是0-255的,你直接加上128转bgra似乎并不符合要求,这方面可以再描述细致一点嘛

你好,加减128这里面是和转化的方式有关,配置项模型量化有预处理的数据操作,这里选择的尺度减去128,则需要,否则原图推理即可

您好,麻烦您帮忙看下附件,转模型配置的预处理选项中norm_type: ‘data_scale’,scale_value: 0.003921568627451,按照配置文件上说明,这个配置是没有加减128的预处理操作的。

还有就是我配置的输入是BGR,为什么c++推理接口需要我提前将BGR图像转成BGRA图像(python推理接口是不需要的),BPU SDK API手册上并没有这块说明,麻烦您也解释一下,谢谢!

scale_value: 0.003921568627451 你用256和数值乘一下,就会发现是0-1的的区间

你好,目的是4通道对齐,加速计算,python封装好了,所以不需要进行类似操作

那只是前处理除以255的操作,和加减128有什么联系吗?

《BPU SDK API手册》没有覆盖到这一点,作为一个api开发文档有很多东西都没有说明白,麻烦详细说明下,非常感谢!