Deepsort工作原理分析
源码解析
deepsort源码解读一
deepsort源码解读二
deepsort源码解读三
deepsort源码解读四
deepsort源码解读五
deepsort源码解读六
deepsort源码解读七
(1)卡尔曼滤波功能是根据系统以前的数据预测系统下一步的操作。如卡尔曼滤波在deepsort中主要功能是基于前一帧图片中的检测框(可能存在很多,假设其中一个检测框为A),预测检测框A在当前这一帧中的位置。
(2)在系统开始运行时,不存在前一帧,那么为了实现卡尔曼滤波的功能,程序会把检测到的第一帧中符合要求的检测框作为新的跟踪对象(track)。
建立新的跟踪对象会进行的操作:



(3)当跟踪链中存在前一帧的track时,卡尔曼滤波的工作方式如下(前一帧的所有track都需要如下操作)。





如图8所示,红色的为目标检测框,其他色为预测的track框结合目标检测框进行更新修正后的框。

图 8 第三帧

图 9 第四帧

图 10 第五帧

图 11 第六帧

图 12 第七帧

图 13 第八帧
(1)相比于普通的sort算法,在IOU Match之前做了一次额外的级联匹配,利用了reid外观特征和马氏距离进行track框与detection框匹配。
① Reid外观特征的作用:通过加入外观特征,可以处理更长时间遮挡下的跟踪[经过更长时间的遮挡,运动模型可能完全失效,无法关联上detection,但是如果有外观特征提供的信息,还有可能关联上],以及减少ID切换。
② 马氏距离的作用:判断track框与detection框的状态向量的前四维度(center_x,center_y,w/h,h)的接近程度。如下图14,一般而言,上下帧之间物体移动的距离不会相差太远,所以坐标越接近越可能是同一个目标。

图 14(该图来源于网络)
(2)Reid外观特征匹配原理
在实现中,每一个track都会将每一帧中同一目标的feature保存下来(特征提取网络由deepsort中的deep实现),以便计算第i个track预测框与第j个detection框的外观距离。在计算中,会将每一个track的所有feature(每一个track所保存的feature数量可人为设定,由参数nn_budget设定)与当前帧的全部detection框进行计算匹配的代价,并存入矩阵cost_matrix中(行数为track数目,列数为detection框数目),即所谓的余弦距离。
余弦距离的计算公式为
,是每一个detection框的特征向量,是track的特征向量。由于每个track有一个或多个特征向量,那么需要将每一个特征向量与所有的detection框都进行计算得到行数为track特征向量数量,列数为detection检测框数量的矩阵。然后利用axis=0,从该矩阵中按列选取最小值,然后返回行数为1,列数为detection框数量的矩阵,如下图示例(对应上面图9、10)
初始化cost_matrix为8x11的矩阵,有8个track,11个detection框,如图15所示

图 15
将每一个track的特征向量与detection进行计算,第一个track的facture向量有3个,如图16所示

图 16
计算结果如下图17所示

图 17
然后按列选取最小值,得到如下图18结果

图 18
这就是余弦距离代价矩阵的第一个track与全部的detection框计算后的距离,构成代价矩阵cost_matrix的第一行,然后进行重复操作,得到全部track与detection框的余弦距离,如下图19所示:

图 19
(3)马氏距离计算原理
Track的mean、covariance,和detection框坐标作为马氏距离计算的输入参数;计算后会根据马氏距离更新代价矩阵cost_matrix(如果去掉马氏距离中的协方差矩阵,就退化为欧氏距离)。
马氏距离的关联度量计算公式为
,表示第j个detection检测框位置,表示第i个track框的位置,表示detection检测框与track框之间的协方差矩阵。如果的马氏距离大于指定的阈值,则忽略该detection检测框与track框的关联,认为不匹配。
示例如下:
将detection框与track框的坐标(按照[center_x,center_y,w/h,h]格式)进行相减。图20为某一帧中某一个track的mean值,图21为该帧中所有的detection框坐标,图22为该track坐标与所有的detection框坐标的差值

图 20

图 21

图 22
将得到插值结果根据计算公式得出该track与所有的detectiond框的马氏距离矩阵,如图23所示。

图 23
将图23得到的马氏距离矩阵进行阈值处理,将马氏距离高于给定阈值的赋值为无穷大。
基于余弦距离处理后的该track与detection框的cost_matrix,如图24所示。

图24
马氏距离判定中设置的阈值为9.4877,将图23中的马氏距离依次与9.4877进行比较,将大于该阈值的cost_matrix中对应位置值设为无穷大(此处为10的五次方),如下图25所示。

图 25
对剩余的所有track重复上述操作,得到最后的cost_matrix如下图26所示.

图 26
(4)得到cost_matrix之后,根据匈牙利算法从cost_matrix中找到最佳匹配的track框与detection框,返回匹配的track与detection框。
总的来说,马氏距离提供了目标的可能位置信息,对短期预测有用;余弦距离更多考虑的是预测信息和轨迹信息的外观特征,当跟踪对象位移较少时,对恢复长期遮挡后的id特别有用。
经过级联匹配余下的track与detection框进行iou匹配,iou的原理是用两个方框的交集面积除以并集面积,如下图27:

图 27
为了实现iou匹配,按照上图所示进行计算,得到每一个track框与detection框的iou值构成的代价矩阵cost_matrix.类似级联处理,忽略代价矩阵cost_matrix中大于给定阈值的track与detection关联。然后进行匈牙利匹配算法,得出可匹配的track与detection.
示例如下(以第三帧为例):
初始化为8x11的cost_matrix代价矩阵,8个track框与11个detection框,如图

图 28
将track框与detection框的坐标转换为(left_top_x,left_top_y,right_bottom_x,right_bottom_y),然后计算该帧中每一个track框与该帧中所有的detection框的iou值,但cost_matrix中存储的是1-iou值,cost_matrix如下图29所示:

图 29
得到cost_matrix经过阈值处理(此处设定为0.7),将大于阈值的值设定为阈值+,即0.70001,得到如图30所示的cost_matrix:

图 30
基于步骤三得到的cost_matrix再次利用匈牙利算法进行匹配,找到最小代价的匹配关系的track与detection,返回匹配的track与detection索引。
deepsort是基于已有的检测目标进行跟踪的算法.

该图来源于网络
每一个track有两种状态confirmed与unconfirmed状态,confirmed状态的track可参加级联匹配与iou匹配;unconfirmed状态的track只可参加iou匹配。
初始的track(新建的track)的状态为unconfirmed状态。
unconfirmed状态的track转为confirmed状态的方法:
由于每一个新建的track最开始只能进行iou匹配,因此新建的track都设有一个hits变量,用来存储unconfirmed track成功与detection框进行iou匹配的次数。若该次数大于等于deepsort中默认的3次,则将该track的状态由unconfirmed track转为confirmed track。
若新建的track(unconfirmed)在后续的三帧中没有连续三次成功进行iou匹配,由于处于unconfirmed状态,那么该unconfirmed track将会被永久删除,不再考虑。
若存在confirmed track在某一帧经过级联匹配与iou匹配均未找到与之对应的detection框时,为了考虑遮挡等问题,deepsort中设置了一个max_age变量,用于容忍该confirmed track可最大连续丢失max_age帧而未匹配,而每一个track则有一个time_since_update变量,记录自身从上次匹配到现在已经有多少帧未匹配。
deepsort中只有confirmed track经过级联匹配或者iou匹配成功后才会在图片中画出跟踪框,不考虑其他track,因此在deepsort刚运行的时候,前几帧不会出现跟踪框。
max_dist 余弦距离的最大阈值min_confidence 置信度的最小阈值nms_max_overlap 非极大值抑制max_iou_distance iou的最大阈值max_age 允许连续丢失的帧数n_init unconfirmed track转为confirmed track需要连续iou匹配成功的次数nn_budget 每一个track允许保留的最多feature向量数目(注:为了更好的体现deepsort的功能,下面情况来自运行deepsort一段时间之后的情况。)
每一帧经过非极大值抑制和去掉置信度低于阈值()的检测框(只有背景);
输入每一帧的检测框的坐标,类别,置信度,图到deepsort中;
基于前一帧的track进行预测,得到前一帧中出现的物体在当前这一帧中可能的位置;
将confirmed track与当前帧的detection框进行级联匹配
(1)匹配成功的的confirmed track利用detection框提供的坐标,特征向量等数据进行更新mean与covariance,将detection框的feature向量加入该track的feature列表;
(2)未匹配成功的track与detection框,进入到iou匹配阶段,见步骤5;
将unconfirmed track与步骤4中剩余的confirmed track集合作为iou匹配的track输入,将该track集合与未匹配的detection框进行iou匹配。
(1)匹配成功的track(不区分confirmed与unconfirmed状态)利用detection框提供的坐标,特征向量等数据进行更新mean与covariance,将detection框的feature向量加入该track的feature列表;
(2)对于未匹配成功的track,若为confirmed状态则保留,不更新mean与covariance,继续参与到下一帧的预测track中;若为unconfirmed状态,则将该track标记为deleted状态;
(3)对于未匹配成功的detection框,为之建立新的track,根据detection框的数据对新的track进行赋值,初始化新的track的mean、covariance、feature等初始值;
将已经匹配成功的track的feature与id,加入到按照{id:feature}存储的列表中,并且根据参数nn_budget限定每一个track的feature数量。若数量超过nn_budget,则按照删除时间久远的,保留时间临近的feature进行该列表中每个{id:feature}的更新。
根据每一个track更新后的mean向量,输出检测框坐标与id。然后读取新的一帧重复上述操作。