Advertisement

猿创征文|SfM(Structure from Motion)学习之路

阅读量:

文章目录

      • 0 前言
      • 1 理论基础
        • 1.1 书籍推荐
    • 1.2 SfM概述

      • 2 动手实践
        • 2.1 增量式SfM复现总结
    • 2.2 部分复现结果

    • 2.3 遇到问题与解决

      • 3 后续学习
        • 3.1 前沿论文阅读笔记
    • 3.2 Colmap使用问题

    • 3.3 三维旋转

    • 3.4 场景对齐

0 前言

转眼间研究生生活已过去两年有余。两年前开始接触SfM这一领域也是不争的事实。至于为何 initially 没有明确的方向可言,则无需多言——当时只是出于个人兴趣的驱动。回想起来虽然没有对学习它感到后悔但 SfM 已经成为了自己较为偏爱的技术之一即便如此鉴于已有数十年的发展历程目前从传统流程入手进行改进的空间无疑是有限且难度不小的。
SfM 全称Structure from Motion 简称为SfM 是三维重建pipeline 中的重要组成部分有时也被描述为稀疏重建技术在摄影测量领域则统称为空中三角测量(空三)。其基本任务是基于一系列具有一定程度重叠度的图像实现相机位姿估计即确定每张图像拍摄时相机的位置与姿态以及被拍摄物体或场景的三维点云信息。

1 理论基础

1.1 书籍推荐

我在初步学习阶段接触了两本教材——《视觉SLAM十四讲》和《计算机视觉中的多视图几何》。值得注意的是,在许多关键步骤上存在相似性。具体而言,在对重建精度的要求上,《视觉SLAM十四讲》更为严格;而对于相机定位的要求,则更为严格。然而,在对场景稠密性的需求上,《计算机视觉中的多视图几何》则相对宽松一些。就个人学习体验而言,《视觉SLAM十四讲》因其实用性强而更具参考价值;相比之下,《计算机视觉中的多视图几何》虽然知识丰富但较为艰深。基于我对增量式SfM的理解,《视觉SLAM十四讲》为此领域奠定了坚实基础

在这里插入图片描述
1.2 SfM概述

上面提到了增量式SfM,这里就顺便简单介绍一下SfM的分类。传统的SfM可以分为全局式和增量式两大类,当然还有其他一些混合的方法,比如层次式。全局式(Global)SfM能够一次性得出所有的相机姿态和场景点结构。它通常先求得所有相机的位姿,然后再通过三角化获得场景点。其中相机位姿求解也分为两步:第一步是求解全局旋转,第二步是根据全局旋转求解全局平移向量。因为第二步的计算依赖于第一步的输出,因此第一步输出结果的准确性直接决定了第二步的结果的优劣,也就是说,全局旋转的求解是相机姿态估计的核心关键问题。全局式SfM只需要在最后进行一次BA(Bundle Adjustment),因此效率较高,但是其鲁棒性差,很容易受到outlier的影响而导致重建失败。增量式(Incremental)SfM则是一边三角化(triangulation)和pnp(perspective-n-points),一边进行局部BA。这类方法在每次添加图像后都要进行一次BA,效率较低,而且由于误差累积,容易出现漂移问题;但是增量式SfM的鲁棒性较高。著名的开源库Colmap(Colmap论文——《Structure-from-Motion Revisited》论文阅读笔记)就是通过增量式SfM的pipeline实现的。而OpenMVG(OpenMVG论文——《Global Fusion of Relative Motions for Robust, Accurate and Scalable Structure from Motion》论文阅读笔记)则同时实现了增量式和全局式两种pipeline。如下两图分别是增量式SfM和全局式SfM流程图:

在这里插入图片描述

[1] Schonberger J L and Frahm J M. Structure from Motion Revisited: A Redesigning Approach[C]// IEEE Conference on Computer Vision and Pattern Recognition. IEEE, 2016:4104-4113.

在这里插入图片描述

[2] Barath D, Mishkin D, Eichhardt I, et al. Effective Initial Graph Construction for Efficient Global Structure-from-Motion[C]// CVPR. IEEE, 2021.

2 动手实践

在阅读了一些相关的书籍和论文之后

2.1 增量式SfM复现总结

增量式SfM的主要流程包括特征点提取与匹配、RANSAC误匹配剔除、初始化视图选择、三角化生成场景点、pnp估计下一视图位姿、BA(bundle adjustment)等。关于具体流程的介绍,在复现之后,我撰写了一篇总结的博文:增量式SfM详细流程介绍及实现方法。里面有对SfM的比较细致的介绍,对每一个步骤的描述以及我是如何实现这个pipeline的。除了这篇对整体流程的介绍博文外, 我还记录了如下内容:

在复现相关技术后, 我在博客中撰文详细解析了增量式 Structure from Motion (SfM) 的工作原理及其实现细节. 文章系统介绍了该方法的核心步骤: 包括特征点提取与匹配、RANSAC误匹配剔除、初始化视图选择、三角化生成场景点、pnp估计下一视图位姿等. 并重点阐述了BA优化算法的应用. 除此之外, 笔者还记录了具体的实验设置参数, 包括相机内参数矩阵的具体值, 各种超参数的选择依据等信息. 这些内容构成了完整的实验方案和实施指导.

在撰写相关内容时, 在复现后我撰写了一篇详细解读文章: 增量式SfM完整流程解析及实现细节. 该文章系统阐述了增量式SfM的工作原理及其关键技术实现细节. 包括特征点提取与匹配算法的选择与优化, RANSAC算法误匹配剔除的具体策略, BA优化算法的应用原理等. 在文章末尾部分还记录了具体的实验结果分析和参数调优经验.

  • 增量式sfm实现过程——基于该方法的成果展示与常见误区分析及经验分享
  • 增量式sfm确定下一个最佳匹配位置及优化PnP点计算技巧
  • 经典与前沿深度SfM相关问题深入探讨
2.2 部分复现结果

完成复现算法的工作后,部分实验数据和结果如下:

在这里插入图片描述
在这里插入图片描述
2.3 遇到问题与解决

在复现过程中会存在诸多挑战。例如,在Windows环境下使用C++进行开发可能会面临一些环境配置的问题:

又例如,在应用Ceres库实现BA求解的过程中,并在配置GDAL完成坐标系转换时所遇到的问题包括:

3 后续学习

3.1 前沿论文阅读笔记

经过前期系统的理论学习与实践经验的积累,
我们对相关领域的基础认识已经较为全面。
然而,
这些工作仅停留在基础层面,
并未体现出任何创新精神。
因此,
在深入研究方面仍需继续努力探索,
在现有基础上寻求突破。
随后我的研究重点转向深度学习在几何建模与 scene reconstruction 中的应用,
一些相关的论文我也进行了翻译或整理记录

  • 2021CVPR论文《深度双向视图结构从运动重做》阅读笔记
  • 基于深度双向视图的结构从运动重做研究阅读笔记
  • The Revisited Research on Deep Two-View Structure from Motion Reading Notes
  • 基于深度双向视图的改进结构从运动算法阅读笔记
  • 一种改进型基于深度双向视图的结构从运动方法研究阅读笔记
3.2 Colmap使用问题

Colmap可被视为计算机视觉领域的划时代工作之一,在该领域具有重要地位

colmap数据格式转换

colmap数据格式转换

踩坑记录

3.3 三维旋转
在这里插入图片描述

在三维空间中,旋转始终是一个不可忽视的重要议题。关于旋转矩阵的知识点,在我的博客中也有详细的介绍和讲解。

3.4 场景对齐

我们有必要解决一个关键问题。一般来说,在结构从方法(SfM)中存在尺度不确定性这一算法特性导致的问题是:恢复出的场景与实际场景在尺寸上存在差异,并且它们之间可能相差一个相似变换(包括旋转、平移和缩放)。当我们在深度学习训练中已知相机的真实参数时,则可以通过对齐恢复出的相机参数与已知的真实相机参数来统一坐标系:

全部评论 (0)

还没有任何评论哟~