0


SORT与DeepSORT简介

一、MOT( mutil-object tracking)步骤

在《DEEP LEARNING IN VIDEO MUTIL-OBJECT TEACKING: A SURVEY》这篇基于深度学习多目标跟踪综述中,描绘了MOT问题的四个主要步骤
1.跟定视频原始帧
2.使用目标检测器如Faster-rcnn, YOLO, SSD等进行检测,获取目标检测框。
3.将所有目标框中对应的目标抠出来,进行特征提取(表观特征或者运动特征)
4.进行相似度计算,计算前后两帧目标之间的匹配程度(前后属于同一个目标的之间距离比较小,不同目标的距离比较大)
5.数据关联,为每一个对象分配目标ID
总结起来,MOT算法主要为四个步骤:1.检测;2.特征提取,运动预测;3.相似度计算;4.数据关联。

二、SORT:Simple Online and Realtime Tracking

1、算法流程:

算法的核心是卡尔曼滤波和匈牙利算法,这两个算法比较偏数学,所以需要学习这两个算法的数学知识,比较有难度。

卡尔曼滤波的基本知识建议看这篇博客:https://blog.csdn.net/u010720661/article/details/63253509,本文不再对其进行数学证明。

匈牙利算法基本知识:https://blog.csdn.net/NIeson2012/article/details/94472313?ops_request_misc,本文不再对其算法细节进行讨论。

如图:
请添加图片描述

2、卡尔曼滤波:

基于传感器(在目标跟踪中即目标检测器)的测量值与跟踪器(卡尔曼滤波)的预测值,实现更精确的跟踪目标估计。

卡尔曼滤波的假设变量都是随机的,并且都服从高斯分布(正态分布),每一个变量都有一个均值

  1. μ
  2. \mu
  3. μ,表示随机分布的中心(最可能的状态),以及方差
  4. σ
  5. 2
  6. \sigma^2
  7. σ2,表示不确定性。

1.目标跟踪中,需要track以下两个状态:

**均值

  1. μ
  2. \mu
  3. μ**:表示目标的位置信息,其由8维向量表示
  4. x
  5. =
  6. [
  7. u
  8. ,
  9. v
  10. ,
  11. s
  12. ,
  13. r
  14. ,
  15. u
  16. ˙
  17. ,
  18. v
  19. ˙
  20. ,
  21. s
  22. ˙
  23. ]
  24. x=[u, v, s, r, \dot{u}, \dot{v}, \dot{s}]
  25. x=[u,v,s,r,u˙,v˙,s˙],分别为:bbox的中心坐标
  26. (
  27. u
  28. ,
  29. v
  30. )
  31. (u, v)
  32. (u,v),面积
  33. s
  34. s
  35. s,宽高比
  36. r
  37. r
  38. rSORT中认为
  39. r
  40. r
  41. r是不变的常数,而DeepSORT认为其是一个变量),以及各自的速度变化值组成。

**协方差

  1. P
  2. P
  3. P**:表示目标位置信息的不确定信息,由8×8的对角矩阵
  4. P
  5. P
  6. P表示。

2.目标跟踪时,需要track在

  1. t
  2. +
  3. 1
  4. t+1
  5. t+1时刻的状态(卡尔曼滤波器采用匀速模型和线性观测器模型)
  6. x
  7. t
  8. +
  9. 1
  10. =
  11. F
  12. x
  13. t
  14. P
  15. t
  16. +
  17. 1
  18. =
  19. F
  20. P
  21. t
  22. F
  23. T
  24. +
  25. Q
  26. x_{t+1} = Fx_t \\ P_{t+1} = FP_tF^{T} + Q
  27. xt+1​=FxtPt+1​=FPtFT+Q

其中,

  1. F
  2. F
  3. F表示预测矩阵,在本算法(匀速模型:
  4. x
  5. t
  6. =
  7. x
  8. t
  9. 1
  10. +
  11. t
  12. x
  13. t
  14. 1
  15. ˙
  16. x_t = x_{t-1} + \triangle t\dot{x_{t-1}}
  17. xt​=xt1​+△txt1​˙​)中表示为:
  18. F
  19. =
  20. [
  21. 1
  22. 0
  23. 0
  24. d
  25. t
  26. 0
  27. 0
  28. 0
  29. 0
  30. 1
  31. 0
  32. 0
  33. d
  34. t
  35. 0
  36. 0
  37. 0
  38. 0
  39. 1
  40. 0
  41. 0
  42. d
  43. t
  44. 0
  45. 0
  46. 0
  47. 0
  48. 1
  49. 0
  50. 0
  51. d
  52. t
  53. 0
  54. 0
  55. 0
  56. 0
  57. 1
  58. 0
  59. 0
  60. 0
  61. 0
  62. 0
  63. 0
  64. 0
  65. 1
  66. 0
  67. 0
  68. 0
  69. 0
  70. 0
  71. 0
  72. 0
  73. 1
  74. ]
  75. F=\begin{bmatrix} 1 & 0 & 0 & dt & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & dt & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & dt & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & dt \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ \end{bmatrix}
  76. F=​100000001000000010000dt0010000dt0010000dt0010000dt001​​
  77. P
  78. P
  79. P是协方差矩阵为经验参数,初始状态为:
  80. P
  81. =
  82. d
  83. i
  84. a
  85. g
  86. (
  87. [
  88. 2
  89. σ
  90. p
  91. h
  92. ,
  93. 2
  94. σ
  95. p
  96. h
  97. ,
  98. 1
  99. e
  100. 2
  101. ,
  102. 2
  103. σ
  104. p
  105. h
  106. ,
  107. 10
  108. σ
  109. v
  110. h
  111. ,
  112. 10
  113. σ
  114. v
  115. h
  116. ,
  117. 1
  118. e
  119. 5
  120. )
  121. P=diag([2\sigma_ph, 2\sigma_ph, 1e-2, 2\sigma_p h, 10 \sigma_vh, 10 \sigma_v h, 1e-5)
  122. P=diag([2σph,2σph,1e2,2σph,10σvh,10σvh,1e5)

Q是系统噪声,初始状态为:

  1. Q
  2. =
  3. d
  4. i
  5. a
  6. g
  7. (
  8. [
  9. σ
  10. p
  11. h
  12. ,
  13. σ
  14. p
  15. h
  16. ,
  17. 1
  18. e
  19. 2
  20. ,
  21. σ
  22. p
  23. h
  24. ,
  25. σ
  26. v
  27. h
  28. ,
  29. σ
  30. v
  31. h
  32. ,
  33. 1
  34. e
  35. 5
  36. )
  37. 2
  38. Q = diag([\sigma_ph, \sigma_ph, 1e-2, \sigma_ph, \sigma_vh, \sigma_vh,1e-5)^2
  39. Q=diag([σphph,1e2phvhvh,1e5)2

3.基于预测结果进行匹配并更新卡尔曼滤波器:

首先利用匈牙利算法关联卡尔曼滤波器的预测阶段(第2步)的估计结果和实际观测结果:若1.匹配成功则更新卡尔曼滤波器;2.匹配失败的跟踪轨迹视为丢失;3.匹配失败的观测量记为新增轨迹。

若匹配成功,则track根据匹配结果进行更新

a)

  1. H
  2. H
  3. H:测量矩阵,将track的均值向量
  4. x
  5. x'
  6. x′映射到检测空间
  7. H
  8. x
  9. [
  10. u
  11. v
  12. s
  13. r
  14. ]
  15. =
  16. [
  17. 1
  18. 0
  19. 0
  20. 0
  21. 0
  22. 0
  23. 0
  24. 0
  25. 1
  26. 0
  27. 0
  28. 0
  29. 0
  30. 0
  31. 0
  32. 0
  33. 1
  34. 0
  35. 0
  36. 0
  37. 0
  38. 0
  39. 0
  40. 0
  41. 1
  42. 0
  43. 0
  44. 0
  45. ]
  46. [
  47. u
  48. v
  49. s
  50. r
  51. u
  52. ˙
  53. v
  54. ˙
  55. s
  56. ˙
  57. ]
  58. Hx \Rightarrow \begin{bmatrix}u\\ v\\s\\r \end{bmatrix} = \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} \begin{bmatrix} u\\v\\s\\r\\\dot{u}\\\dot{v}\\\dot{s}\\ \end{bmatrix}
  59. Hx⇒​uvsr​​=​1000​0100​0010​0001​0000​0000​0000​​​uvsru˙v˙s˙​​

检测结果

  1. z
  2. z
  3. ztrack的均值误差:
  4. y
  5. =
  6. z
  7. H
  8. x
  9. y=z - Hx'
  10. y=z−Hx′

b)将协方差矩阵

  1. P
  2. t
  3. +
  4. 1
  5. P_{t+1}
  6. Pt+1​映射到检测空间,加上噪声矩阵
  7. R
  8. R
  9. R
  10. S
  11. =
  12. H
  13. P
  14. H
  15. T
  16. +
  17. R
  18. S=HP'H^{T} + R
  19. S=HP′HT+R

其中,检测器噪声矩阵:

  1. R
  2. =
  3. d
  4. i
  5. a
  6. g
  7. (
  8. [
  9. σ
  10. p
  11. h
  12. ,
  13. σ
  14. p
  15. h
  16. .
  17. 1
  18. e
  19. 1
  20. ,
  21. σ
  22. p
  23. h
  24. ]
  25. T
  26. )
  27. 2
  28. R=diag([\sigma_ph, \sigma_ph. 1e-1, \sigma_ph]^T)^2
  29. R=diag([σphph.1e1ph]T)2

c)计算卡尔曼增益

  1. K
  2. K
  3. K(关于
  4. K
  5. K
  6. K的定义请查看推荐博文):
  7. K
  8. =
  9. P
  10. H
  11. T
  12. S
  13. 1
  14. K = P'H^TS^{-1}
  15. K=P′HTS−1

d)计算跟新后的均值向量个协方差矩阵:

  1. x
  2. =
  3. x
  4. +
  5. K
  6. y
  7. P
  8. =
  9. (
  10. I
  11. K
  12. H
  13. )
  14. P
  15. x = x' + Ky \\ P = (I - KH)P'
  16. x=x′+KyP=(IKH)P

e)进行下一轮的跟踪,直至当前轨迹跟踪结束。

3、匈牙利算法:

匈牙利算法在多目标跟踪中解决数据关联(检测框和预测框与实际框的匹配)的问题。

当前帧目标检测的框上一帧通过卡尔曼滤波预测的框一一进行IOU匹配,再通过IOU匹配的结果计算其代价矩阵(cost matrix)。而代价矩阵作为匈牙利算法的输入,得到线性的匹配结果。

缺点:造成了Sort算法无法解决行人重叠的问题。所以其IDSW(ID switch)这个指标很差。(IDSW(ID switch),对于同一个目标,由于跟踪算法误判,导致其ID发生切换的次数称为IDSW。跟踪算法中理想的ID switch应该为0。)且其直接丢弃掉IOU小于阈值的作法也导致了无法解决遮挡的问题。

4、总结:

1.SORT算法原文使用匀速直线运动模型,故在一些应用场景下可能不适用。
2.关联匹配中没有使用特征,造成物体间在重合度比较高的情况下会发生ID-Switch。
3.速度非常快而且计算量小。

二、DeepSORT

1、算法流程:

卡尔曼滤波+匈牙利算法+级联匹配+状态估计

其中,卡尔曼滤波和匈牙利算法在SORT中已经介绍,在此不在赘述

算法流程如图:
请添加图片描述
DeepSORT算法在SORT算法的基础上增加了级联匹配(matching cascade)和状态估计(confirmed)。因此,本文只介绍级联匹配和状态估计。

DeepSORT相对SORT的主要改进为:

考虑两个目标遮挡的情况。匹配的目标的Track无法匹配Detection,目标暂时从图像中消失。之后被遮挡的目标再次出现的时候,应该让被遮挡的目标分配的ID不再变化,减少ID-Switch的次数。

2、Deep由来:

为了减少ID-Switch的次数,在跟踪框跟丢且max age仍没达到最大阈值时,track应保存该跟踪框的外观特征,以便其再出现时仍能对其跟踪。DeepSORT通过一个小型的CNN网络来提取跟踪目标的外观特征,在每次(每帧)检测+追踪后,进行一次物体外观特征的提取并保存。后面每执行一步,都要执行一次当前帧被检测物体外观特征之前存储的外观特征相似度计算,这个相似度将作为一个重要的判别依据(不是唯一的,因为作者说是将运动特征外观特征结合作为判别依据,这个运动特征就是SORT中卡尔曼滤波做的事)。
请添加图片描述
如图,CNN网络最终输出为128维的特征向量。注意:DeepSORT的原文数据集是行人检测,在其他应用场景时可以修改网络输入框的大小。

3、状态估计

请添加图片描述

对于一个轨迹,都计算当前帧距上次匹配成功帧的差值,该变量在卡尔曼滤波器predict的时候递增,在轨迹和detection关联的时候重置为0。

超过max age的轨迹被认为离开图片区域,从轨迹集合中删除,设置为删除状态。代码中max age默认值为70,是级联匹配中的循环次数。

如果detection没有和现有track匹配上的,那么将对这个detection进行初始化,转变为新的Track。新的Track初始化的时候的状态是未确定态,只有满足连续三帧都成功匹配,才能将未确定态转化为确定态。如果处于未确定态的Track没有在n_init帧中匹配上detection,将变为删除态,从轨迹集合中删除。

4、级联匹配

请添加图片描述
如图:

1.上半部分计算相似度矩阵的方法使用了外观模型(ReID)和运动模型(马氏距离)来计算相似度,得到代价矩阵;另一个则是门控矩阵,用于限制代价矩阵中过大的值。
2.下半部分是级联匹配的数据关联步骤,匹配过程是一个循环(max_age个迭代,默认为70),从missing age=0到missage age=70的轨迹和Detection进行匹配,没有丢失过的轨迹优先被匹配,丢失较为较为久远的靠后匹配。通过这部分处理,可以重新将遮挡目标找回,降低被遮挡然后再出现目标发生的ID Switch次数。

运动特征:

使用马氏距离,衡量预测到的卡尔曼滤波状态和新获得的检测框之间的距离。

  1. d
  2. 1
  3. (
  4. i
  5. ,
  6. j
  7. )
  8. =
  9. (
  10. d
  11. j
  12. y
  13. j
  14. )
  15. T
  16. S
  17. i
  18. 1
  19. (
  20. d
  21. j
  22. y
  23. i
  24. )
  25. d_1(i, j)=(d_j-y_j)^TS_i^{-1}(d_j-y_i)
  26. d1​(i,j)=(dj​−yj​)TSi1​(dj​−yi​)

其中:

  1. (
  2. y
  3. i
  4. ,
  5. S
  6. i
  7. )
  8. (y_i,S_i)
  9. (yi​,Si​)表示第
  10. i
  11. i
  12. i个跟踪分布(卡尔曼滤波分布)在测量空间的投影,
  13. y
  14. i
  15. y_i
  16. yi​为均值,
  17. S
  18. i
  19. S_i
  20. Si​为协方差。马氏距离通过测量卡尔曼滤波器的追踪位置均值(mean track location)之间的标准差与检测框来计算状态估计间的不确定性,即
  21. d
  22. i
  23. (
  24. i
  25. ,
  26. j
  27. )
  28. d_i(i, j)
  29. di​(i,j)为第i个追踪分布和第j个检测框之间的马氏距离(不确定度)。对马氏距离设定一定的阈值,可以排除那些没有关联的目标,原文以倒卡方分布计算出来的95%置信区间作为阈值。

外观特征:

外观特征使用CNN残差网络提取,返回128维的特征向量。对于每个检测框(编号为j)内物体

  1. d
  2. j
  3. d_j
  4. dj ,其128维度的向量设为
  5. r
  6. j
  7. r_j
  8. rj ,该向量的模长为1,即
  9. r
  10. j
  11. =
  12. 1
  13. ||r_j||=1
  14. ∣∣rj​∣∣=1

接着作者对每个目标k创建了一个gallery,该gallery用来存储目标在每一帧中的外观特征(128维向量),论文中用

  1. R
  2. k
  3. R_k
  4. Rk​表示。注意,这里的k的含义是追踪的目标k,也就是object-in-track的序号,不是物体的ID号。
  5. R
  6. k
  7. =
  8. {
  9. r
  10. k
  11. (
  12. i
  13. )
  14. }
  15. k
  16. =
  17. 1
  18. (
  19. L
  20. k
  21. )
  22. R_k = \{r^{(i)}_{k}\}^{(L_k)}_{k=1}
  23. Rk​={rk(i)​}k=1(Lk​)​就是gallery。作者限定了
  24. L
  25. k
  26. L_k
  27. Lk​的大小最大为100,即最多只能存储目标
  28. k
  29. k
  30. k时刻前100帧的目标外观特征。
  31. i
  32. i
  33. i为跟踪的编号。

之后,获得检测框

  1. j
  2. j
  3. j的外观特征
  4. r
  5. j
  6. r_j
  7. rj​,求解所有已知gallery中的外观特征与检测框(编号为
  8. j
  9. j
  10. j)的外观特征的最小余弦距离。
  11. d
  12. 2
  13. (
  14. i
  15. ,
  16. j
  17. )
  18. =
  19. m
  20. i
  21. n
  22. {
  23. 1
  24. r
  25. j
  26. T
  27. r
  28. k
  29. (
  30. i
  31. )
  32. r
  33. k
  34. (
  35. i
  36. )
  37. R
  38. i
  39. }
  40. d_2(i, j)=min\{ 1-r_j^Tr_k^{(i)} | r_k^{(i)} \in R_i \}
  41. d2​(i,j)=min{1rjTrk(i)​∣rk(i)​∈Ri​}

运动(motion)特征和外观(appearance)特征的融合:

motion提供了物体定位的可能信息,这在短期预测中非常有效;

appearance(余弦距离计算)可在目标被长期遮挡后恢复ID的编号。

  1. C
  2. i
  3. ,
  4. j
  5. =
  6. λ
  7. d
  8. 1
  9. (
  10. i
  11. ,
  12. j
  13. )
  14. +
  15. (
  16. 1
  17. λ
  18. )
  19. d
  20. 2
  21. (
  22. i
  23. ,
  24. j
  25. )
  26. C_{i, j}= \lambda d_1(i, j) + (1 - \lambda)d_2(i, j)
  27. Ci,j​=λd1​(i,j)+(1−λ)d2​(i,j)

其中,

  1. d
  2. 1
  3. d_1
  4. d1​为马氏距离,
  5. d
  6. 2
  7. d_2
  8. d2​为余弦距离,
  9. λ
  10. \lambda
  11. λ为权重系数。

对刚初始化的目标等无法确认(匹配)的追踪,因为没有之前的运动信息和外观信息,采用IOU匹配关联进行追踪。

5、总结:

1.目标检测的效果对结果影响非常非常大,并且Recall和Precision都应该很高才可以满足要求。
2.表观特征:也就是ReID模型,原论文中用的是CNN残差神经网络,含有的参数量比较大,可以考虑用新的、性能更好、参数量更低的ReID模型来完成这部分工作。


本文转载自: https://blog.csdn.net/qq_44733706/article/details/129129224
版权归原作者 晴空^_^ 所有, 如有侵权,请联系我们删除。

“SORT与DeepSORT简介”的评论:

还没有评论