sort算法作为跟踪算法中比较经典的算法,虽然缺点很多,但是依然应用在很多的场景中。网上看了很多的讲解sort算法原理的。感觉看的云里雾里,要不就是一堆公式上来,数学不好的直接窒息。要不就是讲的读者很蒙蔽 。因此我想用最通俗化的语言来讲解一下(也算对这段时间应用sort的一个总结)
sort算法总共分为两个模块,卡尔曼滤波和匈牙利匹配算法。
使用sort算法的时候其 前面一定会接一个检测器 。这是前提,大家都知道。
本文主要 讲一下卡尔曼滤波和匈牙利匹配算法在sort算法中的作用
1.卡尔曼滤波算法
首先从名字上来看我们就可以得到,卡尔曼滤波算法是一个去除噪声的算法。即让我们的结果更加准确。首先得明确这一点。心理得有个概念,不然看着看着就稀里糊涂了。既然是让结果更加准确。那么肯定是采用什么方法使得结果更加准确了。上面讲了,sort算法前面会接一个检测器。那么检测器会给到一个结果,我们假设是下面的矩阵是检测器扔给卡尔曼滤波算法的一个结果(3个目标的bbox)。
d
e
t
s
=
[
[
256.7
,
216.18
,
45.484
,
85.707
]
,
[
497.294
,
158.18
,
31.138
,
78.946
]
,
[
625.138
,
249.739
,
33.795.73.369
]
]
dets=[[256.7,216.18,45.484,85.707], [497.294,158.18,31.138,78.946],[625.138,249.739,33.795.73.369]]
dets=[[256.7,216.18,45.484,85.707],[497.294,158.18,31.138,78.946],[625.138,249.739,33.795.73.369]]
而卡尔曼滤波算法自己会根据上一帧图像的结果来预测相应目标的下一帧结果,
p
r
e
d
i
c
t
s
=
[
[
627.139
,
252.617
,
42.2135
,
74.7414
]
,
[
253.488
,
226.438
,
43.05
,
83.36
]
,
[
497.709
,
153.983
,
30.3849
,
77.8168
]
]
predicts=[[627.139,252.617,42.2135,74.7414],[253.488,226.438,43.05,83.36],[497.709,153.983,30.3849,77.8168]]
predicts=[[627.139,252.617,42.2135,74.7414],[253.488,226.438,43.05,83.36],[497.709,153.983,30.3849,77.8168]]
根据上述的两个结果,通过计算均方差最小化就可以得到当前帧目标的结果即为
r
e
s
u
l
t
s
=
[
[
624.667
,
251.508
,
36.2219
,
70.684
]
,
[
256.43
,
217
,
183
,
44.9639
,
85.8748
]
,
[
497.373
,
157.602
,
30.9896
,
78.9629
]
]
results=[[624.667,251.508,36.2219,70.684],[256.43,217,183,44.9639,85.8748],[497.373,157.602,30.9896,78.9629]]
results=[[624.667,251.508,36.2219,70.684],[256.43,217,183,44.9639,85.8748],[497.373,157.602,30.9896,78.9629]]
其实到了这个地方卡尔曼 滤波的作用基本结束了。
2.匈牙利匹配算法
匈牙利 匹配算法的主要作用就是将前后帧的目标关联起来,即前一帧的目标对应后一帧的哪个目标从而把ID直接赋值过来。
假设上一帧的跟踪结果是
r
e
s
u
l
t
s
0
=
[
[
1
,
649.441
,
231.502
,
44.417
,
96.13
]
,
[
2
,
252.783
,
207.732
,
35.813
,
96.641
]
,
[
3
,
499.296
,
156.205
,
33.338
,
76.362
]
]
results0=[[1,649.441,231.502,44.417,96.13],[2,252.783,207.732,35.813,96.641],[3,499.296,156.205,33.338,76.362]]
results0=[[1,649.441,231.502,44.417,96.13],[2,252.783,207.732,35.813,96.641],[3,499.296,156.205,33.338,76.362]]
通过计算当前帧和上一帧中目标之间的iou损失最小化来赋值当前帧中的目标ID。(不知道这样说懂了不),其实就是计算当前帧计算得到值即results中的bbox和上一帧中各个目标的bbox进行iou计算。并且 将iou损失作为 一个评估值。取iou最小的组合关联匹配,如果 两个框的iou很大(即损失很小)。那么他们两有很大可能就是框的同一个目标,这样上一帧中的追踪ID就会赋值给当前新的 值,从而进行关联匹配。然后更新到当前帧中的 目标信息中。其他的细节此处 不做讲解。