DeepSort+YOLOv3的多目标跟踪开源项目及deepsort原理

  • 目录
    • 链接
    • Sort
      • 卡尔曼滤波简单解释
      • 匈牙利算法简单解释
  • DeepSort
  • DeepSort相比于Sort改进的地方
  • YOLOv3+DeepSort

链接

本文来源:https://www.twblogs.net/a/5cbfacafbd9eee397113c965
其他参考:https://zhuanlan.zhihu.com/p/62858357
deep_sort:https://github.com/nwojke/deep_sort
keras_yolov3:https://github.com/qqwweee/keras-yolo3
deep_sort+yolov3:https://github.com/Qidian213/deep_sort_yolov3 (这个是基于前两个改的)
另一个很好的解释(强推):https://blog.csdn.net/HaoBBNuanMM/article/details/85555547

Sort

sort同样使用的是TBD(Tracking By Detection),也就是说先检测,再跟踪。这也是跟踪领域的主流方法。所以,检测器的好坏将决定跟踪的效果。

Sort算法的理解:

  • 跟踪之前,对所有目标已经完成检测
  • 第一帧进来时,以检测到的目标初始化并创建新的跟踪器,标注id
  • 后面帧进来时,先到卡尔曼滤波器(Kalman Filter)中得到由前面帧box产生的状态预测和协方差预测。求跟踪器所有目标状态与本帧检测的box的IOU,通过匈牙利算法(Hungarian Algorithm),得到IOU最大的唯一匹配(数据关联部分),在去掉匹配值小于iou_threshold的匹配对。
  • 用本帧中匹配到的目标检测box去更新卡尔曼跟踪器,计算卡尔曼增益状态更新协方差更新。并将状态更新值输出,作为本帧的跟踪box。对于本帧中没有匹配到的目标重新初始化跟踪器。
    其中,卡尔曼跟踪器联合了历史跟踪记录,调节历史box与本帧box的残差,更好的匹配跟踪id。
卡尔曼滤波

卡尔曼滤波是用来对目标的轨迹进行预测,并且使用确信度较高的跟踪结果进行预测结果的修正

匈牙利算法

匈牙利算法是一种寻找二分图的最大匹配的算法,在多目标检测跟踪问题中可以理解为寻找前后两帧的若干目标的匹配最优解的方法。

DeepSort

  • 马氏距离计算物体检测Bbox dj和物体跟踪Bbox yi之间的距离,
    注:不使用欧氏距离的原因是dj和yi的空间域分布不同,欧氏距离忽略空间域分布的计算结果不能准确反映两者的真实距离,公式如下:
    马氏距离:
    在这里插入图片描述
    当两者距离 <= 特定阈值,则表示两者相互关联:
    在这里插入图片描述
  • 物体检测Bbox dj通过CNN网络计算对应的128维feature向量rj,具体的做法是把物体检测Bbox dj对应的patch作为下图的CNN输入,转化维128维feature向量rj
    在这里插入图片描述
    对于跟踪器i,为它创建一个集合保留它过去Lk次成功跟踪物体检测Bbox对应的Lk个feature向量集合,公式是在计算第i个物体总总的所有feature向量和第j个物体检测之间的最小余弦距离(具体含义参考下图)
    在这里插入图片描述
    当两者距离 <= 特定阈值,表示两者关联:
    在这里插入图片描述
  • 关联度量的总公式:
    在这里插入图片描述
  • 关联算法:
    在这里插入图片描述
    解释
    T:物体跟踪集合
    D:物体检测集合
    1.C矩阵存放所有物体跟踪i与物体检测j之间距离的计算结果
    2.B矩阵存放所有物体跟踪i与物体检测j之间是否关联的判断(0/1)
    3.关联集合M初始化维{}
    4.将找不到匹配的检测物体集合初始化为{}
    5.从刚刚匹配成功的跟踪器循环遍历到最多已经有Amax次没有匹配的跟踪器
    6.选择满足条件的跟踪器集合Tn
    7.根据最小成本计算法计算出Tn与检测物体j关联成功产生集合[xi,j]
    8.更新M为匹配成功的(跟踪物体i,检测物体j)集合
    9.从U中去除已经匹配成功的检测物体j
    10.循环

原理图
在这里插入图片描述

deepsort相对于sort的改进:

整体框架没有大改,还是延续了卡尔曼滤波加匈牙利算法的思路,在这个基础上增加了Deep Association Metric。Deep Association Metric其实就是在大型行人重识别网络上学习的一个行人鉴别网络。目的是区分出不同的行人。个人感觉很类似于典型的行人重识别网络。输出行人图片,输出一组向量,通过比对两个向量之间的距离,来判断两副输入图片是否是同一个行人。

此外还加入了外观信息(Appearance Information)以实现较长时间遮挡的目标跟踪。(来自:https://zhuanlan.zhihu.com/p/62858357

deepsort+yolov3

从上面的原理图我们即可知,只要将Detection检测部分换成yolo即可。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐