SfMColmap和openMVG尝试记录

Posted Elucidator_xrb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SfMColmap和openMVG尝试记录相关的知识,希望对你有一定的参考价值。

数据集来源:

Colmap与openMVG关于SfM稀疏重建对比

1.NikolaiI

图片数:98
重建方式:sequential

Colmap GUI
meshlab查看

2.Budha

图片数:279
重建方式:sequential

Colmap

重建时间:约81min

Colmap GUI
meshlab查看
openMVG

重建时间:约60min(全局+增量)

sequential-meshlab查看

3.fountain

图片数:14
重建方式:sequential

colmap
meshlab查看
openMVG
sequential-meshlab查看
global-meshlab查看

4.Ayaka

图片数:123
重建方式:sequential

colmap
Colmap GUI
meshlab查看
openMVG

重建失败

输出反馈,左侧为失败项目信息
好像是在```3. Do Incremental/Sequential reconstruction```处中断。

应该是自己采集的照片没法实现重建(是因为带上了global重建导致要求变高了嘛?)

5.urbanII

6.uwo

meshlab查看

7.lund_cath_small

meshlab查看

8.filbyter

图片数:40

colmap
meshlab查看-全景
meshlab查看-这才是照片实体

建模时,由于背景过于清晰,还原了背景部分信息

9.park_gate

图片数:34

colmap
Colmap GUI
meshlab查看

10.Sri_Veeramakaliamman

图片数:157

colmap

11.door

图片数:12

colmap
Colmap GUI

两种软件使用比较

  • 重建时间
  • 图形化界面
  • 重建质量
  • 数据集要求

重建我的3D世界代码开源连载-3Colmap和OpenMVG对比

重建我的3D世界系列的第二篇,我提到关于SFM部分是选择Colmap还是OpenMVG的问题,并决定实践出真知。Colmap官网就提供了带有界面的测试程序,用起来很方便,我下载了3.6版本,地址是colmap 3.6
而OpenMVG则可以较为容易的编译,它不提供带界面程序,有控制台程序可以测试,结果可以导入Colmap的界面程序中可视化。

0. 前言

本次测试总体来说是属于浅层次的测试,我只简单从场景重建的直观效果、重建效率、重投影误差、图像姿态恢复完整度等来评价。实际上一些更专业的评价指标,如场景的点云或控制点和真值的差值、位姿和真值的差值等,没有在本实验进行评价,所以很遗憾的提醒大家这并不是一份专业的测试,最终结果也可能并不那么专业或者准确,还请见谅。

1. 数据选择

在程序都部署妥当后,首先就要进行测试数据的选择,我这里根据数据的类型选择了6组数据,数据量不大(都不超过1000张,数据量太大了测试起来太费时),场景有所区别,有农田有建筑;有室外有室内;有无人机拍图也有数码相机拍图。

需要额外说明的是,为了契合我们的主题,就是希望能用一些简单的设备重建周围的3D世界,所以我也拍摄了两组手机图片集,来测试下SFM的效果,其一是一只跑步鞋,其二是一个恐龙模型。

下面是所有数据的一个概览:

数据名称影像数尺寸相机类型场景描述有无GPS
Small Buildings364592x3056无人机(AscTecFalcon 8)建筑
Urban1135472x3648无人机(senseFly)农田,建筑,裸地
Person-hall3305616x3744数码相机(Canon)建筑、树木、近景
Graham-hall7115316x3744数码相机(Canon)室内,近景
Shoe424032x3024手机(三星S20+)生活用品
Dinosaur554032x3024手机(三星S20+)模型
Small Buildings
Urban
Person-hall
Graham-hall
Shoe
Dinosaur

2. 测试环境

所有测试都在我的台式机上进行,配置如下

平台型号
CPUIntel I7-8700K 3.7GHz
GPUNVIDIA GTX 1080 8G

3. 参数设置

Colmap全部使用默认参数,在特征匹配时采用小型词汇树,适用于少于1000的图像集。下载地址:vocab_tree_flickr100K_words32K

OpenMVG全部使用默认参数,在无法识别传感器型号时,提供初始焦距 max ⁡ ( w , h ) ∗ 1.2 \\max(w,h)*1.2 max(w,h)1.2。控制台的具体调用方式请参考:openMVG softwares & tools。并将生成的结果用OpenMVG自带的工具转成Colmap的SFM格式在Colmap程序中显示。

两者都采用 增量式SFM ,且都没有使用GPS辅助SFM,虽然有的数据有带GPS且OpenMVG提供了辅助GPS的SFM,但由于Colmap没有这个模块,所以为公平起见,测试中它们都没有使用。

为了验证,中间会有部分测试数据使用Agisoft Metashape跑了一遍,Agisoft Metashape的前身是Agisoft Photoscan,以SFM见长。

4. 测试结果

1 Small Buildings 36p 4592x3056

Colmap

步骤时间(分)
特征提取 Feature Extraction0.094
特征匹配 Feature Matching1.723
光束法平差Bundle adjustment0.996
SFM总时间2.813
重投影误差平均0.89
重建图像数 / 稀疏点数36 / 20972

OpenMVG

步骤时间(分)
特征提取 Feature Extraction1.867
特征匹配 Feature Matching0.583
光束法平差Bundle adjustment1.067
SFM总时间3.517
重投影误差平均0.28
重建图像数 / 稀疏点数36 / 69791


这个数据两者差别不是很大,OpenMVG重建效率稍微低一些,生成了更多的稀疏点,平均重投影误差也更小。

2 Urban 113p 5472x3648

Colmap

步骤时间(分)
特征提取【Feature Extraction】1.195
特征匹配 【Feature Matching】7.414
光束法平差Bundle adjustment2.898
SFM总时间11.507
重投影误差平均1.07
重建图像数 / 稀疏点数113 / 73691

场景看上去有些弯曲,为了验证,我用商业软件Agisoft Metashape也跑了一遍,耗时102.344秒(1.706分),效率非常高,重建图像113张,共173095稀疏点,结果如下:

场景是平的,可以判断出Colmap重建出的场景是有一点漂移(Drift)的。但需要说明的是,Metashape是有辅助GPS,而Colmap未使用GPS辅助。

OpenMVG

步骤时间(分)
特征提取 Feature Extraction8.200
特征匹配 Feature Matching23.13
光束法平差Bundle adjustment12.13
SFM总时间43.46
重投影误差平均0.37
重建图像数 / 稀疏点数113/ 408068


OpenMVG重建的场景同样有弯曲的趋势,弯曲程度看上去比Colmap会好一点,但是没有达到Metashape的水平(鉴于Metashape用了GPS辅助而OpenMVG没有,这样的结果可以接受)。

OpenMVG重建时间是显著长于Colmap的(近4倍),即使算法已经使用了多线程,CPU也基本处于忙碌状态。

3 Person-hall 330p 5616x3744

Colmap

步骤时间(分)
特征提取【Feature Extraction】1.169
特征匹配 【Feature Matching】36.197
光束法平差Bundle adjustment22.108
SFM总时间59.474
重投影误差平均0.75
重建图像数 / 稀疏点数330 / 179134

效果看上去还是不错的,结构恢复的比较规整。我们同样用Agisoft Metashape跑一遍,因为相片本身就没有GPS,所以我们看看没有GPS时Metashape表现如何:

同样很稳健的重建结果,耗时509.577秒(8.493分),效率非常高,重建图像330张,生成稀疏点226761。

OpenMVG

步骤时间(分)
特征提取 Feature Extraction29.91
特征匹配 Feature Matching247.78
光束法平差Bundle adjustment130.38
SFM总时间408.07
重投影误差0.26
重建图像数 / 稀疏点数330/ 900759

OpenMVG对该场景的重建直观效果和Colmap及Metashape都比较相近,只是接近7小时的时间实在是太“漫长”了。

4 Graham-hall 711p 5616x3744

Colmap

步骤时间(分)
特征提取【Feature Extraction】2.317
特征匹配 【Feature Matching】25.141
光束法平差Bundle adjustment48.798
SFM总时间76.256
重投影误差平均0.97
重建图像数 / 稀疏点数691/ 171956

效果还是不错的,

OpenMVG

鉴于上一组330张耗时近7小时,这组实验就不做了。




PS. 以下两组为了更加直观的观察重建的效果,对于Shoe数据和Dinosaur数据,我用Colmap重建出了密集点云。

5 Shoe 42p 4032x3024

Colmap

步骤时间(分)
特征提取【Feature Extraction】0.085
特征匹配 【Feature Matching】1.112
光束法平差Bundle adjustment0.259
SFM总时间1.456
重投影误差平均0.68
重建图像数 / 稀疏点数38 / 5059

OpenMVG

步骤时间(分)
特征提取 Feature Extraction1.63
特征匹配 Feature Matching0.37
光束法平差Bundle adjustment0.32
SFM总时间2.32
重投影误差平均0.24
重建图像数 / 稀疏点数39/ 19794


此数据两者看不出太大差别,OpenMVF的重投影误差会更小一些。

Colmap重建稠密点云如下:

步骤时间(分)
立体匹配【Stereo】33.727
点云融合 【Fusion】1.494

6 Dinosaur 55p 4032x3024

步骤时间(分)
特征提取【Feature Extraction】0.096
特征匹配 【Feature Matching】1.098
光束法平差Bundle adjustment0.488
SFM总时间1.682
重投影误差平均0.91
重建图像数 / 稀疏点数55 / 10383

OpenMVG

步骤时间(分)
特征提取 Feature Extraction2.00
特征匹配 Feature Matching0.05
光束法平差Bundle adjustment0.40
SFM总时间2.45
重投影误差平均0.34
重建图像数 / 稀疏点数55/ 15796


此数据两者看不出太大差别,OpenMVF的重投影误差依然会更小一些。

Colmap重建稠密点云如下:

步骤时间(分)
立体匹配【Stereo】48.093
点云融合 【Fusion】1.945

5 总结

Colmap

在没有GPS辅助的情况下,Colmap对小场景(<1000 photos)的重建质量还是不错的,基本都能完整且正确的恢复场景结构,除了一组地面数据产生了一些场景漂移,但我想若辅以GPS信息,这个问题会被很好的解决。

默认参数下的效率偏低,和商业软件Metashape相比差距很大,Colmap文档里描述默认参数目标是进行中高质量的重建,所以效率或许可以用通过一些参数设置来改善,但也可能在一定程度上牺牲精度。

除了SFM,Colmap的稠密重建也是非常慢的,主要在立体匹配上消耗了大量的时间,效果还算可以,点云比较薄,但对弱纹理的支持一般,当然这也是通用重建难题。由于没有像OpenMVS对网格进行优化,所以最后重建的网格不够精细和光滑。

OpenMVG

同样,在没有GPS辅助的情况下,对小场景的重建质量都还不错。经过“漫长”的重建过程,重投影误差比Colmap要小,且漂移现象也要略好一点。

整个SFM Pipeline效率确实非常低,以至于博主放弃了700多张的数据测试,近7小时重建330张是无法接受的。

OpenMVG效率低的其中一个原因是特征提取默认采用CPU版本的SIFT,即使经过多线程加速,效率也无法和Colmap的GPU版本SIFT相比。另一个原因是默认使用枚举法建立特征匹配对,匹配对数目非常多且冗余,而Colmap选用的是词汇树,一种可以快速建立适当数量匹配对的方法,会有更少的匹配对。

选择

基于已有的测试结果,我倾向于使用Colmap而非OpenMVG来完成SFM,效率优势非常明显,且在结构恢复的完整度和准确度上也无明显劣势。

Tips

  1. 在SFM中,GPS是很重要的辅助信息,一方面可以用于恢复尺度信息;另一方面可以有效防止场景漂移;此外还可以在筛选匹配像对时作为辅助信息,间接提高匹配效率。
  2. 提高特征提取算法的效率可以有效提高SFM的效率,一般来说基于GPU的算法会更有优势。
  3. 有效减少图像匹配像对数同样可以有效提高SFM的效率,基于词汇树的图像检索方法可以通过图像相似度快速进行候选匹配像对筛选,有效减少匹配对,提高匹配效率。另一个有效的策略是在使用词汇树策略时可以在降采样分辨率上进行。

大家有什么建议或者见解欢迎在评论区留言!欢迎点赞收藏哦!

工程源码地址:TellusBuilder

感兴趣的同学,建议先点上 starwatch ,当然想基于我的工作自己往后做的也欢迎 Fork 啊。**

关注博主哦!

博主简介:
李迎松(知乎:李迎松)
武汉大学 摄影测量与遥感专业博士
主方向立体匹配、三维重建
2019年获测绘科技进步一等奖(省部级)

三维☁分享❤开源✿
GitHub: https://github.com/ethan-li-coding

个人微信:(加我邀请入群)

以上是关于SfMColmap和openMVG尝试记录的主要内容,如果未能解决你的问题,请参考以下文章

重建我的3D世界代码开源连载-3Colmap和OpenMVG对比

重建我的3D世界代码开源连载-3Colmap和OpenMVG对比

编译openMVG出现的错误的解决

windows下配置VScode,写C++, 使用opencv库和openMVG依赖库 : windows下, VSCode配置C++环境

SQL 查询 - 尝试返回包含先前记录和当前记录的结果的记录

尝试记录多个按钮选择(使用数组?)