我认为 RANSAC 应该随机选择一个点子集来进行拟合,那为什么每次都返回相同的变换矩阵呢?
RANSAC反复选择点的子集,然后根据它们拟合模型,然后检查数据集中有多少数据点是给定拟合模型的内点。一旦完成了很多次,它就会选择具有最多内点的拟合模型,并将模型重新拟合到这些内点。
对于任何给定的数据集、变量模型参数集和构成内点的规则,将存在一个或多个(但通常恰好是一个)最大可能的“内点”集。例如,给定这个数据集(来自维基百科的图片):

...然后通过对异常值的某种合理定义,任何线性模型可以具有的最大可能的内部值集是下面蓝色的那个:

让我们称上面的蓝点集 - 最大可能的内点集 - I。
如果您随机选择少量点(例如两个或三个)并通过它们绘制一条最适合的线,那么直观地希望它只需要您尝试几次,直到您遇到迭代,其中:
- 您选择的所有随机选择的点都来自I,所以
- 通过这些点的最佳拟合线大致等于上图中的最佳拟合线,因此
- 在该迭代中发现的一组内点正是I
从那次迭代开始,所有进一步的迭代都是浪费,不可能进一步改进模型(尽管 RANSAC 无法知道这一点,因为它不能神奇地知道何时找到最大的内点集)。
如果相对于数据集的大小,您有足够多的迭代次数,并且有足够大比例的数据集是内点,那么您最终将找到最大的内点集,每次您都有接近 100% 的机会运行 RANSAC。因此,RANSAC 将(几乎)总是输出完全相同的模型。
这是一件好事!通常,您希望RANSAC 找到绝对最大的内点集,并且不想满足于任何更少的东西。如果在这种情况下每次运行 RANSAC 时都得到不同的结果,则表明您希望增加迭代次数。
(当然,在上面的例子中,我们谈论的是试图通过二维平面中的点拟合一条线,这不是什么findHomography
,但原理是一样的;通常仍然会有一个最大的内点集最终RANSAC会找到它。)
我怎样才能使这种行为实际上是随机的?
减少迭代次数 ( maxIters
) 以便 RANSAC 有时无法找到最大内点集。
但是除了纯粹的求知欲之外,通常没有理由这样做。您基本上会故意告诉 RANSAC 输出劣质模型。