论文地址:https://arxiv.org/abs/1703.07402
代码地址:https://github.com/nwojke/deep_sort
讲的很好的博文链接:
https://blog.youkuaiyun.com/yiran103/article/details/89521292
https://blog.youkuaiyun.com/hailanglin/article/details/90370375
https://blog.youkuaiyun.com/cdknight_happy/article/details/79731981
https://blog.youkuaiyun.com/HaoBBNuanMM/article/details/85555547
目录
Track Handling and State Estimation
DeepSort 创新点
- 两个度量标准:马氏距离 + 深度特征余弦距离;
- 两级关联:第一级关联以余弦距离作为成本函数,但设定马氏距离和余弦距离两个阈值约束;
- 两级关联:第二级关联与SORT中相同(IoU匹配),尝试关联未确认和年龄为 n=1的不匹配轨迹;
- 采取级联匹配,优先匹配距上次出现间隔短的目标;
Track Handling and State Estimation
将跟踪场景定义在八维状态空间(使用卡尔曼滤波预测下一帧检测框的位置)
包含边界框中心位置 (u,v)、纵横比 γ、高度 h 以及它们各自在图像坐标中的速度
Assignment Problem
1.外观特征匹配(深度特征余弦距离)
对每一个跟踪器构建一个特征 gallary,存储该跟踪器成功关联的最近100帧的检测框的外观特征
计算第i个跟踪器的特征集与当前帧第j个检测结果的特征向量间的最小余弦距离
2.运动信息的匹配(马氏距离)
使用马氏距离来表示第j个检测和第i个跟踪器之间的运动匹配程度
计算预测结果(上一帧对当前帧的预测)和检测结果(当前帧的检测结果)之间的马氏距离
预测是由卡尔曼滤波完成的:卡尔曼滤波的理解可以参考我的另外一篇博客:目标跟踪-------卡尔曼滤波
3.加权融合
将两个距离度量进行融合。关联度量的总公式如下所示:
代码的实现中并没有使用lambda,这两种距离度量的融合是通过在cost_matrix矩阵中叠加修改相应位置的值来完成的。
def gated_metric(tracks, dets, track_indices, detection_indices):
features = np.array([dets[i].feature for i in detection_indices])
targets = np.array([tracks[i].track_id for i in track_indices])
# 获得外观特征距离矩阵
cost_matrix = self.metric.distance(features, targets)
# 在外观特征距离矩阵的基础上增加马氏距离约束
cost_matrix = linear_assignment.gate_cost_matrix(
self.kf, cost_matrix, tracks, dets, track_indices,
detection_indices)
Matching Cascade
作者使用了级联匹配来对更加频繁出现的目标赋予优先权
针对之前已经confirmed tracks 将它们与当前帧的检测结果进行级联匹配
级联匹配的意思就是:从最新匹配成功的跟踪器循环遍历到最多已经有30次(self.time_since_update )没有匹配的跟踪器
Deep Appearance Descriptor
在行人重识别数据集上离线训练残差网络模型。输出128维的归一化的特征。
具体的网络结构以及理解可以查看我的另一篇博客:论文笔记《Deep Cosine Metric Learning for Person Re-Identification》
EXPERIMENTS
- 减少了45%的ID switch;
- 结合了深度外观信息,对遮挡目标的追踪效果大大提升;
- FP的升高很多,文章中提出这主要是由于静态场景中detection的错误以及过长的允许丢失的track age所导致的(相对于SORT只用相邻帧进行匹配来说,Deep SORT允许高达30帧的丢失,而Kalman的等速运动模型没有改变,这主要造成了FP的升高)。