多目标跟踪算法理论基础(一)

多目标跟踪算法理论基础

SORT算法概述

概述:SORT是一种多目标跟踪算法,可以有效地关联目标,并提升跟踪的实时性。SORT的核心主要是卡尔曼滤波和匈牙利算法的结合版,可以达到较好的跟踪效果。在当时,追踪速度达到了260HZ,相比其他方法速度提升了20倍。

Deepsort的前身是sort算法,sort算法的核心是卡尔曼滤波算法和匈牙利算法。

卡尔曼滤波算法作用:该算法的主要作用就是当前的一系列运动变量去预测下一时刻的运动变量,但是第一次的检测结果用来初始化卡尔曼滤波的运动变量。

匈牙利算法的作用:简单来讲就是解决分配问题,就是把一群检测框和卡尔曼预测的框做分配,让卡尔曼预测的框找到和自己最匹配的检测框,达到追踪的效果。

SORT算法流程

sort工作流程如下图所示:

在这里插入图片描述

  1. 将第一帧检测到的结果创建其对应的Tracks。将卡尔曼滤波的运动变量初始化,通过卡尔曼滤波预测其对应的框框。

  2. 将该帧目标检测的框框和上一帧通过Tracks预测的框框一一进行IOU匹配,再通过IOU匹配的结果计算其代价矩阵(cost matrix,其计算方式是1-IOU)。

  3. 将(2)中得到的所有的代价矩阵作为匈牙利算法的输入,得到线性的匹配的结果,这时候我们得到的结果有三种,第一种是Tracks失配(Unmatched Tracks),我们直接将失配的Tracks删除;第二种是Detections失配(Unmatched Detections),我们将这样的Detections初始化为一个新的Tracks(new Tracks);第三种是检测框和预测的框框配对成功,这说明我们前一帧和后一帧追踪成功,将其对应的Detections通过卡尔曼滤波更新其对应的Tracks变量。

匈牙利算法Hungarian Algorithm

匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法。最初用来解决的是有权二部图中的最小匹配 Minimum-Weight Bipartite Matching问题

  1. 在多目标跟踪(Multi-objecttracking,MOT)中,匈牙利算法主要被用于数据关联。即在连续的帧之间确定每个目标的ID。

  2. 在实时的场景中,例如,视频流处理,我们需要在每一帧中识别和跟踪多个目标。这就涉及到一个关键的问题,即如何从一帧到下一帧保持对目标的追踪

  3. 匈牙利算法在这里就可以派上用场。可以构建一个成本矩阵,每个单元格的成本是这两个目标之间的距离(例如,中心点之间的欧氏距离,或者边界框之间的loU距离等)。然后,目标就是找到一个配对,使得总的配对成本最小,这就是一个典型的最优分配问题,可以用匈牙利算法来求解。

f ( S ) = ∑ ( u , v ) ∈ S w u v f(\mathcal{S})=\sum_{(u, v) \in \mathcal{S}} w_{u v} f(S)=(u,v)Swuv

标注的Hungarian Algorithm算法对于的代价矩阵是一个nxn的方阵。下面是一个匈牙利匹配算法的例子

在这里插入图片描述

  1. 找到每一行的最小值然后减去每一行的最小值。(保证每一行最少有一个0
    在这里插入图片描述

  2. 之后按照相同的方法找到每一列的最小值。(保证每一列至少有一个0

在这里插入图片描述
3. 之后我们进行循环的操作,每一次的循环操作包括下面的三个步骤组成。

  • 用尽量少的线覆盖住矩阵中所以的0元素。(Cover all the zeros with aminimum number of lines)

  • 判断是否需要终止循环Decide whether to stop (用n条线可以覆盖住所有的0元素则终止循环

  • 对矩阵中的0元素最变化产生更多的0元素

    • 在没有被覆盖的元素上寻找最下的元素记作k
      在这里插入图片描述

    • 没有被线覆盖住的元素都减去k 在这里插入图片描述

    • 交叉位置处的元素都加上k
      在这里插入图片描述

之后按照这个步骤进行下一轮的循环知道整个循环完毕进行退出的时候结束。

在这里插入图片描述

之后就可以完成匹配操作了

在这里插入图片描述

采用同样的算法思路Hungarian Algorithm算法也可以解决Minimum-Weight Bipartite Matching问题,只需要对权重先进行一步取反的操作即可。

卡尔曼滤波Kalman Filter

Optimal estimation algorithm:是一种最优的估计算法。

卡尔曼滤波器的主要步骤可以分为两个阶段:预测阶段更新阶段

  1. 预测阶段:这一阶段根据系统的动态模型对系统的当前状态进行预测并预测系统状态的协方差(表示预测的不确定性)。预测的结果将被用作下一步更新阶段的输入。
  2. 更新阶段:在这一阶段,滤波器使用新的观测数据来修正预测阶段的预测结果。这一步涉及到计算卡尔曼增益它决定了我们应该如何在预测和实际测量之间取平衡。然后,滤波器会更新系统状态估计状态协方差

在这里插入图片描述

卡尔曼滤波公式

卡尔曼提出的递推最优估计理论,采用状态空间描述法,能处理多维和非平稳的随机过程。

状态方程:

x k = A x k − 1 + B u k + ω k {x_{k}}=A x_{k-1}+B u_{k}+\omega_{k} xk=Axk1+Buk+ωk

  • xk:表示当前状态的当前值 K代表当前的状态信息
  • xk-1:表示上一个状态的当前值 K-1代表上一个状态信息
  • wk:表示过程噪声
  • uk:表示的是一个输入信息
  • A: 表示的是一个状态转移矩阵
  • B: 表示的是一个控制矩阵

观测方程:
y k = C x k + v k y_{k}=C x_{k}+v_{k} yk=Cxk+vk

  • yk:表示要观测的值
  • vk:表示一个过程噪声(与观察器误差有关可以简单理解为误差)
  • xk:表示当前状态的当前值 K代表当前的状态信息

卡尔曼滤波的理解:

实现过程: 使用上一次的最优结果预测当前的值,同时使用观测值****修正当前值,得到最优结果(可以简单理解为是一个递归的过程)

  1. 在预测过程中使用到的公式。

x ^ t − = F x ^ t − 1 + B u t − 1 \hat{x}_{t}^{-}=F \hat{x}_{t-1}+B u_{t-1} x^t=Fx^t1+But1

P t − = F P t − 1 F T + Q P_{t}^{-}=F P_{t-1} F^{T}+Q Pt=FPt1FT+Q

  1. 在更新过程中使用到的公式

K k = P k − H T H P k − H T + R K_{k}=\frac{P_{k}^{-} H^{T}}{H P_{k}^{-} H^{T}+R} Kk=HPkHT+RPkHT

x ^ t = x ^ t − + K t ( z t − H x ^ t − ) \hat{x}_{t}=\hat{x}_{t}^{-}+K_{t}\left(z_{t}-H \hat{x}_{t}^{-}\right) x^t=x^t+Kt(ztHx^t)

P t = ( I − K t H ) P t − P_{t}=\left(I-K_{t} H\right) P_{t}^{-} Pt=(IKtH)Pt

跟踪场景的应用
  • 状态预测:新的最优估计是根据上一最优估计预测得到

基于track在t - 1时刻的状态来预测其在t时刻的状态

x ′ = F x x^{\prime}=F x x=Fx

x为track在t-1时刻的均值,F称为状态转移矩阵,该公式预测t时刻的x’

( c x c y w h v x v y w w v h ) t = ( 1 0 0 0 d t 0 0 0 0 1 0 0 0 d t 0 0 0 0 1 0 0 0 d t 0 0 0 0 1 0 0 0 d t 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 ) ⋅ ( c x c y w h v x v y v w v h ) \left(\begin{array}{c} c x \\ c y \\ w \\ h \\ v x \\ v y \\ w w \\ v h \end{array}\right)_{t}=\left(\begin{array}{cccccccc} 1 & 0 & 0 & 0 & d t & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & d t & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & d t & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & d t \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{array}\right) \cdot\left(\begin{array}{c} c x \\ c y \\ w \\ h \\ v x \\ v y \\ v w \\ v h \end{array}\right) cxcywhvxvywwvh t= 10000000010000000010000000010000dt00010000dt00010000dt00010000dt0001 cxcywhvxvyvwvh

  • 协方差的预测

新的不确定性由上一不确定性预测得到,并加上外部环境的干扰

P ′ = F P F T + Q P^{\prime}=F P F^{T}+Q P=FPFT+Q

Cov ⁡ ( x ) = Σ Cov ⁡ ( A x ) = A Σ A T \begin{aligned} \operatorname{Cov}(x) & =\Sigma \\ \operatorname{Cov}(\mathbf{A} x) & =\mathbf{A} \Sigma \mathbf{A}^{T} \end{aligned} Cov(x)Cov(Ax)=Σ=AΣAT

状态的更新

在跟踪的场景中对卡尔曼滤波更新公式进行进一步的细化

y = z − H x ′ y=z-H x^{\prime} y=zHx

z为detection的均值向量,不包含速度变化值,即z = [cx, cy,r,h], H称为测量矩阵, 它将track的均值向量x’映射到测量空间该公式计算detection和track的均值误差,y称为innovation(新息)

S = H P ′ H T + R K = P ′ H T S − 1 x = x ′ + K y P = ( I − K H ) P ′ \begin{array}{l} S=H P^{\prime} H^{T}+R \\ K=P^{\prime} H^{T} S^{-1} \\ x=x^{\prime}+K y \\ P=(I-K H) P^{\prime} \end{array} S=HPHT+RK=PHTS1x=x+KyP=(IKH)P

卡尔曼滤波公式推导

x ^ t − = F x ^ t − 1 + B u t − 1 \hat{x}_{t}^{-}=F \hat{x}_{t-1}+B u_{t-1} \\ x^t=Fx^t1+But1

其中的F即为状态转移矩阵 B即为控制矩阵

P t − = F P t − 1 F T + Q P_{t}^{-}=F P_{t-1} F^{T}+Q Pt=FPt1FT+Q

根据先验估计得到协方差的推导过程如下:

cov ⁡ ( x ^ t − , x ^ t − ) = cov ⁡ ( F x ^ t − 1 + B u t − 1 , F x ^ t − 1 + B u t − 1 ) + Q = F cov ⁡ ( x ^ t − 1 , x ^ t − 1 ) F ⊤ + Q \begin{array}{l} \operatorname{cov}\left(\hat{x}_{t}^{-}, \hat{x}_{t^{-}}\right)=\operatorname{cov}\left(F \hat{x}_{t-1}+B u_{t-1}, F \hat{x}_{t-1}+B u_{t-1}\right) \\ +Q=F \operatorname{cov}\left(\hat{x}_{t-1}, \hat{x}_{t-1}\right) F^{\top} +Q \\ \end{array} cov(x^t,x^t)=cov(Fx^t1+But1,Fx^t1+But1)+Q=Fcov(x^t1,x^t1)F+Q
从而得到了先验估计协方差的形式(带过程噪声的形式)

如果不考虑噪声w或者v,我们可以得到系统k时刻的估计值值为:

x ^ k ˉ = A x ^ k − 1 + B u k − 1  or  x ^ k m = C − 1 y k \hat{x}_{\bar{k}}=A \hat{x}_{k-1}+B u_{k-1} \quad \text { or } \quad \hat{x}_{k_{m}}=C^{-1} y_{k} x^kˉ=Ax^k1+Buk1 or x^km=C1yk

数据融合:根据滤波思想中的线性加权组合数据。

x ^ k = x ^ k ˉ + G ( x ^ k m − x ^ k ˉ ) \hat{x}_{k}=\hat{x}_{\bar{k}}+G\left(\hat{x}_{k_{m}}-\hat{x}_{\bar{k}}\right) x^k=x^kˉ+G(x^kmx^kˉ)

x ^ k = x ^ k ˉ + K k ( y k − C x ^ k ˉ ) \hat{x}_{k}=\hat{x}_{\bar{k}}+K_{k}\left(y_{k}-C \hat{x}_{\bar{k}}\right) x^k=x^kˉ+Kk(ykCx^kˉ)

因此我们的目标就变得十分清晰了,就是求使得考虑了噪声之后的估计值趋近于真实值,那么此时引入误差: e k = X k − X ^ k e_{k}=X_{k}-\hat{X}_{k} ek=XkX^k

 同理P  ( e k ) ∼ ( 0 , P ) , P  也是那个协方差矩阵  \text { 同理P }\left(e_{k}\right) \sim(0, P), P \text { 也是那个协方差矩阵 }  同理(ek)(0,P),P 也是那个协方差矩阵 

而当在不同的维度上的方差越小,那么说明这个e越接近0,因此估计值和真实值也就是最相近的。所以,要选择合适的K使得tr(P)(矩阵对角线相加)最小,那么优化问题就变成了下面这个公式。

P = E ( e k e k T ) = E ( ( X k − X ^ k ) ( X k − X ^ k ) T ) ,  将  X ^ k = X ^ k − + K k ( Z k − H X ^ k − ) 代入,  \begin{array}{l} \mathrm{P}=\mathrm{E}\left(e_{k} e_{k}{ }^{T}\right)=\mathrm{E}\left(\left(X_{k}-\hat{X}_{k}\right)\left(X_{k}-\hat{X}_{k}\right)^{T}\right), \\ \text { 将 } \hat{X}_{k}=\hat{X}_{k}^{-}+K_{k}\left(Z_{k}-H \hat{X}_{k}^{-}\right) \text {代入, } \\ \end{array} P=E(ekekT)=E((XkX^k)(XkX^k)T),  X^k=X^k+Kk(ZkHX^k)代入

P k = E [ ( x k − x ^ k ) ( x k − x ^ k ) T ] = E [ ( x k − x ^ k ˉ − K k ( z k − C x ^ k ˉ ) ) ( x k − x ^ k ˉ − K k ( z k − C x ^ k ˉ ) ) T ] = E [ ( x k − x ^ k ˉ − K k ( C x k + v k − C x ^ k ˉ ) ) ( x k − x ^ k ˉ − K k ( C x k + v k − C x ^ k ˉ ) ) T ] \begin{aligned} P_{k} & =E\left[\left(x_{k}-\hat{x}_{k}\right)\left(x_{k}-\hat{x}_{k}\right)^{T}\right] \\ & =E\left[\left(x_{k}-\hat{x}_{\bar{k}}-K_{k}\left(z_{k}-C \hat{x}_{\bar{k}}\right)\right)\left(x_{k}-\hat{x}_{\bar{k}}-K_{k}\left(z_{k}-C \hat{x}_{\bar{k}}\right)\right)^{T}\right] \\ & =E\left[\left(x_{k}-\hat{x}_{\bar{k}}-K_{k}\left(C x_{k}+v_{k}-C \hat{x}_{\bar{k}}\right)\right)\left(x_{k}-\hat{x}_{\bar{k}}-K_{k}\left(C x_{k}+v_{k}-C \hat{x}_{\bar{k}}\right)\right)^{T}\right] \end{aligned} Pk=E[(xkx^k)(xkx^k)T]=E[(xkx^kˉKk(zkCx^kˉ))(xkx^kˉKk(zkCx^kˉ))T]=E[(xkx^kˉKk(Cxk+vkCx^kˉ))(xkx^kˉKk(Cxk+vkCx^kˉ))T]

 定义先验估计误差  e k ˉ = x k − x ^ k ˉ  且用  P k ˉ  来表示先验估计误差的协方差, 则有  \text { 定义先验估计误差 } e_{\bar{k}}=x_{k}-\hat{x}_{\bar{k}} \text { 且用 } P_{\bar{k}} \text { 来表示先验估计误差的协方差, 则有 }  定义先验估计误差 ekˉ=xkx^kˉ 且用 Pkˉ 来表示先验估计误差的协方差则有 

P k = E [ ( e k ˉ − K k ( v k + C e k ˉ ) ( e k ˉ − K k ( v k − C e k ˉ ) T ] = E [ ( ( I − K k C ) e k ˉ − K k v k ) ( ( I − K k C ) e k ˉ − K k v k ) T ] = E [ ( I − K k C ) e k ˉ e k ˉ T ( I − K k C ) T + K k v k v k T K k T ] + E [ ( I − K k C ) e k ˉ v k T K k T ] + E [ K k v k e k ˉ T ( I − K k C ) ] = E [ ( I − K k C ) e k ˉ e k ˉ T ( I − K k C ) T + K k v k v k T K k T ] = ( I − K k C ) P k ˉ ( I − K k C ) T + K k R K k T \begin{aligned} P_{k} & =E\left[\left(e_{\bar{k}}-K_{k}\left(v_{k}+C e_{\bar{k}}\right)\left(e_{\bar{k}}-K_{k}\left(v_{k}-C e_{\bar{k}}\right)^{T}\right]\right.\right. \\ & =E\left[\left(\left(I-K_{k} C\right) e_{\bar{k}}-K_{k} v_{k}\right)\left(\left(I-K_{k} C\right) e_{\bar{k}}-K_{k} v_{k}\right)^{T}\right] \\ & =E\left[\left(I-K_{k} C\right) e_{\bar{k}} e_{\bar{k}}^{T}\left(I-K_{k} C\right)^{T}+K_{k} v_{k} v_{k}^{T} K_{k}^{T}\right]+E\left[\left(I-K_{k} C\right) e_{\bar{k}} v_{k}^{T} K_{k}^{T}\right]+E\left[K_{k} v_{k} e_{\bar{k}}^{T}\left(I-K_{k} C\right)\right] \\ & =E\left[\left(I-K_{k} C\right) e_{\bar{k}} e_{\bar{k}}^{T}\left(I-K_{k} C\right)^{T}+K_{k} v_{k} v_{k}^{T} K_{k}^{T}\right] \\ & =\left(I-K_{k} C\right) P_{\bar{k}}\left(I-K_{k} C\right)^{T}+K_{k} R K_{k}^{T} \end{aligned} Pk=E[(ekˉKk(vk+Cekˉ)(ekˉKk(vkCekˉ)T]=E[((IKkC)ekˉKkvk)((IKkC)ekˉKkvk)T]=E[(IKkC)ekˉekˉT(IKkC)T+KkvkvkTKkT]+E[(IKkC)ekˉvkTKkT]+E[KkvkekˉT(IKkC)]=E[(IKkC)ekˉekˉT(IKkC)T+KkvkvkTKkT]=(IKkC)Pkˉ(IKkC)T+KkRKkT

tr ⁡ [ P k ] = tr ⁡ [ ( I − K k C ) P k ˉ ( I − K k C ) T + K k R K k T ] = tr ⁡ [ ( P k ˉ − K k C P k ˉ ) ( I − C T K k T ) + K k R K k T ] = tr ⁡ [ P k ˉ − K k C P k ˉ − P k ˉ C T K k T + K k C P k ˉ C T K k T + K k R K k T ] = tr ⁡ [ P k ˉ − 2 K k C P k ˉ + K k C P k ˉ C T K k T + K k R K k T ] \begin{aligned} \operatorname{tr}\left[P_{k}\right] & =\operatorname{tr}\left[\left(I-K_{k} C\right) P_{\bar{k}}\left(I-K_{k} C\right)^{T}+K_{k} R K_{k}^{T}\right] \\ & =\operatorname{tr}\left[\left(P_{\bar{k}}-K_{k} C P_{\bar{k}}\right)\left(I-C^{T} K_{k}^{T}\right)+K_{k} R K_{k}^{T}\right] \\ & =\operatorname{tr}\left[P_{\bar{k}}-K_{k} C P_{\bar{k}}-P_{\bar{k}} C^{T} K_{k}^{T}+K_{k} C P_{\bar{k}} C^{T} K_{k}^{T}+K_{k} R K_{k}^{T}\right] \\ & =\operatorname{tr}\left[P_{\bar{k}}-2 K_{k} C P_{\bar{k}}+K_{k} C P_{\bar{k}} C^{T} K_{k}^{T}+K_{k} R K_{k}^{T}\right] \end{aligned} tr[Pk]=tr[(IKkC)Pkˉ(IKkC)T+KkRKkT]=tr[(PkˉKkCPkˉ)(ICTKkT)+KkRKkT]=tr[PkˉKkCPkˉPkˉCTKkT+KkCPkˉCTKkT+KkRKkT]=tr[Pkˉ2KkCPkˉ+KkCPkˉCTKkT+KkRKkT]

则下一步就是对卡尔曼增益K求导,求出极值点,则认为该点处的估计误差的协方差的迹tr(P)最小,求导并使之为0如下:

d ( tr ⁡ ( P k ) ) d ( K k ) = − 2 P k ˉ T C + 2 K k C P k ˉ C T + 2 K k R = 0 d ( tr ⁡ ( A B ) d A = B T d ( tr ⁡ ( A B A T ) ) d A = A ( B + B T ) \begin{aligned} \frac{d\left(\operatorname{tr}\left(P_{k}\right)\right)}{d\left(K_{k}\right)}= & -2 P_{\bar{k}}^{T} C+2 K_{k} C P_{\bar{k}} C^{T}+2 K_{k} R=0 \\ & \frac{d(\operatorname{tr}(A B)}{d A}=B^{T} \\ & \frac{d\left(\operatorname{tr}\left(A B A^{T}\right)\right)}{d A}=A\left(B+B^{T}\right) \end{aligned} d(Kk)d(tr(Pk))=2PkˉTC+2KkCPkˉCT+2KkR=0dAd(tr(AB)=BTdAd(tr(ABAT))=A(B+BT)

最后我们就可以得到卡尔曼增益的推导公式:

P k ˉ T C + K k ( C P k ˉ C T + R ) = 0 , 即 , K k = P k ˉ T C C P k ˉ C T + R P_{\bar{k}}^{T} C+K_{k}\left(C P_{\bar{k}} C^{T}+R\right)=0 , 即, K_{k}=\frac{P_{\bar{k}}^{T} C}{C P_{\bar{k}} C^{T}+R} PkˉTC+Kk(CPkˉCT+R)=0,,Kk=CPkˉCT+RPkˉTC

之后对于误差协方差矩阵的更新公式的推导过程就比较简单了。只需要将卡尔曼滤波的值带入PK中进行求解就可以得到。

P k = ( I − K k C ) P k ˉ P_{k}=\left(I-K_{k} C\right) P_{\bar{k}} Pk=(IKkC)Pkˉ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值