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.

[参考译文] AM68A:如何在检测人员时触发/打印消息

Guru**** 2455560 points
Other Parts Discussed in Thread: AM68A

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1480671/am68a-how-to-trigger-print-message-when-detect-person

器件型号:AM68A

工具与软件:

1-从摄像机捕获实时视频。
2通过 GStreamer 流水线处理视频、该流水线包括用于执行对象检测的 TI 推理元素。
3-将流录制到10‑秒的 MKV 文件中。
4-通过只保留最后三个段和删除旧段来管理录制的文件。
5-侦听用户输入、这样当用户按下"y"时、它将复制当前段、上段和下段。
6-当在实时流中检测到有人时、尝试在终端上打印通知消息。  

1至5步非常完美、但6 th 要求不起作用、因此该6 th 选项可在您的 AM68A 板上使用
 

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

    您好!

    是的、在 EVM 上应该可以做到这一点。

    谢谢!

    Fabiana

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

    是如何实现的

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

    请说明步骤  

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

    尊敬的 Mohammed Niyas,

    我们没有任何相关的教程、但您可以查看 示例 edgeai-gst-apps 代码、了解如何 在类似的应用中实现这一点。 基于 python 的应用程序 位于中 /opt/edgeai-gst-apps/apps_python 目录。

    谢谢!

    Fabiana

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

    尊敬的 Fabiana:
    我已使用 C 代码完成以下步骤:

    1. 从摄像机捕获实时视频。
    2. 通过 GStreamer 流水线处理视频、该流水线包括用于物体检测的 TI 推理元素。
    3. 将流记录到10秒的 MKV 文件中。
    4. 只保留最后三个句段、删除旧段、从而管理录制的文件。
    5. 侦听用户输入、因此当用户按下"y"时、它会复制当前段、上一段和下一段。

    现在、我需要在检测到人员时触发操作。 是否可以使用 C 代码来实现此触发器、或者如何提取与物体检测相关的元数据?  

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

    您好!

    我们不提供应用开发支持。 我建议使用位于中的基于 C++的应用程序 /opt/edgeai-gst-apps/apps_cpp 以供参考。 如果您对示例应用程序代码有任何具体问题、请告诉我。

    谢谢!

    Fabiana

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

    gchar *pipeline_str = g_strupp_printf (
    "v4l2src device=/dev/video-usb-cam0 IO-mode=2! image/jpeg、宽度=1280、高度=720! jpegdec! tiovxdlcolorconvert ! video/x-raw、格式=NV12! "
    "tiovxmultiscaler name=split src_0:roi-startx=0 src_0::roi-starty=0 src_0:roi-width=1280 src_0:roi-height=720 target=0! "
    "队列! video/x-raw、width=320、height=320! "
    "tiovxdlpreproc model=/opt/model_zoo/TFL-OD-2020-ssdLite-mobDet-DSP-coco-320x320 out-pool-size=4! application/x-tensor-tiovx! "
    "tidlinferer target=1 model=/opt/model_zoo/TFL-OD-2020-ssdLite-mobDet-DSP-coco-320x320! post.tensor"
    "拆分。 ! 队列! video/x-raw、width=480、height=480! post.Sink "
    "tidlpostproc name=post model=/opt/model_zoo/TFL-OD-2020-ssdLite-mobDet-DSP-coco-320x320 alpha=0.4 viz-threshold=0.6 top-N=5 display-model=true! "
    "TEE NAME=VIDEO_TEE! 队列! v4l2h264enc! h264parse! 队列! 多路复用。 "
    "alsasrc device=hw:0,0! audio/x-raw、format=S16LE、rate=16000、channels=1! 音频转换! 有声! "
    "avenc_AAC 比特率=128! 非常棒! 队列! 多路复用。 "
    "matroskamux name=mux! filesink location=%s sync=true"、
    output_file
    );

    如何从tidlinferer元素中提取类 ID 和名称

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

    尊敬的 Mohammed Niyas,

    这 不是我们的示例应用中可以启用的功能、因此您必须自己实现。 如果查看 C++或 python GStreamer 应用、则可以看到此 数据所在的位置并进行实现此目标所需的更改。 如果您对我们的规范有任何具体问题、敬请告知。

    谢谢!

    Fabiana

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

    OptiFlow 呢? 从我观察到的内容来看、apps_cppapps_python示例使用 OpenCV 进行后处理、而不是 TIDL 元素。 但是、我们的要求是使用 Gstreamer、tidlpostproc该端用于后处理。

    我还注意到、OptiFlow 运行 端到端 GStreamer 流水线 和 CRC 值。 我们的主要目标是使用实现相同的 GStreamer 在提取类名或至少提取类 ID 时、我们可以将其映射到 COCO 数据集。 tidlpostprocess 将具有任何访问此的类名称。

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

    当我尝试运行 C++应用程序apps_cpp()时、我遇到了一个与图形相关的错误。 我之前遇到过这个问题、但当时无法解决。

    root@am68a-sk:/opt/edgeai-gst-apps/apps_cpp ./bin/Release/app_edgeai ..../configs/image_classification.yaml

    子图的数量:1、34个节点中委派了34个节点

    应用程序:初始化...!!!
    12257.155477 s:内存:初始...!!
    12257.155556 s:MEM:已初始化的 DMA 堆(FD=6)!!
    12257.155752 s:内存:初始化...完成!!
    12257.155779 s:IPC:初始化...!!
    12257.197586 s:IPC:初始化...完成!!
    remote_servic: init…!!
    Remote_servic:初始化...完成!!!
    12257.206213 s:GTC 频率= 200 MHz
    应用程序:初始化...完成!!!
    12257.206971 s:vx_zone_info:全局启用 vx_zone_error
    12257.207203 s:vx_zone_info:全局启用 vx_zone_warning
    12257.207236 s:vx_zone_info:全局启用 vx_zone_info
    12257.210168 s:vx_zone_info:[tivxPlatformCreateTargetId:134]添加了目标 MPU-0
    12257.210712 s:vx_zone_info:[tivxPlatformCreateTargetId:134]添加了目标 MPU-1
    12257.210892 s:vx_zone_info:[tivxPlatformCreateTargetId:134]添加了目标 MPU-2
    12257.212165 s:vx_zone_info:[tivxPlatformCreateTargetId:134]添加了目标 MPU-3
    12257.212225 s:vx_zone_info:[tivxInitLocal:126] Initialization done!!
    12257.212260 s:vx_zone_info:全局禁用 vx_zone_info
    12257.229918 s:vx_zone_error:[ownContextSendCmd:912]命令确认消息返回失败 cmd_status:-1
    12257.230313 s:vx_zone_error:[ownNodeKernelInit:604]目标内核、节点 TIDLNode 的 TIVX_CMD_NODE_CREATE 失败
    12257.230442 s:vx_zone_error:[ownNodeKernelInit:605]请确保已为此内核注册目标回调
    12257.230531 s:vx_zone_error:[ownNodeKernelInit:606]如果目标回调已注册、请确保此内核的 create 回调中没有出现错误
    12257.230638 s:vx_zone_error:[GraphownNodeKernelInit:690] kernel init for node 0、kernel com.ti.tidl:1:1... failed!!
    12257.230696 s:vx_zone_error:[ TIDL 子图 MobilenetV1/preparations/Reshape_1 ]节点内核初始化失败
    12257.230794 s:vx_zone_error:[ TIDL 子图 MobilenetV1/Predictions/Reshape_1 ]图验证失败
    TIDL_RT_OVX:错误:正在验证 TIDL 图形...失败!!!
    TIDL_RT_OVX:错误:验证 OpenVX 图形失败
    状态图
    [07:07:56.000.000000]:ERROR:[startPipeline:0141] GST_ELEMENT_SET_STATE ()失败。
    [07:07:56.000.000085]:error:[setupFlows:0250]无法启动 GST 流水线。
    抛出'STD::runtime_error'实例后调用终止
    what (): EdgeAIDemoImpl 对象创建失败。
    已中止(已转储内核)

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

    您好!

    您使用的 SDK 版本是什么? 您是否对配置文件或其他任何内容进行了更改? 您是否有连接到该 板的显示器?

    谢谢!

    Fabiana

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

    SDK 版本10.0.1、我尚未对配置文件进行任何更改。
    由于连接显示器工作正常、问题不再存在。

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

    如果可能、请回答此问题。

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

    非常感谢您的答复。 我运行了 C++应用程序并修改了 object_detection.yaml 文件、以使用 USB 摄像头进行检测。

    我尝试 print 在中添加一条语句 /common/src/post_process_image_object_detect.cpp 、以在终端中显示检测到的对象的名称。 但是、print 语句似乎无法正常工作。 这可能是由于在执行对象检测应用程序期间生成的现有日志、这可能会使终端输出不知所措并阻止我们的自定义 print 语句出现。

    此外,我试图检查正在执行的脚本 bin/release/app_edgeai,位于,但它不是可读的格式,使它很难进一步调试。

    您能否帮我理解为什么打印声明没有出现在终端中、并建议一种解决此问题的方法?

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

    尊敬的 Nihal:

    您是在对 C++应用程序进行更改后重新编译的吗? 可以使用以下步骤在目标上修改和构建 C++应用程序。

    /opt/edgeai-gst-apps/apps_cpp# rm -rf build bin lib
    /opt/edgeai-gst-apps/apps_cpp# mkdir build
    /opt/edgeai-gst-apps/apps_cpp# cd build
    /opt/edgeai-gst-apps/apps_cpp/build# cmake ..
    /opt/edgeai-gst-apps/apps_cpp/build# make -j2

    谢谢!

    Fabiana

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

    感谢您的帮助! 我能够成功打印对象名称。 我还实现了分配变量的逻辑、并仅在仅检测人员时打印。

    现在、我想以 FIFO 的方式录制三次10秒的视频、这意味着当新的录制开始时、最旧的文件应该被删除、并替换为最新的文件。 我是在使用分离器之前完成的、但我不确定在这种情况下如何实现它。

    目前、我可以同时保存和流式传输视频、但我需要帮助实现连续录制、同时仅保留最后三个文件。

    以下是中的相关部分 edgeai_demo_config.cpp视频的保存位置:

    else if (sinkType == "video")
    {
        string h264enc = gstElementMap["h264enc"]["element"].as<string>();
        string encoder_extra_ctrl = "";
    
        if (h264enc == "v4l2h264enc")
        {
            encoder_extra_ctrl = "controls"
                                 ",frame_level_rate_control_enable=1"
                                 ",video_bitrate=" + to_string(m_bitrate) +
                                 ",video_gop_size=" + to_string(m_gopSize);
    
            m_gstElementProperty = {{"extra-controls", encoder_extra_ctrl.c_str()}};
        }
    
        makeElement(m_dispElements, h264enc.c_str(), m_gstElementProperty, NULL);
    
        // Add H.264 Parser
        makeElement(m_dispElements, "h264parse", m_gstElementProperty, NULL);
    
        // Add MKV Multiplexer
        makeElement(m_dispElements, "matroskamux", m_gstElementProperty, NULL);
    
        // Configure filesink to store in output.mkv
        m_gstElementProperty = {{"location", "output.mkv"},
                                {"name", name.c_str()}};
    
        makeElement(m_dispElements, "filesink", m_gstElementProperty, NULL);
    }
    

    此外、在我的 object_detection.yaml、我创建了两个输出流程:

    outputs:
        output0:
            sink: kmssink
            width: 1280
            height: 720
            overlay-perf-type: graph
        output1:
            sink: /opt/edgeai-test-data/output/output_video0.mkv
            width: 1280
            height: 720
        output2:
            sink: /opt/edgeai-test-data/output/output_image_%04d.jpg
            width: 1920
            height: 1080
        output3:
            sink: remote
            width: 1920
            height: 1080
            port: 8081
            host: 127.0.0.1
            encoding: jpeg
            overlay-perf-type: graph
    
    flows:
        flow0: [input1, model2, output0]
        flow1: [input1, model2, output1]
    

    这里input1是一个 USB 网络摄像头视频、model2是 YOLOX。

    您能否帮助我以10秒的间隔实现连续录制、同时确保只保留最后三个视频文件(采用 FIFO 方法)?

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

    尊敬的 Nihal:

    我很高兴听到您能够成功打印出所需的对象名称!

    如前所述、TI 不提供应用开发支持。 此用例不是开箱即用支持的功能、我们也没有任何有关启用它的教程。  使用脚本是  实现此目的的一种方法。 我建议查看在线资源以获取教程/示例。 如果您遇到任何似乎与电路板或 SDK 相关的错误、您可以在 E2E 上提出新问题。 由于 初始问题已得到解答并已解决、我将关闭该主题。

    谢谢!

    Fabiana

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

    好的、谢谢

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

    请将我的最后一个回答标记为已回答/解决您的问题。

    谢谢!

    Fabiana