import numpy as np
导入numpy库,并命名为np。Numpy是Python的核心计算库,提供多维数组对象ndarray,数学函数,随机数生成等。
如:a=np.array([1,2,3]) b=np.sum(a)
import scipy.linalg
导入Scipy库的linalg(线性代数)子模块。该模块包含线性代数运算,如矩阵求逆,求解方程组等。
chi2inv95 = { 1: 3.8415, 2: 5.9915, 3: 7.8147, 4: 9.4877, 5: 11.070, 6: 12.592, 7: 14.067, 8: 15.507, 9: 16.919}
定义一个名为chi2inv95的字典,存储了卡方分布的95%置信度临界值,用于统计学中的假设检验或不确定性分析。
class KalmanFilter(object):
卡尔曼滤波器

ndim状态维度为4,dt为时间步长,每次预测时长为1s。

motion_mat为状态转移矩阵

update_mat为更新矩阵,从8维状态向量中提取4维观测值

std_weight_position = 1. / 20
std_weight_velocity = 1. / 160
不确定性权重,位置标准差权重和速度标准差权重

初始化新轨迹,将检测到的目标(未关联到现有轨迹的测量值)转换为卡尔曼滤波的初始状态。
- 输入:检测框的测量值measurement,为[x,y,a,h]形式,中心坐标x/yx,宽高比a,高度h。
- 输出:mean:8维状态向量,如上图所示;covariance:8X8协方差矩阵,表示状态的不确定性。
mean_pos=measurement, [x,y,a,h],4X1的矩阵
mean_vel = np.zeros_like(mean_pos), [0,0,0,0],4X1的零向量
mean = np.r_[mean_pos, mean_vel], [x,y,a,h,0,0,0,0]
std:初始化标准差
std = [
2 * self._std_weight_position * measurement[3],x=2*(1/20)*h
2 * self._std_weight_position * measurement[3],y
1e-2,a
2 * self._std_weight_position * measurement[3],h
10 * self._std_weight_velocity * measurement[3],vx
10 * self._std_weight_velocity * measurement[3],vy
1e-5,va
10 * self._std_weight_velocity * measurement[3]]vh
covariance = np.diag(np.square(std))协方差矩阵初始化为对角矩阵

预测步骤:根据目标的当前状态和运动模型,预测其在下一时刻的状态均值和协方差。 - 输入:mean:8维状态向量;covariance:8X8协方差矩阵。
- 输出:预测后的mean和covariance。
std_pos、std_vel位置噪声和速度噪声,宽高比固定值。
motion_cov = np.diag(np.square(np.r_[std_pos, std_vel]))
过程噪声协方差:将位置和速度噪声拼接为8维向量,平方后转为对角矩阵。
mean = np.dot(self._motion_mat, mean)
计算两个数组的点积。
covariance = np.linalg.multi_dot((self._motion_mat, covariance, self._motion_mat.T)) + motion_cov
更新协方差矩阵。

观测空间投影:用于将状态空间的均值和协方差映射到测量空间,同时添加观测噪声。 - 输入:mean:8维状态均值向量;covariance:8X8状态协方差矩阵。
- 输出:投影后的4维测量均值[x,y,a,h]和4X4测量协方差矩阵。

更新步骤,根据实际测量值修正预测状态。 - 输入:mean:预测的8维状态均值;covariance:预测的8X8状态协方差矩阵;measurement:4维测量值[x,y,a,h]。
- 输出:new_mean:新的状态均值;new_covariance:新的协方差矩阵。

Gating Distance:用于在目标跟踪中衡量预测轨迹与检测框之间的匹配程度。 - 输入:mean:8维状态均值向量;covariance:8X8状态协方差矩阵;measurements:NX4的矩阵。每行是一个检测框[x,y,a,h];only_position:若为True,则仅计算中心坐标(x,y)的距离。
- 输出:长度为N的数组,每个元素是对应检测框与预测状态的平方马氏距离。
cholesky_factor = np.linalg.cholesky(covariance)
对协方差矩阵进行Cholesky分解,避免直接求逆矩阵,提升数值稳定性。
d = measurements - mean
计算残差检测框坐标-预测坐标。
z = scipy.linalg.solve_triangular(cholesky_factor, d.T, lower=True, check_finite=False,overwrite_b=True)
解方程组,对残差进行白化处理。
马氏距离求解:https://zhuanlan.zhihu.com/p/520757659
余弦距离参考:https://blog.csdn.net/DeepCBW/article/details/124650876
参考博客:https://blog.csdn.net/qq_45266796/article/details/134775492
https://blog.csdn.net/weixin_39910711/article/details/113985520#commentBox