1.引言
使用地平线 征程 6 算法工具链进行模型部署时,如果你的模型输入是图像格式,通常会遇到如下信息。
对于初学者,可能会存在一些疑问,比如:
- nv12 是什么?
- 明明算法模型是一个输入,为什么看 hbm 模型,有 y 和 uv 两个输入?
- 为什么 uv 的 valid shape 不是 (1,224,224,2) ,而是(1,112,112,2)
- stride 中为什么有 -1?如果需要自己计算,计算公式是什么?
- 为什么 aligned byte size 是 -1,而不是一个具体的值?如果需要自己计算,计算公式是什么?
相信阅读完本文,可以帮助大家理解上面 5 个问题,下面来一起看一下。
NV12 是一种广泛应用的图像格式,特别在视频编解码领域,自动驾驶领域,嵌入式端图像输入一般都是 NV12,例如英伟达和地平线。
NV12 属于 YUV 颜色空间中的一种,采用 YUV 4:2:0 的采样方式。主要特点是将亮度(Y)与色度(UV)数据分开存储,地平线使用的 NV12,U 和 V 色度分量交替存储。
在深入理解 NV12 之前,我们首先需要对 YUV 颜色空间有基本的了解,YUV 理论介绍参考地平线社区文章:常见图像格式 中的部分章节。
2.YUV
YUV 是一种彩色图像格式,其中 Y 表示亮度(Luminance),用于指定一个像素的亮度(可以理解为是黑白程度),U 和 V 表示色度(Chrominance 或 Chroma),用于指定像素的颜色,每个数值都采用 UINT8 表示,如下图所示。YUV 格式采用亮度-色度分离的方式,也就是说只有 U、V 参与颜色的表示,这一点与 RGB 是不同的。
不难发现,即使没有 U、V 分量,仅凭 Y 分量我们也能 “识别” 出一幅图像的基本内容,只不过此时呈现的是一张黑白图像。而 U、V 分量为这些基本内容赋予了色彩,黑白图像演变为了彩色图像。这意味着,我们可以在保留 Y 分量信息的情况下,尽可能地减少 U、V 两个分量的采样,以实现最大限度地减少数据量,这对于视频数据的存储和传输是有极大裨益的。这也是为什么,YUV 相比