← 全部指南
指南 · 7 分钟

COLMAP 是什么?用大白话讲清运动恢复结构

COLMAP 是什么、运动恢复结构流程怎么走、GUI 与命令行的区别、哪些步骤需要 CUDA、重建失败的常见原因,以及它的输出如何用于 NeRF 和高斯泼溅训练。

01

COLMAP 是什么?

COLMAP 是一款免费的开源软件,它能算出一组照片里每一张是从哪个位置、朝哪个方向拍的,并在这个过程中生成场景的三维点模型。官方文档对它的描述是:通用的运动恢复结构(Structure-from-Motion,SfM)与多视图立体(Multi-View Stereo,MVS)流程。

运动恢复结构(structure from motion)是前半段:给它一组互相重叠的照片,COLMAP 会在多张照片里找到同一个实际位置,据此算出每台相机的位置、朝向和镜头参数,同时得到一片稀疏的三维点云。多视图立体是可选的后半段:相机位置已知之后,为每个像素估算深度,生成稠密点云或网格。

如果你试过 NeRF 或高斯泼溅,多半已经在不知不觉中用过 COLMAP。很多训练工具要么替你调用它,要么要求把它的输出作为输入。这篇指南讲清楚 COLMAP 做了什么、容易在哪里出问题,以及什么情况下你完全不用碰它。

02

作者、许可证与支持的平台

COLMAP 最初由 Johannes Schönberger 编写,得到了他的博士导师 Jan-Michael Frahm 和 Marc Pollefeys 的支持。项目要求引用的两篇论文是 Structure-from-Motion Revisited(CVPR 2016)和 Pixelwise View Selection for Unstructured Multi-View Stereo(ECCV 2016)。GitHub 仓库列出的现任核心维护者是 Johannes Schönberger、Paul-Edouard Sarlin、Shaohui Liu 和 Linfei Pan。

COLMAP 库采用 new BSD 许可证,属于宽松的开源许可证。项目同时说明,随附的第三方组件各有自己的许可证。

按安装文档,获取方式有:

  • Windows:提供预编译程序包,里面同时包含图形界面和命令行程序。
  • Mac:通过 Homebrew 安装,命令是 brew install colmap。
  • Linux:使用发行版软件包或从源码编译。文档提醒,发行版软件包不带 CUDA 支持。
  • Docker:提供带 CUDA 支持的预构建镜像。
  • Python:名为 PyCOLMAP 的绑定,发布在 PyPI 上。
03

COLMAP 教程精简版:用大白话讲流程

不管用哪种界面,一次重建都会经过相同的几个阶段。

  • 特征提取。COLMAP 逐张查看照片,挑出有辨识度的点(关键点),并为每个点保存一段数值描述。默认的特征类型是 SIFT。
  • 特征匹配。在不同照片之间比较这些描述,找出从不同角度拍到的同一个位置。穷举匹配会比较每一对照片,文档提醒它的计算量随照片数量按平方增长;顺序匹配面向视频帧这类有先后顺序的图像;词汇树匹配是几千张规模图片集的推荐模式;空间匹配则利用照片里的 GPS 位置。
  • 稀疏重建,也叫 mapper。从一对照片出发,逐张加入其余照片并三角化出三维点,最终得到一组相机位姿和一片稀疏点云。
  • 去畸变。真实镜头会把直线拍弯。这一步输出校正后的图像,使其符合简单的相机模型,稠密阶段和许多外部工具都需要它。
  • 稠密重建(可选)。为每张图像计算深度图和法线图,融合成稠密点云,之后还可以用 Poisson 或 Delaunay 方法生成网格。

COLMAP 提取的全部数据都保存在一个 SQLite 数据库文件里,你的原始照片不会被改动。

04

COLMAP GUI 与命令行

COLMAP 两种界面都有,干的是同一件事。

COLMAP GUI 在 Mac 和 Linux 上用 colmap gui 命令启动,在 Windows 上双击 COLMAP.bat 即可。最省事的入口是 Reconstruction > Automatic Reconstruction:指定一个图片文件夹,它就会把稀疏和稠密重建结果写进工作目录。在图形界面里还能看着相机和点一步步出现,这对了解一次正常的重建长什么样很有帮助。安装文档提到,由于程序没有正式签名,Windows Defender 可能会弹出警告。

命令行把每个阶段都做成了单独的命令:feature_extractor、exhaustive_matcher、mapper、image_undistorter、patch_match_stereo 和 stereo_fusion;另有一条 automatic_reconstructor 命令可以一次跑完整个流程。脚本、训练工具和桌面应用在后台调用的就是这套接口。

偶尔做一个项目,用图形界面更轻松;需要反复处理时,命令行更实用,因为每次运行的设置完全一致。

05

哪些环节需要 NVIDIA 显卡

这一点常让新手困惑,值得说准确。CUDA 是 NVIDIA 的 GPU 计算体系。

  • 特征提取和匹配可以用 GPU 加速,但 COLMAP 的 FAQ 写明,没有可用的 GPU 时,设置相应选项后所有步骤都能在 CPU 上运行,只是更慢。
  • 得出相机位置的稀疏重建不依赖 CUDA。
  • 稠密重建则不同。FAQ 说,如果显卡不支持 CUDA,可以使用除稠密重建之外的全部 COLMAP 功能,并建议改用外部的稠密重建软件。

实际结论是:如果你只想为 NeRF 或高斯泼溅训练工具准备相机位置,只需要稀疏那一半,不必有 NVIDIA 显卡。如果想要 COLMAP 自己生成的稠密点云和网格,就需要支持 CUDA 且显存足够的 NVIDIA 显卡。官方教程提醒,显存不够时稠密步骤可能直接崩溃。

06

COLMAP 为什么会失败,怎么解决

失败通常有两种表现:只有一部分照片被成功定位,或者 COLMAP 生成了几个互不相连的子模型,而不是一个完整模型。原因几乎总在照片上,而不在参数上。COLMAP 教程里的拍摄建议正好对应这些常见问题:

  • 重叠太少。教程要求每个物体至少出现在三张图像里。多拍一些,相邻两张之间移动得小一点。
  • 表面没有纹理。白墙或空桌面让特征提取无从下手。让画面里保留有纹理的物体或背景。
  • 原地纯旋转。站在一个地方只转动相机,得不到深度信息。教程明确说,不要在同一位置仅靠旋转相机来拍摄。每拍一张都要挪动位置。
  • 反光和光线变化。教程建议避开高光、镜面反射的表面和逆光这类反差极大的场景,并让各张照片的光照保持相近。
  • 模糊。运动模糊的画面很难匹配。nerfstudio 文档的总结是:拍摄有重叠、不模糊的图像。
  • 几乎相同的帧太多。图像并非越多越好,还会拖慢所有步骤。对视频,教程建议降低抽帧的帧率。

如果得到了几个共用部分图像的子模型,COLMAP 提供 model_merger 命令来合并它们。对于纹理很少或视角重叠有限的场景,FAQ 提到 ALIKED 特征类型可能比默认特征更稳定。不过对大多数人来说,重新拍一组重叠更充分的素材是更快的办法。

07

COLMAP 的输出如何用于 NeRF 和高斯泼溅

一个稀疏 COLMAP 模型包含三样东西:相机(镜头参数)、图像(每张照片的位置和旋转)以及三维点(各自带位置和颜色)。这正是辐射场训练工具需要、自己又算不出来的信息。

  • 3D Gaussian Splatting 原始论文描述的做法是:从相机标定过程中产生的稀疏点出发,把它们变成三维高斯。它的参考代码附带一个转换脚本,会调用 COLMAP 并输出去畸变后的图像,因为其渲染器要求简单的针孔相机模型。
  • Nerfstudio 说明其数据处理脚本使用 COLMAP 和 FFmpeg,并坦率提醒 COLMAP 可能比较挑剔。
  • 开源高斯泼溅训练器 Brush 接受 COLMAP 的输出作为训练数据。

之后训练工具把时间都花在改善场景的观感上,并默认拿到的相机位姿是对的。所以 COLMAP 结果不好时,训练再久,得到的高斯场景也会模糊或破碎。拍摄质量对最终结果的决定作用,比多数人以为的来得更早。

08

不碰命令行:内置 COLMAP 的应用

想用上 COLMAP,并不一定要自己安装和学习它。有些桌面应用把它打包在内,替你运行。

SplatLoom 就是其中之一。它是一款面向 Mac(Apple Silicon,macOS 15 及以上)和 Windows 10/11 的桌面应用,在你自己的电脑上把互相重叠的照片或一段短视频变成 3D 高斯泼溅场景,不上传、不用注册账号。它内置的 COLMAP 只负责一件事:求出相机位置,随后由 Brush 在本机 GPU 上训练场景。你只需选好素材、点击生成,不需要 Python,也不需要命令行。

两点实话。SplatLoom 不使用 COLMAP 的稠密阶段,也不导出网格;如果你需要用于 3D 打印的网格,应该选择在 NVIDIA 显卡上运行 COLMAP 自带的稠密流程,或使用专门的摄影测量软件。另外,上面的拍摄规则依然适用:重叠不足,或者拍的是反光、会动的对象时,内置的 COLMAP 同样会吃力。

常见问题

COLMAP 是免费的吗?

是的。COLMAP 是开源软件,库本身采用 new BSD 许可证;随附的第三方组件各有自己的许可证。

运行 COLMAP 必须有 NVIDIA 显卡吗?

只求相机位置的话不需要。COLMAP 的 FAQ 说明所有步骤都可以在 CPU 上运行,只是更慢。例外是稠密重建,它需要支持 CUDA 的显卡。

COLMAP 和高斯泼溅是一回事吗?

不是。COLMAP 计算相机当时的位置,并生成稀疏点云。高斯泼溅是之后单独的训练步骤,它利用这些相机和点,构建出可以自由环视的场景。

COLMAP 需要多少张照片?

文档没有给出固定数字,它的要求是覆盖:拍摄对象的每个部分至少出现在三张图像里。作为参考,SplatLoom 常见的素材是 30 到 150 张互相重叠的照片。

COLMAP 能直接处理视频吗?

COLMAP 读取的是图片文件夹,所以视频要先拆成帧,例如 nerfstudio 用 FFmpeg 来完成这一步。顺序匹配专为有先后顺序的帧设计,教程也建议降低帧率,避免处理大量几乎相同的图像。

参考资料:https://colmap.github.io/ · https://colmap.github.io/tutorial.html · https://colmap.github.io/faq.html · https://colmap.github.io/install.html · https://colmap.github.io/format.html · https://colmap.github.io/cli.html · https://github.com/colmap/colmap · https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/ · https://github.com/graphdeco-inria/gaussian-splatting · https://docs.nerf.studio/quickstart/custom_dataset.html · https://github.com/ArthurBrussee/brush

在 SplatLoom 中试试