title: Bipartite Matching and Hungarian Algorithm
author: yangsenius
original link: https://senyang-ml.github.io/2020/06/01/Bipartite-Matching-and-Hungarian-Algorithm/
mathjax: true
date: 2020-06-02 18:01:23
tags:
- Algorithm
引言
二分图匹配和匈牙利算法(Bipartite Matching and Hungarian Algorithm)在CV领域的后处理算法中是经常可以看到的,比如以下的一些论文:
- 2017年的CVPR工作,OpenPose 利用bipartite matching 来进行,同关节类型的多个人体关键点分配到不同的隶属人体
- 2020年的End-to-end Object Detection with Transformer直接构造了一个Hungarian Loss,来解决预测目标与真实目标的分配问题
- 2020年CVPR Compressed Volumetric Heatmaps for Multi-Person 3D Pose Estimation中多人人体3D距离匹配算法
- 多目标跟踪领域内的,前后相邻帧匹配问题
- 在Instance Segmentation领域,这也是很常见的
顾名思义,二分图匹配是一个分配
问题 (Assignment Problem)。
Hungarian Algorithm (匈牙利算法) 是在1955年提出的[^1] .
如果想要彻底理解它,需要先掌握它所涉及到的一些概念,作为先验知识。如下所示:
-
图
-
边与节点
-
增广路
-
匹配
-
最大匹配
-
完美匹配
-
二分图
-
匈牙利算法
-
KM算法
二分图的最大匹配
名词解释
首先将我们遇到的问题转换成分配问题。我们的数据以一种二分图的数据结构呈现。
什么是二分图呢,它是一种特殊的图,即可以将图分为两组,两组内的节点之间没有连接边,两组之间节点存在连接关系。
我们的目标是寻找一个最大的匹配结果,使得匹配结果最合理。
比如说,我们想在一群男生和一群女生之间,根据他们各自喜欢的异性,找到一种能够成全更多对情侣的方案。又比如说,我们打算把工作项目,指派给员工们,希望用一种最大效率或者最低成本的方案。
最大匹配,即,在任意一个节点最多只有一个边与之相连接的条件下,尽可能使得两组之间的匹配边数最多。这就是我们的最优匹配目标,那么,如何求解出一种匹配方式,能够达到最大匹配呢?
最粗暴的算法就是暴力搜索,然而它的时间复杂度是指数级O(n!)
那有没有可以降低复杂度,并能够确定找到最优解的算法呢?
有,匈牙利算法就是!
匈牙利算法是一个什么算法呢?一种搜索算法,怎么样去搜索解呢?
其中,引入一种增广路的概念,它能在暴力搜索的过程中能够用一种简单的策略来改进当前匹配结果,直到我们无法找到更优的匹配。
增广路是什么意思呢,就是一种特殊的交错路,它从一个未匹配点出发,经过未匹配边、已匹配边、未匹配边,…,直到第一次到达另外一个未匹配点
那么有了增广路后,直接交换交错路径(匹配边和未匹配边),就总能改进匹配!
因为增广路上的未匹配边总比匹配边多1个,交换就意味着改进,因为我们想要最多的匹配边。