NVIDIA DeepStream插件之Gst-nvtracker

news/2024/12/23 2:10:09/

NVIDIA DeepStream插件之Gst-nvtracker

  • 1. 源由
  • 2. 基础知识
  • 3. Gst-nvtracker插件
    • 3.1 插件参数
    • 3.2 插件API接口
  • 4. 分析问题
  • 5. 总结
  • 6. 参考资料

1. 源由

这篇的主要目的是稍微吐槽下NVIDIA的设计,当然其实他们做的还是不错的(从系统架构设计角度看,插件采用so动态库方式是不错的,只不过技巧上还可以更加不错)。

本次涉及到使用 BYTETrack开源代码的 DeepStream 集成,在实际使用的时候遇到非常郁闷、糟心的事情。N多年前的开源代码,已经被证明或者成熟应用的东西,为啥不好用(报错)???

  • Gstnvtracker: Optional NvMOT_RetrieveMiscData not implemented
daniel@daniel-nvidia:~/Work/jetson-fpv/utils/dsyolo$ deepstream-app -c source_config_yolov8s.txt
** WARN: <parse_tracker:1604>: Unknown key 'enable-batch-process' for group [tracker]
gstnvtracker: Loading low-level lib at /home/daniel/Work/jetson-fpv/utils/dsyolo/libByteTracker.so
gstnvtracker: Optional NvMOT_RetrieveMiscData not implemented
[BYTETrack Initialized]
gstnvtracker: Only batch processing mode is supported. query.batchMode must be set as NvMOTBatchMode_Batch
gstnvtracker: Failed to initilaize low level lib.
** ERROR: <main:716>: Failed to set pipeline to PAUSED
Quitting
nvstreammux: Successfully handled EOS for source_id=0
App run failed
daniel@daniel-nvidia:~/Work/jetson-fpv/utils/dsyolo$ ls /home/daniel/Work/jetson-fpv/utils/dsyolo/libByteTracker.so
/home/daniel/Work/jetson-fpv/utils/dsyolo/libByteTracker.so

其实本来是非常简单的一件事情,但由于兼容性的问题,折腾!!!为了解决该问题,所以投资了不少时间,有必要讨论、吐槽下。

2. 基础知识

这里牵涉到一些概念,当然CSDN这里就不再详细赘述。以前折腾过一些框架设计相关的知识和要点如下:

【1】静态库和动态库编译方法和开发上的重要性
【2】Linux的so组件设计框架及逻辑
【3】【C语言】函数默认实现和用户自定义实现编程方法 – 【weak, strong alias】

这个插件实际上使用的是【1】、【2】点内容,而缺少了【3】,所以导致了本次报错,给兼容性带来了不必要的麻烦。

3. Gst-nvtracker插件

在这里插入图片描述

  • Gst-nvtracker 插件允许 DeepStream (DS) 流水线使用低级跟踪器库,通过唯一的 ID 持续跟踪检测到的对象。

支持实现 NvDsTracker API 的库,包括由 NvMultiObjectTracker 库提供的参考实现:

  • IOU 跟踪器:交并比(Intersection-Over-Union,IOU)跟踪器使用检测器在两帧之间的边界框的 IOU 值来进行关联,如果没有找到匹配,则分配一个新的目标 ID。该跟踪器包含一个逻辑,用于处理目标检测器中的误检(false positives)和漏检(false negatives);然而,这可以被认为是最基础的目标跟踪器,仅能作为基准使用。
  • NvSORT:NvSORT 跟踪器是 NVIDIA® 增强版的简单在线实时跟踪(Simple Online and Realtime Tracking,SORT)算法。与简单的二分图匹配算法不同,NvSORT 使用基于边界框(bbox)接近性的级联数据关联方法,在连续帧之间进行边界框的关联,并使用卡尔曼滤波器更新目标状态。由于不涉及任何像素数据处理,它的计算效率非常高。
  • NvDeepSORT:NvDeepSORT 跟踪器是 NVIDIA® 增强版的基于深度关联度量的在线实时跟踪(DeepSORT)算法。它通过使用带有重新识别(Re-ID)神经网络的深度余弦度量学习,在多帧之间进行多个对象的数据关联。此实现允许用户使用任何支持 NVIDIA TensorRT™ 框架的 Re-ID 网络。NvDeepSORT 同样采用级联数据关联方法,而非简单的二分图匹配算法,并针对 GPU 进行了高效处理的优化。
  • NvDCF:NvDCF 跟踪器是一种在线多目标跟踪器,采用判别性相关滤波器进行视觉目标跟踪,即使检测结果不可用时也能独立跟踪目标。它结合了相关滤波器的响应和边界框的接近性来进行数据关联。

注:NvDeepSORT 和 NvDCF 跟踪器使用 NV12 或 RGBA 格式,而 IOU 和 NvSORT 不需要任何视频帧缓冲区。

  • Gst-nvtracker 插件还支持通过 NvMOT_RetrieveMiscData API 从低级跟踪器库中检索用户定义的杂项数据

这些数据包括当前帧目标的默认数据以外的有用对象跟踪信息。例如,历史帧的对象数据、阴影跟踪模式中的目标、已终止目标的完整轨迹以及重新识别特征。有关杂项数据类型及其意义的更多详细信息,可以参考“杂项数据输出”部分。用户还可以在 NvMOTTrackerMiscData 中定义其他类型的杂项数据。

3.1 插件参数

PropertyMeaningType and RangeExample Notes
tracker-widthFrame width at which the tracker is to operate, in pixels. (To be a multiple of 32 when visualTrackerType: 1 or reidType is non-zero with useVPICropScaler: 0)Integer, 0 to 4,294,967,295tracker-width=640
tracker-heightFrame height at which the tracker is to operate, in pixels. (To be a multiple of 32 when visualTrackerType: 1 or reidType is non-zero with useVPICropScaler: 0)Integer, 0 to 4,294,967,295tracker-height=384
ll-lib-filePathname of the low-level tracker library to be loaded by Gst-nvtracker.Stringll-lib-file=/opt/nvidia/deepstream/deepstream/lib/libnvds_nvmultiobjecttracker.so
ll-config-fileConfiguration file for the low-level library if needed. Supports multiple files with semicolon delimiter.Path to configuration file OR a semicolon-delimited list of pathsll-config-file=config_tracker_NvDCF_perf.yml
ll-config-file=config_tracker_NvDCF_perf1.yml;config_tracker_NvDCF_perf2.yml
gpu-idID of the GPU on which memory is allocated, and buffer copy/scaling is done. (dGPU only.)Integer, 0 to 4,294,967,295gpu-id=0
tracking-surface-typeSet surface stream type for tracking. (Default is 0.)Integer, ≥0tracking-surface-type=0
display-tracking-idEnables tracking ID display on OSD.Booleandisplay-tracking-id=1
compute-hwCompute engine to use for scaling:
0 - Default
1 - GPU
2 - VIC (Jetson only)
Integer, 0 to 2compute-hw=1
tracking-id-reset-modeAllows force-reset of tracking ID based on pipeline events:
0 - No reset
1 - Reset on GST_NVEVENT_STREAM_RESET
2 - Reset on GST_NVEVENT_STREAM_EOS
3 - Both
Integer, 0 to 3tracking-id-reset-mode=0
input-tensor-metaUse tensor-meta from Gst-nvdspreprocess if available for tensor-meta-gie-id.Booleaninput-tensor-meta=1
tensor-meta-gie-idTensor Meta GIE ID to use (valid only if input-tensor-meta is TRUE).Unsigned Integer, ≥0tensor-meta-gie-id=5
sub-batchesConfigure batch splitting in sub-batches:
Option 1: Semicolon-separated array of source IDs.
Option 2: Colon-separated array of sub-batch sizes.
See descriptionOption 1: sub-batches=0,1;2,3
Option 2: sub-batches=2:1
sub-batch-err-recovery-trial-cntNumber of recovery attempts for errors in low-level tracker. -1 for infinite retries.Integer, ≥-1sub-batch-err-recovery-trial-cnt=3
user-meta-pool-sizeSize of tracker miscellaneous data buffer pool.Unsigned Integer, >0user-meta-pool-size=32

3.2 插件API接口

  1. NvMOT_Query
NvMOTStatus NvMOT_Query (uint16_t customConfigFilePathSize,char* pCustomConfigFilePath,NvMOTQuery *pQuery
);
  1. NvMOT_Init
NvMOTStatus NvMOT_Init (NvMOTConfig *pConfigIn,NvMOTContextHandle *pContextHandle,NvMOTConfigResponse *pConfigResponse
);
  1. NvMOT_Process
NvMOTStatus NvMOT_Process (NvMOTContextHandle contextHandle,NvMOTProcessParams *pParams,NvMOTTrackedObjBatch *pTrackedObjectsBatch
);
  1. NvMOT_RetrieveMiscData
NvMOTStatus NvMOT_RetrieveMiscData (NvMOTContextHandle contextHandle,NvMOTProcessParams *pParams,NvMOTTrackerMiscData *pTrackerMiscData
);
  1. NvMOT_RemoveStreams
void NvMOT_RemoveStreams (NvMOTContextHandle contextHandle,NvMOTStreamId streamIdMask
);
  1. NvMOT_DeInit
void NvMOT_DeInit (NvMOTContextHandle contextHandle);

4. 分析问题

现象:鉴于前面执行LOG显示: gstnvtracker: Optional NvMOT_RetrieveMiscData not implemented

分析NvMOT_RetrieveMiscData 正好是上面第四个API,因此逻辑上考虑可能是加载这个so符号的时候遇到了问题。

原因:最终,发现在 BTYETrack 确实没有这部分代码。

解决:由于之前这部分代码是可以使用,随着Jetpack版本升级,增加了这部分API,但是BYTETrack没有这部分。为此:fix multi-object track and Deepstream 6.3 API link issue

5. 总结

若在架构设计的时候,考虑兼容性方面的问题,引入weak symbol概念(当用户没有实现,weak链接到stub函数,就能很好的兼容旧接口开发的代码)。

总的来说,NVIDIA在Deepstream这块其实采用了so插件的框架结构,很好,但若能更好的技巧上运用一些方法,可以让代码兼容性,尤其是第三方插件开发更好的应用于NVIDIA的生态。

6. 参考资料

【1】DeepStream documentation - Gst-nvtracker
【2】ByteTrack is a simple, fast and strong multi-object tracker


http://www.ppmy.cn/news/1557342.html

相关文章

Vue.js前端框架教程3:Vue setup语法糖和异步操作

文章目录 script setup基本语法使用 Composition API组件定义使用生命周期钩子模板引用使用 defineProps 和 defineEmits组合多个 <script setup> 标签 Vue异步操作1. 使用 async 和 await2. 使用 Promise3. 在 created 或 mounted 钩子中执行异步操作4. 使用 watch 或 w…

【模型对比】ChatGPT vs Kimi vs 文心一言那个更好用?数据详细解析,找出最适合你的AI辅助工具!

【终极对决】ChatGPT vs Kimi vs 文心一言&#xff1a;哪款AI助手才是你的最佳选择&#xff1f;详尽指南在此&#xff01; 在当今人工智能&#xff08;AI&#xff09;迅猛发展的时代&#xff0c;AI聊天助手已深度融入我们的工作与生活。然而&#xff0c;面对市面上诸多选择——…

C++点云大文件读取

C点云大文件读取 1. 常规读取1.1 逐行读取1.2 逐字节读取 2. 并行读取 (Multithreading)3. 使用缓冲读取 (Buffered I/O)4. 内存映射文件 (Memory Mapping) 在C中读取大文件时&#xff0c;如果需要提高读取速度&#xff0c;可以考虑以下几种方法&#xff1a; 1. 常规读取 常规…

二叉树 -- 堆(详解)

目录 1、堆的概念及结构 2、堆的实现(附代码) 2.1、向下调整算法建堆 3、堆的应用(附代码) 3.1、堆排序 3.2、TOP-K问题 1、堆的概念及结构 如果有一个关键码的集合K { k0&#xff0c;k1 &#xff0c;k2 &#xff0c;…&#xff0c;k(n-1) }&#xff0c;把它的所有元素…

防止私接小路由器

电脑获取到IP地址不是DHCP服务器的IP地址段&#xff0c;导致整个公司网络瘫痪&#xff0c;这些故障现象通常80%原因是私接小路由器导致的&#xff0c;以下防止私接小路由器措施。 一、交换机配置DHCP Sooping DHCP snooping是一种DHCP安全特性&#xff0c;用于防止非法设备获…

安装openGauss数据库一主一备

安装openGauss数据库一主一备 一.安装准备1.修改/etc/selinux/config文件中的“SELINUX”值为“disabled”。2.重新启动操作系统。3.检查防火墙是否关闭。4.关闭防火墙并禁止开机重启。5.关闭交换内存6.设置主机名7.设置解析主机名和 IP 地址8.安装相关依赖包9.创建单独的用户组…

CoinShares预测2025年加密市场前景看涨

原文来源&#xff1a;CoinShares预测2025年加密市场前景看涨 - 币热网 - 区块链数字货币新闻消息资讯 欧洲加密投资公司CoinShares发布了2025年的市场预测&#xff0c;概述了可能塑造行业的关键趋势。 报告指出&#xff0c;在即将上任的川普政府下&#xff0c;监管环境将更加…

信息安全管理与评估赛题第7套

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 赛题七 模块一 网络平台搭建与设备安全防护 1 赛项时间 共计180分钟。 2 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 网络平台搭建与设备安全防护 任务1 网络平台搭建 XX:XX- XX:XX 50 任务2…