随机抽样一致RANSAC: Random Sample Consensus

算法简介:

随机抽样一致算法(RANdom SAmple Consensus,RANSAC)。它采用迭代的方式从一组包含离群的被观测数据中估算出数学模型的参数。RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。

RANSAC的基本假设:

“内群”数据可以通过几组模型的参数来叙述其分布,而“离群”数据则是不适合模型化的数据。
数据会受噪声影响,噪声指的是离群,例如从极端的噪声或错误解释有关数据的测量或不正确的假设。
RANSAC假定,给定一组(通常很小)的内群,存在一个程序,这个程序可以估算最佳解释或最适用于这一数据模型的参数。

范例

这里用一个简单的例子来说明,在一组数据点中找到一条最适合的线。假设,此有一组集合包含了内群以及离群,其中内群为可以被拟合到线段上的点,而离群则是无法被拟合的点。如果我们用简单的最小二乘法来找此线,我们将无法得到一条适合于内群的线,因为最小二乘法会受离群影响而影响其结果。而RANSAC,可以只由内群来计算出模型,而且概率还够高。然而,RANSAC无法保证结果一定最好,所以必须小心选择参数,使其能有足够的概率。
随机抽样一致RANSAC: Random Sample Consensus_第1张图片
包含许多离群的一组数据,要找一条最适合的线。
随机抽样一致RANSAC: Random Sample Consensus_第2张图片
RANSAC找到的线,离群值对结果没影响(蓝色点为内群,红色点为离群)

概述

RANSAC算法的输入是一组观测数据(往往含有较大的噪声或无效点),一个用于解释观测数据的参数化模型以及一些可信的参数。RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:

  1. 有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。
  2. 用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。
  3. 如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。
  4. 然后,用所有假设的局内点去重新估计模型(譬如使用最小二乘法),因为它仅仅被初始的假设局内点估计过。
  5. 最后,通过估计局内点与模型的错误率来评估模型。
  6. 上述过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为比现有的模型更好而被选用。

算法

伪码形式的算法如下所示:

  • 输入:

    data —— 一组观测数据
    model —— 适应于数据的模型
    n —— 适用于模型的最少数据个数
    k —— 算法的迭代次数
    t —— 用于决定数据是否适应于模型的阀值
    d —— 判定模型是否适用于数据集的数据数目

  • 输出:

    best_model —— 跟数据最匹配的模型参数(如果没有找到好的模型,返回null)
    best_consensus_set —— 估计出模型的数据点
    best_error —— 跟数据相关的估计出的模型错误

  • iterations = 0

    best_model = null
    best_consensus_set = null
    best_error = 无穷大
    while ( iterations < k )
    maybe_inliers = 从数据集中随机选择n个点
    maybe_model = 适合于maybe_inliers的模型参数
    consensus_set = maybe_inliers

  • 估计的模型就足够合理

    for ( 每个数据集中不属于maybe_inliers的点 )
    if ( 如果点适合于maybe_model,且错误小于t )
    将点添加到consensus_set
    if ( consensus_set中的元素数目大于d )
    已经找到了好的模型,

  • 现在测试该模型到底有多好

    better_model = 适合于consensus_set中所有点的模型参数
    this_error = better_model究竟如何适合这些点的度量
    if ( this_error < best_error )
    我们发现了比以前好的模型,保存该模型直到更好的模型出现
    best_model = better_model
    best_consensus_set = consensus_set
    best_error = this_error

  • 迭代

    增加迭代次数
    返回 best_model, best_consensus_set, best_error

    RANSAC算法的可能变化包括以下几种:

    1. 如果发现了一种足够好的模型(该模型有足够小的错误率),则跳出主循环。这样可能会节约计算额外参数的时间。
    2. 直接从maybe_model计算this_error,而不从consensus_set重新估计模型。这样可能会节约比较两种模型错误的时间,但可能会对噪声更敏感。

    其实核心就是随机性和假设性。随机性用于减少计算了,那个循环次数就是利用正确数据出现的概率。所谓的假设性,就是说随机抽出来的数据我都认为是正确的,并以此去计算其他点,获得其他满足变换关系的点,然后利用投票机制,选出获票最多的那一个变换。

参数决定

假设每个点是真正内群的几率是w,则:

  • w = 真正内群的数目 / 数据总共的数量

通常我们不知道w 是多少, w n w^{n} wn是所选择的n 个点都是内群的几率, 1 − w n 1-w^{n} 1wn 是所选择的 n 个点至少有一个不是内群的几率, ( 1 − w n ) k {(1-w^{n})^{k}} (1wn)k是表示重复k 次都没有全部的 {\displaystyle n} n 个点都是内群的几率,假设算法跑 k 次以后成功的几率是p,那么:

1 − p = ( 1 − w n ) k {1-p=(1-w^{n})^{k}} 1p=(1wn)k
p = 1 − ( 1 − w n ) k {p=1-(1-w^{n})^{k}} p=1(1wn)k
所以如果希望成功几率高, p = 0.99 {\displaystyle p=0.99} p=0.99, 当n 不变时,k 越大, {\displaystyle p} p 越大, 当w 不变时,n 越大,所需的k 就越大, 通常w 未知,所以 n 选小一点比较好。

优点与缺点

  • RANSAC的优点是它能鲁棒的估计模型参数。例如,它能从包含大量局外点的数据集中估计出高精度的参数。
  • RANSAC的缺点是它计算参数的迭代次数没有上限;如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。
  • RANSAC只有一定的概率得到可信的模型,概率与迭代次数成正比。RANSAC的另一个缺点是它要求设置跟问题相关的阀值。
  • RANSAC只能从特定的数据集中估计出一个模型,如果存在两个(或多个)模型,RANSAC不能找到别的模型。

参考:

RANSAC
随机抽样一致

你可能感兴趣的:(VINS-Mono)