在一般的拟合与估计算法中,一般均假设测量数据点误差来源仅发生在对该点的位置测量,并服从高斯分布(如最小二乘)。实际情况中,普遍存在一些测量数据点的数值由于前级测量失效、突发干扰等原因而严重偏离真实值。这些测量数据点对于高斯(或其他类型)误差分布来说是外点(outlier),或称错误点。即使外点的数量极少,但由于其数值很大,故若使用一般线性估计方法,得到的估计值会由于少数的扰动而与真实值有极大的偏差。因此,必须使用某种方法识别外点,并在拟合估计运算前进行剔除。本文介绍常用的三种方法:RANSAC方法、M-估计、最小中值估计。此外还有最大后验RANSAC方法数学理论较复杂,详情请参阅文献1
由于鲁棒算法均为尝试型算法,在具体实现中需要将拟合估计算法包裹起来作为内循环,以估计的偏差大小控制外循环的算法流程及终止条件。

RANSAC方法

对于一般模型 M 和给定的测量数据点集 D,RANSAC估计模型参数 p 的步骤如下:
1. 设估计模型参数 p 所需的最小数据点数为 n。由 n 个数据点组成的子集称为模型 M 的一个样本
2. 从数据点集 D 中随机抽取一个样本 J,由该样本计算模型的一个实例 Mp(J),确定与 Mp(J) 之间几何距离小于阈值 t 的数据点所构成的集合,称为实例 Mp(J) 的一致集,记为 S(Mp(J));
3. 经过 K 次随机抽样,选择数据点的个数 #S(Mp(J))最大的一致集 S(Mp(J)),用 S(Mp(J)) 重新估计模型 M,最后输出结果

几点说明:

  • 选择抽样次数K的依据是以某个极大的概率(如0.98)抽到不含外点的好样本,可通过K的期望和标准差估计得到。每个样本需要的数据点个数越少,所需抽样次数越少(指数级)。
  • 理论上,希望选择距离阈值t使得内点被接受的概率是 α,这在实践中是非常困难的,需要知道内点到模型之间几何距离的概率分布。故通常由经验选取。
  • 终止条件一般使用内点比例 w 、正确概率αf估计一个抽样次数,如果一致集大小相当于数据集的内点规模则终止。正确概率一般人工指定,内点比例采用自适应算法,初始时给出一个最保守(悲观)的内点比例估计,并由此确定抽样次数,在抽样过程中,一旦发现更大的内点比例,则按新比例更新该抽样次数。该算法保证了抽样次数,并且一定终止,是一种值得推荐的算法。
  • 在OpenCV中,函数SolvePnPRansacfindHomography内部调用了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%才能取得正确结果。
    当数据测量误差符合高斯分布时,最小中值方法的效率非常差。
  1. 吴福朝. 计算机视觉中的数学方法. 科学出版社. 2008.3 ↩
  2. O. Chum and J. Matas, “Matching with PROSAC—Progressive Sample Consensus,” Proc. IEEE Conf. Computer Vision and Pattern Recognition, 2005. ↩