文章目录
多路视频流并行推理时,多目标跟踪算法这块容易成为性能瓶颈,如果处理不好反而弄巧成拙,边缘设备上也没那么多资源去支持。
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-temporal和ReID两种策略来解决跟踪目标暂时丢失的场景,分别对应着历史轨迹匹配和图像特征匹配,利用图像特征的 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)会被缓存一段时间,该对象在这段时间内幸存下来时才被激活以进行长期跟踪。
具体地说,每当检测到新的对

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

被折叠的 条评论
为什么被折叠?



