RANSAC(RAndom SAmple Consensus,随机采样一致)算法在很多方面如图像匹配、曲线/平面拟合取得了良好的应用。这里以笔记的形式对其进行一个简要的介绍总结。
RANSAC算法的一个基本的假设是:一组数据由“内点”(inliers)和“外点”(outliers)组成,其中“内点”就是组成模型参数的数据,而“外点”就是不适合模型的数据。
RANSAC算法的目标就是在一组含有少量“内点”,大量“外点”的数据中,估计出一个符合“内点”数据的模型。
RANSAC算法基本思想
- 假设存在一个样本集 P P P,考虑一个能够估计出模型 M M M所需的大小为 n n n最小抽样子集 S S S(比如说直线拟合,则抽样子集大小 n = 2 n=2 n=2,平面拟合,则抽样子集大小 n = 3 n=3 n=3);
- 使用这个抽样选取的子集进行计算初始化数据模型;
- 针对余集 S C = P − S SC=P-S SC=P−S,代入步骤2中所估计出的模型,若其误差小于设置的阈值 t t t 则认为其是内点,所有的内点组成内点集 S ∗ S^{*} S∗(也成为子集 S S S的一致集)统计个数。
- 比较此次迭代和之前迭代中内点集中内点个数的大小,记录较大“内点”数的模型参数和“内点”数。
- 重复上述步骤1-4的过程,直到当前迭代已经足够好了,即内点集 S ∗ S^{*} S∗的大小 N N N大于一定的阈值 N t N_{t} Nt则认为此数据模型符合要求。并利用 S ∗ S^{*} S∗中的内点采用最小二乘等方法进行重新计算数据模型 M ∗ M^{*} M∗。
讨论
由上述过程中,我们可以了解到在RANSAC算法需要设置以下四个参数:
- 抽样子集大小 n n n
- 用于决定数据是否适应于模型的误差阀值 t t t
- 判断内点集 S ∗ S^{*} S∗的大小是否适用于数据集的阈值 N t N_t Nt
- 迭代次数 K K K
分别对其进行讨论:
-
抽样子集大小 n n n
其中抽样子集的大小 n n n 可以通过模型的类型进行判断,如直线拟合选取2个点,平面选取3个点。 -
误差阀值 t t t
可以根据适用模型需要自主设置。比如说曲线拟合的偏差、图像匹配中的错误匹配点对等等。 -
判断内点集 S ∗ S^{*} S∗的大小是否适用于数据集的阈值 N t N_t Nt
由于RANSAC算法是基于数据驱动的模型估计方法,所以在处理粗差小于50%的情况时,其效果比较可靠。因此,内点集 S ∗ S^{*} S∗大小的阈值 N t N_t Nt可以设置为数据集总体大小的一半。 -
迭代次数 K K K
假设在数据中,“内点”个数的占比为 W W W
W = n u m i n l i e r s n u m i n l i e r s + n u m o u t l i e r s W=\frac{num_{inliers}}{num_{inliers}+num_{outliers}} W=numinliers+numoutliersnuminliers
实际实验过程中,我们并不会知道 W W W的值,但是可以给出一个鲁棒的经验值。
对于每一次迭代过程中选取 n n n个点作为子集 S S S,则子集 S S S中至少存在一个点不为“内点”的概率为:
1 − W n 1-W^{n} 1−Wn
那么 K K K 次迭代中,每次都至少有一个“外点”的情况所发生的概率为:
( 1 − W n ) K (1-W^{n})^{K} (1−Wn)K
即,能够在 K K K 次迭代中正确选取 n n n 个点,且都为“内点”的概率为:
P = 1 − ( 1 − W n ) K P=1-(1-W^{n})^{K} P=1−(1−Wn)K
这个 P P P值就代表了我们所期待RANSAC算法能够正确计算出数据模型的概率,可以根据自己的需求进行设置。
变换上式:
( 1 − W n ) K = 1 − P K = l o g ( 1 − W n ) 1 − P K = l o g ( 1 − P ) l o g ( 1 − W n ) (1-W^{n})^{K}=1-P\\K={log^{1-P}_{(1-W^{n})}}\\K=\frac{log(1-P)}{log(1-W^{n})} (1−Wn)K=1−PK=log(1−Wn)1−PK=log(1−Wn)log(1−P)
上式中
W
W
W可以根据经验值进行设置,
P
P
P是我们所期待的正确计算数据模型的概率,可以自主设置,这样就得到了迭代次数。
当然,如果我们事先实在不知道
W
W
W的值,可以使用自适应迭代次数的方法。即开始时设定一个较大的迭代次数,然后每次更新模型参数估计的时候,用当前的“内点”比值代入公式中的
W
W
W来估算出迭代次数。