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

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

0. 前言

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

1. 数据选择

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

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

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

数据名称 影像数 尺寸 相机类型 场景描述 有无GPS
Small Buildings 36 4592x3056 无人机(AscTecFalcon 8) 建筑
Urban 113 5472x3648 无人机(senseFly) 农田,建筑,裸地
Person-hall 330 5616x3744 数码相机(Canon) 建筑、树木、近景
Graham-hall 711 5316x3744 数码相机(Canon) 室内,近景
Shoe 42 4032x3024 手机(三星S20+) 生活用品
Dinosaur 55 4032x3024 手机(三星S20+) 模型
Small Buildings
Urban
Person-hall
Graham-hall
Shoe
Dinosaur

2. 测试环境

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

平台 型号
CPU Intel I7-8700K 3.7GHz
GPU NVIDIA 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 Extraction 0.094
特征匹配 Feature Matching 1.723
光束法平差Bundle adjustment 0.996
SFM总时间 2.813
重投影误差平均 0.89
重建图像数 / 稀疏点数 36 / 20972

在这里插入图片描述

OpenMVG

步骤 时间(分)
特征提取 Feature Extraction 1.867
特征匹配 Feature Matching 0.583
光束法平差Bundle adjustment 1.067
SFM总时间 3.517
重投影误差平均 0.28
重建图像数 / 稀疏点数 36 / 69791

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

2 Urban 113p 5472x3648

Colmap

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

在这里插入图片描述

场景看上去有些弯曲,为了验证,我用商业软件Agisoft Metashape也跑了一遍,耗时102.344秒(1.706分),效率非常高,重建图像113张,共173095稀疏点,结果如下:
在这里插入图片描述
场景是平的,可以判断出Colmap重建出的场景是有一点漂移(Drift)的。但需要说明的是,Metashape是有辅助GPS,而Colmap未使用GPS辅助。

OpenMVG

步骤 时间(分)
特征提取 Feature Extraction 8.200
特征匹配 Feature Matching 23.13
光束法平差Bundle adjustment 12.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 adjustment 22.108
SFM总时间 59.474
重投影误差平均 0.75
重建图像数 / 稀疏点数 330 / 179134

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

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

OpenMVG

步骤 时间(分)
特征提取 Feature Extraction 29.91
特征匹配 Feature Matching 247.78
光束法平差Bundle adjustment 130.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 adjustment 48.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 adjustment 0.259
SFM总时间 1.456
重投影误差平均 0.68
重建图像数 / 稀疏点数 38 / 5059

在这里插入图片描述

OpenMVG

步骤 时间(分)
特征提取 Feature Extraction 1.63
特征匹配 Feature Matching 0.37
光束法平差Bundle adjustment 0.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 adjustment 0.488
SFM总时间 1.682
重投影误差平均 0.91
重建图像数 / 稀疏点数 55 / 10383

在这里插入图片描述

OpenMVG

步骤 时间(分)
特征提取 Feature Extraction 2.00
特征匹配 Feature Matching 0.05
光束法平差Bundle adjustment 0.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

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

猜你喜欢

转载自blog.csdn.net/rs_lys/article/details/118004259