本篇文章参考了如下文章: https://blog.csdn.net/didiaopao/article/details/120272947 https://blog.csdn.net/HaoBBNuanMM/article/details/85555547 https://azusa.blog.csdn.net/article/details/106009021
首先我们需要明确目标跟踪和目标检测是两件不同的事
目标跟踪:把上一帧利用目标跟踪算法预测的目标跟踪边界框与当前帧目标检测算法检测到的边界框(Bounding Box)进行关联,找到最匹配的目标检测边界框,得到了这样一个目标检测BBox代表成功跟踪的BBox结果 SORT跟踪算法到底在干什么?(以单目标跟踪为例说明如下)
- 假设T1时刻成功跟踪了某个单个物体,ID为1,绘制物体跟踪BBox(紫色)
- T2时刻物体检测BBox总共有4个(黑色),预测T2时刻物体跟踪的BBox(紫色)有1个,解决紫色物体跟踪BBox如何与黑色物体检测BBox关联的算法,就是SORT物体跟踪算法要解决的核心问题
- SORT关联两个BBox的核心算法是:用IOU计算Bbox之间的距离 + 匈牙利算法选择最优关联结果
以上图为例,多目标跟踪为例说明如下: - T1时刻已经成功跟踪了3个检体(不同颜色的BBox代表不同的物体ID)
- T2时刻除了所有物体检测的新位置BBox(灰色),还要物体跟踪预测的Bbox(非灰的其它不同颜色BBox)与物体检测Bbox(灰色)关联,从而分辨出哪一个物体跟踪的Bbox对应哪一个物体检测的BBox,从而产生T2时刻的物体跟踪BBox结果(包括新增物体跟踪器跟踪T2中新检测到的物体)
- T3时刻如果被追踪的物体发生了遮挡(红框BBox的物体),那么要继续能找到该物体并追踪 (避免ID Switch)
物体跟踪有几个主要任务以及它们对应的解决方案
- 检测-深度学习的各种检测网络来实现物体检测
- 跟踪预测与关联-Tracking的算法来实现物体追踪(比如 本文介绍的SORT)
- ID Switch- Tracking的算法来解决遮挡物体(比如 deep SORT)
- ReID(跨摄像头发现和跟踪同一个物体,避免ID switch) - 比如 deep SORT
SORT
SORT的核心是卡尔曼滤波和匈牙利算法 关键步骤:轨迹卡尔曼滤波预测→ 使用匈牙利算法将预测后的tracks和当前帧中的detecions进行匹配(IOU匹配) → 卡尔曼滤波更新
卡尔曼滤波分为两个过程:预测和更新。SORT引入了线性速度模型与卡尔曼滤波来进行位置预测,先进行位置预测然后再进行匹配。运动模型的结果可以用来预测物体的位置。
匈牙利算法解决的是一个分配问题,用IOU距离作为权重(也叫cost矩阵),并且当IOU小于一定数值时,不认为是同一个目标,理论基础是视频中两帧之间物体移动不会过多。在代码中选取的阈值是0.3。scipy库的linear_sum_assignment都实现了这一算法,只需要输入cost_matrix即代价矩阵就能得到最优匹配。
卡尔曼滤波的作用: 卡尔曼滤波的作用就是利用当前的一些列运动变量去预测下一时刻的运动变量,注意:第一次的检测结果用来初始化卡尔曼滤波的运动变量 匈牙利算法的作用: 匈牙利算法主要解决合理分配的问题,将该帧下目标检测模型预测得到的边界框与卡尔曼滤波预测得到的边界框做分配,从而让实现让卡尔曼滤波预测得到的边界框找到和自己最匹配的检测框,以达到最终效果
SORT算法的工作流程如下:
- (1)将第一帧检测到的结果创建其对应的Tracks。将卡尔曼滤波的运动变量初始化,通过卡尔曼滤波算法生成预测框
- (2)将该帧下目标检测算法预测得到的bbox和上一帧通过Tracks预测得到的bbox进行IOU匹配,再通过IOU匹配结果计算其代价矩阵(cost matrix, 计算方式是1-IOU)
- (3)将(2)中得到的所有代价矩阵作为匈牙利算法的输入,得到线性匹配结果,这时我们得到的结果有三种,第一种是Tracks失配(Unmatched Tracks),直接将适配的Tracks删除;第二种是Detections失配(Unmatched Detections),将这样的Detections初始化为一个新的Tracks(new Tracks);第三种是目标检测框和卡尔曼滤波算法预测的边界框匹配成功,这说明我们前一帧和后一帧追踪成功,将其对应的Detections通过卡尔曼滤波更新其对应的Tracks变量。
- (4)反复循环(2)-(3)步骤,直至视频帧结束。
SORT算法的缺点:
- 对于物体遮挡几乎没有处理,导致ID switch次数很高
- 有遮挡的情况下跟踪准确度很低
|