[论文阅读]Structure-from-Motion Revisited

CVPR 2016 文章链接

1 速读

1.1 论文试图解决什么问题?这是否是一个新的问题?
试图解决Incremental Structure-from-Motion(从下称Incremental SfM)这个领域里没有一个鲁棒的、准确的、完整且可拓展的框架这一问题,是这一领域一直以来的问题,文章提出了一套优秀的框架。

1.2 有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员?
SfM可分为:incremental, hierarchical, and global approaches三种,文章做的是研究最多的incremental SfM。
涉及到Correspondence Search+Incremental Reconstruction两部分研究,简言之找到关系+用关系恢复结构。

在实验部分对比的两个incremetal SfM框架:Bundler、VisualSFM;两个global SfM 框架:DISCO、Theia

1.3 文章的贡献是什么?
提出了一个当时“近乎理想”的incremental SfM并开源了代码COLMAP
①提出了一个关于场景信息的几何方法(geometric verification strategy),增强初始化和三角化的鲁棒性;
②提出了更好的如何选择下一帧的策略,提高了重构的鲁棒性和准确性;
提出了一个鲁棒的三角化方法,在降低计算量的情况下恢复更完整的场景结构;
④将BA+re-triangulation+filter迭代进行,减小了drift的影响;
⑤针对密集图片集,通过合并冗余的视角实现更高效的BA

1.4 文章解决方案的关键是什么?
对给出的数据抽象提炼出更高维的信息(帧的状态、相机的聚类)加以使用,提升速度和鲁棒性 ①⑤
对直观上的可行方法做出数学抽象(点分布更均匀如何描述,更好的三角化如何描述)②③
理清SfM中各个部分的作用和效果,设计更合理的执行步骤④

1.5 实验如何设计?实验结果足够论证其效果吗?
效果很好

1.6 数据集是什么?
共17个数据集
[论文阅读]Structure-from-Motion Revisited_第1张图片


以下是精读部分

2 基本概念

Structure-from-Motion (SfM):从无序的图片集之中恢复3D结构
①incremental:with an iterative reconstruction component,即序列processing中有迭代重构部分,如下图所示:
[论文阅读]Structure-from-Motion Revisited_第2张图片
②hierarchical:没说
global:没说

以下是各个模块的基本功能描述,有SLAM基础的应该都基本了解
匹配搜索 Correspondence Search:输入照片 I = { I i ∣ i = 1 。 。 。 N I } \mathcal{I} = \{I_i | i=1。。。N_I\} I={Iii=1NI}
Feature Extraction:特征提取
output: F i = { ( x j , f j ) , ∣ j = 1... N } \mathcal{F}_i = \{(x_j, f_j), | j=1...N\} Fi={(xj,fj),j=1...N} x j x_j xj 表示特征在图像中的位置, f j f_j fj 表示对应的描述子

Matching:寻找看见相同场景(即特征 F i \mathcal{F}_i Fi)的图片,这里似乎在所有图片间寻找,类似SLAM中LoopClosing的部分而不是Tracking的部分,最常用的方法就是所有图片间两两检测,但是非常耗时。
output:可能的匹配图片对 C = { { I a , I b } ∣ I a , I b ∈ I , a < b } \mathcal{C} = \{\{I_a, I_b\} | I_a, I_b\in \mathcal{I}, aC={{Ia,Ib}Ia,IbI,a<b}和特征匹配结果 M a b ∈ F a × F b \mathcal{M}_{ab}\in \mathcal{F}_a\times\mathcal{F_b} MabFa×Fb

Geometric Verification:用几何方法检验匹配图片对 C \mathcal{C} C。①单应矩阵homography H描述在一个平面上的匹配点对之间的变化;②本质矩阵essential matrix E和基础矩阵fundamental matrix F描述由对极几何描述的匹配点间的关系;RANSAC:鲁棒估计方法,减小离群点的影响。
output:经过验证的照片对 C ‾ \mathcal{\overline{C}} C,通过的匹配结果 M ‾ a b \mathcal{\overline{M}}_{ab} Mab,匹配结果的相关性 G a b G_{ab} Gab

递增式重构 Incremental Reconstruction
Initialization:寻找可以构建高质量初始化的两个初始关键帧

Image Registration:求解PnP问题得到帧间运动。PnP使用2D-3的匹配点计算相机位姿 P c P_c Pc和相机内参 K K K(如果为校准的话),通常使用RANSAC求解

Triangulation:新的相机观察到之前没有的点,用三角化重构点来扩展场景

Bundle Adjustment:BA是优化相机位姿 P c P_c Pc和路标点 X k X_k Xk的非线性方法,能够削减重构部分的Image Registration和Triangulation的开环连接导致的结果偏移。其优化的重投影误差为:
E = ∑ j ρ j ( ∣ ∣ π ( P c , X k ) − x j ∣ ∣ 2 2 ) E = \sum_j \rho_j \left(||\pi(P_c, X_k)-x_j||_2^2\right) E=jρj(π(Pc,Xk)xj22)表示路标点通过位姿变换并经过投影后和其匹配点的误差,具体意义可以看我关于Ceres的文章。
提到了①Exact methods:通过求解一个稠密或稀疏的矩阵解决问题;②Inexact methods:使用迭代求解器求解。

3 各部分

3.1 Scene Graph Augmentation

对应:src/estimators/two_view_geometry.cc中的EstimateCalibrated函数
本质上就是计算一些关于帧的信息作为重建过程中的粗略筛选指标,换言之对场景图做了增强。区分了the model type:纯旋转、平面、正常、是否为错帧

计算基础矩阵F、单应矩阵H、本质矩阵E下的inliners数目 N F , N H , N E N_F, N_H,N_E NF,NH,NE
另外还计算了在图像边缘的inliners数目 N S N_S NS,用于检测来自网络的图片是否可用WTFs(含有水印、时间戳、镶边)

三个判断:
N H / N F < ϵ H F N_H/N_F<\epsilon_{HF} NH/NF<ϵHF,表示画面是否大多在一个平面上
N E / N F > ϵ E F N_E/N_F>\epsilon_{EF} NE/NF>ϵEF,表示内参校准是否有效
①and②的情况下对内点进行三角化;计算三角化角度中位值 α m \alpha_m αm用于区分纯旋转pure rotation (panoramic)和平面planar scenes情况
N S / N F > ϵ S F   o r   N S / N E > ϵ S E N_S/N_F>\epsilon_{SF} \ or \ N_S/N_E > \epsilon_{SE} NS/NF>ϵSF or NS/NE>ϵSE,此时检测当前匹配是否符合纯平移,若符合表示当前帧是WTFs(论文中是和 N F N_F NF做比较,实际是和inliners)

处理:
①WTFs不加入Scene graph;
②不是WTFs的标记the model type
N F , N H , N E N_F, N_H,N_E NF,NH,NE中最大的那个记为inliners;
④只将校准有效的且不是纯旋转的用于重构
④不对纯旋转三角化

3.2 Next Best View Selection

对应:src/base/images中的IncrementCorrespondenceHasPoint3D函数
如何选择下最好的下一帧很重要,但是难点在于原数据几乎没什么先验信息,只能参考外观、两帧间关系、已重建的场景
重点是在描述帧好坏的指标上,传统方法文章采用具有最多共视三角化点的帧(sees most triangulated points), 列举了一篇文章说明PnP的求解位姿结果的准确性还和观测点的分布有关。因此文章提了一个综合两者的方法,如图所示:[论文阅读]Structure-from-Motion Revisited_第3张图片
总得分 S \mathcal{S} S,层数 L L L,所在层 l l l,分辨率 K l K_l Kl,权重 w l w_l wl

本质上是一个 L L L层的4叉树,树的第 l = 1... L l=1...L l=1...L层表示按照分辨率 K l = 2 l = K l − 1 ∗ 2 K_l=2^l=K_{l-1}*2 Kl=2l=Kl12的分辨率分割图像,或者表示对 l − 1 l-1 l1层的每个节点再分为四份,每个节点的权重为 w l = K l w_l=K_l wl=Kl(文章中写的是 w l = K l 2 w_l=K_l^2 wl=Kl2但是按照图片数据计算一下应该不对)。节点中有特征点时节点有效,所有层有效节点的权重和为最终的得分 S \mathcal{S} S

3.3 Robust and Efficient Triangulation

对应:src/estimators/triangulation.cc中的Estimate和Residuals函数
存在一个问题,即大多近似匹配技术找到的匹配是:相似外表(similar in appearance)+较小基线距离(a small baseline),但是三角化需要的基线距离不能太小,故可以考虑建立两视角联通(concatenating two-view correspondences),通过传递性得到具有较大基线距离的匹配。
①对于离群点的影响,作者通过RANSAC解决。对联通图进行RANSAC计算,做多次较为均匀的采样,对采样的部分做迭代优化计算,并保存最好的结果,高效+鲁棒;
②对于错误的相机位姿的影响,作者确保在三角化之前寻找一致的跟踪;
③对于联通图中可能存在的多个可三角化点,通过递归不断寻找;

对于一组特征轨迹 T = { T n ∣ n = 1... N T } \mathcal{T} = \{T_n | n=1...N_T\} T={Tnn=1...NT},其中 T n T_n Tn包含归一化的像素点坐标 x ‾ n ∈ R 2 \overline{x}_n\in\mathbb{R}^2 xnR2+相机位姿 P w 2 c − n = [ R T , − R T t ] ∈ S E ( 3 ) P_{w2c-n}=[R^T, -R^Tt]\in SE(3) Pw2cn=[RT,RTt]SE(3)目标为在两张图中选恢复最好的三角结果: X a b ∼ τ ( x ‾ a , x ‾ b , P a , P b )   w i t h   a ≠ b X_{ab}\sim\tau(\overline{x}_a, \overline{x}_b, P_a, P_b)\ with\ a\neq b Xabτ(xa,xb,Pa,Pb) with a=b,其中 τ \tau τ为选定的三角化方法, X a b X_{ab} Xab为三角化的点。

三个指标
①角度足够大; α = a r c c o s ( t a − X a b ∣ ∣ t a − X a b ∣ ∣ 2 ⋅ t b − X a b ∣ ∣ t b − X a b ∣ ∣ 2 ) \alpha=arccos(\frac{t_a-X_{ab}}{||t_a-X_{ab}||_2}\cdot \frac{t_b-X_{ab}}{||t_b-X_{ab}||_2}) α=arccos(taXab2taXabtbXab2tbXab)
②在两帧上恢复的 d a d_a da d b d_b db深度大于0 d = P r o w 3 ⋅ [ X a b , 1 ] T d=P_{row_3}\cdot[X_{ab}, 1]^T d=Prow3[Xab,1]T
重投影误差小于阈值 t t t; e n = ∣ ∣ x ‾ n − [ x ′ z ′ y ′ z ′ ] ∣ ∣ 2   w i t h [ x ′ y ′ z ′ ] = P n [ X a b 1 ] e_n=\left|\left|\overline{x}_n-\begin{bmatrix} \frac{x'}{z'} \\ \frac{y'}{z'} \\ \end{bmatrix}\right|\right|_2\ with\begin{bmatrix} x' \\ y' \\ z' \\ \end{bmatrix} = P_n\begin{bmatrix} X_{ab} \\ 1 \\ \end{bmatrix} en=xn[zxzy]2 withxyz=Pn[Xab1]

3.4 Bundle Adjustment

对应:src/controllers/incremental_mapper.cc中的IterativeGlobalRefinement函数
BA减小累计误差,在每帧对“most-connected images”做局部BA,在处理一定比例的数据后做全局BA(提高效率)
四个部分:
①参数化Parameterization:柯西函数作为鲁棒核函数;相机数量多的情况使用稀疏直接求解器;大规模问题使用PCG;可使图像间共享相机模型;未知相机模型用一个带径向畸变参数的相机模型;
②过滤Filtering:全局BA之后,滤除高投影误差的+三角化角度不够的观测;还需要检查相机退化,没有3D点的图片和有异常参数的图片会被删除;
重三角化Re-Triangulation:在BA之后,对没有成功三角化但是投影误差在阈值之下的点做重三角化;
④迭代优化Iterative Refinement:迭代(BA+Re-Triangulation+Filtering)(但从代码上看重三角化时没有放在循环里面的),直到没有被滤除的点和重三角化的点才停止。因为BA之后会滤除对BA有严重影响的离群点,再次BA会得到更好的结果,通过迭代直到结果无法再优化为止;

3.5 Redundant View Mining

利用SfM的内部特征和密集照片集对将高重叠场景聚合分组来加速BA
有提到前人这方面的工作,作者是在一篇论文的基础上在三个方面提升:
①是利用SfM的内部特征实现,更高效;
②将场景分为多个重叠相机组成的groups,而非分将很多相机聚集到一个submap中,区别在于一个组中的所有相机用一个相机去替代了;
eliminate了原作者的一个什么策略(不懂)

共视程度的描述:
一个image对一组点 N x N_x Nx的观测为一个观测向量 v i ∈ { 0 , 1 } N x v_i\in\{0,1\}^{N_x} vi{0,1}Nx,向量第n位表示点 N x N_x Nx是否被image观测到,则image a和image b之间的共视程度 V a b = ∣ ∣ v a ∧ v b ∣ ∣ ∣ ∣ v a ∨ v b ∣ ∣ V_{ab} = \frac{||v_a \wedge v_b||}{||v_a \vee v_b||} Vab=vavbvavb

将image和points分为unaffected和affected两部分
unaffected G = { G r ∣ r = 1... N G } \mathcal{G}=\{G_r | r=1...N_G\} G={Grr=1...NG} N G N_G NG组高度重叠的image,每个组共享一个相机
一个组的构建:
 ①对图片按照观测数排序 I ‾ = { I i ∣   ∣ ∣ v i ∣ ∣ ≥ ∣ ∣ v i + 1 ∣ ∣ } \mathcal{\overline{I}}=\{I_i |\ ||v_i||\geq||v_{i+1}||\} I={Ii vivi+1}
 ②取第一个image   I a \ I_a  Ia新建一个 G r G_r Gr,在后续image   I b \ I_b  Ib中寻找同组image,如果 V a b > V V_{ab}>V Vab>V ∣ G r ∣ < S |G_r|Gr<S则加入组 G r G_r Gr,否则新建一个组 G G G。为了加速匹配,只遍历 I a I_a Ia观测角 ± β \pm\beta ±β内的前 K r K_r Kr个image;
 一个组的BA cost为 E g = ∑ j   ρ j ( ∣ ∣ π g ( G r , P c , X k ) − x j ∣ ∣ 2 2 ) E_g = \sum_j\ \rho_j\left(\left ||\pi_g(G_r, P_c, X_k)-x_j|\right|_2^2 \right) Eg=j ρj(πg(Gr,Pc,Xk)xj22)具体的意义没看明白,到时候对着代码看吧
affected新加入的image或重投影误差> r r r观测点比例大于阈值 ϵ r \epsilon_r ϵr的image为affected,独立分组以优化其参数

问题

对错帧的相似变换是什么?
SFM和SLAM的区别是什么?
选取最好的第二帧是在做什么?从所有图片里选?
track elements是啥?
相机退化degenerate cameras是什么?

你可能感兴趣的:(文章阅读,SLAM,SfM,算法)