TDA4VM: TDA4VM-RTOS-C7X-pre-proc

Part Number: TDA4VM

背景:

TDA4VM开发板

目前基于RTOS-SDK中的vision_apps里面app_tidl_od_cam、app_tidl_cam、app_tidl_seg_cam预处理节点创建app_create_graph_pre_proc  都有不同内核定制函数

 

 

问题:

1、目前客户需要实现的预处理流程:将2D Bayer阵列转换为4通道图像;裁剪到有效范围 [8, 511];归一化到 [0, 1];从  (H, W, C)  →  (C, H, W);添加batch维度: (C, H, W)  →  (1, C, H, W)。    这些在C66_1 DSP是否可以得到实现呢?    

2、如果可以,需要自定义内核函数实现对应的预处理流程么?

3、有对应实现的流程、文档或者demo么?

  • 您好,收到了您的案例,调查需要些时间,感您的耐心等待

  • 您是试图对二维数组进行去巴耶尔化处理以生成 RGB 图像,然后对其进行裁剪和转换操作,还是只是将二维数组转换为 4 通道图像(每个通道分别对应 R、G1、G2、B)呢?
    如果您想对图像进行去去色处理,那么可以使用“VISS”节点来实现。
    通常,TIDL 节点会接受以(NCHW)格式呈现的张量,其中 N 表示批次维度。
    在预处理节点中,我们将把 NV12 或 YUV 格式的图像转换为 RGB 格式,并将其打包成一个 1×C×H×W 的张量。
    您可以参考预处理内核的实现代码,即位于“vision_apps/kernels/img_proc/c66/vx_image_preprocessing_target.c”这一文件中。

  • 背景:

    TDA4VM开发板

    RTOS-SDK

    使用流水线构建视觉处理流

    image.png

    构建代码

        if(status == VX_SUCCESS)
        {
            app_create_graph_pre_proc(obj->graph, &obj->preProcObj, obj->scalerObj.output[0].arr);
            APP_PRINTF("Pre proc graph done!\n");
        }     if(status == VX_SUCCESS)
        {
            app_create_graph_tidl(obj->context, obj->graph, &obj->tidlObj, obj->preProcObj.output_tensor_arr);
            APP_PRINTF("TIDL graph done!\n");
        }     if(status == VX_SUCCESS)
        {
            app_create_graph_post_proc(obj->graph, &obj->postProcObj, obj->scalerObj.output[1].arr, obj->tidlObj.out_args_arr, obj->tidlObj.output_tensor_arr[0]);
            APP_PRINTF("Draw detections graph done!\n");
        }  

    目前客户想实现CSI2-RX    ---->   C6x_1    ----->     NPU/c7x    ----->   C6x_2    ----->    viss 的流程

    问题:

    1、在app_create_graph_tidl输入的obj->preProcObj.output_tensor_arr,是在预处理创建的对象,实际的tensor填充是在流水线开始后将每一帧RAW数据进行转换为tensor填充到tidl中进行推理?

    2、目前tidl-c7x处理流程只能接收openvx 的vx_image格式输入,不支持tivx_raw_image的直接灌入,是否是需要修改host参数校验和dsp-c6x实际运算,才能支持tivx_raw_image?如果是这样,是否可以提供对应的代码demo?

    3、对于tidl-c7x处理流程的输出,也是obj->tidlObj.out_args_arr, obj->tidlObj.output_tensor_arr[0]张量,需要后处理生成对应的vx_image格式?如果需要生成tivx_raw_image,需要修改后处理流程?如果是,是否可以提供对应的带么demo呢?

  • 是的,数据的实际填充是在管道启动时进行的。
    对于每一帧,原始数据由 viss 节点转换为 yuv 格式,然后预处理节点会将 yuv 格式转换为 RGB 格式,并将其以张量格式打包,然后将其传递给 tild 节点进行推理。

    TIDL-C7X 接收的输入形式为 vx_tensor,而非 vx_image,预处理节点会将 vx_image 转换为 vx_tensor。
    如果您想要对原始图像进行预处理,那么您需要将 dsp-c6x 的 pre_proc 内核修改为能够接受 tivx_raw_image 数据格式。目前我们还没有任何演示程序能够将 tivx_raw_image 输入到预处理节点中。这种方法在 SDK 中尚未经过验证。通常的流程是先将原始图像转换为 YUV/RGB 格式,然后再应用预处理操作。

    tidl_node 以张量格式给出输出结果,而 post_proc 节点则获取 tidl 输出张量以及用于预处理(以 yuv 或 RGB 格式)的输入图像,并对 tidl 输出进行处理。
    对于不同的模型类型,会有不同的 post_proc 节点。
    例如,对于检测模型,张量将包含边界框的坐标,post_proc 节点会在图像中绘制这些框,并给出处理后的输出图像。对于分割模型,tidl 输出将与输入图像混合,以显示不同物体之间的分割情况。
    post_proc 的实现取决于 tidl 模型的输出。

    这取决于使用 tidl 输出数据的是谁。在演示展示或镶嵌节点中,将会使用这些数据来显示结果,因此后处理节点会被编写出来以提供图像作为输出。如果你希望输出的是 tivx_raw_image ,那么是的,你必须相应地修改后处理节点。但我们的 SDK 中没有这个示例。