NVIDIA DeepStream插件之Gst-nvtracker

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.mzph.cn/web/63670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程内存转储工具|内存镜像提取-取证工具

1.内存转储&#xff0c;内存转储&#xff08;Memory Dump&#xff09;是将计算机的物理内存&#xff08;RAM&#xff09;内容复制到一个文件中的过程&#xff0c;这个文件通常被称为“内存转储文件”或“核心转储文件”&#xff08;Core Dump&#xff09;,内存转储的主要目的是…

Lua语言入门 - Lua 面向对象

Lua 面向对象 面向对象编程&#xff08;Object Oriented Programming&#xff0c;OOP&#xff09;是一种非常流行的计算机编程架构&#xff0c;通过创建和操作对象来设计应用程序。 以下几种编程语言都支持面向对象编程&#xff1a; CJavaObjective-CSmalltalkC#Ruby Lua 是…

Pyqt6在lineEdit中输入文件名称并创建或删除JSON文件

1、创建JSON文件 代码 import osdef addModulekeyWordFile(self):if "" ! self.lineEdit_module.text():moduleFile self.lineEdit_module.text() .jsonelse:self.toolLogPrinting(请输入模块名称)returnfilePath modulekeyWordFileDir moduleFileif os.path.e…

数据结构--堆的向上调整和向下调整

文章目录 1.完全二叉树2.堆向上调整3.堆向下调整4.测试代码 1.完全二叉树 下面的这个就是对于我们的完全二叉树的这个逻辑结构和物理结构的说明&#xff1a; 逻辑结构就是我们自己认为的进行购想出来的&#xff1b; 但是这个物理结构却是我们的这个数据结构在内存里面的真是…

智能挂号系统设计典范:SSM 结合 Vue 在医院的应用实现

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了医院预约挂号系统的开发全过程。通过分析医院预约挂号系统管理的不足&#xff0c;创建了一个计算机管理医院预约挂号系统的方案。文章介绍了医院预约挂号系统的系…

Transform组件的用法

文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了Checkbox Widget相关的内容,本章回中将介绍Transform Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的Transform是一种容器类widget,它和Container组件类似。它可以包含其它的组件…

go面试问题

1 Go的内存逃逸如何分析 go build -gcflags-m main_pointer.go 2 http状态码 300 请求的资源可包括多个位置&#xff0c;相应可返回一个资源特征与地址的列表用于用户终端&#xff08;例如&#xff1a;浏览器&#xff09;选择 301 永久移动。请求的资源已被永久的移动到新U…

TouchGFX移植(5)增加触屏驱动

一&#xff09;增加驱动代码gt9xxx.c和ctiic.c到工程中的BSP目录下: 二&#xff09;更改触摸文件STM32TouchController.cpp 1&#xff09;在STM32TouchController.cpp文件中增加&#xff1a; #include “gt9xxx.h” 2&#xff09;增加gt9xxx_init(); void STM32TouchControlle…

资源型数字化平台该如何顺利运营?

一、引言 随着信息技术的迅猛发展&#xff0c;资源型数字化平台在各领域的重要性日益凸显。此类平台整合各类资源&#xff0c;以数字化手段提升资源利用效率与价值&#xff0c;但确保其顺利运营面临诸多挑战。 二、资源型数字化平台特点 资源型数字化平台具有资源整合性&…

GitLab的安装和使用

1.GitLab 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 gitlab-ce-10.8.4 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能…

Leetcode 串联所有单词的子串

算法思想&#xff08;中文解释&#xff09; 这道题目要求我们在字符串 s 中找到所有子串&#xff0c;这些子串是字符串数组 words 中所有单词的串联&#xff0c;并且每个单词只能使用一次&#xff0c;且顺序可以任意。下面是代码的算法思想&#xff1a; 1. 核心思路 分解问题…

解析在OceanBase创建分区的常见问题|OceanBase 用户问题精粹

在《分区策略和管理分区计划的实践方案》这篇文章中&#xff0c;我们介绍了在ODC中制定分区策略及有效管理分区计划的经验。有不少用户在该帖下提出了使用中的问题&#xff0c;其中一个关于创建分区的限制条件的问题&#xff0c;也是很多用户遭遇的老问题。因此本文以其为切入&…

有哪些免费的 ERP 软件可供选择?哪些 ERP 软件使用体验较好?

想找个 “免费” 的 ERP 软件&#xff1f; 咱得知道&#xff0c;ERP 那可是涉及财务、人力、供应链、采购、销售等好多方面的重要企业软件。功能这么全&#xff0c;能免费才怪呢&#xff01;真要是有免费的&#xff0c;早就火遍大江南北&#xff0c;说不定把市场都垄断了&…

centos-stream9系统安装docker

如果之前安装过docker需要删除之前的。 sudo dnf -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装yum-utils工具&#xff1a; dnf -y install yum-utils dnf-plugin…

了解cuda的统一内存

1. CUDA 6中的统一内存 在CUDA 6中&#xff0c;从Kepler GPU架构&#xff08;计算能力3.0或更高&#xff09;开始&#xff0c;在64位Windows 7、8和Linux操作系统&#xff08;内核2.6.18&#xff09;上开始支持统一内存. 从CUDA 6开始&#xff0c;NVIDIA推出了CUDA平台历史上…

Pytorch | 从零构建MobileNet对CIFAR10进行分类

Pytorch | 从零构建MobileNet对CIFAR10进行分类 CIFAR10数据集MobileNet设计理念网络结构技术优势应用领域 MobileNet结构代码详解结构代码代码详解DepthwiseSeparableConv 类初始化方法前向传播 forward 方法 MobileNet 类初始化方法前向传播 forward 方法 训练过程和测试结果…

Electronjs+Vue如何开发PC桌面客户端(Windows,Mac,Linux)

electronjs官网 https://www.electronjs.org/zh/ Electron开发PC桌面客户端的技术选型非常适合已经有web前端开发人员的团队。能够很丝滑的过渡。 Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.…

【1.排序】

排序 笔记记录 1.排序的基本概念1.1 排序的定义 2. 插入排序2.1 直接插入排序2.2 折半插入排序2.3 希尔排序 3. 交换排序3.1 冒泡排序3.2 快速排序 4. 选择排序4.1 简单选择排序4.2 堆排序 5. 归并排序、基数排序和计数排序5.1 归并排序4.2 基数排序4.3 计数排序 6. 各种内部排…

Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon

文章目录 Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon什么是 Swap&#xff1f;主要命令介绍1. mkswap2. mkfs.swap3. swapon 创建和管理 Swap 的步骤1. 创建 Swap 分区2. 初始化 Swap3. 激活 Swap4. 持久化配置5. 查看 Swap 状态 删除 Swap 分区或文件1. 停用 Swap2. 删…

取子串(指针)

#include <stdio.h> #include <string.h>char* substr(char *s, int startloc, int len) {static char result[51]; // 定义一个足够大的静态数组来存储结果static char result1[] {N,U,L,L,\0};int i, j;// 检查startloc是否在字符串的范围内if (startloc < 1…