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



你好,我实验了一下,发现有些问题。
在模型输入格式指定为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中,不报错,推理结果更接近原始模型,但不完全正确。

您好,针对您提出的问题,回复主要如下:
针对 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 为主。
Y/NV12/BGRP/RGBP 为 NCHW 排布,YUV444/BGR/RGB 则是 NHWC 排布。
对齐要求包括起始地址和数据对齐的要求。具体主要分为 3 个方面:
1)模型输入无奇偶或大小的限制,但 Y/NV12/NV12_SEPARATE 要求 HW 均为偶数;
2)数据跨距在 Y/NV12/NV12_SEPARATE 时要求 W 16 对齐;
3)传入 BPU 的内存要求起始地址 16 对齐。
(例如 227x227 输入的 SqueezeNet,如果是 nv12 输入,则要求 w 对齐到 240,h 对齐到 228)