SSD+Sort实现目标跟踪
- 源码地址
- 1、🙌🏻匈牙利匹配算法
- 1.1 什么是匈牙利匹配
- 1.2 什么是二分图:
- 1.3 最大匹配
- 1.4 最优匹配
- 1.5 最小点覆盖
- 1.6 交替路
- 1.7 增广路
- 1.8 匈牙利匹配具体流程以及实例
- 1.9 广度优先匹配
- 1.10 深度优先匹配
- 1.11 给匹配加权来示例(实际应用中基本都是带加权的匹配)
- 1.12 实际使用方法及代码实现
- 2、🚀卡尔曼滤波
- 3、⚡️Sort算法流程
- 4、🌈Sort算法代码详解
源码地址
⚡️⚡️⚡️Github: SSD+Sort⚡️⚡️⚡️
1、🙌🏻匈牙利匹配算法
关于匈牙利匹配算法,网上有十分多的教程,讲的也都很细致,这里我精简一下描述。
参考文献:
匹配算法之 匈牙利算法详解
yolo目标追踪:卡尔曼滤波 + 匈牙利匹配算法 + deepsort算法
多目标跟踪算法中之图匹配——匈牙利算法和KM算法详解
超详细!图解匈牙利匹配算法
1.1 什么是匈牙利匹配
匈牙利匹配算法,就是图论中寻找最大匹配的算法,即要保证匹配到最多的边,并且保证这些边的加权和最小。
匈牙利匹配算法,用于解决与二分图匹配有关的问题。
后面会具体的讲解什么叫匹配到最多的边,加权和又是指什么,什么是二分图这些问题。
1.2 什么是二分图:
二分图是一种特殊的图,它是由两个部分组成的,各部分内部没有直接关系并不相连,如下图:
二分图中的匹配讲的就是两个分布之间的连线,并且该连线的两端不能拥有共同的顶点,如上图,这就不是一个二分图的最终匹配,因为其中有很多的连线具有公共的端点,如(X1,Y2)和(X1,Y4)就是一组冲突的连线,我们可以通过去除一些公共端点的连线来使其变成匹配的二分图。下图这样的二分图则可以被称为匹配:
这样的即可以被称作是该图的一个匹配。
即匹配有以下属性:
- 匹配是由一组没有公共断电的不是圈的边构成的集合。
- 匹配是边的集合。
- 在该集合中,任意两条边不能有共同的顶点。
1.3 最大匹配
二分图中的某一个匹配中含有最多的边数,我们即称之为是最大的匹配。(注意,一个二分图的最大匹配不一定只有一个!)
1.4 最优匹配
二分图的某一个匹配是最大匹配,并且匹配中的每条边的权重相加求和是其他最大匹配中的最小值,即称这个最大匹配是最优匹配。
1.5 最小点覆盖
最小顶点覆盖是指最少的顶点数使得二分图中的每条边都至少与其中一个点相关联,二分图的最小顶点覆盖=二分图的最大匹配数。
1.6 交替路
从未匹配的点出发,依次经过未匹配的边和已匹配的边,即为交替路。如下图从2出发:2-5-1-7-4-8。
这里橘色的线我们认为是已经匹配的,黑色的连线认为是还每匹配的,我们可以看到2是未匹配的点,出发之后(2,5)是一个未匹配的边,(5,1)是匹配的边,(1,7)是未匹配的边,(7,4)是匹配的边,(4,8)是未匹配的边。
1.7 增广路
如果交替路经过除出发点外的另一个为匹配点,则这条交替路被成为增广路,根据fig.3来看,2是一个出发的未匹配点,经过的5174都是已经匹配的点,直到8是一个未匹配的点。
观察这中现象,我们可以总结出以下几条规律:
- 增广路径长度一定是一个奇数,因为最后会达到一个未匹配的点。
- 对于增广路径,所有的奇数边都不在匹配的集合中,偶数边在匹配的集合中。
- 当且仅当不存在关于该二分图的增广路径时,这个二分图此时达到最大匹配。
最后我们可以将匈牙利算法总结成不断寻找增广路径来增加匹配个数的算法。
1.8 匈牙利匹配具体流程以及实例
匈牙利匹配分为广度优先和深度优先两种匹配原则。具体这两者有什么优劣我还没有具体了解过,我感觉就是一种方法的选择吧。
1.9 广度优先匹配
广度优先匹配的原则即:为先匹配上的一对保留原先配对,后面的竞争者想匹配上之前的已经匹配好的对象是不可能的,只有找它其他的能匹配且还未匹配好的对象。(这是我自己总结的大白话)我们用下图这个例子来举例说明:
按照从上至下的顺序来匹配,首先是A,有两个可以匹配的对象a和b,我们先让A与a匹配上。然后是B,B可以匹配的对象有两个,分别是a和b,但是a已经被A匹配上了,因此我们只能让B去匹配其他的对象b,最后C的话直接和c匹配即可。
1.10 深度优先匹配
深度优先匹配得原则即:每个点从另一个集合里挑选对象,没冲突的话就先安排上,要是冲突了,就找增广路径重新匹配。重复上述操作,直到所有的点找到对象,或者找不到对象也没有增广路了。 用下图的这个例子来说明:
按照这个逻辑,最后的匹配结果(绿色的阴影):
1.11 给匹配加权来示例(实际应用中基本都是带加权的匹配)
假设我们这里以检测到的汽车为例,ABC表示前一帧检测到的,abc表示当前帧检测到的,每个数表示两帧目标之间的距离:
1.12 实际使用方法及代码实现
在实际使用中,我们首先需要确定的是两个分布之间的代价矩阵cost matrix,也就是这里面的数是怎么来的,通常情况下会根据任务的不同定制不同的计算方式,像在目标检测中使用目标跟踪的话可以使用IOU的计算方式,也可以使用欧氏距离(检测框质心的距离)等。
如果是使用python来完成匈牙利匹配的任务的话,我们可以通过直接调用第三方库的方式来完成,如scipy库中的scipy.optimize.linear_sum_assignment 函数即可实现。输入一个代价矩阵,返回的是两个分布的对应索引。
C++实现匈牙利匹配:
未完待续~~~