详解多目标跟踪(MOT)算法中的Kalman滤波

Kalman滤波算法的原理可以参考: 卡尔曼滤波理解

以sort算法为例, 算法中使用到了卡尔曼滤波。 其作用是:对t-1帧的结果, 通过卡尔曼滤波的predict过程得到目标在t帧的先验估计, 同时在t帧通过检测模型得到检测结果, 对先验估计值和检测结果进行匈牙利算法匹配,匹配的结果作为t帧的测量值,执行卡尔曼滤波的update过程, 得到目标的后验估计。

在使用卡尔曼滤波时, 有以下几个变量需要确定:

1 状态变量

在sort中, 使用了7维的状态变量, 它们是
( u , v , s , r , u ˙ , v ˙ , s ˙ ) (u,v, s, r, \dot{u}, \dot{v}, \dot{s} ) (u,v,s,r,u˙,v˙,s˙)
前4项分别是检测框的中心坐标, 检测框的尺度(s=w*h), 检测框的宽高比(r=w/h)。后3项表示它们的速度, 这里作者把 r r r当成常数, 所以没有对应的速度。

2 观测变量

直接能测量得到的结果, 也就是检测得到的结果。 是一个4维向量。
( u , v , s , r ) (u,v, s,r) (u,v,s,r)

3 状态转移矩阵A

状态转移矩阵表征了如何把当前帧的状态变量, 转移到下一帧 , 表示的是运行模型。
sort中假设了匀速运动, 因此状态转移关系如下:

{ u t = u t − 1 + u t − 1 ˙ v t = v t − 1 + v t − 1 ˙ s t = s t − 1 + s t − 1 ˙ r t = r t − 1 u t ˙ = u t − 1 ˙ v t ˙ = v t − 1 ˙ s t ˙ = s t − 1 ˙ \left\{ \begin{matrix} u_t= u_{t-1}+\dot{u_{t-1}} \\ v_t= v_{t-1}+\dot{v_{t-1}} \\ s_t= s_{t-1}+\dot{s_{t-1}} \\ r_t = r_{t-1}\\ \dot{u_{t}} =\dot{u_{t-1}}\\ \dot{v_{t}} =\dot{v_{t-1}}\\ \dot{s_{t}} =\dot{s_{t-1}}\\ \end{matrix} \right. ut=ut1+ut1˙vt=vt1+vt1˙st=st1+st1˙rt=rt1ut˙=ut1˙vt˙=vt1˙st˙=st1˙

所以状态转移矩阵为:
[ 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 ] (1) \begin{bmatrix} 1 & 0 & 0 &0 &1&0&0 \\ 0 & 1 & 0 &0 &0&1&0 \\ 0& 0 & 1 &0 &0&0&1 \\ 0 & 0 & 0 &1 &0&0&0 \\ 0 & 0 & 0 &0 &1&0&0 \\ 0 & 0 & 0 &0 &0&1&0 \\ 0 & 0 & 0 &0 &0&0&1 \\ \end{bmatrix} \tag{1} 1000000010000000100000001000100010001000100010001 (1)

4 测量矩阵H

测量矩阵是用于将状态空间的变量映射到观测空间。
在sort中直接取观测空间的值等于状态空间中相应的值。
所以测量矩阵为:
[ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 ] (2) \begin{bmatrix} 1 & 0 & 0 &0 &0&0&0 \\ 0 & 1 & 0 &0 &0&0&0 \\ 0& 0 & 1 &0 &0&0&0 \\ 0 & 0 & 0 &1 &0&0&0 \\ \end{bmatrix} \tag{2} 1000010000100001000000000000 (2)

5 状态变量协方差矩阵P

P的初始值需要手动设定, 卡尔曼滤波过程中P会自动更新。 初始值其实也没那么敏感 ,随着卡尔曼滤波的进行,P会很快收敛。 所以不用担心P值设置的不好。 P值可以根据经验设定, 不确定性越大, 或者认为偏差越大, 就给更高的值就可以了。
P的初始值是一个对角矩阵。 sort中作者设置为:
[ 10 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 10000 0 0 0 0 0 0 0 10000 0 0 0 0 0 0 0 10000 ] (3) \begin{bmatrix} 1 0& 0 & 0 &0 &0&0&0 \\ 0 & 10 & 0 &0 &0&0&0 \\ 0& 0 & 10 &0 &0&0&0 \\ 0 & 0 & 0 &1 0&0&0&0 \\ 0 & 0 & 0 &0 &10000&0&0 \\ 0 & 0 & 0 &0 &0&10000&0 \\ 0 & 0 & 0 &0 &0&0&10000 \\ \end{bmatrix} \tag{3} 10000000010000000010000000010000000010000000000010000000000010000 (3)
由于后3个值初始的时候没有, 所以给予了很高的方差。

6 观测噪声协方差矩阵R

测量噪声协方差矩阵也是一个对角矩阵,衡量的是对观测结果的不确定性。 维度为观测变量的大小, 如sort中观测变量大小是4, 所以R是维度为4的方阵。
这个也需要根据经验设置,并且这个值是恒定的, 设定好了就不会变了,整个卡尔曼滤波过程都不会再变。
sort中设定的是:
[ 1 0 0 0 0 1 0 0 0 0 10 0 0 0 0 10 ] (4) \begin{bmatrix} 1 & 0 & 0 &0 & \\ 0 & 1 & 0 &0 \\ 0& 0 & 10 &0 \\ 0 & 0 & 0 &10 \\ \end{bmatrix} \tag{4} 100001000010000010 (4)
后2个观测变量给予了更大的不确定性。

7 处理噪声协方差矩阵Q

处理噪声协方差矩阵是一个对角阵, 衡量的是状态转移过程的不确定性。维度为状态变量的大小, 如sort中观测变量大小是7, 所以R是维度为7的方阵。
这个也需要根据经验设置,并且这个值是恒定的, 设定好了就不会变了,整个卡尔曼滤波过程都不会再变。
sort中设定的是:
[ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0.01 0 0 0 0 0 0 0 0.01 0 0 0 0 0 0 0 0.0001 ] (5) \begin{bmatrix} 1 & 0 & 0 &0 &0&0&0 \\ 0 & 1 & 0 &0 &0&0&0 \\ 0& 0 & 1&0 &0&0&0 \\ 0 & 0 & 0 &1 &0&0&0 \\ 0 & 0 & 0 &0 &0.01&0&0 \\ 0 & 0 & 0 &0 &0&0.01&0 \\ 0 & 0 & 0 &0 &0&0&0.0001\\ \end{bmatrix} \tag{5} 100000001000000010000000100000000.0100000000.0100000000.0001 (5)
后3个状态变量给予了更小的不确定性。

你可能感兴趣的:(卡尔曼滤波,目标跟踪,算法,人工智能)