DeepStream Gst-nvtracker

本文介绍了DeepStream的多目标跟踪框架,其支持批处理、接口抽象程度高、迁移成本低。阐述了统一的跟踪框架,包括接口统一、模板化配置和输入输出;介绍了通用核心模块,如数据关联、目标管理等;还分析了不同Tracker的权衡,如NvDCF Tracker的性能优势。


多路视频流并行推理时,多目标跟踪算法这块容易成为性能瓶颈,如果处理不好反而弄巧成拙,边缘设备上也没那么多资源去支持。
DeepStream6.3 版本之前,NvTracker 一直被当成黑箱来使用,现在除了底层的NvMultiObjectTracker库还没有开源外,其他相关的代码已经公开,可以通过已有资料了解其特点和实现。其特点概括如下:

  • 支持批处理。在一次调用 NvMOT_Process API 中处理所有需要进行目标跟踪的视频流,所有步骤支持 GPU 加速;而目前开源的 MOT 算法都没有较好的去实现批处理,而且基于深度学习的跟踪算法,也只是 ReID 这一步调用了 GPU 加速,其它步骤还是 CPU 计算
  • 接口抽象程度高。作为 DeepStream 的插件之一,实现了一种通用的跟踪框架或接口,兼容任何实现了 NVNvDsTracker API 的底层库,截止到 deepstream6.3 版本,已经支持了 IOU、NvSORT、NvDeepSORT、NvDCF 四种经过 NV 高度优化的 tracker
  • 迁移成本低。相对容易能够从 X86 迁移到 ARM 上去,这应该是 DeepStream 最实用的特点之一

1. 统一的跟踪框架

1.1 接口统一

DeepStream 从 6.0 开始提供了了一个多目标跟踪库NvMultiObjectTracker, 将内置的四种 tracker 通过接口的形式统一了起来,同时支持自定义 tracker,不同 tracker 在基本功能(例如数据关联、目标管理、状态估计)方面共享通用模块,而在其他核心功能上有所不同(例如,NvDCF 的视觉跟踪和 NvDeepSORT 的深度级联匹配。

其中四种内置的 tracker 如下:

  • IOU Tracker
    一般只能作为 baseline 使用。使用连续帧 detector 输出的两个边界框之间的 IOU 值来执行匹配操作,该 tracker 包含一个逻辑来处理来自 detector 的误报和漏报

  • NvSORT
    NvSORT 不是简单的二分匹配算法,NvSORT 采用基于 bouding box 邻近度的级联数据关联,以关联连续帧上的 bouding box,并应用卡尔曼滤波器更新目标状态,由于它不涉及任何像素数据处理,因此计算效率很高

  • NvDeepSORT
    比较有名的跟踪算法,NV 同样对它进行了基于工程优化和 GPU 加速,以支持 online tracking,相对于 NvSORT,增加了基于 ReID 特征的级联匹配操作等等,ReID 网络只要能够支持 TensorRT 加速,就可以在 NvDeepSORT 中使用

  • NvDCF
    online tracker,特点是速度快,能够轻量级的边缘设备上做到实时跟踪。采用判别相关滤波器(discriminative correlation filter)进行视觉对象跟踪,即使在 detector 失效时也能进行独立的对象跟踪。它使用相关滤波器的响应强度和 bouding box 邻近度的组合来进行数据关联

1.2 模板化配置

NvMultiObjectTracker基于统一的架构或配置模板,通过配置通用参数和特定 tracker 的参数。即可启用相应的 tracker。例如:

  • IOU tracker 只需要一组最简单的模块,包括数据关联和目标管理模块
  • 在此基础上,NvSORT 增加了一个状态估计器,以实现更精确的运动预测
  • 而 NvDeepSORT 则进一步引入了 ReID 网络,将外观特征整合到数据关联中。
  • 与 NvDeepSORT 中基于深度神经网络的 ReID 特征不同,NvDCF 采用了基于 DCF 的视觉跟踪模块,该模块使用传统的 feature descriptors 来提高跟踪效率不过,NvDCF 也支持使用 ReID 模块对目标进行重新关联,以实现更长期的鲁棒性

下表显示了不同对象跟踪器之间的通用的模块和特有模块:

空白项表示暂时不支持该项功能,其中只有 NvDCF 支持 Target Re-Assocation,也就是对于丢失的目标,重新关联到新的目标上去,这个功能在实际应用中很有用,例如在视频流中,目标可能会被遮挡,或者由于 detector 失效,在某些帧中检测不到,但是在后面的帧中又能检测到。
NvDCF 通过基于Spatio-temporalReID两种策略来解决跟踪目标暂时丢失的场景,分别对应着历史轨迹匹配和图像特征匹配,利用图像特征的 ReID 方法,可以是传统的 feature descriptor,也可以是基于深度学习的方法,精度和效率的 trade off,需要根据实际应用场景来选择

1.3 输入输出

  • 输入输出数据由多个流中的帧和检测到的对象组成,载体为gstreamer buffer,数据结构为NvDsBatchMeta,输出数据在NvDsBatchMeta中添加了跟踪目标大小、ID、跟踪置信度等属性
  • NvTracker 从上游接受数据(一般是 NvInfer),连同检测对象在内的 frame meta 数据一起向底层 tracker 发起请求
    typedef struct _NvDsBatchMeta {
         
         
      NvDsBaseMeta base_meta;
      /** Holds the maximum number of frames in the batch. */
      guint max_frames_in_batch;
      /** Holds the number of frames now in the batch. */
      guint num_frames_in_batch;
      /** Holds a pointer to a pool of pointers of type @ref NvDsFrameMeta,
      representing a pool of frame metas. */
      NvDsMetaPool *frame_meta_pool;
      /** Holds a pointer to a pool of pointers of type NvDsObjMeta,
      representing a pool of object metas. */
      NvDsMetaPool *obj_meta_pool;
      /** Holds a pointer to a pool of pointers of type @ref NvDsClassifierMeta,
      representing a pool of classifier metas. */
      NvDsMetaPool *classifier_meta_pool;
      /** Holds a pointer to a pool of pointers of type @ref NvDsDisplayMeta,
      representing a pool of display metas. */
      NvDsMetaPool *display_meta_pool;
      /** Holds a pointer to a pool of pointers of type @ref NvDsUserMeta,
      representing a pool of user metas. */
      NvDsMetaPool *user_meta_pool;
      /** Holds a pointer to a pool of pointers of type @ref NvDsLabelInfo,
      representing a pool of label metas. */
      NvDsMetaPool *label_info_meta_pool;
      /** Holds a pointer to a list of pointers of type NvDsFrameMeta
      or NvDsAudioFrameMeta (when the batch represent audio batch),
      representing frame metas used in the current batch.
      */
      NvDsFrameMetaList *frame_meta_list;
      /** Holds a pointer to a list of pointers of type NvDsUserMeta,
      representing user metas in the current batch. */
      NvDsUserMetaList *batch_user_meta_list;
      /** Holds a lock to be set before accessing metadata to avoid
      simultaneous update by multiple components. */
      GRecMutex meta_mutex;
      /** Holds an array of user-specific batch information. */
      gint64 misc_batch_info[MAX_USER_FIELDS];
      /** For internal use. */
      gint64 reserved[MAX_RESERVED_FIELDS];
    } NvDsBatchMeta;
    

2. 通用核心模块

主要为上图中的 Data Association、Target Management、State Estimation、Object Re-Identification 和 Target Re-Association

2.1 Data Association

即连续帧的匹配。多目标跟踪的绝大多数算法,都需要对已有跟踪对象和当前帧 detector 输出目标之间进行相似性度量,通过一个匹配分数来作为数据关联的依据,相似性度量有多种方法,包括:

  • IOU 相似度
  • 基于 bounding box 尺寸的相似度
  • 基于 ReID 特征的相似度
  • 基于 Visual appearance 的相似度, 特指 NvDCF

通常对以上相似度进行加权。在匹配过程中,detector 的输出对象默认与属于同一类别的目标关联,以最大限度地减少错误匹配。但是,可以通过设置 checkClassMatch: 0来禁用此功能,从而一定程度减小由于 detector 误检造成的目标丢失现象。

匹配算法

默认根据上述加权相似度利用贪心算法进行二分匹配;也支持级联匹配,以提高准确性,级联匹配顾名思义,由多阶段匹配构成,根据 detector 输出和已有跟踪目标的置信度分配不同的优先级和相似性度量方案。detector 输出对象根据置信度分为两组:

  • confirmed
    高置信度检测框,置信度位于[tentativeDetectorConfidence, 1.0]
  • tentative
    低置信度检测框,置信度位于[minDetectorConfidence, tentativeDetectorConfidence]

同时根据已有跟踪目标的状态,将跟踪目标分为active and inactive Targets。然后依次进行三阶段匹配:

  • stage1: 高置信度检测框和所有跟踪已有目标进行匹配
  • stage2: 低置信度目标和第一步未匹配的 active targets 进行匹配
  • stage3: 前面两步未匹配的高置信度检测框和未匹配的 inactive targets 进行匹配

stage1 使用上面定义加权相似度相似度指标,而后两个阶段仅通过 IOU 相似度来匹配,因为当由于部分遮挡或噪声等原因导致检测置信度较低时,IOU 相似度可能是比视觉相似度或 ReID 更可靠的指标。每个阶段都以不同的 bbox 集合作为候选集,并使用贪心算法进行匹配,最后将所有匹配对合并输出,输出对象分为三组:

  • 未匹配的检测框
  • 匹配的检测框和对应的跟踪目标
  • 未匹配的跟踪目标

未匹配的检测框与现有任何跟踪目标的 IOU 最大值低于IouDiff4NewTarget, 则会被初始化为新的跟踪对象,级联匹配的流程图如下:
请添加图片描述

以上级联匹配的和ByteTrack一样,合理利用所有检测框而不是丢弃低置信度的目标,以提高跟踪算法对检测算法的鲁棒性,增强跟踪轨迹的连贯性,对于遮挡或短暂丢失的目标跟踪,有非常好的效果。

2.2 Target Management

航迹管理是多目标跟踪领域的重要环节,NvtTracker 提供了一套完整的航迹管理机制,用来处理 detector 的误检和漏检,以及跟踪目标的状态转移等问题

2.2.1 Late Activation

用来处理 detector 的误检。为了抑制检测中的此类假阳性的噪声,NvTracker 提供用了一种称为 Late Activation(后期激活)的技术,其中新检测到的对象(Unmatched Detector Objects)会被缓存一段时间,该对象在这段时间内幸存下来时才被激活以进行长期跟踪。
具体地说,每当检测到新的对

<think>好的,用户现在问的是关于gst-inspect和gst-launch的问题。之前他们问了如何用GStreamer转储视频文件,我回答了使用filesink的例子,并提到了相关问题,比如安装插件和不同的编码器。现在他们可能想进一步了解这两个工具的具体用法。 首先,我需要解释gst-inspect的作用,主要是用来查看插件和元素的信息。用户可能想知道如何查找已安装的插件,或者某个元素的属性和能力。这时候需要给出具体的命令示例,比如gst-inspect-1.0列出所有插件,或者查看特定元素的详细信息。 然后是gst-launch,这是一个用来构建和运行管道的工具。用户之前已经用过gst-launch的例子,所以可能需要更详细的说明,比如如何组合不同的元素,设置属性,处理错误。可能需要举几个例子,比如播放视频文件或者捕获摄像头画面。 还要注意用户可能遇到的问题,比如插件缺失,这时候需要说明如何通过gst-inspect检查插件是否存在,以及如何安装缺失的插件。另外,用户可能对如何调试管道有兴趣,比如使用--verbose选项或者日志级别。 接下来,要确保回答的结构符合之前的格式,给出命令示例后,再提供相关问题。相关问题需要涵盖这两个工具的常见疑问,比如元素属性、管道调试、插件安装、性能优化等。 需要检查是否有遗漏的关键点,比如gst-inspect的不同版本(比如gst-inspect-1.0),或者gst-launch的语法格式。还要确保示例命令正确,比如使用正确的元素名称和参数。 最后,确保相关问题部分有3-5个问题,并且覆盖用户可能的后续疑问,比如如何查看元素的详细信息,如何调试管道错误,如何安装插件等。避免重复之前的问题,而是针对这两个工具深入探讨。</think>`gst-inspect` 和 `gst-launch` 是 GStreamer 的核心调试与测试工具,分别用于 **查看元素信息** 和 **构建管道**。以下是具体用法: --- ### **1. `gst-inspect`:查看元素/插件信息** 用于查询已安装的 GStreamer 插件、元素及其属性、能力等。 #### **常用命令** - **列出所有可用插件**: ```bash gst-inspect-1.0 --plugin ``` - **查看某个插件包含的元素**(例如 `x264`): ```bash gst-inspect-1.0 x264 ``` - **查看某个元素的详细信息**(如 `videotestsrc`): ```bash gst-inspect-1.0 videotestsrc ``` 输出内容包括: - 元素功能描述 - 支持的属性(如 `pattern`、` framerate`) - 输入/输出 pad 的能力(caps) - 可调整的参数(如 `bitrate`、`key-int-max`) --- ### **2. `gst-launch`:构建并运行管道** 用于通过命令行快速测试 GStreamer 管道。 #### **基本语法** ```bash gst-launch-1.0 <元素1> [属性] ! <元素2> [属性] ! ... ``` #### **示例** - **播放本地视频文件**: ```bash gst-launch-1.0 filesrc location=input.mp4 ! qtdemux ! avdec_h264 ! autovideosink ``` - **捕获摄像头画面并显示**: ```bash gst-launch-1.0 v4l2src device=/dev/video0 ! autovideosink ``` - **推流到RTMP服务器**: ```bash gst-launch-1.0 videotestsrc ! x264enc ! flvmux ! rtmpsink location=rtmp://server/live/stream ``` #### **调试技巧** - **启用详细日志**: ```bash gst-launch-1.0 --verbose videotestsrc ! autovideosink ``` - **设置日志级别**(1=错误,2=警告,3=信息,4=调试): ```bash GST_DEBUG=3 gst-launch-1.0 videotestsrc ! autovideosink ``` --- ### **常见问题解决** 1. **元素未找到?** - 运行 `gst-inspect-1.0` 检查插件是否安装。 - 安装缺失插件(如 `gstreamer1.0-plugins-good`)。 2. **管道报错 "could not link"?** - 检查元素之间的 caps(能力)是否匹配。 - 使用 `videoconvert` 或 `audioconvert` 转换格式。 3. **如何动态调整属性?** - 在管道中使用 `--set` 参数(需元素支持): ```bash gst-launch-1.0 videotestsrc pattern=0 ! autovideosink --set "pattern=18" ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值