追踪

数据关联

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

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

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

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

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

  • bp_iters (int) – 可选的信念传播迭代次数。如果未指定或为None,将使用一个计算成本较高的精确算法。

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

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

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

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

class MarginalAssignmentSparse(num_objects, num_detections, edges, exists_logits, assign_logits, bp_iters)[源代码]

MarginalAssignment 的一个廉价稀疏版本。

Parameters
  • 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,将使用一个计算成本较高的精确算法。

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

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

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

  • assign_dist (pyro.distributions.Categorical) – 一个关于每个检测关联的对象(或无)的平均场后验分布。它具有 .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')

Parameters
  • 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) 内。

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

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

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

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

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

compute_marginals(exists_logits, assign_logits)[source]

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

请参阅MarginalAssignment以获取参数和问题描述。

compute_marginals_bp(exists_logits, assign_logits, bp_iters)[source]

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

请参阅 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)[源代码]

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

请参阅 MarginalAssignmentSparse 以获取参数和问题描述。

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

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

compute_marginals_persistent(exists_logits, assign_logits)[source]

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

请参阅 MarginalAssignmentPersistent 以获取参数和问题描述。

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

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

请参阅 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

Parameters
filter_states(value)[source]

根据测量值返回ekf状态

Parameters

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

log_prob(value)[来源]

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

Parameters

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

动态模型

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

动态模型接口。

Parameters
  • 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 进行积分。

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

  • dt – 积分的时间间隔。

  • do_normalization – 是否对输出进行归一化,例如,将角度调整到一个区间内。

Returns

原生状态 x 将 dt 集成到未来。

geodesic_difference(x1, x0)[source]

计算并返回两个原生状态之间的测地线差异。 这是欧几里得操作 x1 - x0 的推广。

Parameters
  • x1 – 原生状态。

  • x0 – 初始状态。

Returns

原生状态 x1x2 之间的测地差异。

abstract mean2pv(x)[source]

计算并返回从本地状态得到的PV状态。在IMM(交互多模型)滤波中,结合不同类型的状态估计非常有用。

Parameters

x – 本地状态估计均值。

Returns

PV状态估计平均值。

abstract cov2pv(P)[源代码]

从原生协方差计算并返回PV协方差。在IMM(交互多模型)滤波中,用于组合不同类型的状态估计。

Parameters

P – 原生状态估计协方差。

Returns

PV状态估计协方差。

abstract process_noise_cov(dt=0.0)[source]

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

Parameters

dt – 积分的时间间隔。

Returns

只读协方差(Q)。对于DifferentiableDynamicModel,这是由随机积分产生的原生状态x的协方差(用于EKF)。否则,它是过程噪声参数的直接协方差(用于UKF)。

process_noise_dist(dt=0.0)[来源]

返回一个状态位移的分布对象,该位移由过程噪声分布在一段时间间隔内产生。

Parameters

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

Returns

MultivariateNormal.

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

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

abstract jacobian(dt)[source]

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

Parameters

dt – 积分的时间间隔。

Returns

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

class Ncp(dimension, sv2)[源代码]

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

Parameters
  • dimension – 原生状态维度。

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

forward(x, dt, do_normalization=True)[源代码]

在时间间隔 dt 上对原生状态 x 进行积分。

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

  • dt – 要积分的时间间隔。 do_normalization: 是否对输出进行归一化,例如, 将角度调整到一个区间内。对于此子类没有影响。

Returns

原生状态 x 将 dt 集成到未来。

mean2pv(x)[source]

计算并返回从本地状态得到的PV状态。在IMM(交互多模型)滤波中,结合不同类型的状态估计非常有用。

Parameters

x – 本地状态估计均值。

Returns

PV状态估计平均值。

cov2pv(P)[源代码]

从原生协方差计算并返回PV协方差。在IMM(交互多模型)滤波中,用于组合不同类型的状态估计。

Parameters

P – 原生状态估计协方差。

Returns

PV状态估计协方差。

jacobian(dt)[source]

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

Parameters

dt – 积分的时间间隔。

Returns

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

abstract process_noise_cov(dt=0.0)[source]

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

Parameters

dt – 积分的时间间隔。

Returns

只读的本地状态x的协方差(Q),这是由随机积分产生的(用于EKF)。

class Ncv(dimension, sa2)[源代码]

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

Parameters
  • dimension – 原生状态维度。

  • sa2 – 加速度的方差。通常选择的标准差大约为预期观察到的最大加速度的一半。

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

在时间间隔 dt 上对原生状态 x 进行积分。

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

  • dt – 积分的时间间隔。

  • do_normalization – 是否对输出进行归一化,例如,将角度调整到一个区间内。对于此子类没有影响。

Returns

原生状态 x 将 dt 集成到未来。

mean2pv(x)[source]

计算并返回从本地状态得到的PV状态。在IMM(交互多模型)滤波中,结合不同类型的状态估计非常有用。

Parameters

x – 本地状态估计均值。

Returns

PV状态估计平均值。

cov2pv(P)[source]

从原生协方差计算并返回PV协方差。在IMM(交互多模型)滤波中,用于组合不同类型的状态估计。

Parameters

P – 原生状态估计协方差。

Returns

PV状态估计协方差。

jacobian(dt)[source]

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

Parameters

dt – 积分的时间间隔。

Returns

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

abstract process_noise_cov(dt=0.0)[来源]

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

Parameters

dt – 积分的时间间隔。

Returns

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

class NcpContinuous(dimension, sv2)[源代码]

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

参考文献

“估计在跟踪和导航中的应用” 作者 Y. Bar-Shalom 等,2001年,第269页。

Parameters
  • dimension – 原生状态维度。

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

process_noise_cov(dt=0.0)[source]

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

Parameters

dt – 积分的时间间隔。

Returns

只读的本地状态x的协方差(Q),这是由随机积分产生的(用于EKF)。

class NcvContinuous(dimension, sa2)[source]

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

参考文献

“估计在跟踪和导航中的应用” 作者 Y. Bar-Shalom 等,2001年,第269页。

Parameters
  • dimension – 原生状态维度。

  • sa2 – 加速度的方差。通常选择的标准差大约为预期观察到的最大加速度的一半。

process_noise_cov(dt=0.0)[source]

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

Parameters

dt – 积分的时间间隔。

Returns

只读的本地状态x的协方差(Q),这是由随机积分产生的(用于EKF)。

class NcpDiscrete(dimension, sv2)[源代码]

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

Parameters
  • dimension – 原生状态维度。

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

参考文献

“估计及其在跟踪和导航中的应用” 作者 Y. Bar-Shalom 等,2001年,第273页。

process_noise_cov(dt=0.0)[source]

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

Parameters

dt – 积分的时间间隔。

Returns

只读的本地状态x的协方差(Q),由随机积分产生(用于EKF)。

class NcvDiscrete(dimension, sa2)[source]

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

Parameters
  • dimension – 原生状态维度。

  • sa2 – 加速度的方差。通常选择的标准差大约为预期观察到的最大加速度的一半。

参考文献

“估计在跟踪和导航中的应用” 作者 Y. Bar-Shalom 等,2001年,第273页。

process_noise_cov(dt=0.0)[source]

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

Parameters

dt – 积分的时间间隔。

Returns

只读协方差(Q)是本地状态x的随机积分结果(用于EKF)。(请注意,这个Q,模数数值误差,具有秩dimension/2。因此,它只是半正定的。)

扩展卡尔曼滤波器

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

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

警告

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

Parameters
  • 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]

使用动态模型来预测(也称为传播或集成)状态估计。

Parameters
  • dt – 要积分的时间。状态时间将自动增加这个量,除非你提供destination_time。使用destination_time可能更可取,以防止舍入误差的累积。

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

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

innovation(measurement)[source]

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

Parameters

measurement – 测量

Returns

创新意味着假设更新的均值和协方差。

Return type

元组(torch.Tensor, torch.Tensor)

log_likelihood_of_update(measurement)[source]

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

Param

测量。

Returns

假设更新的可能性。

update(measurement)[source]

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

Param

测量。

Returns

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()
Parameters

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

add(key, point)[source]

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

Parameters
  • key – 用于标识 point 的键。

  • point (torch.Tensor) – 数据,应该是分离的并且在CPU上。

remove(key)[source]

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

如果键不在哈希中,则引发 KeyError

Parameters

key – 用于标识点的键。

nearby(key)[source]

返回一组键,这些键是由key标识的点的邻居。

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

Parameters

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

Returns

一组标识输入点邻居的键。

Return type

set

class ApproxSet(radius)[source]

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

Parameters

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

try_add(point)[source]

尝试将point添加到集合中。只有在point的bin中没有点时才会添加。

Parameters

point (torch.Tensor) – 要查询的点,应该被分离并在CPU上。

Returns

True 如果点成功添加,False 如果 point 的 bin 中已经有一个点。

Return type

bool

merge_points(points, radius)[source]

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

这使用LSH来实现复杂度,该复杂度在合并的集群数量上是线性的,在最大合并集群的大小上是二次的。

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

  • radius (float) – 比这个距离更近的点将被合并。

Returns

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

Return type

tuple

测量

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

高斯测量接口。

Parameters
  • 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]

计算并返回两次测量之间的测地差异。 这是欧几里得操作 z1 - z0 的推广。

Parameters
  • z1 – 测量。

  • z0 – 测量。

Returns

z1z2 之间的测地线差异。

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

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

abstract jacobian(x=None)[source]

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

Parameters

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

Returns

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

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

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

Parameters
  • mean – 测量分布的均值。

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

  • time – 测量时间。

jacobian(x=None)[source]

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

Parameters

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

Returns

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