RANSAC 原理
RANSAC, Random Sample Consensus(随机抽样一致算法)是一个通用的鲁棒估计算法,由Fischler和Bolles提出文献。
算法原理很简单,如图:
现以平面点集拟合直线为例进行说明。已知点集
(xi,yi),∀i∈ n
,估计直线
y=kx+b
。
根据RANSAC算法思想,得到如下步骤:
- 随机地从 (xi,yi),∀i∈ n 中选择2个点,得到一条直线L1;
- 计算其它点到直线L1的距离,确定距离小于阈值 Td 的点集 Si ;
- 如果 Si 中点的个数大于阈值 Tn ,则该直线L1即为所求;
- 如果 Si 中点的个数小于阈值 Tn ,选择新的2个点,重复上述过程;
经过 N 次重复后,选择具有最多点的个数的点集
Si ,其对于的直线即为所求。
三个问题:
- 什么是距离阈值?
我们希望选择的距离阈值 t 使点为内点的概率是α 。该计算需要知道内点到模型距离的概率分布。实际中距离阈值通常靠经验选取,但是,如果假定测量误差为均值为0,标准差为 σ 的高斯分布,那么 t 的值可以计算出来。
- 采样多少次为宜?
尝试每个可能的样本通常在计算上不可行也不必要。只要采样次数N足够大,保证由s 个点组成的随机样本中至少有一次没有野值点的概率是 p 。通常,p=0.99 。假定 w 是任意选择一个数据点为内点的概率,那么,ϵ=1−w 是其为野值点的概率,从而至少需要N次选择,每次 s 个点,其中(1−ws)N=1−p , 得到 N=log(1−p)/log(1−(1−ϵ)s) 。
- 一致集多大为宜?
根据经验,给定野值的假定比率后,如果一致集大小接近期望属于该数据集的内点数时迭代就停止,即对 n 个数据,T=(1−ϵ)n .对于直线拟合的例子, ϵ 的保守估计是 ϵ=0.2 ,因此 T=(1−0.2)∗12=10 。