USAC方法与框架 OpenCV v4.8.0

author:

  • Maksym Ivashechkin bibliography: ‘bibs.bib’ csl: ‘acm-sigchi-proceedings.csl’ date: August 2020 title: ‘Google Summer of Code: OpenCV 中随机样本共识的改进’ …

贡献

OpenCV calib3d 模块的集成部分是用 C++ 编写的基于 RANSAC 的通用框架 USAC(命名空间 usac)。该框架包括用于采样、验证或局部优化的各种先进方法。该框架的主要优势在于其对任何估计问题的独立性和模块化结构。因此,可以很容易地添加/删除新的求解器或方法。到目前为止,该框架包括以下组件:

  1. 采样方法:
    a. Uniform - [8] 中提出的标准 RANSAC 采样,以随机均匀的方式独立抽取最小子集。这是拟议框架的默认选项。
    b. PROSAC - 假设输入数据点按质量排序的方法[4],因此可以从最有希望的点开始采样。这种方法的对应点可以按 SIFT 检测器获得的最佳匹配点与第二匹配点的描述符距离之比进行排序。建议使用这种方法,因为它能找到好的模型,并能更早终止。
    c. NAPSAC - 抽样方法[10],该方法随机均匀抽取初始点,并在初始点附近对其余点进行最小抽样。当模型局部化时,这种方法可能非常有用。例如,用于平面拟合。然而,在实际应用中,这种方法在退化问题和定义最佳邻域大小方面存在困难。
    d. 渐进-NAPSAC–与 NAPSAC 类似的采样器 [2],不过它是从局部开始,逐渐收敛到全局采样。如果预计会出现局部模型,但数据分布可能是任意的,那么这种方法就会非常有用。实施版本假定数据点按 PROSAC 的质量排序。
  2. 评分法。USAC 和标准 RANSAC 都能找到使总损失最小的模型。损失可以用以下函数表示:
    a. RANSAC - 二进制 0 / 1 损失。离群值为 1,离群值为 0。如果目标是找到尽可能多的离群值,则这是个不错的选择。
    b. MSAC - 点到模型的截断平方误差距离。框架中的默认选项。模型的离群值可能没有使用 RANSAC 分数那么多,但会更准确。
    c. MAGSAC - 计算得分的无阈值方法[3]。虽然使用最大西格玛(噪声标准偏差)水平对点的残差进行西格玛边际化。点的得分代表该点成为离群点的可能性。由于该方法不需要阈值,因此在图像噪声未知的情况下推荐使用。不过,还是建议至少提供近似阈值,因为终止本身就是基于误差小于阈值的点的数量。如果阈值为 0,该方法将在达到最大迭代次数后输出模型。
    d. LMeds - 误差平方距离的最小中值。在该框架中,使用快速排序算法可以以 O ( n ) O(n) O(n) 的复杂度高效地找到中位数。需要注意的是,当离群点比率小于 50%时,LMeds 无法正常工作,而在其他情况下,这种方法是稳健的,不需要阈值。
  3. 误差度量,描述点到估计模型的误差距离。
    a. 再投影距离–用于仿射、同向和投影矩阵。对于同形,也可以使用对称再投影距离。
    b. 桑普森距离 - 用于基本矩阵。
    c. 对称几何距离 - 用于基本矩阵。
  4. 退化
    a. DEGENSAC - 用于基本矩阵估计的方法[7],可有效验证和恢复最小样本中至少有 5 个点位于主平面上的模型。
    b. 共线性检验–对于仿射矩阵和同轴矩阵估计,检验是否有 3 个点位于直线上。对于同轴矩阵,由于点是平面的,因此要进行测试,检查最小样本中的点是否位于样本中任意两点交叉的任意直线的同一侧(不假定反射)。
    c. 方向外极约束–用于外极几何的方法[6],可验证模型(基本矩阵和重要矩阵)在摄像机前方是否有可见点。
  5. SPRT 验证–该方法[9]通过对随机洗牌点的评估来验证模型,使用的统计属性包括离群点概率、估算相对时间、输出模型的平均数量等。这种方法大大加快了框架的速度,因为无需明确计算每个点的误差,就能快速剔除坏模型。
  6. 局部优化:
    a. 局部优化 RANSAC - 通过非最小估计迭代改进迄今最佳模型的方法 [5]。框架中的默认选项。这个程序是最快的,而且并不比其他局部优化方法差。
    b. Graph-Cut RANSAC–该方法[1]可完善迄今为止的最佳模型,但它利用了数据点的空间一致性。该程序相当精确,但计算速度较慢。
    c. Sigma Consensus(西格玛共识)–该方法[3]通过应用非最小加权估计来改进模型,其中权重的计算逻辑与 MAGSAC 分数相同。这种方法最好与 MAGSAC 评分一起使用。
  7. 终止:
    a. 标准 - 独立均匀抽样的标准方程。
    b. PROSAC - PROSAC 的终止。
    c. SPRT - SPRT 的终止。
  8. 求解器。框架中有最小求解器和非最小求解器。最小求解器采用标准估计方法。在非最小求解器中,通常会建立协方差矩阵,并根据最高特征值对应的特征向量找到模型。
    a. Affine2D 矩阵
    b. 同构矩阵 - 在最小求解器中使用 OpenCV 的 RHO(高斯消除)算法。
    c. 基本矩阵–对于 7 点算法,使用高斯消除(消除到上三角矩阵并反向置换)而不是 SVD 来找到两个空向量,然后求解 3 度多项式。8 点求解器也使用高斯消除法。
    d. 使用高斯消元法找到基本矩阵 - 4 个空向量。然后使用[11]中描述的基于 Gröbner 基础的求解器。只有安装了 LAPACK 或 Eigen 才能计算基本矩阵,因为它需要使用复特征值进行特征分解。
    e. 透视-n-点 - 最小求解器为经典的 3 点,最多 4 个解。对于 RANSAC 来说,低样本量起着重要作用,因为它所需的迭代次数较少,此外,P3P 求解器平均约有 1.39 个估计模型。此外,在使用 UsacParams 的新版本 solvePnPRansac(...) 中,有一个选项可以传递空的内在矩阵 InputOutputArray cameraMatrix。如果矩阵为空,则使用直接线性变换算法(6 点 PnP),框架不仅会输出旋转和平移向量,还会输出校准矩阵。

此外,该框架还可以并行运行。并行化的方式是创建多个 RANSAC,它们共享两个原子变量 bool successint num_hypothesis_tested,这两个原子变量决定了所有 RANSAC 必须何时终止。如果其中一个 RANSAC 成功终止,那么其他所有 RANSAC 也将终止。最后,所有线程同步得出最佳模型。如果使用 PROSAC 采样器,那么线程必须共享同一个采样器,因为采样是按顺序进行的。不过,使用并行 RANSAC 框架的默认选项并不是确定的,因为这取决于每个线程的运行频率。使其具有确定性的最简单方法是使用不带 SPRT 和局部优化的 PROSAC 采样器,而不是基本矩阵,因为它们内部使用的是随机生成器。在框架中,有 3 种方法可以做到这一点:

  1. NEIGH_FLANN_KNN - 使用 OpenCV FLANN K 最近邻域估算邻域图。KNN 的默认值为 7。KNN 方法可能对采样有好处,但对 GC-RANSAC 却没有好处。
  2. NEIGH_FLANN_RADIUS - 与前一种情况类似,查找距离小于 20 像素的邻近点。
  3. NEIGH_GRID - 使用哈希表查找单元中点的邻域瓦片点。该方法在 [2] 中有所描述。其精确度低于 NEIGH_FLANN_RADIUS,但速度明显快于 NEIGH_FLANN_RADIUS。

注意,NEIGH_FLANN_RADIUSNEIGH_FLANN_RADIUS 无法使用 PnP 求解器,因为存在 3D 对象点:

  1. USAC_DEFAULT - 具有标准的 LO-RANSAC。
  2. USAC_PARALLEL - 具有并行运行的 LO-RANSAC 和 RANSAC。
  3. USAC_ACCURATE - 使用 GC-RANSAC。
  4. USAC_FAST - 在局部优化步骤中使用迭代次数较少的 LO-RANSAC。使用 RANSAC 分数最大限度地减少异常值,并提前终止。
  5. USAC_PROSAC - 采用 PROSAC 采样。注意,必须对点进行排序。
  6. USAC_FM_8PTS - 采用 LO-RANSAC。仅适用于使用 8 点求解器的基本矩阵。
  7. USAC_MAGSAC - 使用 MAGSAC++。

每个标志都使用 SPRT 验证。最后,通过对所有发现的离群值进行非最小化估计,来完善最终的最佳模型:

  1. randomGeneratorState - 因为在 OpenCV 中,每个 USAC 求解器都是确定性的(即对于相同的点和参数返回相同的结果),所以只要提供新的状态,它就会输出新的模型。

  2. loIterations - 局部优化方法的迭代次数。默认值为 10。通过增加 loIterations,输出模型可能会更加精确,但计算时间也可能会增加。

  3. loSampleSize - 本地优化的最大样本数。默认值为 14。需要注意的是,增加 loSampleSize 会提高模型的精确度,同时也会增加计算时间。不过,建议将值保持在 100 以内,因为在较少的点数上进行估计会更快更稳健。

样本:

opencv/samples 目录中有三个新的示例文件。

  1. epipolar_lines.cpp - 主函数的输入参数是两个图像路径。然后使用 SIFT 检测器找到对应关系。使用 RANSAC 从暂定对应关系中找到基本矩阵,并绘制外极坐标线。

  2. essential_mat_reconstr.cpp - 输入参数是包含图像名称和单个本征矩阵的数据文件路径,以及这些图像所在的目录。使用 SIFT 查找对应关系。使用 RANSAC 估算本征矩阵,并分解为旋转和平移。然后,通过投影矩阵建立两个相对位置,将图像点三角化为物体点。通过运行三维平面拟合 RANSAC,将物体点和对应点聚类到平面中。

  3. essential_mat_reconstr.py - 与 .cpp 文件中的功能相同,但不是将点聚类到平面,而是绘制对象点的三维地图。
    参考文献

  4. Daniel Barath and Jiří Matas. 2018. Graph-Cut RANSAC. In Proceedings of the iEEE conference on computer vision and pattern recognition, 6733-6741.

  5. Daniel Barath, Maksym Ivashechkin, and Jiri Matas. 2019. Progressive NAPSAC: Sampling from gradually growing neighborhoods.

  6. Daniel Barath, Jana Noskova, Maksym Ivashechkin, and Jiri Matas.
    快速、可靠、准确的鲁棒估计器 MAGSAC++. iEEE/CVF 计算机视觉与模式识别(cVPR)会议论文集》。

  7. O. Chum and J. Matas. 2005. 用 PROSAC-渐进样本共识进行匹配。计算机视觉与模式识别》。

  8. O. Chum、J. Matas 和 J. Kittler。2003. 局部优化的 RANSAC。联合模式识别研讨会。

  9. O. Chum、T. Werner 和 J. Matas. 2004. 通过 RANSAC 的外极点几何估计从定向外极点约束中获益。模式识别国际会议。

  10. Ondrej Chum、Tomas Werner 和 Jiri Matas. 2005. 不受主平面影响的双视角几何估计。2005 iEEE 计算机学会计算机视觉与模式识别会议(cVPR’05),772-779。

  11. M. A. Fischler and R. C. Bolles. 1981. 随机样本共识: A paradigm for model fitting with applications to image analysis and automated cartography. Communications of the ACM. ACM通讯》。

  12. Jiri Matas and Ondrej Chum. 2005. 随机 RANSAC 与顺序概率比测试。第十届 iEEE 计算机视觉国际会议(iCCV’05)第 1 卷,1727-1732。

  13. D. R. Myatt、P. H. S. Torr、S. J. Nasuto、J. M. Bishop 和 R. Craddock. 2002. NAPSAC:高噪声、高维度鲁棒估计。In bMVC02, 458-467.

  14. Henrik Stewénius, Christopher Engels, and David Nistér. 2006. 直接相对定向的最新发展。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值