追踪¶
数据关联¶
- 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。- 参数
x0 (torch.Tensor) – PV 张量(均值)
P0 (torch.Tensor) – 协方差
dynamic_model –
DynamicModel
对象measurement_cov (torch.Tensor) – 测量协方差
time_steps (int) – 时间步长数量
dt (torch.Tensor) – 时间步长
- 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 – 本地状态。
- 返回
本地状态
x1
和x2
之间的测地线差异。
- abstract mean2pv(x)[source]¶
从本地状态计算并返回 PV 状态。这对于在 IMM(交互多模型)滤波中组合不同类型的状态估计很有用。
- 参数
x – 本地状态估计均值。
- 返回
PV 状态估计均值。
- abstract cov2pv(P)[source]¶
从本地协方差计算并返回 PV 协方差。这对于在 IMM(交互多模型)滤波中组合不同类型的状态估计很有用。
- 参数
P – 本地状态估计协方差。
- 返回
PV 状态估计协方差。
- class DifferentiableDynamicModel(dimension, dimension_pv, num_process_noise_parameters=None)[source]¶
可以高效计算状态转移雅可比矩阵的 DynamicModel,通常通过解析或自动微分。
- 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 状态估计协方差。
- 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 状态估计协方差。
- class NcpContinuous(dimension, sv2)[source]¶
具有 CWNV(连续白噪声速度)的 NCP(接近恒定位置)动态模型。
参考
Y. Bar-Shalom 等人,2001 年,p.269,《带跟踪与导航应用的估计》。
- 参数
dimension – 本地状态维度。
sv2 – 速度的方差。通常选择这个值,使得标准差大约是预期观察到的最大速度的一半。
- class NcvContinuous(dimension, sa2)[source]¶
具有 CWNA(连续白噪声加速度)的 NCV(接近恒定速度)动态模型。
参考
Y. Bar-Shalom 等人,2001 年,p.269,《带跟踪与导航应用的估计》。
- 参数
dimension – 本地状态维度。
sa2 – 加速度的方差。通常选择这个值,使得标准差大约是预期观察到的最大加速度的一半。
- class NcpDiscrete(dimension, sv2)[source]¶
具有 DWNV(离散白噪声速度)的 NCP(接近恒定位置)动态模型。
- 参数
dimension – 本地状态维度。
sv2 – 速度的方差。通常选择这个值,使得标准差大约是预期观察到的最大速度的一半。
参考
Y. Bar-Shalom 等人,2001 年,p.273,《带跟踪与导航应用的估计》。
扩展卡尔曼滤波器¶
- 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
)
散列¶
- class LSH(radius)[source]¶
为低维欧几里得空间实现局部敏感哈希。
允许高效地找到点的邻居。提供 2 个保证:
示例
>>> 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 上。
- class ApproxSet(radius)[source]¶
查询低维欧几里得空间的近似占用情况。
- try_add(point)[source]¶
尝试将
point
添加到集合中。仅当point
的 bin 中没有其他点时才添加。- 参数
point (torch.Tensor) – 要查询的点,应是 detached 且在 cpu 上。
- 返回
如果点成功添加,则为
True
;如果point
的 bin 中已存在一个点,则为False
。- 返回类型
- 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
。- 返回类型
测量¶
- 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¶
测量的离散时间。