追踪

数据关联

class MarginalAssignment(exists_logits, assign_logits, bp_iters=None)[source]

计算对象和检测之间的边际数据关联。

这假设每个检测对应零个或一个对象,并且每个对象对应零个或多个检测。具体来说,这不假设检测已被划分为互斥帧,这在二维分配问题中很常见。

参数
  • exists_logits (torch.Tensor) – 形状为 [num_objects] 的张量,表示每个潜在对象存在性的每对象因子。

  • assign_logits (torch.Tensor) – 形状为 [num_detections, num_objects] 的张量,表示分配概率的每边因子,其中每条边表示给定检测与单个对象关联。

  • bp_iters (int) – 可选的信念传播迭代次数。如果未指定或为 None,将使用昂贵的精确算法。

变量
  • num_detections (int) – 检测的数量

  • num_objects (int) – (潜在存在的)对象的数量

  • exists_dist (pyro.distributions.Bernoulli) – 关于对象存在的平均场后验分布。

  • assign_dist (pyro.distributions.Categorical) – 关于每个检测关联到的对象(或 None)的平均场后验分布。这具有 .event_shape == (num_objects + 1,),其中最后一个元素表示虚假检测,并且 .batch_shape == (num_frames, num_detections)

class MarginalAssignmentSparse(num_objects, num_detections, edges, exists_logits, assign_logits, bp_iters)[source]

MarginalAssignment 的廉价稀疏版本。

参数
  • num_detections (int) – 检测的数量

  • num_objects (int) – (潜在存在的)对象的数量

  • edges (torch.LongTensor) – 形状为 [2, num_edges] 的张量,表示指定可行关联的(检测,对象)索引对。

  • exists_logits (torch.Tensor) – 形状为 [num_objects] 的张量,表示每个潜在对象存在性的每对象因子。

  • assign_logits (torch.Tensor) – 形状为 [num_edges] 的张量,表示分配概率的每边因子,其中每条边表示给定检测与单个对象关联。

  • bp_iters (int) – 可选的信念传播迭代次数。如果未指定或为 None,将使用昂贵的精确算法。

变量
  • num_detections (int) – 检测的数量

  • num_objects (int) – (潜在存在的)对象的数量

  • exists_dist (pyro.distributions.Bernoulli) – 关于对象存在的平均场后验分布。

  • assign_dist (pyro.distributions.Categorical) – 关于每个检测关联到的对象(或 None)的平均场后验分布。这具有 .event_shape == (num_objects + 1,),其中最后一个元素表示虚假检测,并且 .batch_shape == (num_frames, num_detections)

class MarginalAssignmentPersistent(exists_logits, assign_logits, bp_iters=None, bp_momentum=0.5)[source]

这计算了具有未知数量的持续对象的多帧多对象数据关联问题的边际分布。

输入是因子图中的因子(每个潜在对象的存在概率以及每个对象-检测对的分配概率),输出是每个潜在对象的后验存在概率的边际分布以及每个对象-检测对的后验分配概率。

这假设每帧有一个共享的(最大)检测数量;要处理可变数量的检测,只需将 assign_logits 的相应元素设置为 -float('inf')

参数
  • exists_logits (torch.Tensor) – 形状为 [num_objects] 的张量,表示每个潜在对象存在性的每对象因子。

  • assign_logits (torch.Tensor) – 形状为 [num_frames, num_detections, num_objects] 的张量,表示分配概率的每边因子,其中每条边表示在给定时间帧中给定检测与单个对象关联。

  • bp_iters (int) – 可选的信念传播迭代次数。如果未指定或为 None,将使用昂贵的精确算法。

  • bp_momentum (float) – 用于信念传播的可选动量。应在区间 [0,1) 内。

变量
  • num_frames (int) – 时间帧的数量

  • num_detections (int) – 每帧的(最大)检测数量

  • num_objects (int) – (潜在存在的)对象的数量

  • exists_dist (pyro.distributions.Bernoulli) – 关于对象存在的平均场后验分布。

  • assign_dist (pyro.distributions.Categorical) – 关于每个检测关联到的对象(或 None)的平均场后验分布。这具有 .event_shape == (num_objects + 1,),其中最后一个元素表示虚假检测,并且 .batch_shape == (num_frames, num_detections)

compute_marginals(exists_logits, assign_logits)[source]

这通过枚举实现对成对边际的精确推断。这非常昂贵,仅用于测试。

有关 args 和问题描述,请参阅 MarginalAssignment

compute_marginals_bp(exists_logits, assign_logits, bp_iters)[source]

这通过循环信念传播实现对成对边际的近似推断,改编了 [1] 的方法。

有关 args 和问题描述,请参阅 MarginalAssignment

[1] Jason L. Williams, Roslyn A. Lau (2014)

使用信念传播对边际关联概率进行近似评估 https://arxiv.org/abs/1209.6299

compute_marginals_sparse_bp(num_objects, num_detections, edges, exists_logits, assign_logits, bp_iters)[source]

这通过循环信念传播实现对成对边际的近似推断,改编了 [1] 的方法。

有关 args 和问题描述,请参阅 MarginalAssignmentSparse

[1] Jason L. Williams, Roslyn A. Lau (2014)

使用信念传播对边际关联概率进行近似评估 https://arxiv.org/abs/1209.6299

compute_marginals_persistent(exists_logits, assign_logits)[source]

这通过枚举实现对成对边际的精确推断。这非常昂贵,仅用于测试。

有关 args 和问题描述,请参阅 MarginalAssignmentPersistent

compute_marginals_persistent_bp(exists_logits, assign_logits, bp_iters, bp_momentum=0.5)[source]

这通过循环信念传播实现对成对边际的近似推断,改编了 [1]、[2] 的方法。

有关 args 和问题描述,请参阅 MarginalAssignmentPersistent

[1] Jason L. Williams, Roslyn A. Lau (2014)

使用信念传播对边际关联概率进行近似评估 https://arxiv.org/abs/1209.6299

[2] Ryan Turner, Steven Bottone, Bhargav Avasarala (2014)

一个完整的变分追踪器 https://papers.nips.cc/paper/5572-a-complete-variational-tracker.pdf

分布

class EKFDistribution(x0, P0, dynamic_model, measurement_cov, time_steps=1, dt=1.0, validate_args=None)[source]

EKF 状态上的分布。参见 EKFState。当前仅支持 log_prob

参数
filter_states(value)[source]

返回给定测量的 EKF 状态

参数

value (torch.Tensor) – 形状为 (time_steps, event_shape) 的测量均值

log_prob(value)[source]

返回测量张量创新的联合对数概率

参数

value (torch.Tensor) – 形状为 (time_steps, event_shape) 的测量均值

动态模型

class DynamicModel(dimension, dimension_pv, num_process_noise_parameters=None)[source]

动态模型接口。

参数
  • dimension – 本地状态维度。

  • dimension_pv – PV 状态维度。

  • num_process_noise_parameters – 过程噪声参数空间维度。这用于 UKF 应用。对于 EKF 和大多数其他滤波器,可以保留为 None

property dimension

本地状态维度访问。

property dimension_pv

PV 状态维度访问。

property num_process_noise_parameters

过程噪声参数空间维度访问。

abstract forward(x, dt, do_normalization=True)[source]

在时间间隔 dt 内积分本地状态 x

参数
  • x – 当前本地状态。如果 DynamicModel 是不可微的,请确保处理 x 增强过程噪声参数的情况。

  • dt – 积分的时间间隔。

  • do_normalization – 是否对输出执行归一化,例如,将角度取模到某个区间。

返回

本地状态 x 在 dt 时间后积分得到的结果。

geodesic_difference(x1, x0)[source]

计算并返回 2 个本地状态之间的测地线差异。这是欧几里得运算 x1 - x0 的推广。

参数
  • x1 – 本地状态。

  • x0 – 本地状态。

返回

本地状态 x1x2 之间的测地线差异。

abstract mean2pv(x)[source]

从本地状态计算并返回 PV 状态。这对于在 IMM(交互多模型)滤波中组合不同类型的状态估计很有用。

参数

x – 本地状态估计均值。

返回

PV 状态估计均值。

abstract cov2pv(P)[source]

从本地协方差计算并返回 PV 协方差。这对于在 IMM(交互多模型)滤波中组合不同类型的状态估计很有用。

参数

P – 本地状态估计协方差。

返回

PV 状态估计协方差。

abstract process_noise_cov(dt=0.0)[source]

计算并返回过程噪声协方差 (Q)。

参数

dt – 积分的时间间隔。

返回

只读协方差 (Q)。对于 DifferentiableDynamicModel,这是随机积分导致的本地状态 x 的协方差(用于 EKF)。否则,它是过程噪声参数本身的协方差(用于 UKF)。

process_noise_dist(dt=0.0)[source]

返回在时间间隔内由过程噪声分布引起的状态位移的分布对象。

参数

dt – 过程噪声累积的时间间隔。

返回

多元正态分布.

class DifferentiableDynamicModel(dimension, dimension_pv, num_process_noise_parameters=None)[source]

可以高效计算状态转移雅可比矩阵的 DynamicModel,通常通过解析或自动微分。

abstract jacobian(dt)[source]

计算并返回在时间间隔 dt 内的本地状态转移雅可比矩阵 (F)。

参数

dt – 积分的时间间隔。

返回

积分映射 (f) 的只读雅可比矩阵 (F)。

class Ncp(dimension, sv2)[source]

NCP(接近恒定位置)动态模型。可以被子类化,例如使用 CWNV(连续白噪声速度)或 DWNV(离散白噪声速度)。

参数
  • dimension – 本地状态维度。

  • sv2 – 速度的方差。通常选择这个值,使得标准差大约是预期观察到的最大速度的一半。

forward(x, dt, do_normalization=True)[source]

在时间间隔 dt 内积分本地状态 x

参数
  • x – 当前本地状态。如果 DynamicModel 是不可微的,请确保处理 x 增强过程噪声参数的情况。

  • dt – 积分的时间间隔。 do_normalization: 是否对输出执行归一化,例如,将角度取模到某个区间。对此子类没有影响。

返回

本地状态 x 在 dt 时间后积分得到的结果。

mean2pv(x)[source]

从本地状态计算并返回 PV 状态。这对于在 IMM(交互多模型)滤波中组合不同类型的状态估计很有用。

参数

x – 本地状态估计均值。

返回

PV 状态估计均值。

cov2pv(P)[source]

从本地协方差计算并返回 PV 协方差。这对于在 IMM(交互多模型)滤波中组合不同类型的状态估计很有用。

参数

P – 本地状态估计协方差。

返回

PV 状态估计协方差。

jacobian(dt)[source]

计算并返回在时间间隔 dt 内的缓存的本地状态转移雅可比矩阵 (F)。

参数

dt – 积分的时间间隔。

返回

积分映射 (f) 的只读雅可比矩阵 (F)。

abstract process_noise_cov(dt=0.0)[source]

计算并返回缓存的过程噪声协方差 (Q)。

参数

dt – 积分的时间间隔。

返回

随机积分导致的本地状态 x 的只读协方差 (Q)(用于 EKF)。

class Ncv(dimension, sa2)[source]

NCV(接近恒定速度)动态模型。可以被子类化,例如使用 CWNA(连续白噪声加速度)或 DWNA(离散白噪声加速度)。

参数
  • dimension – 本地状态维度。

  • sa2 – 加速度的方差。通常选择这个值,使得标准差大约是预期观察到的最大加速度的一半。

forward(x, dt, do_normalization=True)[source]

在时间间隔 dt 内积分本地状态 x

参数
  • x – 当前本地状态。如果 DynamicModel 是不可微的,请确保处理 x 增强过程噪声参数的情况。

  • dt – 积分的时间间隔。

  • do_normalization – 是否对输出执行归一化,例如,将角度取模到某个区间。对此子类没有影响。

返回

本地状态 x 在 dt 时间后积分得到的结果。

mean2pv(x)[source]

从本地状态计算并返回 PV 状态。这对于在 IMM(交互多模型)滤波中组合不同类型的状态估计很有用。

参数

x – 本地状态估计均值。

返回

PV 状态估计均值。

cov2pv(P)[source]

从本地协方差计算并返回 PV 协方差。这对于在 IMM(交互多模型)滤波中组合不同类型的状态估计很有用。

参数

P – 本地状态估计协方差。

返回

PV 状态估计协方差。

jacobian(dt)[source]

计算并返回在时间间隔 dt 内的缓存的本地状态转移雅可比矩阵 (F)。

参数

dt – 积分的时间间隔。

返回

积分映射 (f) 的只读雅可比矩阵 (F)。

abstract process_noise_cov(dt=0.0)[source]

计算并返回缓存的过程噪声协方差 (Q)。

参数

dt – 积分的时间间隔。

返回

随机积分导致的本地状态 x 的只读协方差 (Q)(用于 EKF)。

class NcpContinuous(dimension, sv2)[source]

具有 CWNV(连续白噪声速度)的 NCP(接近恒定位置)动态模型。

参考

Y. Bar-Shalom 等人,2001 年,p.269,《带跟踪与导航应用的估计》。

参数
  • dimension – 本地状态维度。

  • sv2 – 速度的方差。通常选择这个值,使得标准差大约是预期观察到的最大速度的一半。

process_noise_cov(dt=0.0)[source]

计算并返回缓存的过程噪声协方差 (Q)。

参数

dt – 积分的时间间隔。

返回

随机积分导致的本地状态 x 的只读协方差 (Q)(用于 EKF)。

class NcvContinuous(dimension, sa2)[source]

具有 CWNA(连续白噪声加速度)的 NCV(接近恒定速度)动态模型。

参考

Y. Bar-Shalom 等人,2001 年,p.269,《带跟踪与导航应用的估计》。

参数
  • dimension – 本地状态维度。

  • sa2 – 加速度的方差。通常选择这个值,使得标准差大约是预期观察到的最大加速度的一半。

process_noise_cov(dt=0.0)[source]

计算并返回缓存的过程噪声协方差 (Q)。

参数

dt – 积分的时间间隔。

返回

随机积分导致的本地状态 x 的只读协方差 (Q)(用于 EKF)。

class NcpDiscrete(dimension, sv2)[source]

具有 DWNV(离散白噪声速度)的 NCP(接近恒定位置)动态模型。

参数
  • dimension – 本地状态维度。

  • sv2 – 速度的方差。通常选择这个值,使得标准差大约是预期观察到的最大速度的一半。

参考

Y. Bar-Shalom 等人,2001 年,p.273,《带跟踪与导航应用的估计》。

process_noise_cov(dt=0.0)[source]

计算并返回缓存的过程噪声协方差 (Q)。

参数

dt – 积分的时间间隔。

返回

随机积分导致的本地状态 x 的只读协方差 (Q)(用于 EKF)。

class NcvDiscrete(dimension, sa2)[source]

具有 DWNA(离散白噪声加速度)的 NCV(接近恒定速度)动态模型。

参数
  • dimension – 本地状态维度。

  • sa2 – 加速度的方差。通常选择这个值,使得标准差大约是预期观察到的最大加速度的一半。

参考

Y. Bar-Shalom 等人,2001 年,p.273,《带跟踪与导航应用的估计》。

process_noise_cov(dt=0.0)[source]

计算并返回缓存的过程噪声协方差 (Q)。

参数

dt – 积分的时间间隔。

返回

随机积分导致的本地状态 x 的只读协方差 (Q)(用于 EKF)。(注意,这个 Q,除了数值误差,秩为 dimension/2。因此,它仅是半正定的。)

扩展卡尔曼滤波器

class EKFState(dynamic_model, mean, cov, time=None, frame_num=None)[source]

以状态为中心的 EKF(扩展卡尔曼滤波器),用于 NCP(接近恒定位置)或 NCV(接近恒定速度)目标动态模型。存储目标动态模型、状态估计和状态时间。传入的 Measurement 提供用于更新的传感器信息。

警告

为了效率,动态模型仅进行浅拷贝。必要时在外部进行深拷贝以防止意外更改。

参数
  • dynamic_model – 目标动态模型。

  • mean – 目标状态估计的均值。

  • cov – 目标状态估计的协方差。

  • time – 状态估计的时间。

property dynamic_model

动态模型访问。

property dimension

本地状态维度访问。

property mean

本地状态估计均值访问。

property cov

本地状态估计协方差访问。

property dimension_pv

PV 状态维度访问。

property mean_pv

计算并返回缓存的 PV 状态估计均值。

property cov_pv

计算并返回缓存的 PV 状态估计协方差。

property time

连续状态时间访问。

property frame_num

离散状态时间访问。

predict(dt=None, destination_time=None, destination_frame_num=None)[source]

使用动态模型就地预测(又称传播、又称积分)状态估计。

参数
  • dt – 积分时间。除非您提供 destination_time,否则状态时间将自动增加此量。使用 destination_time 可能更适合防止舍入误差累积。

  • destination_time – 积分后设置连续状态时间的可选值。如果未提供此值,则必须提供 destination_frame_num

  • destination_frame_num – 积分后设置离散状态时间的可选值。如果未提供此值,则必须提供 destination_frame_num

innovation(measurement)[source]

计算并返回测量如果用于更新将引起的创新,但不实际执行更新。假定状态和测量是时间对齐的。这对于计算 Chi^2 统计量和似然很有用。

参数

measurement – 测量

返回

假想更新的创新均值和协方差。

返回类型

tuple(torch.Tensor, torch.Tensor)

log_likelihood_of_update(measurement)[source]

计算并返回潜在更新的似然,但不实际执行更新。假定状态和测量是时间对齐的。这对于在数据关联的分配问题中进行门控和计算成本很有用。

参数

measurement.

返回

假想更新的似然。

update(measurement)[source]

使用测量就地更新状态估计并返回创新。创新很有用,例如,在 EKFStateIMMFState 的一部分时,用于评估滤波器一致性或更新模型似然。

参数

measurement.

返回

EKF 状态、创新均值和协方差。

散列

class LSH(radius)[source]

为低维欧几里得空间实现局部敏感哈希。

允许高效地找到点的邻居。提供 2 个保证:

  • 未通过 nearby() 返回的点的坐标与输入点之间的差异大于 radius

  • 通过 nearby() 返回的点的坐标与输入点之间的差异小于 2 radius

示例

>>> radius = 1
>>> lsh = LSH(radius)
>>> a = torch.tensor([-0.51, -0.51]) # hash(a)=(-1,-1)
>>> b = torch.tensor([-0.49, -0.49]) # hash(a)=(0,0)
>>> c = torch.tensor([1.0, 1.0]) # hash(b)=(1,1)
>>> lsh.add('a', a)
>>> lsh.add('b', b)
>>> lsh.add('c', c)
>>> # even though c is within 2radius of a
>>> lsh.nearby('a') 
{'b'}
>>> lsh.nearby('b') 
{'a', 'c'}
>>> lsh.remove('b')
>>> lsh.nearby('a') 
set()
参数

radius (float) – 哈希函数中使用的缩放参数。确定邻域的大小。

add(key, point)[source]

将 (key, point) 对添加到哈希中。

参数
  • key – 用于识别 point 的键。

  • point (torch.Tensor) – 数据,应是 detached 且在 cpu 上。

remove(key)[source]

从哈希中移除 key 和对应的点。

如果 key 不在哈希中,则抛出 KeyError 异常。

参数

key – 用于识别点的键。

nearby(key)[source]

返回一个键集合,这些键标识的点是 key 所标识的点的邻居。

如果它们的哈希中每个元素的差小于 2,则两个点是邻近的。在欧几里得空间中,这对应于所有点 \(\mathbf{p}\),其中 \(|\mathbf{p}_k-(\mathbf{p_{key}})_k|<r\),以及一些点(不保证所有点),其中 \(|\mathbf{p}_k-(\mathbf{p_{key}})_k|<2r\)

参数

key – 用于识别输入点的键。

返回

一个键集合,用于标识输入点的邻居。

返回类型

set

class ApproxSet(radius)[source]

查询低维欧几里得空间的近似占用情况。

参数

radius (float) – 哈希函数中使用的缩放参数。决定 bin 的大小。详情请参阅 LSH

try_add(point)[source]

尝试将 point 添加到集合中。仅当 point 的 bin 中没有其他点时才添加。

参数

point (torch.Tensor) – 要查询的点,应是 detached 且在 cpu 上。

返回

如果点成功添加,则为 True;如果 point 的 bin 中已存在一个点,则为 False

返回类型

bool

merge_points(points, radius)[source]

贪婪地合并距离小于给定半径的点。

这使用 LSH 来实现复杂度与合并簇的数量呈线性关系,与最大合并簇的大小呈二次关系。

参数
  • points (torch.Tensor) – 形状为 (K,D) 的张量,其中 K 是点数,D 是维度数。

  • radius (float) – 合并点的最小距离。

返回

一个元组 (merged_points, groups),其中 merged_points 是形状为 (J,D) 的张量,J <= K,并且 groups 是一个索引元组列表,将合并点映射到原始点。注意 len(groups) == J 并且 sum(len(group) for group in groups) == K

返回类型

tuple

测量

class Measurement(mean, cov, time=None, frame_num=None)[source]

高斯测量接口。

参数
  • mean – 测量分布的均值。

  • cov – 测量分布的协方差。

  • time – 测量的连续时间。如果未提供此值,则必须提供 frame_num

  • frame_num – 测量的离散时间。如果未提供此值,则必须提供 time

property dimension

测量空间维度访问。

property mean

测量均值(在大多数卡尔曼滤波文献中表示为 z)。

property cov

噪声协方差(在大多数卡尔曼滤波文献中表示为 R)。

property time

测量的连续时间。

property frame_num

测量的离散时间。

geodesic_difference(z1, z0)[source]

计算并返回 2 个测量之间的测地线差异。这是欧几里得运算 z1 - z0 的推广。

参数
  • z1 – 测量。

  • z0 – 测量。

返回

z1z2 之间的测地线差异。

class DifferentiableMeasurement(mean, cov, time=None, frame_num=None)[source]

可以高效计算雅可比矩阵的高斯测量接口,通常通过解析或自动微分。

abstract jacobian(x=None)[source]

在目标 PV 状态 x 处计算并返回测量映射 (h) 的雅可比矩阵 (H)。

参数

x – PV 状态。当雅可比矩阵不依赖于状态时,使用默认参数 None

返回

测量映射 (h) 的只读雅可比矩阵 (H)。

class PositionMeasurement(mean, cov, time=None, frame_num=None)[source]

欧几里得空间中的全秩高斯位置测量。

参数
  • mean – 测量分布的均值。

  • cov – 测量分布的协方差。

  • time – 测量时间。

jacobian(x=None)[source]

在目标 PV 状态 x 处计算并返回测量映射 (h) 的雅可比矩阵 (H)。

参数

x – PV 状态。在此子类中可以使用默认参数 None,因为雅可比矩阵不依赖于状态。

返回

测量映射 (h) 的只读雅可比矩阵 (H)。