我一直在使用一些已在python中实现的匈牙利/ munkres算法(munkres包和scipy linear_sum_assignment具体)并且它们都运行良好(它们基于我认为的相同C实现),但是他们缺乏我特别需要的功能。
给出一些上下文我跟踪从一个图像到另一个图像的点,因此成本矩阵是图像1中的点与图像2中的所有点之间的距离。
问题出现在一个非常特殊的情况下,即如果图像1中的一个点在第二个图像中丢失,但是在图像2中也检测到新的不同点,那么图像1点之一总是匹配的有了新的观点。这是匈牙利算法按预期工作,不要误会我的意思。但是我需要的是匈牙利算法如果想要与之匹配的点太远,则返回一个点的“不匹配”。在matlab中有一个名为simpletracker.m的文件交换的例子,那里的munkres实现可以允许一个没有好链接的情况。因此,即使您有两个图像,例如5个粒子,它也可能只链接其中的2个粒子,因为您可以使用最大链接距离参数来决定是否应该进行分配。
作为一个简单的例子,如果我们在(1,1)和(10,1)处有一个带有两个点的image1,并且为了争论我们知道它们将在下一个图像中向右移动一个像素,所以我们期望它们在图像2中处于(2,1)和(11,1),并且如果在第二图像中找到它们,则匈牙利算法将容易地链接正确的粒子。然而,如果找不到其中一个,就会出现问题,比如说(11,1)处的点,而是在(20,1)处发现随机噪声点或视频中出现的新点。然后匈牙利算法将按预期链接点(1,1)和(2,1),但现在也将(10,1)链接到(20,1)。
所以在matlab实现中你可以选择一个最大链接距离值,然后将成本矩阵条目设置为无穷大,如果只能分配一个粒子,那就没问题,算法只返回那个链接。在munkres.py包中,有一个名为DISALLOWED的东西,但是只要这阻止了对每个点的赋值,算法就会失败。 例如差分矩阵为[[1,9 ^ 2],[8 ^ 2,10 ^ 2]]。如果我们将70设置为最大链接距离,则矩阵为[[1,DISALLOWED],[64,DISALLOWED]] 这意味着唯一有效的分配是图像1(1,1)中的点1到图像2(2,1)中的点1。然而,munkres算法只会返回UnsolvableMatrix:Matrix无法解决!因为它无法链接第二点。
很抱歉文字的墙壁和可能的混乱。我问的是,如果有人知道munkres实现可以允许已经在python中实现的非赋值? 或者,处理错误匹配点的最佳做法是什么?我想我可以尝试在分配完成后过滤掉异常值,或者如果所有值都被禁用,可能会在距离矩阵中删除列,但是我不确定这是否足够强大以涵盖所有可能的值例。