因为在目标跟踪中,不同时刻,物体的位置等信息会发生变化,但我们需要让它保持同一个ID
eg:
假设本来视频帧只出现一辆车,那么我们一直采用目标检测的方法也没有问题,可以一直把该黄车标成ID = 1
但如果出现了另外一台车,而且我们的目标检测器只有分类出“车”这个能力的话,我们便无法知道这个黄车的ID是否等于1了
我们先来一个定性的理解
匈牙利算法会建立一个图,其中有当前帧t=1
和前一帧t=0
的节点。然后会计算两帧节点互相的距离,易得,这个距离越小,那么当前帧的物体与前一帧相同的概率越大
如下图,(虽然不理解这个人怎么走的比车还快:)
至此,我们得到了一个这个算法的关键:得到了距离的话我们怎么选出来呢
我们来举一个具体的例子:
假设我们现在就有两帧的图片,第一帧我们看到图片中有CarA, CarB, CarC, 并且通过我们的目标检测器找到了这三辆车;第二帧,同样,也看到了三辆车,CarD, CarE, CarF,两帧都只存在这三辆车,但由于目标检测器只能分辨出他们是车,而不能分辨出CarD对应的是CarA还是其它车
但我们可以测量出两帧之间他们对应的距离(如,第二帧看到的CarF离第一帧看到的CarA有9m),如上图数字所示
接下来我们就采用匈牙利算法来进行这个匹配
如:第一行最小的是9,那么我们减去9,以此类推
最后变为:
如:第一列最小的是1,那么我们减去1,以此类推
最后变为:
划掉所有零有不少方式,如下图:
但明显最少的方式应该是两条:
如果这个数量大于等于矩阵的行列数,那么跳到第五步
剩下的矩阵为【【3, 7】,【2, 5】】,都减去2
然后右上角交叉的0加上2
变成:
然后重复第三步
变为:
这时我们有3条线了,那么跳到第五步
第二行只有一个零,那么Car F 对应了car B,然后删掉行列
第三行,Car C对应了Car D
剩下就是Car A对应Car E了
最终结果:
那在实际的目标跟踪当中,我们获取到了前一帧的跟踪框track
和当前帧的检测框detection
,之间的距离Cost Metric
如何计算的呢?
检测框则是当前帧的目标检测器检测出来的bounding box, 跟踪框是上一帧最后输出预测出来的框,并不是检测框
下面介绍三种方法:
我们可以把两帧的目标框的中心点进行一个距离的计算: $$ d = √[(x2 – x1)^2 + (y2 – y1)^2] $$
这种方法最简单了,但如果目标的形状发生了变化,或者目标与其他发生了重叠,会有不少问题
看图可得
这种方法有个问题,就是我们现在不是求最小,而是求最大,所以会与上述说的方法有一些出入
IOU匹配是很常用的,但是如果出现了目标的重叠阻挡等问题,目标框也会发生变化,IOU匹配也会不准确
但即使目标有遮挡,但如果我们一样能检测其中一部分,那么我们能不能用一个卷积网络提取其中的特征,然后和原本的框的特征进行相比呢?如下图
这里也是DeepSort相比Sort的其中一个创新点,加入了外观信息,借用了ReID领域模型来提取特征,减少了ID switch
在我们所应用的DeepSort里面,我们把IOU匹配和外观相似度这两个cost metric
结合了起来一起计算这个“距离”
刚刚我们的矩阵的行列数是相等的,那是因为两帧的图片都只出现了三辆车,那么如果第一帧三辆车,第二帧出现了四辆车呢?
如果出现这种情况,我们只需要添加一个新的边缘给我们的图标,这个值是我们原先的最大值就可以了。
如果我们使用IOU匹配的话,我们需要优化的是最大值
我们只需要在第一步进行一个转换
比如在Detenction 4, Tracking 1中(行4列1),cost metric 只有10,如果是IOU匹配的话,表示这个匹配度很低,我们把所有的值都让最大值减去这个值,比如10,我们让90 - 10 = 80
这样就可以啦
- 匈牙利算法可以帮助您匹配由cost metric计算后的两组元素
- 跟踪边界框时,成本可以是 IOU、欧几里德距离、卷积相似度或您自己的损失函数(可结合)
- 该算法分 5 步工作:我们首先对矩阵进行缩减,然后交叉 0,最后再次缩减,直到我们可以对元素进行配对
- 如果你有一个最大化问题,比如 IOU,你总是可以把它变成一个最小化问题
- 如果您有 NxM 矩阵,则可以通过添加具有最大值的列来使其成为 NxN 矩阵
- 编码时,可以通过矩阵调用sklearn中的函数linear_assignment(),直接得到算法的输出