• Deepsort工作原理分析


    Deepsort工作原理分析

    源码解析
    deepsort源码解读一
    deepsort源码解读二
    deepsort源码解读三
    deepsort源码解读四
    deepsort源码解读五
    deepsort源码解读六
    deepsort源码解读七


    一.重要实现部分

    1.卡尔曼滤波

    (1)卡尔曼滤波功能是根据系统以前的数据预测系统下一步的操作。如卡尔曼滤波在deepsort中主要功能是基于前一帧图片中的检测框(可能存在很多,假设其中一个检测框为A),预测检测框A在当前这一帧中的位置。

    (2)在系统开始运行时,不存在前一帧,那么为了实现卡尔曼滤波的功能,程序会把检测到的第一帧中符合要求的检测框作为新的跟踪对象(track)。
    建立新的跟踪对象会进行的操作:

    1. 输入参数,检测框的位置坐标(检测框中心坐标[x,y],宽/高,高)
    2. 构造跟踪对象的8维mean均值向量,该向量由位置坐标和速度构成,也称状态向量。第一帧中的mean向量为[312.5,225,0.40277778,72,0,0,0,0]。(初始速度为0)
    3. 构造协方差矩阵covariance,该矩阵的作用是协调mean中每个参数相互之间的关系,来表示目标位置信息的不确定性质,矩阵中的数字越大表示不确定性越大。由8x8的矩阵表示,该协方差矩阵也是对角矩阵,可以以任意值初始化。将会用在下文提到的马氏距离计算中,用来考虑不确定性。
      若mean =
      在这里插入图片描述
      则covariance = 在这里插入图片描述
      其中每一个track的covariance的初始值由权重与检测框的高度设定。
    4. 进行其他参数赋值(与卡尔曼滤波无关)。
      将新建立的track放入跟踪链中(跟踪链是用来存储所有预测的track)。如图1,下列9个track框都是第一帧中物理检测框的位置(也为第一帧的track位置)。
      在这里插入图片描述
      图 1

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

    1. 每一帧的每一个track都有mean,covariance参数,将这两个参数传入卡尔曼滤波预测函数中。
    2. 在卡尔曼滤波预测函数中,实现与两个数学等式即可得到新预测的mean和covariance(其中F为8x8的状态转移矩阵)。对于协方差矩阵的预测中,考虑到外部因素的不确定性(如在跟踪一个四轴飞行器,它可能会受到风的冲击,或者行人在冰上或者泥里打滑了),预测步骤后添加一些新的不确定性,可以对与“世界”相关的不确定性进行建模,如将无法确定的外部因素描述成方差为的高斯噪声。
    3. 得到某一track的和后,进行更新操作:
      (1)进行级联操作和iou操作;
      (2)对于匹配上的track进行更新操作:
      ①输入track的mean、covariance、检测框的位置[中心坐标(x,y),w/h,h]到卡尔曼滤波的更新函数;
      ②输出纠正后track的mean与covariance.也即该帧得到最终的检测框位置信息等。
      存在前一帧的track时,得到基于前一帧预测的track和目标检测框。
      如图2-图7所示,红色的为目标检测框,其他色为预测的track框(未结合目标检测框进行更新修正)。
      在这里插入图片描述
      图 2 第三帧
      在这里插入图片描述
      图 3 第四帧
      在这里插入图片描述
      图4 第五帧
      在这里插入图片描述
      图5 第六帧
      在这里插入图片描述
      图6 第七帧
      在这里插入图片描述
      图7 第八帧

    如图8所示,红色的为目标检测框,其他色为预测的track框结合目标检测框进行更新修正后的框。
    在这里插入图片描述
    图 8 第三帧
    在这里插入图片描述
    图 9 第四帧
    在这里插入图片描述
    图 10 第五帧
    在这里插入图片描述
    图 11 第六帧
    在这里插入图片描述
    图 12 第七帧
    在这里插入图片描述
    图 13 第八帧


    2.级联匹配

    (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框的关联,认为不匹配。

    示例如下:

    1. 将detection框与track框的坐标(按照[center_x,center_y,w/h,h]格式)进行相减。图20为某一帧中某一个track的mean值,图21为该帧中所有的detection框坐标,图22为该track坐标与所有的detection框坐标的差值
      在这里插入图片描述
      图 20
      在这里插入图片描述
      图 21
      在这里插入图片描述
      图 22

    2. 将得到插值结果根据计算公式得出该track与所有的detectiond框的马氏距离矩阵,如图23所示。
      在这里插入图片描述
      图 23

    3. 将图23得到的马氏距离矩阵进行阈值处理,将马氏距离高于给定阈值的赋值为无穷大。
      基于余弦距离处理后的该track与detection框的cost_matrix,如图24所示。
      在这里插入图片描述
      图24
      马氏距离判定中设置的阈值为9.4877,将图23中的马氏距离依次与9.4877进行比较,将大于该阈值的cost_matrix中对应位置值设为无穷大(此处为10的五次方),如下图25所示。
      在这里插入图片描述
      图 25

    4. 对剩余的所有track重复上述操作,得到最后的cost_matrix如下图26所示.
      在这里插入图片描述
      图 26
      (4)得到cost_matrix之后,根据匈牙利算法从cost_matrix中找到最佳匹配的track框与detection框,返回匹配的track与detection框。
      总的来说,马氏距离提供了目标的可能位置信息,对短期预测有用;余弦距离更多考虑的是预测信息和轨迹信息的外观特征,当跟踪对象位移较少时,对恢复长期遮挡后的id特别有用。


    3.Iou匹配

    经过级联匹配余下的track与detection框进行iou匹配,iou的原理是用两个方框的交集面积除以并集面积,如下图27:
    在这里插入图片描述
    图 27

    为了实现iou匹配,按照上图所示进行计算,得到每一个track框与detection框的iou值构成的代价矩阵cost_matrix.类似级联处理,忽略代价矩阵cost_matrix中大于给定阈值的track与detection关联。然后进行匈牙利匹配算法,得出可匹配的track与detection.

    示例如下(以第三帧为例):

    1. 初始化为8x11的cost_matrix代价矩阵,8个track框与11个detection框,如图
      在这里插入图片描述
      图 28

    2. 将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

    3. 得到cost_matrix经过阈值处理(此处设定为0.7),将大于阈值的值设定为阈值+,即0.70001,得到如图30所示的cost_matrix:
      在这里插入图片描述
      图 30

    4. 基于步骤三得到的cost_matrix再次利用匈牙利算法进行匹配,找到最小代价的匹配关系的track与detection,返回匹配的track与detection索引。


    二.Deepsort整体流程

    deepsort是基于已有的检测目标进行跟踪的算法.

    在这里插入图片描述
    该图来源于网络

    预备知识
    1. 每一个track有两种状态confirmed与unconfirmed状态,confirmed状态的track可参加级联匹配与iou匹配;unconfirmed状态的track只可参加iou匹配。

    2. 初始的track(新建的track)的状态为unconfirmed状态。

    3. unconfirmed状态的track转为confirmed状态的方法:
      由于每一个新建的track最开始只能进行iou匹配,因此新建的track都设有一个hits变量,用来存储unconfirmed track成功与detection框进行iou匹配的次数。若该次数大于等于deepsort中默认的3次,则将该track的状态由unconfirmed track转为confirmed track。

    4. 若新建的track(unconfirmed)在后续的三帧中没有连续三次成功进行iou匹配,由于处于unconfirmed状态,那么该unconfirmed track将会被永久删除,不再考虑。

    5. 若存在confirmed track在某一帧经过级联匹配与iou匹配均未找到与之对应的detection框时,为了考虑遮挡等问题,deepsort中设置了一个max_age变量,用于容忍该confirmed track可最大连续丢失max_age帧而未匹配,而每一个track则有一个time_since_update变量,记录自身从上次匹配到现在已经有多少帧未匹配。

    6. deepsort中只有confirmed track经过级联匹配或者iou匹配成功后才会在图片中画出跟踪框,不考虑其他track,因此在deepsort刚运行的时候,前几帧不会出现跟踪框。

    执行步骤
    1. 执行每一帧前,可设定的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一段时间之后的情况。)

    1. 每一帧经过非极大值抑制和去掉置信度低于阈值()的检测框(只有背景);

    2. 输入每一帧的检测框的坐标,类别,置信度,图到deepsort中;

    3. 基于前一帧的track进行预测,得到前一帧中出现的物体在当前这一帧中可能的位置;

    4. 将confirmed track与当前帧的detection框进行级联匹配
      (1)匹配成功的的confirmed track利用detection框提供的坐标,特征向量等数据进行更新mean与covariance,将detection框的feature向量加入该track的feature列表;
      (2)未匹配成功的track与detection框,进入到iou匹配阶段,见步骤5;

    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等初始值;

    6. 将已经匹配成功的track的feature与id,加入到按照{id:feature}存储的列表中,并且根据参数nn_budget限定每一个track的feature数量。若数量超过nn_budget,则按照删除时间久远的,保留时间临近的feature进行该列表中每个{id:feature}的更新。

    7. 根据每一个track更新后的mean向量,输出检测框坐标与id。然后读取新的一帧重复上述操作。

  • 相关阅读:
    【深度学习】多标签学习
    AE调试(人脸场景)
    超简单的vue实现生成二维码并下载为图片(可直接复制使用)
    google abseil c++ Tip of the Week #65: Putting Things in their Place 把对象放入容器的方式
    [PyTorch][chapter 60][强化学习-2-有模型学习2]
    开源数据库连接池的使用及其工具类
    shell_55.Linux临时重定向
    1000道最新高频Java面试题,覆盖25个技术栈(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构
    释放固态继电器的力量:主要优势和应用
    iOS开发M1芯片遇到的问题
  • 原文地址:https://blog.csdn.net/qq_44116998/article/details/125566835