专栏算法工具链模型输入align问题

模型输入align问题

已解决
clover2020-09-18
231
6

我的模型输入本身是1x3x300x300,align后的输入要求是1x4x300x304。而我从摄像头获取数据经过vps缩放后应该是1x3x300x300的。那么在给输入tensor赋值时,我需要自己在每一行数据后面加padding以达到align的数据效果吗?

算法工具链
评论2
0/1000
  • clover
    Lv.1

    你好,我实验了一下,发现有些问题。

    在模型输入格式指定为yuv444_128的时候,输入tensor的data_shape和aligned_shape都设定为原始模型输入大小,数据直接保持原样拷贝到tensor中,推理结果正确。

    模型输入格式指定为nv12时,输入tensor的data_shape和aligned_shape都设定为原始模型输入大小,此时,运行会报错:[ERROR:548208431120: 09:11:35]/home/users/yaoyao.sun/project/bpupredict_0817/src/bpu_task.cc:1508: input yuv nv12 w stride: 300 is not equal to model's stride: 304

    模型输入格式指定为nv12时,输入tensor的data_shape设定为原始模型大小,aligned_shape设定为align后的大小,数据不做Padding直接拷贝到tensor中,不报错,但推理结果错误。

    模型输入格式指定为nv12时,输入tensor的data_shape设定为原始模型大小,aligned_shape设定为align后的大小,数据做padding后放入tensor中,不报错,推理结果更接近原始模型,但不完全正确。

    2020-09-23
    0
    4
    • clover回复clover:

      我看了toolchain里的samples当中tensor_utils.cc文件下面你们对输入tensor的预处理方式之后更困惑了。针对nv12的图像,y通道做了padding,而uv数据是直接memcpy进去没做padding,这好像不太合理吧。能否请你们确认一下nv12输入下,数据align的方式?

      2020-09-24
      1
    • 芯链情报局回复clover:

      您好,针对您提出的问题,回复主要如下:

      1. 首先关注 tensor 格式

      针对 nv12,我们是提供了两种类型:BPU_TYPE_IMG_YUV_NV12 和 BPU_TYPE_IMG_NV12_SEPARATE。第一种是连续保存 Y 和 UV 分量,可通过偏移量进行操作;第二种则是 Y 和 UV 分开存储。

      一般从 vio 进入的视频帧数据经过 vps 后都是 Y/UV 分开存储,所以基本使用 BPU_TYPE_IMG_NV12_SEPARATE。而我们在 sample 中提供的都是回灌示例,所以会以 BPU_TYPE_IMG_YUV_NV12 为主。

      2. 关注数据 layout 分布

      Y/NV12/BGRP/RGBP 为 NCHW 排布,YUV444/BGR/RGB 则是 NHWC 排布。

      3. 关注 BPU 对齐要求

      对齐要求包括起始地址和数据对齐的要求。具体主要分为 3 个方面:

      1)模型输入无奇偶或大小的限制,但 Y/NV12/NV12_SEPARATE 要求 HW 均为偶数;

      2)数据跨距在 Y/NV12/NV12_SEPARATE 时要求 W 16 对齐;

      3)传入 BPU 的内存要求起始地址 16 对齐。

      (例如 227x227 输入的 SqueezeNet,如果是 nv12 输入,则要求 w 对齐到 240,h 对齐到 228)

      4. 关于 sample 中 tensor_utils.cc 代码里对 uv 分量的处理,直接用 memcpy 确实是存在 bug,这个我们会在下个版本进行修复,应该要考虑 padding 的。感谢您的指正~
      2020-10-09
      0
    • clover回复芯链情报局:

      感谢回复。数据align之后结果还是错误的问题找到了,因为给input tensor申请了cachable内存,给Input tensor赋值之后要flushmem,之前没做,所以结果不对。加入之后结果正确了。但是比较奇怪的是,没有对齐问题的数据,不做flush似乎结果也是正确的,这个应该怎么解释?

      2020-10-10
      1
    • anming回复clover:
      input tensor申请了cachable内存 情况下, 如果不调用flushMEM,确实存在这种随机情况。CPU回写+BPU读取的情况,建议是要做flush操作保证mem一致
      2020-10-10
      1
  • anming
    Lv.1

    不需要用户添加padding, 输入tensor与模型输入保持一致即可

    2020-09-18
    0
    0