https://zhuanlan.zhihu.com/p/97449724?from_voters_page=true
-
SORT官方代码:https://github.com/abewley/sort
-
DeepSORT官方代码:https://github.com/nwojke/deep_sort
-
奇点大佬keras实现DeepSORT: https://github.com/Qidian213/deep_sort_yolov3
-
CenterNet作检测器的DeepSORT: https://github.com/xingyizhou/CenterTrack 和 https://github.com/kimyoon-young/centerNet-deep-sort
-
JDE Github地址: https://github.com/Zhongdao/Towards-Realtime-MOT
-
FairMOT Github地址: https://github.com/ifzhang/FairMOT
-
笔者修改的代码:https://github.com/pprp/deep_sort_yolov3_pytorch
SORT和DeepSORT
从这两个工业界关注度最高的算法说起。
SORT作为一个粗略的框架,核心就是两个算法:卡尔曼滤波和匈牙利匹配。
关键步骤:轨迹卡尔曼滤波预测→ 使用匈牙利算法将预测后的tracks和当前帧中的detecions进行匹配(IOU匹配) → 卡尔曼滤波更新。
对于没有匹配上的轨迹,也不是马上就删掉了,有个T_lost的保存时间,但SORT里把这个时间阈值设置的是1,也就是说对于没匹配上的轨迹相当于直接删了。
匈牙利算法解决的是一个分配问题。SK-learn库的linear_assignment_和scipy库的linear_sum_assignment都实现了这一算法,只需要输入cost_matrix即代价矩阵就能得到最优匹配。不过要注意的是这两个库函数虽然算法一样,但给的输出格式不同。具体算法步骤也很简单,是一个复杂度 的算法。
DeepSORT的优化主要就是基于匈牙利算法里的这个代价矩阵。它在IOU Match之前做了一次额外的级联匹配,利用了外观特征和马氏距离。
外观特征就是通过一个Re-ID的网络提取的,而提取这个特征的过程和NLP里词向量的嵌入过程(embedding)很像,所以后面有的论文也把这个步骤叫做嵌入(起源应该不是NLP,但我第一次接触embedding是从NLP里)。然后是因为欧氏距离忽略空间域分布的计算结果,所以增加里马氏距离作为运动信息的约束。
匈牙利:解决一些与二分图匹配有关的问题
表格法 https://blog.csdn.net/tommy0095/article/details/104466364/
1. 匈牙利算法寻找最大匹配,就是通过不断寻找原有匹配M的增广路径,因为找到一条M匹配的增广路径,就意味着一个更大的匹配M' , 其恰好比M 多一条边。
2. 对于图来说,最大匹配不是唯一的,但是最大匹配的大小是唯一的。
二分图(Bipartite graph)是一类特殊的图,它可以被划分为两个部分,每个部分内的点互不相连。
匈牙利算法主要用来解决两个问题:求二分图的最大匹配数和最小点覆盖数。
最大匹配数
int M, N; //M, N分别表示左、右侧集合的元素数量
int Map[MAXM][MAXN]; //邻接矩阵存图
int p[MAXN]; //记录当前右侧元素所对应的左侧元素
bool vis[MAXN]; //记录右侧元素是否已被访问过
bool match(int i)
{
for (int j = 1; j <= N; ++j)
if (Map[i][j] && !vis[j]) //有边且未访问
{
vis[j] = true; //记录状态为访问过
if (p[j] == 0 || match(p[j])) //如果暂无匹配,或者原来匹配的左侧元素可以找到新的匹配
{
p[j] = i; //当前左侧元素成为当前右侧元素的新匹配
return true; //返回匹配成功
}
}
return false; //循环结束,仍未找到匹配,返回匹配失败
}
int Hungarian()
{
int cnt = 0;
for (int i = 1; i <= M; ++i)
{
memset(vis, 0, sizeof(vis)); //重置vis数组
if (match(i))
cnt++;
}
return cnt;
}
最小点覆盖问题
想找到最少的一些点,使二分图所有的边都至少有一个端点在这些点之中。倒过来说就是,删除包含这些点的边,可以删掉所有边。
MOTDT
JDE
Detect-Track
Tracktor++
CenterTrack
FairMOT
PointTrack(ECCV2020 ORAL): Segment as Points for Efficient Online Multi-Object Tracking and Segmentation
heatmap, 最大响应
Visual Tracking with Fully Convolutional Networks(ICCV15)
Hierarchical Convolutional Features for Visual Tracking(ICCV15)