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:EdgeAI - OptiFlow GStreamer 流水线相关问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1574657/am62a7-edgeai---optiflow-gstreamer-pipeline-related-question

器件型号: AM62A7

工具/软件:

大家好:

我正在处理用于平铺对象检测的 gstreamer 流水线。 核心理念是将实时源帧分割成 2 个非重叠的图块、对每个图块执行推理、并将结果合并成具有可视化效果的最终帧。 我提供了一个代码片段供参考。 我的限制是流水线正在等待推理完成、从而限制输出的帧速率。 是否有方法使其异步、从而使推理是非阻塞的、并且输出帧速率保持与输入帧相同? 理想情况下、我希望在屏幕上显示一个推理通道的边界框、直到完成下一个结果。

gst-launch-1.0 -v v4l2src device=/dev/video3 io-mode=dmabuf-import ! queue leaky=2 max-size-buffers=4 ! \
video/x-bayer,width=1920,height=1080,framerate=30/1,format=rggb10 ! \
tiovxisp ... ! video/x-raw,format=NV12 ! \
tiovxmultiscaler name=tile_split target=0 src_0::roi-startx=0 src_0::roi-starty=0 src_0::roi-width=960 src_0::roi-height=1080 \
src_1::roi-startx=960 src_1::roi-starty=0 src_1::roi-width=960 src_1::roi-height=1080 \
\
tile_split. ! queue ! video/x-raw, width=960, height=1080 ! tiovxmultiscaler name=ms_left target=1 \
ms_left. ! queue ! video/x-raw, width=640, height=640 ! \
tiovxdlpreproc ... ! application/x-tensor-tiovx ! \
tidlinferer target=1 ... ! post_left.tensor \
ms_left. ! queue ! video/x-raw, width=960, height=1080 ! post_left.sink \
tidlpostproc name=post_left ... ! queue ! mosaic_0. \
\
tile_split. ! queue ! video/x-raw, width=960, height=1080 ! tiovxmultiscaler name=ms_right target=1 \
ms_right. ! queue ! video/x-raw, width=640, height=640 ! \
tiovxdlpreproc ... ! application/x-tensor-tiovx ! \
tidlinferer target=1 ... ! post_right.tensor \
ms_right. ! queue ! video/x-raw, width=960, height=1080 ! post_right.sink \
tidlpostproc name=post_right ... ! queue ! mosaic_0. \
\
tiovxmosaic name=mosaic_0 target=1 src::pool-size=4 sink_0::startx="<0>" sink_0::starty="<0>" sink_0::widths="<960>" sink_0::heights="<1080>" sink_1::startx="<960>" sink_1::starty="<0>" sink_1::widths="<960>" sink_1::heights="<1080>" ! \
video/x-raw, format=NV12, width=1920, height=1080 ! queue max-size-buffers=5 leaky=downstream ! \
tiperfoverlay title="Test" overlay-type=graph ! \
\
...

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

    尊敬的 Konrad:

    对于这个问题、主要是在可视化级别上面临挑战吗? 不同硬件加速器上的负载是否足以首先满足延迟要求? 我相信您知道、AI 加速器 (C7xMMA) 一次只能运行一个模型、因此您的其中一条路径会比另一条路径准备好帧。  

    gstreamer 的一般做法是、“队列“元素将拆分流水线、因此前后的部分可以作为单独的线程运行。 我看到这里已经有队列元素、它们与多标量/马赛克功能之前/之后的建议一致。 假定数据可用、值得注意的插件将能够异步运行。  

    您的挑战很可能出现在 tiovxmosaic 插件上。 我认为这需要所有传入的图像在生成合并的帧之前准备就绪--该插件没有帧重放/重用的机制。 考虑到相邻插件之间共享的 DMA 缓冲器(高数据吞吐量是必需的)、该特性可能非常重要。

    • 据我所知、您可以将图像拼接在一起并在应用程序代码 (appsrc/appsink gstreamer 插件、但随后它不再是 OptiFlow) 中维护最后一个帧历史记录、因为 gstreamer 本身没有实现此类机制。  

    如果缺少帧、那么我会查看 to core 加载和 gstreamer 插件延迟[1]以确保它们能够达到输出帧速率。 您还可以探索对马赛克和多标量节点使用不同的“目标“--它们使用相同的 MSC 硬件加速器--看起来 target=1 的使用率高于 target=0

    [1]  https://texasinstruments.github.io/processor-sdk-doc/processor-sdk-edgeai-AM62AX/esd/docs/11_01_07_05/edgeai/measure_perf.html 

    BR、

    Reese

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

    尊敬的 Reese:

    感谢您的快速答复、它肯定回答了一些相关问题。 我们的核心理念是保持输出帧速率与输入相同 (30FPS)。 我们已经承认,硬件不够强大,无法执行两次推理,并实现与流源相同的帧速率。 两个推理通道也不需要同步。 理想的解决方案是在完成推理传递时更新每个逻辑块的结果、并在完成下一次传递之前保持可见。 当前设置会同步推理过程和逻辑块合并、从而生成 10FPS 流源。  

    我们将尝试查看提到的 gstreamer 插件。

    此致、
    Konrad

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

    您好、Konrad、

    补充一下(在今天的讨论之后):

    我想到目前为止我们已经告诉过您 gstreamer appsink/appsource 是一种 以自己偏好的速率将新帧推入 GST 的方法(单独的线程可以运行 AI 流水线、并将结果发送到推入 appsrc 的显示线程)。  我们没有一个运行单个流水线的示例、其中显示的速率比流水线的关键路径的速率更高。

    在 edgeai-gst-apps 中、流水线有一个关键部分提取输入图像、输入张量(对于 TIDL)、运行模型、进行后处理、并将输出图像推回流水线[1]

    [1] https://github.com/TexasInstruments/edgeai-gst-apps/blob/main/apps_python/infer_pipe.py

    所以你可能需要把它分成两个线程,一个以 30FPS 的速度将图像推入直线(可能会重放一个帧),另一个拉取输入,运行 AI 等 您可以在线程之间共享 AI 的输出、以便仅在队列提供新处理的图像时才将帧更新为 PUSH

    Stefan