工具与软件:
1-从摄像机捕获实时视频。
2通过 GStreamer 流水线处理视频、该流水线包括用于执行对象检测的 TI 推理元素。
3-将流录制到10‑秒的 MKV 文件中。
4-通过只保留最后三个段和删除旧段来管理录制的文件。
5-侦听用户输入、这样当用户按下"y"时、它将复制当前段、上段和下段。
6-当在实时流中检测到有人时、尝试在终端上打印通知消息。
1至5步非常完美、但6 th 要求不起作用、因此该6 th 选项可在您的 AM68A 板上使用
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.
工具与软件:
1-从摄像机捕获实时视频。
2通过 GStreamer 流水线处理视频、该流水线包括用于执行对象检测的 TI 推理元素。
3-将流录制到10‑秒的 MKV 文件中。
4-通过只保留最后三个段和删除旧段来管理录制的文件。
5-侦听用户输入、这样当用户按下"y"时、它将复制当前段、上段和下段。
6-当在实时流中检测到有人时、尝试在终端上打印通知消息。
1至5步非常完美、但6 th 要求不起作用、因此该6 th 选项可在您的 AM68A 板上使用
尊敬的 Fabiana:
我已使用 C 代码完成以下步骤:
现在、我需要在检测到人员时触发操作。 是否可以使用 C 代码来实现此触发器、或者如何提取与物体检测相关的元数据?
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 和名称
OptiFlow 呢? 从我观察到的内容来看、apps_cpp和apps_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 对象创建失败。
已中止(已转储内核)
非常感谢您的答复。 我运行了 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