匈牙利算法 & KM算法

  • 1. 匈牙利算法(Hungarian Algorithm)
  • 2. KM 算法(Kuhn-Munkres Algorithm)

Reference:

  1. 带你入门多目标跟踪(三)匈牙利算法&KM算法
  2. 算法学习笔记(5):匈牙利算法

匈牙利算法(Hungarian Algorithm)与 KM 算法(Kuhn-Munkres Algorithm)主要用于解决一些与二分图匹配有关的问题,这种问题在解决多目标跟踪中的数据关联时会比较常见。

二分图(Bipartite graph) 是一类特殊的图,它可以被划分为两个部分,每个部分内的点互不相连。下图是典型的二分图:

可以把二分图理解为视频中连续两帧中的所有检测框,第一帧所有检测框的集合称为 UUU,第二帧所有检测框的集合称为 VVV。同一帧的不同检测框不会为同一个目标,所以不需要互相关联,相邻两帧的检测框需要相互联通,最终将相邻两帧的检测框尽量完美地两两匹配起来,而求解这个问题的最优解时就要用到匈牙利算法或者KM算法。

1. 匈牙利算法(Hungarian Algorithm)

匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法,并推动了后来的原始对偶方法。美国数学家哈罗德·库恩于1955年提出该算法。此算法之所以被称作匈牙利算法,是因为算法很大一部分是基于以前匈牙利数学家 Dénes Kőnig 和 Jenő Egerváry 的工作之上创建起来的。


以上图为例,假设左边的四张图是我们在第 NNN 帧检测到的目标 XXX,右边四张图是我们在第 N+1N+1N+1 帧检测到的目标 YYY。红线连起来的图,是算法认为的同一行人可能性较大的目标。由于算法并不是绝对理想的,因此并不一定会保证每张图都有一对一的匹配,事实上会有一对二甚至一对多的、多对多的情况发生。这时该怎么获得最终的一对一结果呢?

  • 第一步:
    首先给左1进行匹配,发现第一个与其相连的右1还未匹配。将其配对,连上一条蓝线:
  • 第二步:
    接着匹配左2,发现与其相连的第一个目标右2还未匹配,将其配对:
  • 第三步:
    接下来是左3,发现最优先的目标右1已经匹配完成了,怎么办呢?
    我们给之前右1的匹配对象左1分配另一个对象-----黄色表示这条边被临时拆掉:
    可以与左1匹配的第二个目标是右2,但右2也已经有对象了,怎么办呢?

    我们再给之前右2的匹配对象左2分配另一个对象(注意这个步骤和上面是一样的,这是一个递归的过程)

    此时发现左2还能匹配右3,那之前的问题就迎刃而解了,回溯回去。

    左2对右3,左1对右2,左3对右1。
    所以第三步最后的结果是:

  • 第四步:
    最后是左4,很遗憾,按照第三步的节奏我们没法给左4腾出来一个匹配对象,只能放弃对左4的匹配,匈牙利算法流程至此结束。蓝线就是我们最后的匹配结果。至此我们找到了这个二分图的一个最大匹配。

最终的结果是我们匹配出了三对目标,由于候选的匹配目标中包含了许多错误的匹配红线(边),所以匹配准确率并不高。可见匈牙利算法对红线连接的准确率要求很高,也就是要求我们运动模型、外观模型等部件必须进行较为精准的预测,或者预设较高的阈值,只将置信度较高的边才送入匈牙利算法进行匹配,这样才能得到较好的结果。

匈牙利算法的流程大家看到了,有一个很明显的问题相信大家也发现了,按这个思路找到的最大匹配往往不是我们心中的最优。匈牙利算法将每个匹配对象的地位视为相同,在这个前提下求解最大匹配。这个和我们研究的多目标跟踪问题有些不合,因为每个匹配对象不可能是同等地位的,总有一个真实目标是我们要找的最佳匹配,而这个真实目标应该拥有更高的权重,在此基础上匹配的结果才能更贴近真实情况。

KM 算法就能比较好地解决这个问题,我们下面来看看 KM 算法。

2. KM 算法(Kuhn-Munkres Algorithm)

KM算法解决的是带权二分图的最优匹配问题。

还是用上面的图来举例子,这次给每条连接关系加入了权重,也就是我们算法中其他模块给出的置信度分值。

  • 第一步
    首先对每个顶点赋值,称为顶标,将左边的顶点赋值为与其相连的边的最大权重,右边的顶点赋值为0:
  • 第二步
    匹配的原则是只与权重大于等于左边分数(顶标)的边进行匹配,若找不到边匹配,对此条路径的所有左边顶点的顶标减d,所有右边顶点的顶标加 ddd。参数 ddd 我们在这里取值为0.1。

    对于左1,与顶标分值相同的边先标蓝。
    然后是左2,与顶标分值相同的边标蓝。
    然后是左3,发现右1已经与左1配对。首先想到让左3更换匹配对象,然而根据匹配原则,只有权值大于等于(0.9+0=)0.9的边能满足要求,而此时另一个匹配对象的权值为(0.8+0=)0.8<0.9,因此左3无法换边。

    这时左1能不能换边呢?对于左1来说,只有权值大于等于(0.8+0=)0.8的边能满足要求,而另一匹配对象的权值为(0.6+0=)0.6<0.8,也无法换边。

    此时根据KM算法,应该对所有冲突的边的顶点做加减操作。令左边顶点值减0.1,右边顶点值加0.1,结果如下图所示:

    再进行匹配操作,发现左3多了一条可匹配的边,因为此时左3对右2的匹配要求只需权重大于等于0.8+0即可,所以左3与右2匹配!
    最后进行左4的匹配。由于左4唯一的匹配对象右3已被左2匹配,发生冲突。进行一轮加减d操作,再匹配,左4还是匹配失败。两轮以后左4期望值降为0,放弃匹配左4。

至此KM算法流程结束,三对目标成功匹配,甚至在左3目标预测不够准确的情况下也进行了正确匹配。可见在引入了权重之后,匹配成功率大大提高

最后还有一点值得注意,匈牙利算法得到的最大匹配并不是唯一的,预设匹配边、或者匹配顺序不同等,都可能会导致有多种最大匹配情况,所以有一种替代KM算法的想法是,我们只需要用匈牙利算法找到所有的最大匹配,比较每个最大匹配的权重,再选出最大权重的最优匹配即可得到更贴近真实情况的匹配结果。但这种方法时间复杂度较高,会随着目标数越来越多,消耗的时间大大增加,实际使用中并不推荐。

匈牙利算法 KM算法相关推荐

  1. 带你入门多目标跟踪(三)匈牙利算法KM算法

    匈牙利算法(Hungarian Algorithm)与KM算法(Kuhn-Munkres Algorithm)是做多目标跟踪的小伙伴很容易在论文中见到的两种算法.他们都是用来解决多目标跟踪中的数据关联 ...

  2. 匈牙利匹配、KM算法、卡尔曼滤波、SORT/deep SORT

    匈牙利匹配.KM算法 带你入门多目标跟踪(三)匈牙利算法&KM算法 - 知乎 卡尔曼滤波: 图像处理之目标跟踪(一)之卡尔曼kalman滤波跟踪(主要为知识梳理)(转载)_coming_is_ ...

  3. 二分图最佳完美匹配——KM算法

    前情概要 学km算法之前,笔者还是希望大家已经掌握了匈牙利算法--也就是对于求解二分图最大匹配的算法.学习本算法的前提除了已经掌握C++语言之外,还需要掌握邻接表存图法,不会的朋友这里有传送门 [微笑 ...

  4. NOI数据结构:KM算法

    NOI数据结构:二分图的最佳匹配KM算法 二分图匹配之最佳匹配--KM算法 - ~Lanly~ - 博客园 二分图最佳完美匹配-KM算法_ZigZagK的博客-CSDN博客_完美匹配2 二分图的最佳完 ...

  5. 【坤坤讲师--图】KM算法

    KM算法 KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的.设顶点Xi的顶标为A[i],顶点Yj的顶标为B[j],顶点Xi与Yj之间的边权为w[i,j].在算 ...

  6. Acm+java各种数据结构_Acm竞赛算法——数据结构算法分类

    ACM竞赛的算法,分为了数学.数据结构和算法三大块. 一 数学(Mathematics) 1 离散数学(Discrete Mathematics) 1.1 图论(Graph Theory) 图的遍历( ...

  7. 判别两棵树是否相等 设计算法_从匈牙利算法到KM算法

    网上搜了好多KM算法的文章,都写得云里雾里.看了半天之后,我终于看懂了.其实KM算法非常简单,只要会匈牙利算法了,一下就能看懂KM算法. 如果大家对自己的匈牙利算法不够自信的话,可以先复习一下,放上我 ...

  8. 多目标跟踪算法中之图匹配——匈牙利算法和KM算法详解

    目录 一.匈牙利算法 1.算法背景及思想 2.最大匹配 3.最优匹配/完美匹配 4.增广路径 5.代码实现 6.匈牙利算法总结 6.1.深度优先 6.2. 广度优先 二.KM算法思想及局限性 代码示例 ...

  9. 匈牙利算法与KM算法的区别

    前记 在学习过程中,发现很多博客将匈牙利算法和KM算法混为一谈,当时只管用不管分析区别,所以现在来分析一下两个算法之间的区别. 匈牙利算法在二分图匹配的求解过程中共两个原则: 1.最大匹配数原则 2. ...

  10. 【算法笔记】二分图最大权匹配 - KM算法(dfs版O(n4) + bfs版O(n3))

    整理的算法模板合集: ACM模板 匈牙利算法又称为 KM 算法,可以在 O(n3)O(n^3)O(n3) 时间内求出二分图的 最大权完美匹配 . 考虑到二分图中两个集合中的点并不总是相同,为了能应用 ...

最新文章

  1. Linux Exploit系列之三 Off-By-One 漏洞 (基于栈)
  2. 张一鸣的微博世界-产品篇一
  3. 【Bit-Z月报】11月送出182.4万美元活动奖励,真是豪气
  4. 探寻用户自定义定时任务的实践方案
  5. Replace Parameter with Explicit Methods(以明确函数取代参数)
  6. .net core 开发 Windows Forms 程序
  7. thinkphp sql查询条件 一个字段多个限制条件
  8. 190.颠倒二进制位
  9. 模拟SAP ALV下载XLSX文件
  10. 2022百度之星程序设计大赛 - 复赛 1003 最大值
  11. 4-5. do...while循环
  12. 微信web中IOS系统手机摇一摇功能实现及问题解决
  13. 朴素贝叶斯分类(python实现)
  14. 【广度优先搜索-中等】1905. 统计子岛屿
  15. 大专毕业,0基础转行C++程序员一个月后,我后悔了
  16. win11本地用户和组找不到的解决办法
  17. 事件营销此起彼伏,效果决定未来
  18. LWN: 内核staging目录的驱动们最后下场如何?
  19. Golang字符串函数用法
  20. 一升的眼泪 日记原文+剧照

热门文章

  1. 6、深思数盾加密狗使用小记
  2. 数字万用表校准软件|数字万用表自动计量系统NSAT-3030
  3. 老毛子出现app页面解决办法
  4. 网络PPTP协议代理加速器的应用
  5. Qt 自定义QWidget中区分鼠标单击和双击
  6. 搬运: CVonline: 图像数据库(二) (更新于20190821)
  7. 7款流程图制作软件大盘点!轻松绘制流程图
  8. vs2008 sp1 C++ 发布程序 .
  9. 路由与交换技术(常用版)
  10. WEB前端之网页设计①----最新最全详解/网页基础结构