随机采样一致性算法——RANSAC
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1−p = (1−wn)k
对上式的两边取对数,得出
值得注意的是,这个结果假设 n 个点都是独立选择的;也就是说,某个点被选定之后,它 可能会被后续的迭代过程重复选定到。这种方法通常都不合理,由此推导出的 k 值被看作是
选取不重复点的上限。例如,要从上图中的数据集寻找适合的直线,RANSAC 算法通常在每 次迭代时选取两个点,计算通过这两点的直线 maybe_model,要求这两点必须唯一。
四、参数
参数 t 和 d 的值必须根据特定的问题和数据集通过实验来确定。然而参数 k(迭代次数)可 以从理论结果推断。当我们选择 n 个点来估计模型参数时,用 p 表示一些迭代过程中从数 据集内选择出的点均为局内点的概率;此时,结果模型很可能有用,因此 p 也表征了算法 产生有用结果的概率。用 w 表示每次从数据集中选取一个局内点的概率,如下式所示: w = 局内点的数目 / 数据集的数目 通常情况下,我们事先并不知道 w 的值,但是可以给出一些鲁棒的值。假设估计模型需要 选定 n 个点,wn 是所有 n 个点均为局内点的概率;1−wn 是 n 个点中至少有一个点为局外 点的概率,此时表明我们从数据集中估计出了一个不好的模型。(1−wn)k 表示算法永远都不 会选择到 n 个点均为局内点的概率,它和 1-p 相同。因此,
maybe_inliers = 从数据集中随机选择n个点; maybe_model = 适合于maybe_inliers的模型参数; consensus_set = maybe_inliers;
for ( 每个数据集中不属于maybe_inliers的点 ) if ( 点适合于maybe_model并且误差小于t ) 将点添加到consensus_set;
RANSAC 算法可以进行如下改进: (1)如果发现了一个足够好的模型(该模型的误差相当小),则跳出主循环。这样可能会节 约计算额外参数的时间。 (2)直接从 maybe_model 计算 this_error,而不从 consensus_set 重新估计模型。这样可能 会节约比较两种模型误差的时间,但可能会对噪声更敏感。
一、范例
一个简单的例子是从一组观测数据中找出一条合适的 2 维直线。假设观测数据中包含局内点 和局外点,其中局内点近似的被直线所通过,而局外点远离于直线。简单的最小二乘法不能 找到适应于局内点的直线,原因是最小二乘法尽量去适应包括局外点在内的所有点。相反, RANSAC 能得出一个仅仅用局内点计算出的模型,并且概率还足够高。在这种情况下,RANSAC 并不能保证结果一定正确,为了保证算法有足够高的合理概率,我们必须小心的选择算法的 参数。
输出: best_model —— 跟数据最匹配的模型参数(如果没有找到好的模型返回null) best_consensus_set —— 估计出该模型的数据点 best_error ——该模型与相关数据的误差
iterations = 0; best_model = null; best_consensus_set = null; best_error = 无穷大; while ( iterations < k ) {
RANSAC 是“RANdom SAmple Consensus(随机采样一致性)”的缩写。它是从一组包含异常 值的观测数据集中估计其数学模型参数的迭代方法。RANSAC 是一种不确定算法,从某种意 义上说,它只有一定的概率得出一个合理的结果,提高这个概率需要增加迭代次数。该算法 最早由 Fischler 和 Bolles 于 1981 年提出。 RANSAC 的基本假设是:数据由“局内点”组成,例如数据的分布可以用一些模型参数来解 释,“局外点”是不能适应该模型的数据,除此之外的数据属于噪声。局外点产生的原因有 噪声的极值、错误的观测和对数据的错误假设等。RANSAC 也做了以下假设:给定一组(通 常很小的)局内点,存在一个可以估计模型参数的过程,该模型能够最优地解释或者适用于 这些数据。
if ( consensus_set中的元素数目大于d ) {
/* 我们可能找到了好的模型,现在测试该模型到底有多好 */ this_model = 适合于consensus_set中所有点的模型参数; this_error = this_model究竟如何适合这些点的度量; if ( this_error < best_error )
5. 最后,通过估计局内点与模型的误差来评估模型。 这个过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为 比现有的模型更好而被选用。
三、算法
伪代码形式的 C 语言算法表示如下:
输入: data —— 一组观测数据 model —— 适应于数据的模型 n —— 适用于模型的最少数据个数 k —— 算法的迭代次数 t —— 用于决定数据是否适应于模型的阈值 d —— 判定模型是否适用于数据集的数据数目
包含很多局外点的数据集
RANSAC 找到的直线(局外点并不影响结果)
二、概述
RANSAC 算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一 些可信的参数。 RANSAC 通过反复选择数据中的一组随机子集来达成目标。选择的子集被假设为局内点,并 用下述方法进行验证:
1. 有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。 2. 用 1 中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,Βιβλιοθήκη Baidu为它也 是局内点。 3. 如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。 4. 然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。
/* 我们发现了比以前所有模型都好的模型,保存该模型直到更好的模型出现 */ best_model = this_model; best_consensus_set = consensus_set; best_error = this_error; }
iterations++; } 返回 best_model, best_consensus_set, best_error
对上式的两边取对数,得出
值得注意的是,这个结果假设 n 个点都是独立选择的;也就是说,某个点被选定之后,它 可能会被后续的迭代过程重复选定到。这种方法通常都不合理,由此推导出的 k 值被看作是
选取不重复点的上限。例如,要从上图中的数据集寻找适合的直线,RANSAC 算法通常在每 次迭代时选取两个点,计算通过这两点的直线 maybe_model,要求这两点必须唯一。
四、参数
参数 t 和 d 的值必须根据特定的问题和数据集通过实验来确定。然而参数 k(迭代次数)可 以从理论结果推断。当我们选择 n 个点来估计模型参数时,用 p 表示一些迭代过程中从数 据集内选择出的点均为局内点的概率;此时,结果模型很可能有用,因此 p 也表征了算法 产生有用结果的概率。用 w 表示每次从数据集中选取一个局内点的概率,如下式所示: w = 局内点的数目 / 数据集的数目 通常情况下,我们事先并不知道 w 的值,但是可以给出一些鲁棒的值。假设估计模型需要 选定 n 个点,wn 是所有 n 个点均为局内点的概率;1−wn 是 n 个点中至少有一个点为局外 点的概率,此时表明我们从数据集中估计出了一个不好的模型。(1−wn)k 表示算法永远都不 会选择到 n 个点均为局内点的概率,它和 1-p 相同。因此,
maybe_inliers = 从数据集中随机选择n个点; maybe_model = 适合于maybe_inliers的模型参数; consensus_set = maybe_inliers;
for ( 每个数据集中不属于maybe_inliers的点 ) if ( 点适合于maybe_model并且误差小于t ) 将点添加到consensus_set;
RANSAC 算法可以进行如下改进: (1)如果发现了一个足够好的模型(该模型的误差相当小),则跳出主循环。这样可能会节 约计算额外参数的时间。 (2)直接从 maybe_model 计算 this_error,而不从 consensus_set 重新估计模型。这样可能 会节约比较两种模型误差的时间,但可能会对噪声更敏感。
一、范例
一个简单的例子是从一组观测数据中找出一条合适的 2 维直线。假设观测数据中包含局内点 和局外点,其中局内点近似的被直线所通过,而局外点远离于直线。简单的最小二乘法不能 找到适应于局内点的直线,原因是最小二乘法尽量去适应包括局外点在内的所有点。相反, RANSAC 能得出一个仅仅用局内点计算出的模型,并且概率还足够高。在这种情况下,RANSAC 并不能保证结果一定正确,为了保证算法有足够高的合理概率,我们必须小心的选择算法的 参数。
输出: best_model —— 跟数据最匹配的模型参数(如果没有找到好的模型返回null) best_consensus_set —— 估计出该模型的数据点 best_error ——该模型与相关数据的误差
iterations = 0; best_model = null; best_consensus_set = null; best_error = 无穷大; while ( iterations < k ) {
RANSAC 是“RANdom SAmple Consensus(随机采样一致性)”的缩写。它是从一组包含异常 值的观测数据集中估计其数学模型参数的迭代方法。RANSAC 是一种不确定算法,从某种意 义上说,它只有一定的概率得出一个合理的结果,提高这个概率需要增加迭代次数。该算法 最早由 Fischler 和 Bolles 于 1981 年提出。 RANSAC 的基本假设是:数据由“局内点”组成,例如数据的分布可以用一些模型参数来解 释,“局外点”是不能适应该模型的数据,除此之外的数据属于噪声。局外点产生的原因有 噪声的极值、错误的观测和对数据的错误假设等。RANSAC 也做了以下假设:给定一组(通 常很小的)局内点,存在一个可以估计模型参数的过程,该模型能够最优地解释或者适用于 这些数据。
if ( consensus_set中的元素数目大于d ) {
/* 我们可能找到了好的模型,现在测试该模型到底有多好 */ this_model = 适合于consensus_set中所有点的模型参数; this_error = this_model究竟如何适合这些点的度量; if ( this_error < best_error )
5. 最后,通过估计局内点与模型的误差来评估模型。 这个过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为 比现有的模型更好而被选用。
三、算法
伪代码形式的 C 语言算法表示如下:
输入: data —— 一组观测数据 model —— 适应于数据的模型 n —— 适用于模型的最少数据个数 k —— 算法的迭代次数 t —— 用于决定数据是否适应于模型的阈值 d —— 判定模型是否适用于数据集的数据数目
包含很多局外点的数据集
RANSAC 找到的直线(局外点并不影响结果)
二、概述
RANSAC 算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一 些可信的参数。 RANSAC 通过反复选择数据中的一组随机子集来达成目标。选择的子集被假设为局内点,并 用下述方法进行验证:
1. 有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。 2. 用 1 中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,Βιβλιοθήκη Baidu为它也 是局内点。 3. 如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。 4. 然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。
/* 我们发现了比以前所有模型都好的模型,保存该模型直到更好的模型出现 */ best_model = this_model; best_consensus_set = consensus_set; best_error = this_error; }
iterations++; } 返回 best_model, best_consensus_set, best_error