RANSAC笔记

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

什么叫RANSAC?

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

RANSAC的具体步骤?

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

输入:
1. 在RANSAC定义中,已经说过,它是一种求解已知模型的参数的框架。所以这个模型的形式,得给出。也就是说,你所求解的模型是一阶模型?二阶模型还是什么的…..你得给出来,这样模型需要求解的参数个数也就确定了。
2. 一堆数据。这一堆数据中是允许出现错误数据的(野点或者外点),也许你会纳闷为啥要给有错误的数据。这是因为在实际的数据采集中,难免受到噪声的污染,数据的准确性也就难以保证,所以存在错误数据是非常合理的情况。这也是RANSAC流行的原因,相比于最小二乘(线性回归),他对数据的错误的鲁棒性更好。有博文中写到,“对于包含80%误差的数据集,RANSAC的效果远优于直接的最小二乘法”,这个我没有证实,但是我相信应该是对的吧。
3. 迭代次数 k ,内外点距离阈值 t1 ,一致性集合大小阈值 t2 。这三个参数根据不同的问题,会有不同的值。现在也不介绍他们到底是什么意思,等算法步骤流程说完了再介绍他们,那样应该更加清晰明了。


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

  1. 从数据中随机选取模型参数估计的最少的数据(对于直线估计问题,两个点确定一条直线,当然就随机选取两个数据。),然后计算出直线方程。
  2. 然后计算数据集中其余点与已算出模型的距离 d ,当 d<t1 时就判定该点为内点(inlier),当 d>t1 就判定为外点(outlier)。然后统计内点个数 n ,当 n>t2 时就判定该模型为最优模型 mbest ,并记录该模型下的统计误差 errormin (即每个内点与模型的距离误差)。
  3. 然后重复上面的过程,当计算得到新的模型,比较其统计误差 error errormin 大小,如果 error 更小,就可以更新 mbest errormin
  4. 最后输出 mbest

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


参数的选择:

  1. 内外点距离阈值 t1 ,这个阈值是用来判定数据点是内点还是外点,一般没有一个统一的方法,只能通过实验得到。
  2. 迭代次数 k 一致性集合大小阈值 t2 ,当我们估计模型参数时,用 p 表示一些迭代过程中从数据集内随机选取出的点均为inlier的概率;用 w 表示每次从数据集中选取一个inlier的概率, w=inlier ,通常情况下,我们事先并不知道 w 的值,但是可以给出一些鲁棒的值。假设估计模型需要选定 n 个点, wn 是所有 n 个点均为局内点的概率; 1wn n 个点中至少有一个点为局外点的概率,此时表明我们从数据集中估计出了一个不好的模型。 (1wn)k 表示算法永远都不会选择到 n 个点均为局内点的概率,它和 1p 相同。因此, 1p=(1wn)k ,通过此式就可以计算 k 的最小值了,当然 k 越大越可能得到准确的模型,但是需要考虑时间效率。RANSAC只有一定的概率得到可信的模型,概率与迭代次数成正比。
  3. 一致性集合大小阈值 t2 ,这个是判定一个模型是否合理的阈值。

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

你可能感兴趣的:(图像局部特征)