方法简介
渐进一致采样法1 (PROSAC) 是对经典的 RANSAC2 中采样的一种优化。相比经典的 RANSAC 方法均匀地从整个集合中采样,PROSAC 方法是从不断增大的最佳对应点集合中进行采样的。所以这种方法可以节省计算量,提高运行速度。
详细内容
1. 引入
假设: 具有更高相似性的数据点更可能是类内点(根据相似性进行排序的半随机采样不会比完全随机采样的效果更差)
1.1. 标记说明
N 个数据点的集合记作 UN,根据评价函数 q,UN 内数据点被降排序为:
ui,uj∈UN:i<j⇒q(ui)>q(uj)
评价最好的 n 个数据点集合记作 Un
从数据集 Un 中的采样点集合记作 M,其元素个数为 ∣M∣=m
采样点集合的评价函数被定义为其所有元素评价函数值中最小的评价函数值:
q(M)=ui∈Mminq(ui)
2. 算法
由于 PROSAC 不是从所有数据点中进行随机采样,而是需要先对数据点进行排序,然后在评价函数值最高的数据点子集中进行随机采样,这个子集被称为假设生成集,并且这个假设生成集的元素数量是不断增大的。那么现在就会面临两个问题:
- 假设生成集的大小如何确定?
- 采样过程的停止策略是什么?
2.1 生长函数和采样
生长函数是用来确定假设生成集的大小的。它既不能过分乐观地依赖评价函数的预排序作用,也不能太消极地对所有数据点都相同看待。用 P{ui} 表示 ui 是正确点的概率,我们对这个概率和评价函数之间的联系做一个最小的假设,即单调性假设:
i<j⇒q(ui)≥q(uj)⇒P{ui}≥P{uj}
用 {Mi}i=1TN 表示 TN 次采样点集合的序列,且每次采样都是从 N 个数据点中选取其中的 m 个,即 Mi∈UN。用 {M(i)}i=1TN 表示根据评价函数排序之后的序列,则有:
i<j⇒q(M(i))≥q(M(j))
用 Tn 表示 {Mi}i=1TN 中所有元素都来源于 Un 的采样点集合 Mi 的平均个数,则有:
Tn=TN(mN)(mn)=TNi=0∏m−1N−in−i TnTn+1=i=0∏m−1N−in+1−ii=0∏m−1n−iN−i=n+1−mn+1
最终它们之间的递归关系为:
Tn+1=n+1−mn+1Tn
平均来说有 Tn 个采样点集合只包含 Un 的数据点,有 Tn+1 个采样点集合只包含 Un+1 的数据点。由于 Un+1=Un∪{un+1},所以就有 Tn+1−Tn 个采样点集合包括一个数据点 un+1 和 m−1 个来源于 Un 的数据点。所以让 n 从 m 一直取值到 N−1,这样就可以随机且高效地得到采样点集合 M(i).
由于 Tn 的值一般不是整数,我们令 Tm′=1,并且有:
Tn+1′=Tn′+⌈Tn+1−Tn⌉
其中 ceil 括号表示取大于或等于括号中值的最小整数。所以生长函数可以被定义为:
g(t)=min{n:Tn′≥t}
这样第 t 个采样点集合 Mt 可以表示为:
Mt={ug(t)∪Mt′}
其中 Mt′∈Ug(t)−1 是一个包含 m−1 个来源于 Ug(t)−1 的数据点的集合,这样参数 TN就表示需要多少次采样,PROSAC 算法的效果会和 RANSAC 算法保持一致。
2.2 停止策略
如果集合 Un∗ 中的类内点数 In∗ 满足下面的条件,PROSAC 算法就停止:
- 非随机性——n∗ 个数据点中的类内点恰好也是任意一个错误模型的类内点的概率小于 Ψ (一般设为 5%)
- 极大性——存在一个解在 Un∗ 中有比 In∗ 更多的类内点的情况,并且这种情况在 k 次采样后还未被发现的概率小于 ηo (一般设为 5%)
非随机性可以防止由类外点产生的模型也和算法一致。随机类内点集合的元素个数的分布是二项分布:
PnR(i)=βi−m(1−β)n−i+m(i−mn−m)
其中 β 是与一个错误模型相对应的点不在采样点集合中的概率,并且该采样点集合包含一个类外点。(上面的公式可以这样理解:错误模型是由 m 个采样点确定的,得到与该模型相对应的点有 i≥m 个【这 i 个点就是错误模型认为的类内点,也就是所谓的随机类内点集合】,那么不在采样点集合 M 中的点有 i−m 个,数据集中的一个点是这样的点的概率为 β,所以可以得到随机类内点集合(∈Un)的元素个数为 i 的概率就是 PnR(I).)
最少的类内点数 Inmin 可以通过下面的式子得到(也就是限制随机类内点集合元素数量较大的概率):
Inmin=min{j:i=j∑nPnR(i)<Ψ}
在 Un∗ 中发现一个非随机的结果必须要满足:
In∗≥In∗min
极大性定义了需要多少次采样才能保证解的置信度,这也是 RANSAC 算法中唯一的停止策略。从 Un 中采样得到的 m 个点都来自于类内点的概率为:
PIn=(mn)(mIn)=j=0∏m−1n−jIn−j≈εnm
其中 In 是 Un 中类内点的数量,εn=In/n 表示类内点数的比例。那么 k 次采样也没有一次采样都是类内点的概率为(g(k)≤n):
η=(1−PIn)k
所以在给定概率阈值 ηo 的后,采样次数需要满足下面的条件:
kn∗(ηo)≥log(ηo)/log(1−PIn∗)
最终 n∗ 的大小是在满足 In∗≥In∗min 的条件下最小化 kn∗(ηo) 得到的。
PROSAC算法

3. 实验
作者在基于 SIFT 的图像匹配中使用了 PROSAC 算法,并和 RANSAC 进行了对比,详细的实验内容和参数参考文献[1],下面的图片完全是为了好看才放在这里的。

4. 结论
这种方法可以非常有效地节省运算量和时间。由于减少了一个相关性阈值参数,所以可以对多种情况的检测有比较好的鲁棒性。
这里抱怨一下,这篇论文对于我来说实在是太难读懂了,一大堆从句让人抓狂。不过还是挺佩服这两个作者的,几乎所有的 RANSAC 相关的论文都是他们写的。
参考文献