您的位置:首页 > 其它

RANSAC笔记

2015-11-01 19:16 288 查看
刚来实验室那会儿,每周组会汇报,师兄报告时,和老板讨论,总听到“那就对数据RANSAC一下”……当时我怯生生的问了一下师兄,啥叫RANSAC?现在也不记得师兄咋解释的,后来自己也经常调用matlab里的ransac函数求解单应性矩阵,但是对其具体原理我还真没花时间去了解一下,今天就做一下笔记,理解理解什么叫RANSAC。

什么叫RANSAC?

直译过来随机采样一致性(random sample consensus)。具体什么意思,了解其算子过程和原理就很容易理解了。这里我想首先强调的一点就是,RANSAC是一种思想,一个求解已知模型的参数的框架。它不限定某一特定的问题,可以是计算机视觉的问题,同样也可以是统计数学,甚至可以是经济学领域的模型参数估计问题。

RANSAC的具体步骤?

谈算法的步骤之前,首先得说明这个算法的输入输出,然后才是是具体算法步骤。

输入:

1. 在RANSAC定义中,已经说过,它是一种求解已知模型的参数的框架。所以这个模型的形式,得给出。也就是说,你所求解的模型是一阶模型?二阶模型还是什么的…..你得给出来,这样模型需要求解的参数个数也就确定了。

2. 一堆数据。这一堆数据中是允许出现错误数据的(野点或者外点),也许你会纳闷为啥要给有错误的数据。这是因为在实际的数据采集中,难免受到噪声的污染,数据的准确性也就难以保证,所以存在错误数据是非常合理的情况。这也是RANSAC流行的原因,相比于最小二乘(线性回归),他对数据的错误的鲁棒性更好。有博文中写到,“对于包含80%误差的数据集,RANSAC的效果远优于直接的最小二乘法”,这个我没有证实,但是我相信应该是对的吧。

3. 迭代次数kk,内外点距离阈值t1t_1,一致性集合大小阈值t2t_2。这三个参数根据不同的问题,会有不同的值。现在也不介绍他们到底是什么意思,等算法步骤流程说完了再介绍他们,那样应该更加清晰明了。

算法流程

下面均已从一堆点中估计直线方程这个问题进行展开,其他比如单应性矩阵求解等问题可以类比。

从数据中随机选取模型参数估计的最少的数据(对于直线估计问题,两个点确定一条直线,当然就随机选取两个数据。),然后计算出直线方程。

然后计算数据集中其余点与已算出模型的距离dd,当d<t1d时就判定该点为内点(inlier),当d>t1d>t_1就判定为外点(outlier)。然后统计内点个数nn,当n>t2n>t_2时就判定该模型为最优模型mbestm_{best},并记录该模型下的统计误差errorminerror_{min}(即每个内点与模型的距离误差)。

然后重复上面的过程,当计算得到新的模型,比较其统计误差errorerror与errorminerror_{min}大小,如果errorerror更小,就可以更新mbestm_{best}和errorminerror_{min}。

最后输出mbestm_{best}

所以不同的问题,主要区别就在第一步,利用最少的数据求解模型参数的方法上,这个涉及到不同问题的求解原理。

参数的选择:

内外点距离阈值t1t_1,这个阈值是用来判定数据点是内点还是外点,一般没有一个统一的方法,只能通过实验得到。

迭代次数kk一致性集合大小阈值t2t_2,当我们估计模型参数时,用pp表示一些迭代过程中从数据集内随机选取出的点均为inlier的概率;用ww表示每次从数据集中选取一个inlier的概率,w=inlier的数目数据集的数目w=\frac{ inlier的数目}{数据集的数目},通常情况下,我们事先并不知道ww的值,但是可以给出一些鲁棒的值。假设估计模型需要选定nn个点,wnw^n是所有nn个点均为局内点的概率;1−wn1-w^n是nn个点中至少有一个点为局外点的概率,此时表明我们从数据集中估计出了一个不好的模型。 (1−wn)k(1-w^n)^k表示算法永远都不会选择到nn个点均为局内点的概率,它和1−p1-p相同。因此,1−p=(1−wn)k1-p=(1-w^n)^k,通过此式就可以计算kk的最小值了,当然kk越大越可能得到准确的模型,但是需要考虑时间效率。RANSAC只有一定的概率得到可信的模型,概率与迭代次数成正比。

一致性集合大小阈值t2t_2,这个是判定一个模型是否合理的阈值。

下面这张图是我用RANSAC求取单应性矩阵后,进行的图像拼接,由于自己匆匆忙忙写的,效果确实不咋好,就是意思意思一下。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: