MOT

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即代价矩阵就能得到最优匹配。不过要注意的是这两个库函数虽然算法一样,但给的输出格式不同。具体算法步骤也很简单,是一个复杂度 O(n^3)的算法。

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)

Siamese Keypoint Prediction Network for Visual Object Tracking

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值