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​=ut−1​+ut−1​˙​vt​=vt−1​+vt−1​˙​st​=st−1​+st−1​˙​rt​=rt−1​ut​˙​=ut−1​˙​vt​˙​=vt−1​˙​st​˙​=st−1​˙​​

所以状态转移矩阵为:
[ 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} ​1000000​0100000​0010000​0001000​1000100​0100010​0010001​ ​(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} ​1000​0100​0010​0001​0000​0000​0000​ ​(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} ​10000000​01000000​00100000​00010000​00001000000​00000100000​00000010000​ ​(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} ​1000​0100​00100​00010​ ​(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} ​1000000​0100000​0010000​0001000​00000.0100​000000.010​0000000.0001​ ​(5)
后3个状态变量给予了更小的不确定性。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐