SFM综述

SFM综述https://blog.csdn.net/qq_29462849/article/details/118159269

大家好,又见面了,我是你们的朋友全栈君。

Structure from Motion(SfM)是一个估计相机参数及三维点位置的问题。SfM方法可以分为增量式(incremental/sequential),全局式(global),混合式(hybrid),层次式(hierarchical),基于语义的SfM(Semantic SfM)。

  1. 增量式(incremental)

Incremental方式的SfM方法[1,2,3,4,5,6,7]是目前最广为使用的方法,大多数方法都以[1]中的pipeline为基础并进行了改进。

1.1 basic pipeline

以[1]中的SfM方法为主,一个基本的SfM pipeline可以描述为:对每张图片检测特征点(feature point),对每对图片中的特征点进行匹配,只保留满足几何约束的匹配,最后执行一个迭代式的、鲁棒的SfM方法来恢复摄像机的内参(intrinsic parameter)和外参(extrinsic parameter)。

如图1.1所示,该方法可以作更为具体的描述。首先使用SIFT特征检测器[8]提取特征点并计算特征点对应的描述子(descriptor),然后使用ANN(approximate nearest neighbor)方法进行匹配,低于某个匹配数阈值([1]中的阈值为20)的匹配对将会被移除。对于保留下来的匹配对,使用RANSAC(RANdom Sample Consensus)[9]和八点法[10]来估计基本矩阵(fundamental matrix),在估计基本矩阵时被判定为外点(outlier)的匹配被看作是错误的匹配而被移除。对于满足以上几何约束的匹配对,将被合并为tracks。然后通过incremental方式的SfM方法来恢复场景结构。首先需要选择一对好的初始匹配对,一对好的初始匹配对应该满足[11]:(1)足够多的匹配点;(2)宽基线。之后增量式地增加摄像机,估计摄像机的内外参并由三角化得到三维点坐标,然后使用Bundle Adjustment[12]进行优化。

算法1和算法2对该方法做了精简的描述[6]。

Algorithm 1 Computation of geometry-consistent pairwise correspondences

Require: image set

Ensure: pairwise point correspondences that are geometrically consistent

Compute putative matches:

Detect features in each image and build their descriptor

Match descriptors (brute force or approximate nearest neighbor)

Filter geometric-consistent matches:

Estimate fundamental matrix F

Estimate homography matrix H

Algorithm 2 Incremental Structure from Motion

Require: internal camera calibration (matrix K, possibly from EXIF data)

Require: pairwise geometry consistent point correspondences

Ensure: 3D point cloud

Ensure: camera poses

Compute correspondence tracks t

Compute connectivity graph G (1 node per view, 1 edge when enough matches)

Pick an edge e in G with sufficient baseline (compare F and H)

Robustly estimate essential matrix from images of e

Triangulate te, which provides an initial reconstruction

Contract edge e

While G contains an edge do

Pick edge e in G that maximizes track (e){3D points}

Robustly estimate pose(external orientation/rep)

Triangulate new tracks

Contract edge e

Perform bundle adjustment

End while

1.2 后续的改进

[1]中的方法已经能够较为完整地重建出三维场景,但仍存在不足:当添加的摄像机越来越多时,该SfM方法会明显变慢。除此之外,重复出现的场景结构会产生很多错误的匹配,这会对场景重建的精度造成明显影响。由此,后续方法在降低重建的时间和提高重建精度上均做出过很多改进。

Photo Tourism[1]中SfM算法的时间复杂度为O(n4),其中n为摄像机数量。VisualSFM[5]中将SfM算法的时间改进到O(n2)的同时又保留了较高的精度。[5]中提出一种抢占式特征匹配(preemptive feature matching)策略来提高匹配速度。该论文发现,在top-scale中,大小为h的匹配子集中一个匹配被保留的概率为h/k,其中k是两幅匹配的图像中最大的特征点数。抢占式特征匹配策略如下:

对每幅图片中的特征点按下降尺度(decreasing scale)进行排序

使用全匹配或者选择一个子集生成匹配对列表

对于每对图片:

对两幅图片中的前h个特征点进行匹配

如果子集中匹配点的数目小于某个阈值,则跳过(c)

进行常规的特征匹配和几何估计

由于大规模场景中的很多图片具有很多冗余的视图和特征点,抢占式特征匹配策略可以将最有可能进行匹配的图片进行匹配。对于Bundle Adjustment,VisualSFM使用GPU版本的multicore bundle adjustment[13]来最小化重投影误差,使得bundle adjustment的时间复杂度减少到O(n)。由于摄像机和3D点在重建过程中会很快趋于稳定,因此在每次迭代过程中对所有摄像机和3D点进行优化是不必要的。为了减少累积误差,每当摄像机数目增加了某个常数时(该论文中为20),便使用partial BAs对摄像机和3D点进行局部优化;当模型的大小增加当某个比例时,便使用full BAs进行全局优化。由于摄像机位姿(pose)的累积误差,incremental SfM经常会出现drift。Drift的一个主要原因是:初始的位姿估计和BA优化后的位姿都不够准确,这就导致了一些正确的特征匹配在三角化时失败,这些正确的匹配丢失造成了误差的累积。VisualSFM中首次提到了使用re-triangulate(RT)来三角化失败的特征匹配——当模型大小增加25%时,便re-triangulate这些失败的特征匹配。

OpenMVG中的sequential SfM方法为adaptive structure from motion(ASfM) [6]。以往的SfM pipeline在模型估计(model estimation)中都使用固定的阈值,而ASfM则提出使用a contrario(AC) methodology使阈值来适应(adapt)输入数据及不同的模型估计问题。自动计算阈值有两个好处:参数不用人为设置;可以达到全局固定阈值达不到的优化程度。阈值选择是一个两难的问题,比如使用RANSAC过滤outlier时,阈值太小,则会导致内点数太少而不够用来拟合模型;阈值太大又会造成outliers较多而影响结果的精确度。对于基本矩阵(fundamental matrix)和单应矩阵(homography matrix),ASfM使用AC-RANSAC[14]取代RANSAC;对于摄像机姿态估计,也使用AC-RANSAC[14]取代RANSAC。ASfM在精度方面有所提高,然而,自适应阈值的计算会额外增加O(n log n)时间复杂度。

尽管之前的incremental SfM方法做出了很多努力,在完整性(completeness)和鲁棒性(robustness)上仍然难以取得令人满意的效果——有的只重建出场景的部分,或是出现drift。Colmap[7]则在最大化重建精度和完整性上更进一步。Colmap主要在五个方面进行了改进:

引入了geometric verification增强scene graph。首先估计基本矩阵,如果有至少NF 个内点被保留,则用于估计基本矩阵的这对图片则视为geometrically verified。接着对同一对图片估计单应矩阵,假设保留的内点数为NH,如果,则假定一个移动的摄像机位于一个通常的场景中。然后估计本质矩阵,假设保留的内点数为NE,如果,则假设图片已被正确标定。对于正确的标定以及满足的匹配,对本质矩阵进行分解并进行三角化,得到三角化后角度的中位数,使用来区分纯旋转和平面场景。

Next Best View Selection方面的改进。对于Next Best View的选择,一个常见的策略是选择看见重建出的最多的3D点的那张照片。使用feature tracks的一个graph可以非常有效地对这种方法进行实现,但是,对于网络上的图片,这样的一个graph会变得非常稠密,因为很多图片看见的是一个相同的场景结构。Colmap的策略则是同时对每张候选图片中的visible points的数量和点的分布情况进行跟踪,更多的visible points和visible points的更均匀的分布会得到一个更高的分数,得分最高的图片将作为next best view。

Sampling-based triangulation。由于错误的二视图验证和特征匹配,feature tracks中的outlier ratio仍然比较高,而之前的一些triangulation方法对于这样一种情况仍然不够鲁棒。Colmap中提出了一种高效的,sampling-based triangulation方法。Bundler[3]中对track中的所有匹配对进行triangulation,然后检查是否至少有一个匹配对具有足够大的triangulation angle。只要找到了这样一对匹配,则对该track中的所有匹配进行triangulation。但是这种方法不够鲁棒,而且计算时间也很长。Colmap则在triangulation的基础上加上了RANSAC来解决解决任意的outlier ratio的问题。此外,使用RANSAC拟合的模型需要满足两个约束:triangulation angle 需满足;以及对应点的深度为正数并且重投影误差小于某个阈值。

Bundle Adjustment。Colmap在BA方面部分采用了和VisualSFM[5]相同的策略——仅当模型增加到一定比例的时候才执行global BA;在global BA之前进行re-triangulation(pre-BA RT)。但是,由于BA对摄像机和点的参数进行了优化,因此Colmap中提出post-BA RT,即在global BA之后再次进行triangulation。除此之外,和Bundler[3]以及VisualSFM[5]在每一次优化时仅仅执行一次BA和filter outlier不同的是,Colmap会进行一个iterative refinement,即迭代使用,RT和filtering,直到没有可以被filter的观测值和post-BA RT的点存在。
在这里插入图片描述

图1.1 basic SfM pipeline
2. 全局式(global)

由于并没有对全局式SfM有过深入研究,因此仅仅大致提及.

1.1中提及的增量式重建方法,一个显著的缺陷就是随着误差的累积,存在闭环的场景在最后的重建结果中会漂移(其实简单来说可以看成是重建恢复的相机位置无法形成一个闭环).全局式重建由于考虑了相邻相机之间的空间关系,因此不会出现漂移的情况.但是,由于全局式重建需要依赖正确的匹配结果,因此,全局式重建的精度较低,重建场景的完整性也不如增量式重建.目前也有很多算法对全局式重建算法进行了很多改进,从计算机视觉的三大会议论文数来看,目前全局式重建研究正在成为一种趋势.

  1. 混合式(hybrid)

尽管incremental SfM在鲁棒性和重建精度上有着优势,但是效率却不够高,而且对于大规模的场景重建,随着误差的累积,场景结构很有可能会出现drift;而global SfM虽然效率比incremental方式快,但是却对外点较为敏感。

混合式SfM[15, 16]在一定程度上综合了incremental SfM和global SfM各自的优点。

HSfM[15]的整个pipeline可以概括为全局估计摄像机旋转矩阵,增量式计算摄像机中心,具体如图3.1所示。

在这里插入图片描述

图3.1 HSfM的pipeline
算法的输入为Epipolar Geometry Graph(EG),EG被定义为:顶点为图片,相连的边为匹配的图片对,对应的图片之间的几何关系通过分解本质矩阵来进行估计。边(i, j)的相关旋转和相关的平移方向需满足以下约束:

其中和分别表示图片i的摄像机中心和旋转。全局摄像机旋转和相关旋转可以转换到李代数空间,然后使用L1优化求解。但是,全局的rotation averaging对EG的结构和对极几何匹配对的精确度很敏感,因此,HSfM方法使用community-based rotation averaging的方法来解决这两个问题。增量式计算摄像机中心时,每增加一个摄像机并进行三角化之后,就做一次BA。由于HSfM中的BA只对场景结构和摄像机中心进行优化,因此HSfM比传统的incremental方式速度更快。

与HSfM[15]相比,PSfM[16]则在大规模场景和高精度重建方面取得了更为令人诧异的效果。[16]能够在10台均为6核128GB内存的计算机上进行城市级规模(百万量级的高精度图片)的重建。由于城市级规模重建所需内存远超过一台计算机的内存,基于“分而治之”的思想,[16]把摄像机分成许多个cluster,每个cluster需要满足size constraint和completeness constraint。Size constraint是由于每个camera cluster应该足够小从而能够在单台计算机上进行local incremental SfM,论文中通过实验给出的结果是每个cluster中摄像机的数量不超过100;completeness constraint的引入是为了保留摄像机之间的connectivity,这些connectivity能够提供relative pose来进行global motion averaging,[16]中使用第i个camera cluster与第j个camera cluster中相交的摄像机在第i个camera cluster中所占的比率作为completeness constraint的评价标准,[16]中使用的比率为0.7 。camera clustering算法分为graph division和graph expansion两部分,graph division可以保证size constraint,graph expansion则保证了completeness constraint。具体算法如算法3所示。

Algorithm 3 Graph-based camera clustering algorithm

在这里插入图片描述

为了解决在track generation过程中,一台计算机的无法同时将所有特征点和匹配加载到内存中的问题,[16]使用hierarchical camera cluster tree。其中,hierarchical camera cluster tree定义为这样的一个树结构:叶子结点对应独立不相交的camera cluster,非叶节点对应相交的camera cluster。令表示为树的第k层的第i个节点,和分别表示为的左右孩子节点,若和为叶子结点,则将它们的特征点及匹配载入内存,生成的tracks,再重新分配特征点和匹配的内存,并将tracks存入磁盘;若和为非叶子结点,则只将匹配和tracks载入内存,并将对应的tracks存入磁盘。当每个cluster中的local incremental SfM执行完毕之后,便用local incremental SfM中得到的relative motion参数用来进行global averaging,三角化之后再使用分布式BA进行全局优化。

  1. 层次式(hierarchical)

1中的incremental SfM存在三个主要问题:易受initialization的影响,容易出现drift问题,时间效率不高。Hierarchical SfM[17,18,19]的方法较好地解决了前两个问题,并且将时间复杂度从incremental SfM的提高到。

标准的hierarchical SfM pipeline[17]使用一种agglomerative clustering策略,生成一棵binary cluster tree(dendrogram)。Agglomerative clustering算法自底向上开始处理:算法的每次迭代合并具有最小距离的两个clusters,每个cluster可以是一张图片,也可以是一个合并之后的cluster。组成cluster的两个视图需要满足两个要求:足够多的匹配点和足够宽的基线。由于合并的两个clusters的坐标系不同,因此合并的时候需要做相似变换。在incremental SfM中,增加view i需要做i次BA,因此总的时间复杂度为;而在[17]中,使用BA进行优化时仅选择每个cluster中k个视图,因此对于m个点和n个视图的BA算法,时间复杂度为。但是,在最坏的情况下,如果一个cluster每一次并不是和另一个cluster合并,而是和单个视图合并,那么就将得到一个不平衡的二叉树,在这种情况下的时间复杂度就将和incremental SfM一样。

在[17]的基础上,[18]提出了一种聚簇策略来使得dendrogram更加平衡。修改后的聚簇策略为:对于算法的每一次迭代,在l个最近匹配对的clusters中选择具有最小cardinality的一对cluster,一对cluster的cardinality为两个clusters的cardinality之和。

References

[1] Seitz S M, Szeliski R, Snavely N. Photo Tourism: Exploring Photo Collections in 3D[J]. Acm Transactions>[2] Agarwal S, Snavely N, Simon I, et al. Building Rome in a day[J]. Communications of the Acm, 2011, 54(10):105-112.

[3] Snavely K N. Scene reconstruction and visualization from internet photo collections[M]. University of Washington, 2008.

[4] Frahm J M, Fite-Georgel P, Gallup D, et al. Building Rome>[5] Wu C. Towards Linear-Time Incremental Structure from Motion[C]// International Conference>[6] Moulon P, Monasse P, Marlet R. Adaptive structure from motion with a contrario, model estimation[C]// Asian Conference>[7] Schönberger J L, Frahm J M. Structure-from-Motion Revisited[C]// Computer Vision and Pattern Recognition. IEEE, 2016.

[8] Lowe D G, Lowe D G. Distinctive Image Features from Scale-Invariant Keypoints[J]. International Journal of Computer Vision, 2004, 60(2):91-110.

[9] Fischler M A, Bolles R C. Random sample consensus: a paradigm for model fitting with applications to image analysis and automated cartography[J]. Readings in Computer Vision, 1987:726-740.

[10] Hartley R, Zisserman A. Multiple view geometry in computer vision[J]. Kybernetes, 2003, 30(9/10):1865 – 1872.

[11] Beder C, Steffen R. Determining an Initial Image Pair for Fixing the Scale of a 3D Reconstruction from an Image Sequence[J]. 2006, 4174:657-666.

[12] Triggs B, Mclauchlan P F, Hartley R I, et al. Bundle Adjustment — A Modern Synthesis[C]// International Workshop>[13] Wu C, Agarwal S, Curless B, et al. Multicore bundle adjustment[C]// Computer Vision and Pattern Recognition. IEEE, 2011:3057-3064.

[14] Moisan L, Moulon P, Monasse P. Automatic Homographic Registration of a Pair of Images, with A Contrario Elimination of Outliers[J]. Image Processing>[15] H Cui , X Gao,S Shen, Z Hu. HSfM: Hybrid Structure-from-Motion[C]// Computer Vision and Pattern Recognition. IEEE, 2017.

[16] Zhu S, Shen T, Zhou L, et al. Parallel Structure from Motion from Local Increment to Global Averaging[J]. 2017.

[17] Farenzena M, Fusiello A, Gherardi R. Structure-and-motion pipeline>[18] Gherardi R, Farenzena M, Fusiello A. Improving the efficiency of hierarchical structure-and-motion[C]// Computer Vision and Pattern Recognition. IEEE, 2010:1594-1600.

[19] Chen Y, Chan A B, Lin Z, et al. Efficient tree-structured SfM by RANSAC generalized Procrustes analysis[J]. Computer Vision & Image Understanding, 2017, 157©:179-189.

原文:
https://blog.csdn.net/qq_29462849/article/details/118159269

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151310.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • oracle未明确定义列[通俗易懂]

    oracle未明确定义列[通俗易懂]分类:SQL使用技巧2012-04-0616:121332人阅读评论(0)收藏举报运行环境:Oracle10gsqlplus环境下。 在查询语句中,经常会出现一个错误: SQL基础:ORA-00918:未明确定义列的错误。 当前遇到有两种情况。原因为:当查询语句中,查询的表(数据集)中有相同的字

  • kali装电脑_Kali安装教程(Windows7和kali双系统安装教程)[通俗易懂]

    kali装电脑_Kali安装教程(Windows7和kali双系统安装教程)[通俗易懂]Kali安装教程(一)Windows7+kali双系统安装准备先安装win7,然后安装kali,并且kali的引导项安装在/boot分区而不安装在MBR中,因为这样的话就算重装win7,kali系统经过简单引导仍然可以使用。Win7的安装此处就不在赘述,现在只聊一聊kali的安装。注:教程中个别截图借用了网上某人热心童鞋的截图,在此表示感谢!!1)准备阶段准备4G的优盘一个;刻录工具为:unetb…

  • C语言 strstr函数的用法及模拟实现strstr函数「建议收藏」

    C语言 strstr函数的用法及模拟实现strstr函数「建议收藏」C语言strstr函数的用法及模拟实现strstr函数一、strstr函数的用法二、模拟实现strstr函数的功能一、strstr函数的用法1.strstr函数原型:char*strstr(constchar*str1,constchar*str2)2.功能:strstr()是一个参数为两个字符指针类型,返回值是char*类型的函数,它用于找到子串(str2)在一个字符串(str1)中第一次出现的位置。这里因为传进来的地址指向的内容不会在发生改变,所以我们在两个形参(char*)前加上c

  • MongoDB模糊查询($regex查询、正则表达式匹配查询)

    MongoDB模糊查询($regex查询、正则表达式匹配查询)MongoDB的模糊查询可以使用$regex运算符通过正则表达式来进行匹配查询。$regex:为查询中的模式匹配字符串提供正则表达式功能。语法:{<field>:{$regex:/pattern/,$options:‘’}}{<field>:{$regex:‘pattern’,$optio…

  • 根据美光内存颗粒上的编码查询对应型号

    根据美光内存颗粒上的编码查询对应型号根据美光内存颗粒上的编码查询对应型号今天遇到需要查看美光内存颗粒容量的问题。美光FBGA封装的DDR颗粒上只有两行,每行5位的编码。根据美光官网上的说明,由于FBGA封装上空间的限制,不能印完整的型号信息,只能用编码表示,其中第二行的5位编码可以用于查询对应的型号信息。官方提供了FBGA&ComponentMarkingDecoder工具来查询FBGAcode对应的型号,进而就可以查找到了

  • 如何使用eclipse创建JAVA项目并写一个简单的HelloWorld

    如何使用eclipse创建JAVA项目并写一个简单的HelloWorld打开eclipse软件,选择好工作区域(就是项目的储存地址)后登陆。File-New-Project选择JavaProject输入项目名称点击完成(Finish)在SRC(SRC是专门放java源代码的文件夹,就是你在IDE里编写的各个java类的文件都在里面)中新建package包包的命名规范:包名全部使用小写。包名通常由若干个标识符…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号