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:主题:[AM62A][SDK 11.01.07.05]将自定义模型添加到 EdgeAI GStreamer 应用程序的过程 (Optiflow)

Guru**** 2763595 points

Other Parts Discussed in Thread: SK-AM62A-LP

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

https://e2e.ti.com/support/tools/simulation-hardware-system-design-tools-group/sim-hw-system-design/f/simulation-hardware-system-design-tools-forum/1608879/am62a7-subject-am62a-sdk-11-01-07-05-procedure-for-adding-custom-model-to-edgeai-gstreamer-apps-optiflow

器件型号: AM62A7
主题中讨论的其他器件: SK-AM62A-LP

您好、
我正在使用 SK-AM62A-LP 入门套件和使用 Processor SDK Linux:11.01.07.05
我尝试使用运行一个定制训练的模型(通过 TIDL 编译) edgeai-gst-apps 框架、特别是使用 OptiFlow 实用程序。 我想了解将此模型集成到现有演示结构所需的确切工作流程和文件修改。
请说明以下几点:

  • 模型工件: 我应该将编译的模型工件(可部署,和文件)放在哪里.bin.param.json? 它们/opt/model_zoo/是否应该遵循目录结构?
  • 配置文件: .yamlconfigs/我需要修改目录中的哪些特定文件以指向我的自定义模型? 自定义输入/输出张量是否有特定参数?
  • 后处理: 如果我的模型具有自定义输出格式、则apps_pythonapps_cpppost_process.py需要更新或继承 OR 目录(例如)中的哪些文件?
  • 文档: 适用于 SDK 11.x 的“处理器 SDK Linux 边缘 AI 软件开发人员指南“中是否有专门介绍 Optiflow 的端到端“自带模型“(BYOM) 流程的部分?

系统详细信息:

  • 电路板: SK-AM62A-LP
  • SDK 版本: 11.01.07.05
  • 推理运行时: [ONNX]

谢谢你  

Shagufta NADAF

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

    您好 Shagufta、

    您可以将其放置在 SD 卡的目录结构中、但最常见的位置是 /opt/model_zoo。 只需将正在使用的配置文件指向已编译的工件目录。 您可以查看您需要在已存在的配置中指定的选项。 有关所有选项的列表、请查看以下内容: https://github.com/TexasInstruments/edgeai-gst-apps/blob/main/configs/app_config_template.yaml。这是 SDK 中的同一目录。

    对于后处理、您可以按以下方式添加后处理:

    1. apps_python:您可以在 post process 目录 https://github.com/TexasInstruments/edgeai-gst-apps/blob/main/apps_python/post_process.py 中修改一个类 ,也可以添加您的自定义工作流。 您可以param.yaml将编译工件中的文件中的工作流程指定为task_type(键将已经存在)。

    2. apps_cpp:该过程是类似的,但您需要修改此文件: https://github.com/TexasInstruments/edgeai-gst-apps/blob/main/apps_cpp/common/src / post_process_image.cpp 和包含所需工作流程后处理的文件 post_process_image_keypoint_detect.cpp,例如在同一目录中。 如果要添加自定义工作流、则还需要在此处添加源文件: https://github.com/TexasInstruments/edgeai-gst-apps/blob/main/apps_cpp/common/CMakeLists.txt 以进行编译。

    3. OptiFlow:您需要在此处进行相应的修改: https://git.ti.com/cgit/edgeai/edgeai-dl-inferer/tree/post_process。 此存储库也位于 SDK 中、网址为/opt/edgeai-dl-inferer

    如果您需要有关其中一种方法的更多信息、请告诉我。

    此致、
    Jay

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

    尊敬的 Jay:

    感谢您提供有关目录结构和后处理的指导。

    我目前正在使用 SDK 10.01.00.05 来处理第 3 点 (OptiFlow)。 我已在中修改了源代码/opt/edgeai-dl-inferer/post_process、但在未检测到面且输出显示“未定义的标签“的情况下、我遇到了问题。

    在检查生成的流水线后、我注意到以下情况:

    • 流水线仍在插入tidlpostproc name=post_0 model=/opt/model_zoo/face-detection-ulffd

    • 由于我更改了task_type模型中的param.yaml以匹配我的自定义 C++ UltraFace 实施、因此该标准tidlpostproc不再识别配置、从而导致状态中断。

    您能解释一下 SDK 10.x OptiFlow 的以下内容吗?

    1. 绕过tidlpostproc:如何确保 OptiFlow 使用中的自定义 C++进程后逻辑edgeai-dl-inferer,而不是尝试使用默认的 GStreamertidlpostproc 元素?

    2. Re 编译:在中修改源文件后/opt/edgeai-dl-inferer、建议执行什么过程来重新编译共享库并将其部署到目标、以便edgeai-gst-apps接收更改?

    3. 链接:应用程序.yaml(除了)中是否有特定的配置task_type、指示 OptiFlow 将张量输出路由到自定义 C++类而不是标准插件?

    此致、

    Shagufta NADAF

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

    您好 Shagufta、

    1. tidlpostproc 元素使用 edgeai-dl-inferer 对帧进行后处理。 所以,这是完全正常的。 下面列出了确保此功能正常工作所需的更改。


    a.添加实现相同逻辑的 C++和头文件。 请参阅[1]和[2]。
    b.将文件添加到 CMakeLists.txt [3]
    c.将目标添加到根 POST 进程文件中

    2.您需要按照[5]中的说明重新编译 edgeai-dl-inferer、然后按照[6]中的说明重新编译 edgeai-gst-plugins。 无需担心依赖关系或运行测试。

    3. param.yaml 中的 task_type 应该足够了。

    [1] https://git.ti.com/cgit/edgeai/edgeai-dl-inferer/tree/post_process/src / ti_post_process_image_classification.cpp
    [2] https://git.ti.com/cgit/edgeai/edgeai-dl-inferer/tree/post_process/include/ti_post_process_image_classification.h
     [3] https://git.ti.com/cgit/edgeai/edgeai-dl-inferer/tree/post_process/CMakeLists.txt#n12 
    [4] https://git.ti.com/cgit/edgeai/edgeai-dl-inferer/tree/post_process/src cpp/ti_post_proced.cpp#n60 
     [5] https://git.ti.com/cgit/edgeai/edgeai-dl-inferer/tree/README.md#n23 
    [6] https://github.com/TexasInstruments/edgeai-gst-plugins/blob/main/README.md#compiling-the-project-natively

    此致、
    Jay

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

    尊敬的 Jay:

    感谢您的详细说明—这种方法现在可以正常使用。 我能够使用集成我的自定义后处理edgeai-dl-inferer功能、并且管道按预期运行。

    我有一个与有关的后续问题 模型推理可见性和性能测量

    对于通过 OptiFlow 运行的自定义模型:

    1. 推理位置
      您能否确认模型推理在软件栈中的具体执行位置?

      • 是在内部edgeai-dl-inferer(例如,在特定的 C++源文件中)或进行的推理调用

      • 它是否完全在由 GStreamer 插件调用的 TIDL 运行时内进行处理 (tidlinferer)?

      我想确定为自定义模型触发推理的确切源文件/函数。

    2. 测量推理时间
      建议的测量方法是什么 模型推理延迟

      • 是否有现有的性能评测或计时登录edgeai-dl-infereredgeai-gst-plugins

      • 或者、我是否应该围绕特定功能(如果是,是哪一个)添加时间戳来测量不包括预处理/后处理的纯推理时间?

    我的目标是了解 AM62A 上的每帧推理时间并将其与后处理开销区分开来。

    再次感谢您的支持。

    此致、
    Shagufta NADAF

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

    尊敬的 Jay:

    我还希望将其扩展到在 Optiflow 框架内依次运行两个模型。 具体而言、我希望模型 A 的输出馈入模型 B(例如,检测,然后进行分类或二次推理)。

    请您澄清一下:

    1. 管道构造:edgeai-gst-apps框架是否支持tidlinference连续执行的单个字符串中的多个元素、或者是否应该使用特定的多阶段插件?

    2. 元数据传递:如果我需要在将映像传递到模型 B 之前根据模型 A 的检测来裁剪映像、该逻辑应该在自定义tidlpostproc实现中还是通过tensor_transform元素来处理?

    3. OptiFlow 配置:.yaml配置文件中是否需要进行特定更改来定义多阶段推理流程?

    非常希望 AM62A 上的多模型流水线的任何参考代码或文档。

    此致、

    Shagufta NADAF

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

    您好 Shagufta、

    [报价 userid=“675092" url="“ url="~“~/support/tools/simulation-hardware-system-design-tools-group/sim-hw-system-design/f/simulation-hardware-system-design-tools-forum/1608879/am62a7-subject-am62a-sdk-11-01-07-05-procedure-for-adding-custom-model-to-edgeai-gstreamer-apps-optiflow/6213517

    1. 推理位置
      您能否确认模型推理在软件栈中的具体执行位置?

      • 是在内部edgeai-dl-inferer(例如,在特定的 C++源文件中)或进行的推理调用

      • 它是否完全在由 GStreamer 插件调用的 TIDL 运行时内进行处理 (tidlinferer)?

    [/报价]

    为此、您可以查看[1] 作为示例、因为它更易于理解。 C++应用程序和 Optiflow 将使用类似的 CPP 推理文件。

    [报价 userid=“675092" url="“ url="~“~/support/tools/simulation-hardware-system-design-tools-group/sim-hw-system-design/f/simulation-hardware-system-design-tools-forum/1608879/am62a7-subject-am62a-sdk-11-01-07-05-procedure-for-adding-custom-model-to-edgeai-gstreamer-apps-optiflow/6213517

    测量推理时间
    建议的测量方法是什么 模型推理延迟

    • 是否有现有的性能评测或计时登录edgeai-dl-infereredgeai-gst-plugins

    • 或者、我是否应该围绕特定功能(如果是,是哪一个)添加时间戳来测量不包括预处理/后处理的纯推理时间?

    [/报价]

    为此、您可以参阅 Reese 的常见问题解答:  【常见问题解答】PROCESSOR-SDK-AM62A:如何在 AM62A 或其他 AM6xA 器件的边缘 AI SDK 上对神经网络模型进行基准测试? 

    关于多推理问题、SDK 的组件能够支持多阶段推理、但这不是默认产品的一部分。 这样做的一个好理由是模型之间的相互作用不是可以概括的。 作为良好的 PoC、您可以尝试 apps_python 使用的方法。 此处会捕获输入数据并将其从 GStreamer 流水线中取出。 推理发生在此处[2]。

    要保留捕获流水线、您可以通过任何示例轻松使用所需的输入和输出、脚本将在运行流水线之前在控制台上输出该流水线。 您可以在 apps_python 中使用-n 标志来防止 ncurses 表清除屏幕。

    如果您希望使用纯 GStreamer 方法、则可能需要编写一个 GStreamer 插件、以便在模型之间对数据进行中间处理。 如果不需要、可以依次运行推理节点。

    [1] https://git.ti.com/cgit/edgeai/edgeai-dl-inferer/tree/dl_inferer_python/edgeai_dl_inferer.py
    [2] https://github.com/TexasInstruments/edgeai-gst-apps/blob/main/apps_python/edge_ai_class.py#L105 

    此致、
    Jay

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

    尊敬的 Jay:

    感谢您分享参考资料。

    为此、您可以查看[1] 作为示例、因为它更容易理解。 C++应用程序和 Optiflow 将使用类似的 CPP 推理文件。

    edgeai_dl_inferer.py按照建议浏览了该文件。 为了便于理解、我print在文件中添加了一个语句来跟踪推理的确切位置。 但是、当我运行我的应用程序(使用 ONNX 模型的 Optiflow)时、添加的print语句不会在控制台中打印。

    因此、我无法识别这个 Python inferer 代码路径实际上正在执行中、或者推理在 Optiflow 流水线中的确切位置。

    请您澄清一下:

    • edgeai_dl_inferer.py在 Optiflow 推理过程中直接使用、还是

    • 如果有相应的 C++ inferer 文件处理 Optiflow 应用程序的推理、我应该在哪里添加调试日志/打印来跟踪推理流程?

    我附上了一个屏幕截图、其中显示了我添加该print声明以供参考的位置。

    此致、

    Shagufta NADAF

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

    您好 Shagufta、

    apps_python 使用 edgeai_dl_inferer.py 来运行推理。 对于 OptiFlow 和 C++应用程序、您可以参考以下内容: https://git.ti.com/cgit/edgeai/edgeai-dl-inferer/tree/dl_inferer/src
    在本例中、就是以下文件: https://git.ti.com/cgit/edgeai/edgeai-dl-inferer/tree/dl_inferer/src cpp/ti_onnx_inferer.cpp#n152

    另外、我看到您正在打印、而脚本正在尝试对性能进行基准测试。 由于打印开销造成的开销、这将导致报告的时间出现高峰。 理想情况下、应尝试在 start_time 之前或 end_time 计算之后打印。

    此致、
    Jay

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

    尊敬的 Jay:

    感谢您的详细说明和链接。 apps_python按照您的建议、我一直在使用研究多推理方法、但我遇到了一些关于推理位置的令人困惑的行为。

    谈到多推理问题、SDK 的组件能够支持多阶段推理、但这不是默认产品的一部分。 这样做的一个好理由是模型之间的相互作用不是可以概括的。 作为良好的 PoC、您可以尝试 apps_python 使用的方法。 此处会捕获输入数据并将其从 GStreamer 流水线中取出。 推理发生在此处[2]。

    具体来说、我一直在研究 edgeai-dl-inferer 的作用。

    1. edgeai_dl_inferer.py用于apps_python运行推理的工具。

      apps_python 使用 edgeai_dl_inferer.py 来运行推理。
    2. 但是、当我尝试通过将 print 语句添加到来edgeai_dl_inferer.py进行调试时、控制台不会输出任何内容。

    3. 此外、即使我edgeai_dl_inferer.py完全删除/重命名该文件、应用程序也会继续运行、而不会出现任何错误。

    这让我认为我的apps_python设置绕过了此文件、或者使用了预编译/安装的库版本、而不是我正在编辑的本地源文件。

    请您澄清一下:

    • 是否apps_python调用edgeai_dl_inferer模块的全局安装版本(例如,在中)/usr/lib/python3...、而不是本地存储库中的版本?

    我附带了一个屏幕截图、显示即使在删除文件后应用程序仍能成功运行。

    此致、

    Shagufta NADAF

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

    您好 Shagufta、

    您仍需要重新编译 edgeai-dl-inferer。 在编译过程中、CMake 将 python 文件复制到正确的位置。

    您可以在此处查看用作库的文件: /usr/lib/python3.12/site-packages/edgeai_dl_inferer.py

    此致、
    Jay