This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4AH-Q1:边缘器件上预处理节点结果存在差异:I_output_arr 中的偏移

Guru**** 1490575 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1321418/tda4ah-q1-discrepancy-in-results-for-preprocnode-on-edge-device-offset-in-i_output_arr

器件型号:TDA4AH-Q1

以下是我观察到的细节:

  1. 输入:我将提供一个 nv12格式的图像作为输入到 PreprocNode。 当我将 PreprocNode 的已保存 r_input_arr 与原始 nv12映像进行比较时、我发现它们是相同的。 这表明预处理节点正确处理了输入。

  2. 输出:PreprocNode 的 I_output_arr 是已处理图像的可视化表示。 它是一个经 int16格式化的 RGB 图像、大小为[3x704x256]字节。 但是、对 I_output_arr 进行可视化后、我注意到通道之间的偏移。

    • 通道1偏移:I_output_arr 的通道1中的结果与通道0相比偏移了1408x2个字节。
    • 通道2偏移:与通道1相比、I_output_arr 通道2中的结果偏移了1408x2个字节。

    视觉表示表明、与通道0相比、通道1在右侧有额外的空白区、与通道1相比、通道2在右侧有额外的空白区。

此外、我观察到 TIDLNode.r_input_arr 被设置为 PreprocNode.i_output_arr。 此外,我还跟踪了 inDataLayer0层,观察到的现象是一致的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们重点关注 PreProc 节点。  

    您是否正在使用 TIVxImgPreProcNode ()?

    如果是、则可以在 vision_apps 的 DL 演示中看到对 NV12文件输入的相同用法。

    您可以参考相同的物体检测演示(vision_apps/apps/dl_demos/app_tidl_od/)(即文件输入 NV12并使用 pre-proc 节点)。

    您能否检查提供给预处理节点的配置(即 PAD_PIXEL、COLOY_CONV_FLAG)、所有这些配置均从所使用的模型的 ioBufDesc 中获得。

    此致、

    尼基尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,我们使用了 tivxImgPreProcNode ();

    我们首先尝试演示模型的物体检测演示(vision.apps/apps/dl_demos/app_tidl_od/)、结果显示性能正常。

    然后针对我们自己的模型尝试了物体检测演示、结果显示704字节的白色边沿。

    在演示模型中,输入[0]用作图像的输入,显示 inChannelPitch=(inWidth+L+R) x (inHeight+T+B),

    我们的模型输入[0]用作图像输入,并显示 inChannelPitch !=(inWidth+L+R) x (inHeight+T+B),它们之间有704个字节的差异,这正是白色边填充的量。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您必须根据您的输入模型大小修改 app_od.cfg 文件的参数。 能否确认您是否进行了同样的操作? 您可以共享修改后的.cfg 文件吗?

    此致、

    尼基尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    InWitdh、InHeight、L、R、B、 t、inChannelPitch 全部从 IoBuf 文件中读取、并且不是。 cfg 文件将更改它;

    Iobuf 文件在 PC 导入期间生成;为什么 inChannelPitch 不等于(inWitdh+L+R) x (inHeight+B+T)?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    编号 CFG 文件将更改它

    默认 OD 模式采用大小为1024 x 512的图像。 您能否确认您的型号是否也具有相同的图像分辨率? 否则、应更改.cfg dl_size 和 OUT_SIZE 参数。

    为什么 inChannelPitch 不等于(inWitdh+L+R) x (inHeight+B+T)的问题会发生

    抱歉、没有找到您的查询。 您的意思是为什么 inChannelPitch 与 ioBuffDesc 本身内部的其他计算不匹配?

    这些值是从导入的模型获得的、不会被应用程序修改。

    此致、

    尼基尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    。 CFG dl_size 和 out_size 参数已更改为704x256。

    inChannelPitch 不等于(inWitdh+L+R) x (InHeight+B+T)、这是否正常? 您能否导出输入为704x256的模型并测试 preproc 节点的输出

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    inChannelPitch 不等于(inWitdh+L+R) x (inHeight+B+T),这是否正常?

    我将在内部咨询 TIDL 专家、但从 preproc 的角度来看、inChannelPitch 在任何地方都没有使用。 该节点仅使用 InWidth、InHeight、L、R、B、T  

    。 它是 int16格式的 RGB 图像[/引号]

    它还使用 inElementType 来确定8位或16位模型。 在上面、您提到您的模型为16位、但您的 inElementType 为0和1、这是8位。 请您在结束时再次确认这一点吗?

    此致、

    尼基尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、我们注意到、如果 tidl_8bit-16bit-flag 集不同、则 preproc 节点输出可能是 uint16或 uint8;

    同时我们注意到 app_tidl_od 的默认输入是 uint8、于是重新导出了 uint8模型;

    您可以看到我提供的可视化图像。 绿色是 uint16的可视化结果、即我们以前运行的 uint16模型;灰色色调表示 uint8的可视化结果、即我们在 app_tidl_od 中运行的 uint8模型;

    两个可视化图像有相同的错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们已经针对上述问题确定问题位于张量的内存布局中;在正常情况下、张量中的内存访问应遵循左下角的图表。 事实上,preproc-node 的内存空间也是左下角的深灰色框;我们当前面对的 tidl 节点的张量内存访问显示在右下角。 tidl 节点的存储空间位于右下角的蓝色框中。 通道1的蓝色框包含1408个白边字节、深灰色框中包含一些正常数据、通道2的蓝色框包含2816个白边字节、深灰色框中包含一些正常数据; 这可以解释白色边缘的存在。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们可以通过一个小实验来证明这一点。

    首先、preproc 节点正确填充深灰色框中所示的存储器空间。 我们映射了存储器空间并使用以下方式将其保存:streade-0=data_size_bytes、streade-1=(width+padL+padR)* data_size_bytes 和 streade-2=(height+padt+padB)*(width+padL+R)* data_size_bytes。 保存的图是正确的;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    然后、我们根据 tidl 节点 IoBuf 文件的访问要求访问浅蓝色框中所示的存储器空间。 我们映射存储器空间并按以下方式进行保存:streade-0=data_size_bytes、streade-1=(width+padL+padR)* data_size_bytes、并 streade-2=InChannelPitch * data_size_bytes。 保存的图表不正确、通道1白边为1408字节、通道2白边为2816字节;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能否帮助找到保存 IOBuf_desc 文件的函数以及为什么 inChannelPitch 出现=(inWidth+L+R) x (inHeight+T+B)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在应用程序 app_tidl_od 中,可以看到在 app_init_tidl () API 中读取了 IOBuf_desc 文件。 在这里面,readConfig()将读取 ioBufDesc。

    现在,此 ioBufDesc 使用 API app_update_pre_proc ()和 inPadX、inElementType、inDataFormat、numI/p 和 O/p bufs 值传递到 pre-proc 节点。

    张量大小的计算方法如下所示:

           input_sizes[0]= ioBufDesc->inWidth[id] + ioBufDesc->inPadL[id]+ ioBufDesc->inPadR[id];
           input_sizes[1]= ioBufDesc->inHeight[id]+ ioBufDesc->inPadT[id]+ ioBufDesc->inPadB[id];
           input_sizes[2]= ioBufDesc->inNumChannels[id];

    preproc 节点中不使用 ioBufDesc 中的 inChannelPitch 参数。

    此致、

    尼基尔