背景:目标检测 vs 目标跟踪
在开始介绍 DeepSORT 的原理之前呢,我们先来了解下目标检测,和目标跟踪之间的区别:
- 目标检测:在目标检测任务中,我们需要利用 AI 模型识别出单张画面中,物体的位置和类别信息,每一帧画面之间检测结果相对独立,没有依赖关系。这也意味着目标检测算法可以被应用于单张图片的检测,也可以用于视频中每一帧画面的检测。
- 目标跟踪:而目标跟踪则是在目标检测的基础上加入的跟踪机制,他需要追踪视频中同一物体在不同时刻的位置信息,因此他需要判断相邻帧之间的被检测到对象是否是同一个物体,并且为同一物体分配唯一的编号 ID,用来区别不同的目标对象。
例如下面短跑运动员比赛的例子中,目标检测任务只需要识别到画面中所有人体的位置即可,而目标跟踪任务则需要区分画面中相同的对象和不同对象。
DeepSORT
DeepSORT 的前身是 SORT 算法,SORT 算法是由目标检测器以及跟踪器所构成,其跟踪器的核心是卡尔曼滤波算法和匈牙利算法。
利用卡尔曼滤波算法预测检测框在下一帧的状态,将该状态与下一帧的检测结果利用匈牙利算法进行匹配,实现追踪。
一旦物体受到遮挡或者其他原因没有被检测到,卡尔曼滤波预测的状态信息将无法和检测结果进行匹配,该追踪片段将会提前结束。
预测:用卡尔曼滤波算法预测已经tracker到的obj在下一时刻的状态
卡尔曼滤波算法用于预测已经tracker到的object在下一时刻的状态
状态表示:8维向量,[cx, cy, r, h, vx, vy, vr, vh]
- cx,cy是bbox中心坐标点
- r=高宽比,h=高度
- Vx,vy,vr,vh是以上四个量的速度(速度初始值=0)
这里卡尔曼滤波预测下一个状态:使用匀速模型和线性观测模型
检测:在新的帧里detection
例如用YOLO进行物体检测
关联:trackerID关联
SORT算法的思路是将detection出的box和预测出的box分别计算IOU,生成一个IOU矩阵,然后再将矩阵输入到匈牙利算法来计算出box之间的一个最佳匹配
detect box1 | detect box2 | |
预测boxa | IOU | IOU |
预测boxb | IOU | IOU |
目标是将预测出的box和detect出的box一一对应分配,匈牙利算法找出一个最优匹配。
匹配后,detect出的box就可以用对应的预测box的trackerID
更新:用新的有trackerID的detect box来更新维护的tracker box
为后续的预测做准备
更新卡尔曼滤波
匈牙利算法简介:
用于解决最优分配问题,在代价矩阵上找出代价最小的分配方案。
定理:如果代价矩阵的某一行或某一列同时加上或减去某个数,则这个新的代价矩阵的最优分配方案仍然是原代价矩阵的最优分配方案。
参考:
- 目标跟踪初探(DeepSORT) - 知乎
卡尔曼滤波算法:
通过观测值来预测
SORT算法两个地方使用卡尔曼滤波:
- 预测track在下一时刻的位置
- 基于匹配后的detect来更新预测数据,以便于下一次预测
参考:
- 图说卡尔曼滤波,一份通俗易懂的教程 - 知乎
SORT算法的不足:要求必须连续detect到,否则产生新的trackID
一旦物体受到遮挡或者其他原因没有被检测到,卡尔曼滤波预测的状态信息将无法和检测结果进行匹配,该追踪片段将会提前结束
DeepSORT:利用已检测到的物体的外观特征,即使中间遮挡等断开,后续也能追踪上
使用一个简单的CNN提取物体的外观特征,计算特征相似度
结合运动+外观特征
马氏距离:运动物体在两个不同状态的距离
余弦距离:用于计算特征相似度