精度调优工具#

典型的 DeepStream 感知管线包括检测器和多对象跟踪器,每个模块都有许多参数,这些参数在检测器 (PGIE) 和跟踪器配置文件中列出。例如,检测后处理的聚类阈值、跟踪器中的卡尔曼滤波器参数等。当用户在交通、零售、仓库等各种应用中部署此类数据处理管线时,一个痛点是如何为每个用例找到具有最高精度 KPI 的最佳参数。手动参数调整需要深入了解算法以及每个参数如何影响功能。考虑到参数数量众多,此过程的复杂性将呈指数级增长。

从 DeepStream 7.0 开始,发布了一个新的工具 PipeTuner 用于自动精度调优。它可以有效地探索(可能非常高维的)参数空间,并自动找到管线的最佳参数,从而在数据集上产生最高的 KPI。自动调优和传统手动调优之间的区别可以概括如下

方法

工作流程

优点/缺点

要求

使用 PipeTuner 进行自动调优

  • 下载 PipeTuner,并为目标用例准备数据集。

  • 定义一个 DeepStream 管线,其中包含要使用的必需模型和配置文件中的初始参数。然后注册一组要调优的参数,并为每个参数设置搜索范围。

  • 启动 PipeTuner,它将自动搜索具有最高精度 KPI 的参数。

  • 用户无需具备关于管线及其参数的技术知识。

  • 自动调优算法会在搜索范围内找到最佳参数集,从而产生最高的精度 KPI。

  • 用户需要提供一个数据集,其中包括一些视频流,其分辨率与实际部署中使用的分辨率相同,以及真实值(即边界框和对象 ID)。视频应具有相同的分辨率,代表典型的用例,并且不宜过长,否则调优的周转时间可能会太长;我们建议长度为 1-2 分钟。

  • 管线调优将通过多次 DeepStream 管线执行迭代进行,这可能需要数小时,具体取决于各种因素,例如迭代次数(类似于 epoch)、数据集大小和硬件功能。

手动调优

  • 阅读技术文档,了解每个参数如何影响精度。

  • 执行启发式或随机搜索参数,并检查结果质量。

  • 手动多次运行 DeepStream 管线,以比较哪些参数效果最佳。

  • 如果用户在 DeepStream 调优方面非常有经验/技能,那么这可能是一个快速修复。

  • 对某些极端情况的快速修复可能会导致其他情况下的回归。

  • 任何手动调优都将是次优的,因为手动探索高维参数空间是不可行的。

  • 用户需要关于管线及其参数的特殊技术知识,并且需要经历反复试验的过程。

有关更详细的教程,请查看 NGC 中的 PipeTuner 用户指南,获取逐步设置说明和所有技术细节。如果仍然需要手动调优,我们还在以下部分提供了某些配置参数的功能,以便更好地了解它们对多对象跟踪操作的性能和精度的潜在影响。

用于自动调优的 PipeTuner(开发者预览)#

下载#

PipeTuner 托管在 NGC 上。用户需要下载以下资源才能开始。

特性和要求#

以下是 PipeTuner 功能和要求的摘要

数据集

用户需要为其用例提供典型的数据集。它应包括一些示例视频,其中包含边界框和对象 ID 真实值注释

模型

用户需要提供所需的模型,包括对象检测模型(用于 PGIE)和 Re-ID 模型(仅在使用 NvDCF_accuracy 或 NvDeepSORT 跟踪器时才需要 Re-ID)。它们可以是 DeepStream 容器中的 NVIDIA TAO 模型、NGC 或自定义预训练的 ONNX 模型

容器

用户需要从 NGC 下载 PipeTuner 和 DeepStream 容器

精度 KPI

用户选择多对象跟踪 KPI 之一:HOTAMOTAIDF1

设置#

设置 PipeTuner 的总体步骤如下。

  • 下载容器:从 NGC 仓库拉取 PipeTuner 和 DeepStream 感知容器;

  • 下载示例数据:从 NGC 资源下载并提取示例数据;

  • 数据准备:用户创建自己的数据集,格式与示例数据相同,并更新配置文件以匹配其用例;

  • 启动调优:使用所需的配置和数据启动调优管线;

  • 检索结果:检索最佳参数并可视化调优结果;

  • 部署:将最佳参数部署到所需的用例中。

PipeTuner 通过迭代以下三个步骤搜索最佳参数,直到精度 KPI 收敛或达到指定的最大迭代次数(即 epoch)

  • ParamSearch:给定上一次迭代中的精度 KPI 分数,对可能产生更高精度 KPI 的参数集进行有根据的猜测。对于第一次迭代,将进行参数空间中的随机抽样;

  • PipeExec:给定采样/猜测的参数集,使用参数执行管线并生成元数据以进行精度评估;

  • PipeEval:给定来自管线的元数据输出和数据集,根据精度指标执行精度评估并生成精度 KPI 分数。

用于手动调优的多对象跟踪参数功能#

本节介绍检测器和跟踪器每个模块中的配置参数,以及它们对性能和精度的潜在影响。《DeepStream SDK 插件手册》中提供了 NvMultiObjectTracker 跟踪器库的总体介绍。

精度-性能权衡#

视觉特征大小、检测间隔和输入帧大小都会对精度和性能产生影响。应正确设置它们以实现良好的精度-性能权衡。

视觉特征类型和特征大小#

相关参数

  • 视觉特征类型

    • useColorNames

    • useHog

  • 特征大小

    • featureImgSizeLevel

    • searchRegionPaddingScale

NvDCF 跟踪器可以使用多种类型的视觉特征,例如定向梯度直方图 (HOG) 和 ColorNames。如果同时使用这两种特征(通过设置 useColorNames: 1useHog: 1),则通道总数将为 28。使用的视觉特征通道越多,算法跟踪就越准确,但会增加计算复杂性并降低性能。

除了视觉特征的类型外,我们还可以配置用于表示每个特征通道的对象的像素数。相应的参数是 featureImgSizeLevel,其范围为 1 到 5。级别 1 到 5 之间的每个级别分别对应于每个特征通道的 12x12、18x18、24x24、36x36 和 48x48。因此,如果一个人同时使用 HOG 和 ColorNames,并将 featureImgSizeLevel: 5,则表示对象的视觉特征的维度将为 28x48x48。

需要注意的一点是,对象的视觉特征是从一个区域提取的,该区域的大小比对象区域稍大,以确保即使对象在帧之间移动,下一个帧中的对象也出现在该区域内。此区域称为搜索区域,其大小通过向对象 bbox 添加一定程度的填充来定义。《DeepStream 插件手册》中的 NvDCF 跟踪器部分提供了更多详细信息。

增加搜索区域大小会降低在下一帧中错过对象的概率;但是,给定固定的特征大小(即 featureImgSizeLevel),如果我们增加 searchRegionPaddingScale,它将有效地减少属于对象的像素数,从而导致视觉特征中对象表示的分辨率降低。这可能会导致跟踪精度降低;但是,如果预期对象在两个连续帧之间的移动程度较小,则即使搜索区域较小,对象也很可能出现在下一帧的搜索区域中。如果启用了状态估计器并且状态估计器的预测相当准确,则尤其如此,因为搜索区域将在下一帧的预测位置定义。

检测间隔#

相关参数

  • 检测间隔

    • interval

用户可以探索增加检测间隔(即 PGIE 配置中的 interval),而不是减少视觉特征类型和大小。由于增强的精度和鲁棒性,NvDCF 跟踪器允许用户增加检测间隔,而不会过多牺牲精度。特别是当更重的神经网络模型用于对象检测时,增加检测间隔带来的性能增益将更高。因此,用户可以考虑增加检测间隔,而不是降低 NvDCF 跟踪器的精度设置。

跟踪器的视频帧大小#

相关参数

  • 跟踪器的视频帧大小

    • tracker-width

    • tracker-height

在跟踪器插件中配置的视频帧大小对性能有一定影响,因为分辨率较高的视频帧需要更长的时间在内存之间传输。如果将帧分辨率设置得较低,希望获得更高的性能,但是,它对精度的负面影响可能会超过性能增益。因此,建议使用至少 960x544 分辨率(对于 1080p 源分辨率)以最大程度地减少精度下降。

鲁棒性#

为了处理来自检测器的误报和漏报,NvMultiObjectTracker 库利用了两种策略,称为延迟激活阴影跟踪(更多详细信息可以在《DeepStream SDK 插件手册》中找到)。除了与这些策略相关的配置参数外,还有一些配置参数会影响何时为新对象创建和终止跟踪器。

目标创建策略#

相关参数

  • 目标候选资格

    • minDetectorConfidence

    • minIouDiff4NewTarget

  • 延迟激活

    • probationAge

    • earlyTerminationAge

如果检测器检测到的对象满足以下指定的最低资格(即目标候选资格),则会为该对象实例化一个新的跟踪器

  • minDetectorConfidence

  • minIouDiff4NewTarget

如果观察到置信度值较低的虚假检测,可以增加最小检测器置信度(即 minDetectorConfidence)来过滤掉它们。如果新检测到的对象与任何现有目标的最大 IOU 分数低于 minIouDiff4NewTarget,则将创建一个新的目标跟踪器来跟踪该对象。因此,如果希望进一步抑制在同一目标上创建可能具有略微不同 bbox 大小的重复 bbox,则可以将 minIouDiff4NewTarget 设置得更低。

一旦为新对象实例化了跟踪器,它最初会在临时模式(即 Tentative 模式)下开始跟踪对象,直到在由 probationAge 指定的期限(以帧数为单位)内满足进一步的标准。在此试用期内,只要跟踪器 bbox 与检测器 bbox 不匹配或跟踪器置信度低于 minTrackerConfidence,阴影跟踪年龄(这是一个内部变量)就会增加。如果阴影跟踪年龄达到预定义的阈值(即 earlyTerminationAge),则跟踪器将提前终止,从而有效地消除误报。

如果预计误报率较高,则可以考虑增加 probationAge 和/或降低 earlyTerminationAge 以获得更严格的创建策略。如果误报的预期检测器置信度较低,而真阳性的预期检测器置信度较高,则可以相应地设置 minDetectorConfidence 以过滤掉误报。

目标终止策略#

相关参数

  • 阴影跟踪

    • minTrackerConfidence

    • maxShadowTrackingAge

除了上述试用期内的提前终止策略外,跟踪器终止时还需要满足某些标准。一旦跟踪器开始在 Active 模式下跟踪,如果满足以下条件,其状态将更改为 Inactive 模式

  1. 跟踪器置信度低于 minTrackerConfidence

  2. 在数据关联期间,它与检测器 bbox 不匹配。

当目标未与检测器对象关联时,阴影跟踪年龄每帧都会增加。如果跟踪器再次与检测器 bbox 匹配,则阴影跟踪年龄将重置为零,并且如果跟踪器处于 Inactive 模式,则跟踪器的模式将再次更改为 Active 模式(这意味着跟踪器输出将报告给下游)。但是,如果阴影跟踪年龄超过预定义的阈值(即 maxShadowTrackingAge),则跟踪器将被终止。

为了获得更鲁棒的跟踪,可以增加 maxShadowTrackingAge 的值,因为它允许即使在连续多帧中丢失检测后也能重新关联对象。但是,如果对象的视觉外观在丢失检测期间发生显着变化(例如,长时间遮挡),则当对象重新出现时,学习到的相关滤波器可能不会产生高相关响应。此外,增加 maxShadowTrackingAge 会使跟踪器的寿命更长(即延迟终止更多),从而导致在给定时间内存中存在的跟踪器数量增加,这反过来会增加计算负载。

状态估计#

NvMultiObjectTracker 库中的对象跟踪器维护目标的以下状态集

  • 目标位置(在 2D 相机坐标中)

    • 位置

    • 位置速度

  • 目标 Bbox

    • 大小

    • 大小速度

卡尔曼滤波器#

相关参数

  • processNoiseVar4Loc

  • processNoiseVar4Size

  • processNoiseVar4Vel

  • measurementNoiseVar4Detector

  • measurementNoiseVar4Tracker

NvMultiObjectTracker 库中的卡尔曼滤波器 (KF) 实现主要遵循标准的 2D KF 方法,用户需要根据预期的不确定性水平定义过程噪声和测量噪声。如果对象具有相对简单且线性的运动,则可以将过程噪声设置得低于测量噪声,从而有效地更信任预测。如果预计对象具有更动态的运动或状态的突然变化,则更建议将测量噪声设置得较低;否则,如果预测不正确,可能会出现一些滞后。

需要考虑的另一个附加因素是,允许用户为检测器 bbox 和跟踪器 bbox 设置不同的测量噪声,以用于启用视觉跟踪器模块(即 NvDCF)的情况。检测器始终可能出现误报,或者可能存在跳过对象检测推理的视频帧。对于这种情况,每个对象跟踪器都使用学习到的相关滤波器进行自己的定位,并且结果用于更新卡尔曼滤波器。因此,从 KF 的角度来看,测量来自两个不同的来源:一个来自检测器,另一个来自跟踪器。在预期测量来自多个来源的情况下,应融合此类测量,以使用适当的测量模型(即测量的 不确定性建模)正确估计目标状态。

根据检测器和跟踪器的精度特性,应相应地配置测量噪声。当非常高精度的模型用于对象检测时,可以将 measurementNoiseVar4Detector 值设置得低于 measurementNoiseVar4Tracker,从而有效地比跟踪器的预测/定位更信任检测器的测量。

数据关联#

相关参数

  • 匹配候选资格

    • minMatchingScore4Overall

    • minMatchingScore4SizeSimilarity

    • minMatchingScore4Iou

    • minMatchingScore4VisualSimilarity

  • 匹配分数权重

    • matchingScoreWeight4VisualSimilarity

    • matchingScoreWeight4SizeSimilarity

    • matchingScoreWeight4Iou

在检测器执行推理的视频帧(称为推理帧)中,NvDCF 跟踪器执行数据关联,以将一组检测器对象与一组现有目标匹配。为了降低匹配的计算成本,必须为每个对象跟踪器定义一小组好的候选对象。这就是匹配候选资格的标准发挥作用的地方。对于每个跟踪器 bbox,只有在最小大小相似性、IOU 和视觉相似性方面合格的检测器 bbox 才会被标记为匹配的候选对象。视觉相似性是根据跟踪器在检测器 bbox 位置的相关响应计算得出的。例如,如果只想考虑至少与跟踪器 bbox 有一些重叠的检测器 bboxes,则需要将 minMatchingScore4Iou 设置为非零值。可以以类似的方式调整其他参数。

给定每个跟踪器的一组候选检测器 bboxes,在检测器 bbox 集和跟踪器集之间构建数据关联矩阵,匹配分数作为矩阵中元素的值。每个元素的匹配分数计算为加权和

  1. 视觉相似性

  2. 大小相似性,以及

  3. IOU 分数,权重分别在 matchingScoreWeight4VisualSimilaritymatchingScoreWeight4SizeSimilaritymatchingScoreWeight4Iou 中。

只有当结果匹配分数超过预定义的阈值(即 minMatchingScore4Overall)时,才会将该分数放入数据关联矩阵中

DCF 核心参数#

除了所用视觉特征的类型和大小外,还有一些参数与如何在 DCF 框架中学习和更新每个对象的分类器有关,这些参数会影响精度。

DCF 滤波器学习#

相关参数

  • filterLr

  • filterChannelWeightsLr

  • gaussianSigma

基于 DCF 的跟踪器使用隐式正样本和负样本为每个对象学习一个分类器(即判别相关滤波器)。此类学习到的分类器会以预定义的学习率(即 filterLr)进行实时更新,以实现时间一致性。如果目标对象的视觉外观预计会随着时间快速变化,则可以使用高学习率来更好地使相关滤波器适应不断变化的外观。但是,也存在快速学习背景的风险,从而可能导致更频繁的跟踪漂移。

由于 NvDCF 跟踪器利用多通道视觉特征,因此如何合并这些通道以获得最终相关响应是一个值得关注的问题。NvDCF 采用自适应通道权重方法,其中实时检查每个通道的重要性,并且相应的通道权重会随着时间以预定义的学习率(即 filterChannelWeightsLr)进行更新。此学习率的调优策略将与之前描述的 filterLr 的情况类似。

当学习相关滤波器时,gaussianSigma 确定我们希望将结果滤波器与正样本拟合得有多紧密。较低的值意味着更紧密的拟合,但可能会导致过拟合。另一方面,较高的值可能会导致学习到的滤波器的判别能力较低。

另请参阅跟踪器设置和参数调优中的故障排除部分,了解跟踪器行为和调优中常见问题的解决方案。