deepsort算法流程简介

研究了一段时间的FairMOT,但是对其跟踪部分类似于Deepsort的算法并不熟悉,惭愧啊。于是补习一下这个广泛应用在工业界的经典而又简单的tracking算法。由于很多博客已经说的很详细了,这里只谈一下自己对于流程的一些概述和理解。

我们面临的任务是这样的:在某一帧,有许多个之前的track,以及当前帧的detection,我们希望的是把这些detection分配给之前的轨迹。如果匹配成功,那么该detection就分配给那个track,如果detection未匹配,则只能产生一个新的轨迹。

所以tracking问题的核心就在于如何进行最好的匹配?

Sort算法中仅采用track与detection之间的IOU作为代价矩阵,采用卡尔曼滤波进行预测更新,用匈牙利算法做二分图匹配。这样只是尽可能多的匹配上检测框,并不能保证匹配的准确性(因为他只是在意框之间的位置关系,并不在意框里面的内容或者特征是什么),会导致大量的Id switch。

因此Deepsort中引入了级联匹配,主要是不仅仅考虑框之间的位置关系,更要在意track和detection两者之间的特征要相近。

对于轨迹的一些知识

我们可以把轨迹分为三种状态:confirmed,unconfirmed以及deleted。(1)confirmed轨迹表示之前有若干帧连续成功匹配的轨迹,并且到当前帧为止,连续未匹配的帧数小于给定阈值(30帧?);(2)unconfirmed一般是刚产生的轨迹,连续匹配帧数还没达到设定的标准(好像是连续3帧匹配成功就能成为confirmed);(3)deleted是已经被删除的轨迹,有两种来源:其一是confirmed轨迹连续很多帧没有匹配到,超过了设定的阈值;其二是unconfirmed轨迹在某一帧没匹配成功,直接删除。

我们还需要将每个confirmed轨迹设置优先级:轨迹到上一次成功匹配的时间越长(也就是说越久没有匹配成功),则该轨迹的优先级越低。因为作者说一个track的不确定性会随着未匹配次数的增多而增加。而当两个track去竞争一个detection的时候,不确定性更大的track和detection之间的马氏距离更小,这显然会破坏track的持续性。因此对于confirmed轨迹,需设置优先级,循环的进行级联匹配。

级联匹配

只有confirmed状态的轨迹才会进行级联匹配,主要是运用外观的余弦距离和马氏距离作为代价矩阵。外观特征很简单,就是把box送入到一个CNN中,得到一个embedding就是特征向量。通过余弦距离,就可以得到每一个track与每一个detection之间特征的相似性(假设track有i个,detection有j个,就得到了i*j的关联矩阵)。我们把超过某个阈值的值置为无穷大(因为值越小表明越相似,先筛除掉一些feature很不一样的)。接着对每一个track和detection计算其位置的马氏距离,以排除掉虽然特征相似但距离很远的匹配,即把马氏距离矩阵某些大于指定阈值的值置为无穷,该矩阵维度与前者相同。这样把两个矩阵按照一定的权重相加,就作为最终的代价矩阵,进行后续的匈牙利算法的二分匹配。

ps:这里的马氏距离其实就是欧式距离的改进版,其好处可以参考其他博文,这里不做详述。

IOU匹配

IOU匹配就是把unconfirmed轨迹和上一帧匹配到的confirmed轨迹(通过卡尔曼滤波预测后的位置),去和剩下的detection计算IOU,以IOU为代价,通过匈牙利算法进行匹配。

因此通过级联匹配和IOU匹配,就可以得到match的轨迹和detection,没有match的轨迹,以及没有match的detection。

后续就是把很久没匹配到的confirmed轨迹删除,或者为匹配到的unconfirmed轨迹删除,将没匹配到的detection分配新的轨迹,卡尔曼滤波更新,调整没有match的轨迹的优先级等一些操作,以便下一帧的运算。

下面一张图个人认为很好的deepsort算法描述图:

在这里插入图片描述

由于没详细看过代码,过程难免会有些细节疏忽,不过大致流程就是这样,如有错误请指正。

猜你喜欢

转载自blog.csdn.net/jackzhang11/article/details/111320385