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.

[参考译文] AM62A7:有关使用 tiovx 执行目标检测任务的问题

Guru**** 2482225 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1425874/am62a7-questions-about-using-tiovx-to-perform-target-detection-tasks

器件型号:AM62A7

工具与软件:

大家好、我有一些问题要问您。 我目前正在学习 edgeai-tiovx-apps 项目。 想要使用的输出 tiovx 和 yolov5来推断图像、但读取代码后、我没有找到任何与模型推理和结果后处理相关的代码。 您能给我一些提示吗? 第二个问题是、如果我有一个 yolov5模型、我如何将其转换为可以在电路板上使用的.bin 文件? 我希望得到您的回复。 谢谢你。

祝你一切顺利

Zhuang YH

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

    您好!

    是的、edgeai-tiovx-apps 是为此开始的正确位置。 此存储库中有一些使用深度学习模型和后处理的示例。

    对于独立示例、请在 tests/目录中查找存储库

    主要应用利用 "deep_learning_block.c"进行模型预/后处理和 DL 本身

    第二个问题是、如果我使用的是 yolov5模型、如何将其转换为可以在电路板上使用的.bin 文件?

    编译网络时、它会生成一些工件、其中包括一对_net.bin 和 io_1.bin 二进制文件。 这就是加速运行模型所需的一切。 开源运行时需要原始网络文件(例如 yolov5.onnx)、但 TIOVX 应用直接使用 TIDL_RT 软件、该软件只需要这两个二进制文件。   

    BR、
    Reese

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

    您好、 Reese、 现在我在使用 tiovx 工具时感到困惑。 我的想法是基于 tiovx 检测图像中的目标、然后获取位置信息(四个坐标点)以及检测结果的可信度。 但是、我在 edgeai-tiovx-apps 工程代码中找不到相关代码。 您能为我提供一个目标检测预处理、特定呼叫后处理和结果采集的简单演示吗? 非常感谢

    祝你一切顺利

    Zhuangyihao

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

    您好!  

    我们没有单个演示、也没有在一个文件中包含物体检测。 离独立物体检测应用最近的是tests/app_tiovx_dl_pipel_test.c 下的图像分类应用

    Edgeai-tiovx-apps 被组织为一个框架、可以基于 YAML 配置文件构建 TIOVX 应用。 deep_learning_block.c 将整合一组节点和配置参数、用于预处理、TIDL 推理和后处理 TIOVX 节点。 节点本身的源代码包括预/后处理代码和 TIDL:  

    从 TIDL 节点发出的数据的格式始终取决于模型。 用户需要了解其模型的输入和输出尺寸。 deep_learning_block.c 可用作参考、了解如何从使用 edgeai-tidl-tools 编译的大多数 TI 模型 中读取这一点(通常读取具有预/后处理器信息的 param.yaml 文件)。

    在运行时、TIOVX 框架会以隐式方式将数据从一个节点传递到另一个节点。 在应用级别、这在它们到达整体图形的输出之前不会公开。 在 edgeai-tiovx-apps 中、我们引用连接到节点输入/输出的 buffer_pool、以及从该缓冲区排队或出队以从图形中获取数据。 一些独立测试是可以看到这一点的最佳代码参考、因为测试中不存在主要 tiovx-apps 的额外复杂性/抽象。   

    BR、
    Reese

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

    您好、Reese。

    感谢您的答复。 我将再次阅读下面提到的代码。 我还有一个问题。 我需要在基于 tiovx 进行目标检测后对所有检测到的目标执行目标跟踪处理(例如 ByteTrack)。 因此、我需要获得位置信息(x1、y1、x2、y2)以及检测结果的可信度、以便进行后续目标跟踪。 但是、如果我遵循 YAML 配置、则只能保存绘制了矩形框架的图片。 我如何获得所有检测结果的特定信息、尤其是用于后续跟踪处理的每个目标的坐标和置信度? 我期待您的回答。

    BR、

    zhuangyh

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

    您好!

    [报价 userid="592846" url="~/support/processors-group/processors/f/processors-forum/1425874/am62a7-questions-about-using-tiovx-to-perform-target-detection-tasks/5476415 #5476415"]但是、如果我遵循 YAML 配置、我只能保存绘制了矩形框架的图片。 我如何获得所有检测结果的特定信息、尤其是用于后续跟踪处理的每个目标的坐标和置信度? 我期待您的回答。

    基于 YAML 的应用程序是一个起点。 对于应用特定的任务、这需要进行一些修改。  

    您要查找的信息(框坐标、conf 值)将在 tiovx_dl_post_proc_module.c 中可用、但具体来说在内核中。 这些内核编程在 edgeai-tiovx-kernels 中

    您可以在内核中处理特定于应用的处理。 跨帧跟踪可能需要静态变量或以其他方式在帧之间保存数据。 或者、您可以构建类似于 tests/下的示例的图形、直接消耗 TIDL 节点的输出、以便 在应用代码中的 TIOVX 图形之外处理该信息。

    如果您更新内核、则需要重新编译这些内核。 您使用 edgeai-gst-apps/scripts/edgeai-app-stack 在目标上重新 install_tiovx_kernels.sh 编译或使用 edgeai-app-stack 进行交叉编译

    BR、
    Reese

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

    您好、Reese、

    您说过" 或者,您可以构建类似于测试中的示例/的图形,并直接消耗 TIDL 节点的输出,以便 在应用代码中的 TIOVX 图形之外处理信息"  , 您提到的这种方法可能更适合我的需要,我应该如何修改演示中的过程以直接消耗来自 TIDL 节点的输出? 例如、在演示 edgeai—tiovx-apps/tests/app_tiovx_capture_dl_display_pipeline.c 中、我应该如何修改代码以直接获得 TIDL 的输出?

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

    您好!

    如果您希望直接从 TIDL 获得输出、则应删除 tidl_node 之后的任何节点。 TIDL 之后的第一个节点是 TIOVXDLPostProc。 确保这两个 TIOVX 模块未"链接"(函数 tiovx_modules_link_pads)。 如果您希望直接从 TIDL 输出、则确保 TIDL 节点/模块不会将其输出链接到另一个节点/模块-否则、TIDL 的输出将自动传递到图形中的下一个节点。

    要从 TIDL 节点检索输出、您需要从 TIDL 节点的 src 中使缓冲区出队。 请注意、如果您的模型有多个输出、则应该有等量的输出。

    要以这种方式使用节点的输出、您必须:

    1. 首先使用 tiovx_modules_acquy_buf 和 tiovx_modules_enqueue_buf 准备缓冲池 。 在应用程序的主循环之前执行此操作、无论缓冲池中有多少缓冲区(node->SRCS[i]->bufq_depth 是"i" th 输出(或输入为"链接"而不是"缓存")的缓冲池的大小
    2. 启动应用的主循环。 这里、使用 tiovx_modules_dequeue_buf 从 TIOVX 拉取缓冲区。 按照您的需要使用/复制/映射此数据。 一旦不再需要来自该缓冲区的数据、使用  tiovx_modules_enqueue_buf 将其返回 TIOVX。 如果要立即使缓冲区重新进入队列、则可能需要复制该数据。
    3. 当主循环/应用程序线程完成时、再次使缓冲区出队、并使用  tiovx_modules_dequeue_buf 和 tiovx_modules_release_buf 释放

    有几个这种行为的示例;在 app_tiovx_capture_dl_display_pipeline.c 文件中、请查看主函数的底部、在该函数中、此策略应用于图形的输入、而应应用于输出。  

    有关命名约定的说明:

    • 在 tiovx-apps 中,"TIOVX"是一个 src 节点的一部分,该节点将缓冲/数据提供给管道中的下一个节点——通过这种方式,TIOVX src 是一个节点的输出。
    • 同样、接收端是从管道角度发送数据的地方、它充当节点的输入。
    • 该约定与 gstreamer 一致、并且也只是输入/输出的命名方式

    BR、
    Reese

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

    您好 Reese、感谢您的指导

    感谢您的指导。 按照前面提到的步骤、我对 app_tiovx_capture_dl_display_pipel.c 进行了一些修改、包括注释掉 tidl 节点后的节点、并直接获取 tidl 阶段的输出。 附件是我修改的演示。 在318行中、我获取了 TILD 节点的输出并将其保存在 output_pad 中。 然后在435行中、我得到了 output_pad 的结果。 是这样吗? 如果正确、我将来应该如何处理该 buf 类型数据以获取检测结果的信息?e2e.ti.com/.../app_5F00_tiovx_5F00_capture_5F00_dl_5F00_display_5F00_pipeline.c

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

    您好!

    是的、这对我来说是正确的。 您能否确认在此阶段在应用中获取缓冲区? 查看该缓冲区中数据对象的大小并将其与模型输出的预期值进行比较会很有用。

    要从 buf 获取张量、请考虑 app_tiovx_tidl_module_test.c 中的代码 --使用 outbuf->handle cast to vx_tensor、我们应该能够检索缓冲区中的数据(在您的情况下、是张量对象)。 writeTensor 函数 在这里可能是有关如何使用该张量的良好参考、因为它仍然需要映射到物理地址(否则、它是一个虚拟对象、可以实现存储器优化、例如在内核之间传递而不进入 DDR)。

    您还可以使用 edgeai-tiovx-kernels repo 作为一些后处理方法的参考、特别是与 vx_dl_post_proc (: https://git.ti.com/cgit/edgeai/edgeai-tiovx-kernels/tree/target/armv8/vx_dl_post_proc_target.c?h=develop)相关的文件

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

    Reese、您好!

    关于 tiovx、我有两个问题要问您。
    第一个问题是、我使用 edgeai_tidl_tools 工具编译 yolov5s6_640_ti_lite_37p4_56p0-640 edgeai_yolov5模型。 编译效果很好、生成了 subgraph_0_tidl_io_1.bin 和 subgraph_0_tidl_net.bin。 不过、我将编译后的模型放在了电路板上、并使用 edgeai_tiovx_apps 的演示来运行该算法、但该算法未生效。 为什么? 他在询问父亲后说、需要进行一些处理才能得出结果。 该怎么做?

    第二个问题是、我修改了 edgeai_tiovx_apps/test/app_tiovx_dl_pipel_test.c、想要直接获取 tild_node 的输出、但在运行时报告了错误、日志表明图形验证失败。 原因是什么?

    我已将用于这两个问题的所有文件(model.zip .c error_log.png)提交给您。 请帮我回答。 谢谢 you.e2e.ti.com/.../file1111.zip

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

    您好!

    [报价 userid="592846" url="~/support/processors-group/processors/f/processors-forum/1425874/am62a7-questions-about-using-tiovx-to-perform-target-detection-tasks/5507838 #5507838"]owever、我把编译过的模型放在了电路板上并使用 edgeai_tiovx_apps 的演示来运行该算法、但没有生效。 为什么? 他在询问父亲后说、需要进行一些处理才能得出结果。 我该怎么做?

    您是否确定模型提供了良好、可用的结果? 如果没有、那么您可能无法看到输出绘制。  

    在对此进行测试时、您是否使用了 TI 提供的应用? 当您说未生效时、屏幕上什么也没有画出来? 如果您使用的是我们的应用程序、如/opt/edgeai-tiovx-apps/bin/Release/...-main (用 main executable 名称替换...)、那么我认为它应该运行模型作为管道的一部分并绘制结果、如果有任何结果是由模型生成的。 该应用程序已经处理后处理----它使用 TIOVX TIDL 后处理模块将模型输出绘制到帧中。

    • 对于模型评估和健全性测试、我建议改用 edgeai-gst-apps/apps_python、因为您可以更容易地从 infer_pipe.py 中看到数据(使用 pull_tensor 调用检查函数)。 听起来您的 yolox5模型可能无法产生预期的结果。 在 edgeai-tiovx-apps 中调试该代码将比 edgeai-gst-apps 困难。 还可以更轻松地在我提到的 python 示例中查看后处理代码。 同样、这是良好的健全性测试

    [报价 userid="592846" url="~/support/processors-group/processors/f/processors-forum/1425874/am62a7-questions-about-using-tiovx-to-perform-target-detection-tasks/5507838 #5507838"]第二个问题是我修改了 edgeai_tiovx_apps/test/tapp_tiovx_dl_pipel_test.c、想要直接获取 tild_node 的输出、但在运行时报告了错误、日志表明图形验证失败。 原因是什么?

    图形验证错误表明它无法初始化多标量节点--在配置节点及其相互链接时可能设置错误

    好的、首先在函数 tiovx_modules_compare_image 中记录错误。 这是从 tiovx_modules_link_pads 调用的。 发生该错误是因为节点的输出与下一个链接节点的输入格式不同。 这通常表示在创建节点时传递的节点配置对象/结构中错误指定的内容、例如输入/输出的维度、数据类型等

    我建议添加一些打印件、以查找失败时链接的节点、然后调查向两者提供了哪些配置。

    进行投诉的情况。 我在之前的工作中已经注意到、如果裁剪参数未设置/初始化、即使您不打算裁剪图像、多标量器也会失败(结构必须初始化为默认值)。 如果是这个节点才是问题所在、请查看 tests/下使用多标量的一些其他文件、并了解它们如何初始化配置。

    BR、
    Reese

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

    你好,雷塞, 你能帮我看看我写的演示吗? 当程序执行 outbuf[i]= tiovx_modules_acquice_buf (out_buf_pool[i])时;
    、程序将消失、并且没有错误日志将显示 appeare2e.ti.com/.../2821.test.c

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

    您好!

    这是否与您尝试运行或编辑过的文件代码相同? 第86行有一个大括号、似乎在任何地方都没有关闭。 循环的缩进不容易理解。

    它是完全退出还是抛出像 segfault 这样的东西? 我假设这是在编译时没有错误、并且在 AM62A 上运行。 我建议在后台或单独的终端中运行/opt/vx_app_arm_remote_log.out。 一些 TIOVX 日志将在这里显示、而不是 stdout。

    可能需要再执行几次代码检测、以确定故障位置。 您有许多注释掉的行、包括 schedule_graph 和 wait_graph。 但是、如果您没有将图形参数更改为手动计划、则这些调用可能不是必需的。 否则、不会应用任何应用程序迭代、但您可能只希望从文件输入并退出。

    当程序执行 outbuf[i]= tiovx_modules_acquacy_buf (out_buf_pool[i])时;
    、程序将消失、并且不会显示任何错误日志

    这是第95行、对吧?

    故障线94-96。 您有 tidl_node->num_outputs 缓冲池(假设是 Yolo 模型为2)。 现在、这些缓冲池中的每一个都可以有 buf_pool->bufq_depth 内缓冲区数目(可以是1、2、3、4等、但通常2或4是典型值)。  在代码中、看起来每个池使用的是单个缓冲区。 这在技术上可行、但想提一下。  

    否则,我不知道为什么这个程序会退出你. 它不应该在不抛出一些错误或信号的情况下在程序中间退出。 可能值得在 gdb 运行。

    BR、

    Reese

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

    您好、Reese

    我似乎能够获得 tidl 节点的输出、然后将 output->handle 的数据转换为 vx_tensor 并调用 writeTensor。 最后、我得到两个 bin 文件、一个是5X200.bin、另一个是200x1.bin。 这两个透镜是否由 yolox 输出? 那么我想问一下、在获取张量数据后、我应该如何处理张量数据? 我是否应该调用 tivxMapTensorPatch 并获取 void*指针? 如何解码 yolox 检测结果中所有目标的未知信息和知识信息?

    我的第二个问题是 edgeai_tiovx_kernelS 的 vx_dl_post_proc_target.c 中的函数 tivxKernelDLPostProcess。 我不知道这个函数是否可以在应用层被调用。 它需要传入 tivx_target_kernel_instance 类型和 tivx_obj_desc_t *类型变量。 这个变量是在 edgeai_tiovx_apps/tests 演示中获得或转换的类型吗?

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

    您好!

    是的、看起来尺寸正确。 这是重要的进展。

    我建议查看 writeTensor 函数、以了解有关如何检索实际张量数据的指南。 如果我正确回忆一下 yolox 输出样式、那么我假设5x200采用 float32格式、200x1采用 int64格式。 您可以查看 artifacts/tempDir 目录下 SVG 文件中的输出层(将鼠标悬停在 TIDL-Data-Layer 输出节点上、SVG 加载在 Chrome 之类的浏览器中)、以了解数据类型、但我应该认为 vx_tensor 也会携带此信息。  

    我的第二个问题是函数 tivxKernelDLPostProcess

    该函数旨在作为内核本身的一部分运行、因此直接在代码中运行它可能很重要。 我认为它不能轻松调用、因为它依赖于作为 TIOVX 图形一部分生成的数据结构。  

    在 edgeai-tiovx-apps/tests 下的示例中、它在 TIOVX 图形中调用、因此到该 TIOx...过程调用的直接接口是从用户的角度抽象化的。  

    请注意、这一非常长的函数需要处理许多不同的输入类型和模型类型、因而变得复杂、而 yolox 实际需要的代码只是用于在输入图像上绘制框的代码子集。 此内核将有一个输入用于可视化图像、其他输入是 TIDL 节点的输出

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

    Reese、您好!

    仿真模型时看到的波形相同。 py、我使用 d-m 时效果很好、张量输出的大小为(21、6)。 然而,当我使用- d ,我发现模型的输出是(300, 6),没有过滤 NMS。 但是、当我执行以导出为导向的程序时、我添加了 export_nms 选项。 然后、我上传了这两个结果的 tensors、这些结果保存在 OCD2_608pc-d - m.txt 和 OCD2_608pc-m 中 .txt 文件中。 最后、我还上传了 onnx、ti 仿真和电路板端 tiovx 执行结果的图片、其中三个是 py_ovx。 ut_oCD2_608pc-d - m.jpg、py_out_oCD2_608pc-m jpg 和 board.jpg,可以观察到精度和有效性在逐渐下降。 您能帮助分析一下造成这种情况的原因吗

    祝你一切顺利

    zhuangyhe2e.ti.com/.../1205-experiment.zip

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

    您好!

    我想我理解您的问题、但我们先来后退一步。

    您的 TIOVX 相关查询是否已解决?

    我看到您在最新的回复中讨论了模型精度问题。 对于我们之前讨论的 TIOVX 问题、这将是一个独立的主题。  

    我的建议如下 :在本主题中,我们将重点讨论 TIOVX 主题。 对于模型精度、请创建单独的螺纹。 这对阅读论坛帖子的其他人很有帮助----在同时处理许多主题的情况下很难理解。  

    我也是合适的工程师、可以帮助您解决模型精度方面的难题、但请让我们通过单独的主题来解决这一问题。 我们可以稍后重新打开该主题。

    BR、
    Reese

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

    Reese、您好!   

    我希望在 YOLOv5的后处理中删除截断点、然后我将自行实施 YOLOv5的后处理。 也就是说、onnx 的输出是三个功能映射。 我还通过将 modelotype 从"oD"更改为分级、然后使用 edgeai_tidl_tool 编译 bin 文件来完成此操作。 但是、我在板上加载 bin 文件时收到如下错误消息:
    12049.270725 s:vx_zone_error:[ownContextSendCmd:885]命令确认消息返回失败 cmd_status:-1
    12049.270769 s:vx_zone_error:[ownNodeKernelInit:592]目标内核 tidl_node tidl_node 的 TIVX_CMD_NODE_CREATE 失败
    12049.270787 s:vx_zone_error:[ownNodeKernelInit:593]请确保已为此内核注册目标回调
    12049.270799 s:vx_zone_error:[ownNodeKernelInit:594]如果目标回调已注册、请确保在此内核的 create 回调中没有发生错误
    12049.270814 s:vx_zone_error:[GraphNodeKernelInit:620] kernel init for node 2, kernel com.ti.tidl:1:3... failed!!
    12049.270847 s:vx_zone_error:[vxVerifyGraph:2254]节点内核初始化失败
    12049.270859 s:vx_zone_error:[vxVerifyGraph:2311]图形验证失败
    [TIOVX_MODULES][错误] 795:tiovx_modules_verify_graph:图形验证 failedtidl_node->num_outputs 为3
    问题所在

    祝你一切顺利

    Zhuangyihao

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

    您好!

    理解--您正在拆除用于处理 NMS 的外径头部分。 因此、您有3个到网络的输出

    [TIOVX_MODULES][错误] 795:tiovx_modules_verify_graph:图形验证 failedtidl_node->num_outputs 为3
    [报价]

    TIDL 二进制文件应知道网络有3个输出、并且在 TIOVX 图中添加 tidl_node 时传递的配置必须反映这一点。

    更改模型后、您是否修改了 tidl_node 的配置(结构 TIOVXTIDLNodeCfg)?

    BR、
    Reese