一、概述

RANSAC(RANdom SAmple Consensus)随机抽样一致,是用来从一组观测数据中估计数学模型参数的一种方法。由于是观测数据,避免不了有误差存在,当误差太大了就变成了无效数据outlier(与outlier对应的是inlier有效数据)。如果我们在估计参数的时候没有剔除掉这些无效的数据,结果会被这些无效数据所影响。所以我们希望采用一种方法从数据集的inliers中估计模型参数,这就是RANSAC.

二、算法描述

1.  输入

  • 数据------------------------------------一组观测数据
  • 模型------------------------------------含有参数的模型
  • 确定模型参数的最小数据个数n---例如确定一条直线至少要两个点
  • 最大迭代次数k-----------------------最大迭代次数
  • 误差阈值t-----------------------------误差在阈值t之内,则认为是有效数据
  • 符合模型数据的个数d--------------如果数据中有d个数据符合迭代中产生的模型,则认为该模型有效,即可以认为该模型包含足够都的有效数据

2. 输出

  • 模型参数(成功找到合适的模型)或NULL(没有找到合适的参数)

3. 步骤

  • 从数据中随机挑选n个数据,假设这n个数据都是有效的(只是算法认为其有效,并非真正有效),用这个n个数据求出模型参数(例如用解方程组的方法)
  • 用第一步生成的模型依次验证剩下的数据,统计在误差阈值t之内的数据个数c,如果c>d,认为该模型有效,否则认为该模型无效,转第一步
  • 把第一步n个数据和第二步c个数据合并,检测该模型对这些数据的拟合程度,即检查该模型参数基于有效数据的好坏程度,如果比当前最好的参数好,则更换最好参数为当前参数
  • 增加迭代次数,返回第一步

4. 具体描述

iterations =
bestfit = null
besterr = something really large
while iterations < k {
maybeinliers = n randomly selected values from data
maybemodel = model parameters fitted to maybeinliers
alsoinliers = empty set
for every point in data not in maybeinliers {
if point fits maybemodel with an error smaller than t
add point to alsoinliers
}
if the number of elements in alsoinliers is > d {
//this implies that we may have found a good model
// now test how good it is
bettermodel = model parameters fitted to all points in maybeinliers and alsoinliers
thiserr = a measure of how well model fits these points
if thiserr < besterr {
bestfit = bettermodel
besterr = thiserr
}
}
increment iterations
}
return bestfit

三、举例

譬如现在有一组测量的二维点数据,分布如下:

图中红色点为无效数据,蓝色点为有效数据,我们期望拟合出一条如上图的直线,然而不排除这些无效数据的话,直接采用最小二乘法会的到如下一条直线:

假设共有50个点,按照RANSANC的思路:

  • 从50个点随机选两个点确定一条直线L
  • 基于L验证剩下的48个点中误差在t之内的数据个数,记为inlierNum,如果inlierNum < d,则表示这条直线不够好,返回第一步
  • 计算第一步中的两个点和第二步中的inlierNum个点对与该直线L的残差平方和thiserr,如果thiserr<besterr,则设这个参数为最优,否则丢弃
  • 继续迭代

四、参数确定

注意上面的输入数据中,除了数据和模型之外还有一些参数,那这些参数怎么确定呢?

通常n的值由模型确定,t和d的值有观测数据和具体应用共同由实验确定。而k的值可以从理论上进行确定,直观上来讲k值越大求得最优参数的概率就越大。假设算法迭代k次能在初始选择数据时选择的都是有效数据的概率为p,数据集中有效数据的比率为w(w = 有效数据数/总数据数),w一般是不知道的,但可以估计的偏小一点,让算法更鲁棒。n次都选择为有效数据的概率为w^n,至少有一次选择到了无效数据的概率为1-w^n,连续k次每次都至少有一次选择到了无效数据的概率为(1-w^n)^k。

有:1-p = (1-w^n)^k

则:k = log(1-p)/log(1-w^n)

假设设定p = 0.98则就能确定k=log(0.02)/log(1-w^n).通常这样确定的k要比k的实际上界偏小一点,因为上面的计算每次选择一个数据都是基于全部数据选择的,即有放回的选取,实际上不能这样,选择的时候要求数据不能重复出现。故还要在k的基础上加上一个额外值:

SD(k) = [(1-w^n)^1/2]/w^n

即实际上:k = log(1-p)/log(1-w^n)  + [(1-w^n)^1/2]/w^n.

RANSAC的更多相关文章

  1. RANSAC算法笔记

    最近在做平面拟合,待处理的数据中有部分噪点需要去除,很多论文中提到可以使用Ransac方法来去除噪点. 之前在做图像配准时,用到了Ransac算法,但是没有去仔细研究,现在好好研究一番. 参考: ht ...

  2. RANSAC 剔除错误匹配 估计模型

    随机抽样一致,这个算法,我以前一直都没有理解透彻.只知道可以用来直线拟合,网上大多数中文博客也都是写直线拟合的,但是用来匹配二维特征的时候,总还是没弄明白. 基本概念参考 http://www.cnb ...

  3. 随机抽样一致性算法(RANSAC)示例及源代码

    作者:王先荣 大约在两年前翻译了<随机抽样一致性算法RANSAC>,在文章的最后承诺写该算法的C#示例程序.可惜光阴似箭,转眼许久才写出来,实在抱歉.本文将使用随机抽样一致性算法来来检测直 ...

  4. SIFT+HOG+鲁棒统计+RANSAC

    今天的计算机视觉课老师讲了不少内容,不过都是大概讲了下,我先记录下,细讲等以后再补充. SIFT特征: 尺度不变性:用不同参数的高斯函数作用于图像(相当于对图像进行模糊,得到不同尺度的图像),用得到的 ...

  5. RANSAC随机一致性采样算法学习体会

    The RANSAC algorithm is a learning technique to estimate parameters of a model by random sampling of ...

  6. RANSAC和Flitline

    [blog算法原理]RANSAC和FitLine ​ 如果已经有一系列图片,需要拟合出最为合适的一条直线出来,这个时候你会选择RANSAC还是FitLine. 一.算法定义: RANSAC是实际运用非 ...

  7. 理论沉淀:RANSAC算法

    1.解决问题: 当一组样本数据中含有(较小波动的)正常数据(inliers)和(较大波动的)异常数据(outliers)且异常数据的量还不小于正常数据的量时,用最小二乘法将难以获得期望的直线(即能拟合 ...

  8. PCL—低层次视觉—点云分割(RanSaC)

    点云分割 点云分割可谓点云处理的精髓,也是三维图像相对二维图像最大优势的体现.不过多插一句,自Niloy J Mitra教授的Global contrast based salient region ...

  9. 在vs中跑动ransac

    期间遇到很多问题. 记一个最主要的是: LINK2019 无法识别的外部符号,然后某一个函数的函数名 然后是 @@函数名 (@) 大概长成这样.或者还就根本就是 无法识别的外部符号. 解决方案: 我这 ...

  10. 随机抽样一致性算法(RANSAC)

    本文翻译自维基百科,英文原文地址是:http://en.wikipedia.org/wiki/ransac,如果您英语不错,建议您直接查看原文. RANSAC是"RANdom SAmple ...

随机推荐

  1. jeecg-boot 简易部署方案

    jeecg-boot采用前后端分离的方案,前后端代码不在一起.想要部署 一般是通过反向代理实现. jeecg-boot目前支持更好更简单的解决方案: jeecg 在配置文件里面指定了 webapp的存 ...

  2. Android中 Git 使用中几个概念

    1.仓库(版本库) 版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史 ...

  3. Java学习笔记 -- Java定时调度工具Timer类

    1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...

  4. Linux gzip命令

    语法: gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][--best/fast][文件...] 或 gzip [-acdfhlLnN ...

  5. jQuery横向上下排列鱼骨图形式信息展示代码时光轴样式(转自CSDN,原文链接附于文中)

    原文链接:http://www.jqueryfuns.com/resource/2173 $.fn.fishBone = function(data) { var colors = ['#F89782 ...

  6. idea2018.1.5激活教程

    这是地址  链接: https://pan.baidu.com/s/1lx5AfMjADYFcQARi7_GNIw 密码: nvfi 1下载解压到任意目录(前提你能找到) 2将复制到 bin目录下 如 ...

  7. tensorflow 升级到1.9-rc0,tensorboard 报错:TypeError: GetNext() takes exactly 1 argument (2 given)

    Exception in thread Reloader:Traceback (most recent call last):  File "/usr/lib/python2.7/threa ...

  8. spring cloud Ribbon

    参考:https://www.jianshu.com/p/1bd66db5dc46 Ribbon 是什么 spring cloud ribbon 是一个基于HTTP 和 TCP 的客户端负载均衡工具, ...

  9. PhoenixFD插件流体模拟——UI布局【Rendering】详解

    Liquid Rendering 流体渲染  本文主要讲解Rendering折叠栏中的内容.原文地址:https://docs.chaosgroup.com/display/PHX3MAX/Liqui ...

  10. LR实现问答系统查询功能

    脚本中未对问题进行参数化处理,关键点在于关联取值和web_add_header()函数的使用 Action() { web_url("首页", "URL=http://q ...