DeepStream Gst-nvtracker


多路视频流并行推理时,多目标跟踪算法这块容易成为性能瓶颈,如果处理不好反而弄巧成拙,边缘设备上也没那么多资源去支持。
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)会被缓存一段时间,该对象在这段时间内幸存下来时才被激活以进行长期跟踪。
具体地说,每当检测到新的对象,就会实例化一个新的 Tracker 来跟踪该对象,目标最初会进入 Tentative 模式,这是一个试用期,其长度由TargetManagement下的的probationAge参数定义。在此试用期内,Tracker 的输出不会立即发送给下游;未发送的过去的帧数据被存储在 tracker 中,在通过试用期后才会被激活,发送到下游。

2.2.2 Shadow Tracking

用来处理 detector 的漏检。detector 可能会出现假阴性,导致与目标的数据关联不成功。当跟踪目标在一段时间内未被检测到时,会进入 Shadow Tracking 模式,此时 tracker 会在后台继续跟踪该目标,直到其被重新检测到。在此期间,跟踪器的输出仍然会被发送到下游,但是会被标记为 Shadow 状态,以便下游可以根据需要处理这些目标。每当目标在给定时间范围内未与 detector 输出对象关联时,跟踪目标的内部变量shadowTrackingAge就会递增。一旦跟踪目标与 Detector 输出对象关联,shadowTrackingAge 将重置为零。

2.2.3 Mode transition

如果跟踪目标处于 Tentative 模式并且 shadowTrackingAge 达到配置文件中指定的earlyTerminationAge,则跟踪目标将被提前终止(称为 Early Termination)。
如果跟踪目标在 Tentative 模式期间未被提前终止,并成功与 Detector 输出对象关联,则跟踪目标将被激活并进入 Active 模式,开始向下游报告 tracker 输出。如果启用了过去帧数据,则也会报告 Tentative 模式期间的跟踪数据。一旦目标被激活,同时目标在给定时间范围内没有匹配到检测对象,它将被置于 Inactive 模式,并且其 shadowTrackingAge 将为递增,但仍会在后台进行跟踪。然而,如果 shadowTrackingAge 超过maxShadowTrackingAge,目标将被终止。

2.2.4 Memory Management

通过预先分配了所有必要的显存,即使跟踪对象数量随着时间的推移而增加,NvTracker 在长期运行期间也不会出现内存增长。主要基于以下条件预分配所有的显存:

  • 同时处理的流的数量
  • 每路流所需要跟踪的最大目标数量maxTargetsPerStream
    一旦被跟踪的对象数量达到配置的最大值(即 maxTargetsPerStream),任何新对象都将被丢弃,直到某些现有目标被终止。被跟踪的对象数量包括 shadow tracking 模式下被跟踪的目标。因此,Nv 建议将 maxTargetsPerStream 设置得足够大,以容纳一帧中可能出现的感兴趣对象的最大数量,以及 shadow tracking 模式下可能从过去帧跟踪到的对象

2.3 State Estimation

Nvtracker 采用了两种基于 Kalman Filter 的状态估计器,分为为 Simple KF 和 Regular KF。
Simple KF 定义了 6 种状态,分别是{x, y, w, h, dx, dy},其中xy表示目标 bbox 的左上角坐标,wh表示 bbox 的宽度和高度。dxdy 表示 x 和 y 变化率。
Regular KF 在 Simple KF 的基础上额外定义了dw, dh两个状态
两种 KF 均采用了通用的恒定速度模型,测量向量为{x, y, w, h}。此外,在启用使用宽高比(useAspectRatio)时,可以选择使用 bbox 宽高比 a及其变化率da代替wdw,NvDeepSORT 特别使用了这一选项。如果状态估计器用于一般用例(如 NvDCF 跟踪器),{x, y}{w, h}{dx, dy, dw, dh}的过程噪声方差可分别通过 processNoiseVar4LocprocessNoiseVar4SizeprocessNoiseVar4Vel进行配置。
当启用视觉跟踪器模块时(如在 NvDCF 跟踪器中),从状态估计器的角度来看,可能会有两种不同的测量结果:

  1. 来自 detector 的 bbox
  2. 来自 tracker 的 bbox
    因为 NvDCF 跟踪器模块能够利用自身学习的滤波器定位目标。这两种不同测量类型的测量噪声方差可通过measurementNoiseVar4DetectormeasurementNoiseVar4Tracker 进行配置。这些参数可根据 detecor 和 tracker 的特性进行调整或优化,以实现更好的测量融合。

NvDeepSORT 中状态估计器的使用与上述通用用例略有不同,虽然它基本上是 Regular KF,但根据原始论文和实现有一些差异:

  • 使用长宽比a和高度h(而不是wh)来估算边框大小
  • 过程噪声和测量噪声与 bbox 高度成正比,而不是恒定常数值,通过noiseWeightVar4LocnoiseWeightVar4Vel进行设置

2.4 Object Re-Identification

ReID 使用 TensorRT 加速的神经网络从检测到的物体中提取高维的图像特征向量,这些特征向量对时空差异和遮挡具有鲁棒性。在 Nvtracker 中,它有两种用途:

  1. 在 NvDeepSORT 中,ReID 相似性用于连续帧中物体的数据关联
  2. target re-association(目标重新关联)中,提取并保留目标的 ReID 特征,以便在目标看似丢失时用于重新关联同一目标

对于每个目标,内部都会保存最近帧中reidHistorySize数量的的 ReID featuremap。
detector 对象与跟踪目标之间的 ReID 相似度是 detector 对象的 ReID 特征与其在跟踪目标特征库中的最近邻近特征之间的余弦相似度,其值范围为 [0.0, 1.0]。具体来说,跟踪目标特征库中的每个特征都与检测物体的特征进行点积。所有点积的最大值就是相似度得分,即
s c o r e i j = m a x k ( f e a t u r e _ d e t i ⋅ f e a t u r e _ t r a c k j k ) score_{ij} = max_{k}\left(feature\_det_{i} \cdot feature\_track_{jk}\right) scoreij=maxk(feature_detifeature_trackjk)
其中 f e a t u r e _ d e t i feature\_det_{i} feature_deti表示 detector 输出的第 i 个对象的 ReID 特征,而 f e a t u r e _ t r a c k j k feature\_track_{jk} feature_trackjk则表示跟踪目标 j 的历史第 k 帧的 ReID 特征,k= [1, reidHistorySize]。ReID 具有时空约束。如果对象移出框架或被遮挡超过maxShadowTrackingAge,即使它返回到跟踪框架中,也会为其分配一个新 ID。

2.5 Target Re-Association

非连续帧的匹配,找回丢失的目标。多目标跟踪过程中,检测器 detector 可能仅捕捉到物体的一部分(由于部分可见性),导致目标出现尺寸检测错误、以及中心位置预测错误等等问题,进而造成目标无法与再次出现的物体关联,导致跟踪失败和 ID Switch。Deepstream6.2 版本通过运行特征和 ReID 特征的结合增强了目标重新关联算法,但是这些是作为后处理模块进行的,时延指标上会有所下降。对于实时分析应用而言,通常希望将其作为实时多目标跟踪算法的一部分进行无缝处理。Deepstream6.3 中的 NvTracker 则将 Target Re-Association 以一种可选模块的形式集成到了核心跟踪框架中,通过 Tracklet Prediction、ReID Feature Extraction、Target ID Acquisition、Tracklet Matching 以及 Tracklet Fusion 来完成目标重新关联的过程。

2.5.1 Tracklet Prediction

每当现有跟踪目标长时间(由probationAge设置)不与 detector 输出对象关联时,就认为该目标丢失。当视觉跟踪器模块在 shadow tracking 模式下跟踪目标时,使用一些最近匹配的轨迹点(其长度由 trajectoryProjectionLength 设置)生成预测轨迹的长度(prepLength4TrajectoryProjection)并将其存储到内部数据库,直到它再次与 detector 输出对象匹配或与另一个目标重新关联。

2.5.2 ReID Feature Extraction

在目标丢失之前,ReID 网络会以reidExtractionInterval 的帧间隔提取其 ReID 特征,并将其存储在特征库中。这些特征将用于 Tracklet Matching(轨迹匹配)阶段识别目标的再次出现。

2.5.3 Target ID Acquisition

当实例化新目标时,会在几帧内(由probationAge设置)检查其有效性,并且在完成 Late Activation 后,才分配目标 ID 并上报目标状态。
在目标 ID 获取的过程中,会检查新目标是否与存储上述预测轨迹的内部数据库中的任何轨迹匹配(即采用历史轨迹去匹配)。如果匹配成功,则意味着新目标实际上是过去消失目标重新出现。然后新目标会与现有目标进行重新关联,其 Tracklet(轨迹列表)也会与现有目标的 Tracklet 合并,从而实现目标 ID 的获取。否则,就为分配新的目标 ID。

2.5.4 Tracklet Matching

在轨迹匹配过程中,根据maxTrackletMatchingTimeSearchRange配置的可行时间窗口,从数据库中查询有效的候选 Tracklet。对于新目标和每个候选目标,轨迹匹配时都会考虑运动相似度和 ReID 相似度。
运动相似度是沿着轨迹的平均 IOU,具有不同的实现方式,包括最小平均 IOU 分数(minTrackletMatchingScore)、运动中的最大角度差(maxAngle4TrackletMatching)、最小速度相似度(minSpeedSimilarity4TrackletMatching)和最小 bbox 大小相似度(minBboxSizeSimilarity4TrackletMatching)。 ReID 相似度是新目标的 ReID 特征与其候选特征库中最近邻居之间的余弦距离。总相似度得分是两个指标的加权和。
t o t a l S c o r e = ω 1 ∗ I O U + ω 2 ∗ r e i d S i m i l a r i t y totalScore = \omega_{1} *IOU + \omega_{2} * reidSimilarity totalScore=ω1IOU+ω2reidSimilarity

2.5.5 Tracklet Fusion

一旦两个轨迹点关联起来,就会根据与检测器的匹配状态和每个点的置信度将它们融合在一起,生成一个平滑的轨迹点。

仅当启用状态估计器时,目标重新关联才能有效,否则将无法正确进行轨迹预测

3. 不同 Tracker 的之间的 Tradeoff

NvTracker 提供了四类跟踪器的实现,它们在准确性、鲁棒性和效率方面具有不同的资源需求和性能特征,需要根据具体场景来选择使用

Tracker 类型GPU 使用程度CPU 使用程度优点缺点最佳使用场景
IOU非常低速度快,轻量级没有使用视觉特征来匹配,因此容易出现频繁的跟踪器 ID 切换和轨迹点消失。不适合快速移动的场景1. 物体分布稀疏,大小不同
2. Detector 逐帧运行
NvSORT非常低1. 速度快,轻量级
2. 用基于卡尔曼滤波器的状态估计器进行运动估计和预测
3. 通过中精度或高精度 Detector,比较容易提高数据关联性和合理的跟踪精度
没有使用视觉特征来匹配,因此容易出现频繁的跟踪器 ID 切换和轨迹点消失1. 与中等或高精度检测器结合使用,例如 PeopleNet 和 YOLO
2. Detector 逐帧运行
NvDeepSORT非常高1. 允许自定义 ReID 模型进行外观匹配
2. ID Switch 频率较低
3. 对具有相似外观的目标具有高度辨别力
1. 由于需要对每个对象进行推理,因此计算成本较高
2. 除非切换 ReID 模型,否则无法轻松调整精度/性能水平
1. 多对象、复杂场景,即使有部分遮挡
2. 视角变化较小的场景
NvDCF中等1. 对于部分遮挡、阴影和其他短暂的视觉变化具有高度鲁棒性
2. ID 切换频率较低
3. Detecor 进行跳帧检测,不会显著降低精度
4. 基于视觉相似性的输出跟踪置信度
5. 根据应用要求轻松调整参数以实现精度与性能的权衡
由于视觉特征提取的计算复杂性增加,比 IOU、NvSORT 慢1. 多对象、复杂场景,即使有部分遮挡
2. Detector 跳帧运行

3.1 NvDCF Tracker

IOU、NvSORT 之类的跟踪器比较常见了,而 NvDCF 的资料相对较少,这里主要介绍一下 NvDCF 以及它的性能优势。NvDCF 跟踪器采用了基于判别相关滤波器(DCF)的视觉跟踪器,DCF 用来学习或拟合目标级别的 correlation filter, 并以此来在后续帧中定位相同的目标。

3.1.1 Batched MOT execution

在典型的 MOT 实现中,这种相关滤波器的学习和定位通常是按目标进行的,也就是对每个目标都会初始化一个 correlation filter,因此在 GPU 上处理时可能会频繁启动大量的小型 CUDA 内核,这本身不利于充分利用 GPU 的并行计算能力,尤其是当需要在单个 GPU 上并行跟踪来自多个视频流的大量物体时。
为了解决此类性能问题,NvDCF 跟踪器的 GPU 加速操作被设计为在批处理模式下执行,以最大限度地提高 GPU 利用率,尽管每个对象跟踪模型中的 CUDA 内核较小。批处理模式应用于跟踪步骤的全部流程,包括 bbox 裁剪和缩放、视觉特征提取、相关滤波器学习和定位。这可以看成与 batched cuFFT 或 batched cuBLAS 调用类似的模型,但不同之处在于 batched MOT execution model 包含了更多更高级别的操作,批处理的对象从多个目标扩展到多个流,以实现更高的效率和可扩展性。

3.1.2 Visual Tracking

通过视觉跟踪功能,即使上游 detector 产生漏检,NvDCF 跟踪器也可以定位并跟踪目标,从而实现更稳健的结果跟踪。并且还允许设置跳帧检测,但代价是精度略有下降。
与 NvSORT 和 NvDeepSORT 中 kalman filter 将检测框作为唯一输入不同,NvDCF 跟踪器中的 kalman filter 同时将视觉跟踪模块的定位结果和检测框一起作为输入。一旦目标被跟踪,视觉跟踪器就会继续尝试使用拟合得到的 correlation filter 在下一帧中定位相同的目标,同时与匹配到的检测框融合,得到更好的目标状态估计和预测。

  1. 为每个跟踪目标定义搜索区域
    对于每个被跟踪的目标,NvDCF 跟踪器都会在其下一帧的预测位置周围定义一个搜索区域,该区域要足够大,以便在搜索区域内检测到相同的目标。目标下一帧中的位置是通过使用状态估计模块预测的。searchRegionPaddingScale 属性决定搜索区域的大小,即目标边界框对角线的倍数。搜索区域的大小将按以下方式确定:
    S e a r c h R e g i o n w i d t h = w + s e a r c h R e g i o n P a d d i n g S c a l e ∗ w ∗ h SearchRegion_{width} = w + searchRegionPaddingScale * \sqrt{w * h} SearchRegionwidth=w+searchRegionPaddingScalewh
    S e a r c h R e g i o n h e i g h t = h + s e a r c h R e g i o n P a d d i n g S c a l e ∗ w ∗ h SearchRegion_{height} = h + searchRegionPaddingScale * \sqrt{w * h} SearchRegionheight=h+searchRegionPaddingScalewh
    其中wh是跟踪目标 bbox 的宽和高。

  2. 裁减图像并提取视觉特征
    为每个目标的预测位置定义搜索区域后,每个搜索区域的图像片段都会被裁剪并缩放为预定义的特征图像大小,并从中提取视觉特征。

    • featureImgSizeLevel 属性定义了特征图像的大小,其范围为 1 至 5。1 到 5 之间的每一级分别对应 12x12、18x18、24x24、30x30 和 36x36 特征图像尺寸。较低的 featureImgSizeLevel 会使 NvDCF 使用较小的特征尺寸,从而有可能提高 GPU 性能,但会牺牲精度和稳定性 - 在配置参数时,需要考虑featureImgSizeLevelsearchRegionPaddingScale 之间的相对关系。如果增加 searchRegionPaddingScale,而 featureImgSizeLevel 固定不变,那么特征图像中与目标本身相对应的像素数量就会有效减少,提取到的视觉特征也会变少

      对于每个裁剪过的图像片段,都会提取视觉外观特征,如ColorNames特征和HOG特征(梯度直方图)。HOG 特征包括 18 个通道(基于不同方向的分区数),而 ColorNames 特征则有 10 个通道。那么通道总数将达到 28 个。因此,如果同时使用 HOG 和 ColorNames 且特征图像大小级别为 5,则表示目标的视觉特征维度为 28x48x48。使用的视觉特征通道越多,精度就越高,但会增加计算复杂度,降低性能。NvDCF 跟踪器使用 NVIDIA 的 VPI库来提取这些视觉特征。

  3. 创建和更新 correlation filter
    correlation filter 是在跟踪目标 bbox 的中心位置应用注意力窗口(通过 Hanning window 实现)生成的。可以在垂直方向上移动注意力窗口的中心。例如,featureFocusOffsetFactor_y: -0.2将导致注意力窗口的中心位于特征图中的 y=-0.2,featureFocusOffsetFactor_y 的取值范围为[-0.5, 0.5]。
    在室内或室外监控场景中,摄像头一般都安装在高处以增大监控范围,例如零售店或交通十字路口。在这些应用场景中,人或车辆的下半身可能会被其他人或车辆遮挡。将注意力窗口上移一些,会提高 NvDCF 的跟踪效果。
    为目标生成 correlation filter 后,基于 DCF 的跟踪器在连续帧上创建和更新最佳 correlation filter 时,通常会采用指数移动平均法来实现时间上的一致性。这种移动平均法的学习率可分别通过相关滤波器及其通道权重的 filterLrfilterChannelWeightsLr 来配置,同时通过gaussianSigma来设置预期响应的高斯标准差。

3.1.3 Data Association

为了提高跟踪器的稳定性,通常引入视觉特征的来计算外观相似性。通常,这是一个计算成本高昂的过程,特别是对每个候选框位置提取视觉特征,在目标跟踪中往往成为性能瓶颈。现有方法一般为:

  • 从所有候选位置提取视觉特征
  • 在所有候选对象之间进行特征匹配

而 NvDCF 跟踪器利用在目标定位阶段获得的相关响应(correlation response)作为每个跟踪器在搜索区域内的跟踪置信度图,只需查找每个候选位置(即每个检测对象位置)的置信度值,即可获得视觉相似度,而无需任何显式计算。通过比较跟踪器之间的置信度,可以确定哪个跟踪器与特定检测器对象的视觉相似度更高,并将其作为数据关联的匹配分数的一部分。因此,在数据关联过程中,通过对现有 correlation response 进行简单的查找表(LUT)操作,就能非常高效地进行视觉相似性匹配。

在下面的动图中,左侧显示的是搜索区域内的目标,右侧显示的是相关响应图(深红色表示置信度较高,深蓝色表示置信度较低)。在置信度图中,中心周围的黄色十字(即 +)表示相关响应的峰值位置,而紫色 x 表示附近探测器 bboxes 的中心。这些紫色 x 位置上的相关响应值表示该位置上存在相同目标的视觉相似度的置信度得分。

如果目标周围有多个探测器框(即紫色 x),如下图所示,数据关联模块将根据视觉相似度得分以及配置的权重matchingScoreWeight4VisualSimilarity及其最小值minMatchingScore4VisualSimilarity进行匹配。

其他

截止到当前,基本能够通过已有公开资料对 NvTracker 有了大致的了解,但是其核心库仍然是闭源的,因此还有很多细节还需要未来进一步的探索。

参考

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值