专栏算法工具链【J6】灰度图部署链路介绍

【J6】灰度图部署链路介绍

Jade-self2025-07-09
73
1

1. 为什么是灰度图

相较于 RGB 三通道图像,灰度图仅保留亮度信息(Y 分量),数据量减少 2/3,相比于常用的NV12图像,数据量减少1/3,内存占用与计算负载显著降低。对于下游网络结构而言,单通道网络计算量/参数量也会更少,这对边缘设备的实时处理至关重要。

灰度图部署有一个问题:如何将视频流中的 NV12 数据高效转换为模型所需的灰度输入,并在工具链中实现标准化前处理流程。

视频通路传输的原始数据通常采用 NV12 格式,这是一种适用于 YUV 色彩空间的半平面格式:

  • 数据结构:NV12 包含一个平面的 Y 分量(亮度信息)和一个平面的 UV 分量(色度信息),其中 Y 分量分辨率为 W×H,UV 分量分辨率为 W×H/2。

  • 灰度图提取:对于灰度图部署,仅需使用 NV12 中的 Y 分量。以 1920×1080 分辨率为例,若NV12中Y与UV分量连续存储,Y 分量占据前 1920×1080 字节,后续部分为 UV 分量,可直接忽略或舍弃,若分开存储,使用起来更简单。

2. 灰度图部署数据链路

视频通路过来的数据不能直接是灰度图,而是nv12数据,对于灰度图部署,可以只使用其中的y分量。

Description

2.1 手动插入前处理节点

在工具链提供的绝大部分材料中,前处理节点多是对于3通道网络、nv12输入进行的,查看工具链用户手册《进阶内容->HBDK Tool API Reference》中几处api介绍,可以发现也是支持gray灰度图的,具体内容如下:

  • insert_image_convert(self, mode str = "nv12")

对于batch输入,均值、标准化、归一化等操作,可以在insert_image_preprocess中实现:

  • insert_image_preprocess( self, mode str, divisor int, mean List[float], std List[float], is_signed bool = True)

手动插入前处理节点可参考:

  • mean = [0.485] 和 std = [0.229]:定义图像归一化时使用的均值和标准差

  • func = qat_bc[0]:获取量化感知训练 (QAT) 模型中的第一个函数 / 模块作为处理入口。

  • for input in func.flatten_inputs[::-1]:逆序遍历模型的所有扁平化输入节点。

  • split_inputs = input.insert_split(dim=0):将输入数据按批次维度 (dim=0) 分割,这是处理batch输入必须要做的。

  • node = split_input.insert_transpose([0, 3, 1, 2]):将数据维度从[B, H, W, C](NHWC 格式) 转换为[B, C, H, W](NCHW 格式),也是必须要做的。

  • node.insert_image_preprocess(...):执行图像预处理

  • node.insert_image_convert(mode="gray"):插入单通道灰度图

3. 全流程示例代码

算法工具链
社区征文征程6技术深度解析杂谈
评论1
0/1000
  • bopk
    Lv.1

    转的模型没有量化吗,没有看到量化的数据集呢

    2025-08-27
    0
    0