DCF 跟踪器是一种在线视觉跟踪器,它采用判别相关滤波器进行视觉对象跟踪。它学习特定于对象的关联滤波器,并根据所学内容在后续帧中定位同一对象。有关更多信息,请参阅 CSR-DCF 论文 [1]。
请参阅 DCF 跟踪器示例应用程序,了解如何实现简单的 DCF 跟踪器。
来源:CSR-DCF 论文 [1]
定位对象 | 更新滤波器 |
---|---|
![]() 来源:CSR-DCF 论文 [1] | ![]() |
对象块: 从输入帧中裁剪并重新缩放到小正方形图像的检测对象称为对象块。所有被跟踪对象的块都存储在一个高的连续图像中,一个在另一个之上。裁剪缩放器 可以执行块提取和缩放。
特征块: 从对象块中提取的密集多维特征。每个维度代表一个特定的特征,由一个单通道图像平面表示。每个平面由堆叠在一起的矩形区域组成,每个区域对应一个对象块,顺序相同。所有平面都具有相同的大小,这由 featurePatchSize
DCFTracker 参数给出。
DCFTracker 在两个不同的阶段对被跟踪对象进行操作:定位和更新。在定位阶段,被跟踪对象在输入帧中被检测到,并且它们的边界框被更新以反映其估计位置。在更新阶段,内部对象模型根据其当前估计的边界框进行更新。
在定位阶段,被跟踪对象在输入帧中被检测到,并且它们的边界框被更新以反映其估计位置。
该函数对输入对象数组 inObjects
及其在 inPatches
中的对应图像块进行操作。该函数不会就地更新 inObjects
数组。相反,它会被复制到 outObjects
,但带有更新后的边界框。通过不执行就地操作,之前的和新的边界框都被保留。这些可能对于进一步优化边界框(DCFTracker 外部)很有用。如果需要就地对象数组更新,inObjects
也可以作为输出数组传递。
根据对象的状态,执行以下操作
此外,如果用户传递有效的 VPIImage 作为 outCorrelationResponses
参数,则可以返回计算出的相关响应。应用程序可以使用它来决定被跟踪对象的命运,即是否丢失跟踪。然后,此决定反映在新的对象状态中。如果确定跟踪已丢失,则必须将对象的状态设置为 LOST。
outCorrelationResponse
图像包含正在处理的所有对象(无论对象的状态如何)的相关响应。图像格式为 VPI_IMAGE_FORMAT_F32。只有状态为 TRACKED 或 SHADOW_TRACKED 的对象才具有有效的相关响应。该图像是一个垂直条带的正方形块,每个块的宽度等于 featureImgSize
。
如果需要,此图像必须由用户以正确的尺寸和格式分配。它必须足够高以至少包含在 DCFTracker 有效负载创建期间指定的 maxTargets
。
更新阶段是可以添加、删除新对象的地方,并且可以根据其当前估计的边界框完成被跟踪对象的内部模型的更新。根据对象的状态,执行以下操作
一旦为目标生成相关滤波器,DCF 跟踪器就会采用指数移动平均来获得时间一致性,此时会创建和更新连续帧上的最佳相关滤波器。相关滤波器及其通道权重的学习率可以分别通过 filterLr
和 filterChannelWeightsLr
进行配置。用于创建最佳 DCF 滤波器的期望响应的高斯分布的标准差也可以通过 gaussianSigma
进行配置。
有关实现该算法的限制、约束和后端的列表,请查阅以下函数的参考文档
函数 | 描述 |
---|---|
vpiInitDCFTrackerCreationParams | 使用默认值初始化 VPIDCFTrackerCreationParams。 |
vpiCreateDCFTracker | 创建 DCF 跟踪器的有效负载。 |
vpiInitDCFTrackerParams | 使用默认值初始化 VPIDCFTrackerParams。 |
vpiSubmitDCFTrackerLocalizeBatch | 使用判别相关滤波器方法在输入图像块中定位每个被跟踪对象。 |
vpiSubmitDCFTrackerUpdateBatch | 根据对象的状态及其对应的输入图像块更新内部对象跟踪信息。 |
vpiDCFTrackerGetChannelWeights | 返回包含每个被跟踪对象的通道权重信息的数组。 |
上面描述的 DCF 组件可以组装成各种方式的跟踪器。一种常见的方式如下所示。初始帧和参考边界框(通常来自检测器)用于更新(vpiSubmitDCFTrackerUpdateBatch),即学习一组判别相关滤波器和相应的通道权重。后续帧被馈送到一个循环中,该循环交替执行 vpiSubmitDCFTrackerLocalizeBatch 和 vpiSubmitDCFTrackerUpdateBatch 步骤,以不断定位对象并根据目标对象的新边界框位置更新相关滤波器。
状态转换管理必须由用户处理。下面显示了一个示例转换图。在典型场景中,帧被处理后,可以将其分类为以下状态
状态转换由用户通过显式更新对象数组中的对象状态来触发。这使用户可以完全控制对象的生命周期以及对对象执行的处理类型。
所有正在处理的对象都存储在单个 VPIArray 对象中。对象数组的元素类型为 VPI_ARRAY_TYPE_DCF_TRACKED_BOUNDING_BOX 。对象在数组中的位置在其生命周期内是固定的。它们被独立处理,并且可以来自多个输入序列,如下图所示。
用户负责管理对象数组。跟踪丢失的对象(或任何对象)可以在需要时重复用于新对象,只需将其状态设置为 NEW,并初始化对象属性的其余部分。如果数组末尾对象的跟踪丢失,则可以相应地减小整个数组的大小,从而提高算法运行时性能。
与对象关联的任何其他属性都可以在外部进行管理。它们可以通过其在对象数组中的索引,或者通过使用 VPIDCFTrackedBoundingBox 结构中的 userData
指针,与 DCFTracker 管理的相应对象关联。
DCFTracker 中有两个可用的配置参数集。第一组对应于影响所需内部资源分配的参数。这些参数在创建 DCFTracker 实例时定义,之后无法修改。这些是 VPIDCFTrackerCreationParams 和 VPIDCFTrackerCreationFlag 。
第二组对应于可以在运行时修改的参数,例如,在每帧之后或根据用户需要。VPIDCFTrackerParams 定义了这些参数。
可以使用初始化函数 vpiInitDCFTrackerCreationParams 和 vpiInitDCFTrackerParams 使用默认值填充这些结构。
有关更多信息,请参阅 VPI - 视觉编程接口 的“C API 参考”部分中的 DCF 跟踪器。
对于完整的多对象跟踪解决方案,请参阅 NVIDIA DeepStream SDK 中的 NvDCF 多对象跟踪器。
有关如何使用以下性能表的信息,请参阅 算法性能表。
在比较测量结果之前,请查阅 比较算法运行时间。
有关性能基准测试方式的更多信息,请参阅 性能基准。