在一般的拟合与估计算法中,一般均假设测量数据点误差来源仅发生在对该点的位置测量,并服从高斯分布(如最小二乘)。实际情况中,普遍存在一些测量数据点的数值由于前级测量失效、突发干扰等原因而严重偏离真实值。这些测量数据点对于高斯(或其他类型)误差分布来说是外点(outlier),或称错误点。即使外点的数量极少,但由于其数值很大,故若使用一般线性估计方法,得到的估计值会由于少数的扰动而与真实值有极大的偏差。因此,必须使用某种方法识别外点,并在拟合估计运算前进行剔除。本文介绍常用的三种方法:RANSAC方法、M-估计、最小中值估计。此外还有最大后验RANSAC方法数学理论较复杂,详情请参阅文献1
由于鲁棒算法均为尝试型算法,在具体实现中需要将拟合估计算法包裹起来作为内循环,以估计的偏差大小控制外循环的算法流程及终止条件。
RANSAC方法
对于一般模型
M
和给定的测量数据点集
1. 设估计模型参数
2. 从数据点集
3. 经过
K
次随机抽样,选择数据点的个数
几点说明:
- 选择抽样次数K的依据是以某个极大的概率(如0.98)抽到不含外点的好样本,可通过K的期望和标准差估计得到。每个样本需要的数据点个数越少,所需抽样次数越少(指数级)。
- 理论上,希望选择距离阈值t使得内点被接受的概率是
α ,这在实践中是非常困难的,需要知道内点到模型之间几何距离的概率分布。故通常由经验选取。- 终止条件一般使用内点比例
w
、正确概率
αf 估计一个抽样次数,如果一致集大小相当于数据集的内点规模则终止。正确概率一般人工指定,内点比例采用自适应算法,初始时给出一个最保守(悲观)的内点比例估计,并由此确定抽样次数,在抽样过程中,一旦发现更大的内点比例,则按新比例更新该抽样次数。该算法保证了抽样次数,并且一定终止,是一种值得推荐的算法。 在OpenCV中,函数
SolvePnPRansac
findHomography
内部调用了RANSACPointSetRegistrator
类进行RANSAC解算,详见这篇博客此外还有改进的PROSAC2方法,将点初始集匹配的结果作为排序的依据,使得在采样时根据匹配结果由高到低的得分进行排序,这样最有可能得到最佳参数的采样会较早出现,提高了速度。
M-估计
在M-估计中,对残差进行饱和函数运算,限制单个数据点对于误差函数的影响力。其思想类似于L1的稀疏性。
使用的函数称为M-估计子,如通常使用的Huber估计子为
ρ(t;σ)={t2σ2|t|<σ|t|>=σ
在残差较小时取值为残差的平方,残差较大时取一个常值的平方。
另一些选择
ρ(t;σ)=t2t2+σ2ρ(t;σ)=⎧⎩⎨⎪⎪t2σ|t|0|t|<σσ<=|t|<3σ|t|>=3σ
最后这个估计子当残差较大时,被认为是错误的,在估计中不起作用。这是设置估计子是比较合理的,然而使得求解变为非凸优化,较难。最小中值估计
最小中值方法通过求解下述最小化问题来估计模型参数
Min Median{|r2j(xj,p)|}
与RANSAC相比,不采用一致集内点的个数来衡量样本的好坏,而是根据样本,计算所有数据点到样本的偏差,以偏差的中位数衡量样本好坏,从而避免了使用划分内点和外点距离阈值的先验知识。缺点是,要求错误数据点必须小于50%才能取得正确结果。
当数据测量误差符合高斯分布时,最小中值方法的效率非常差。
- 终止条件一般使用内点比例
w
、正确概率