视觉三维重建colmap框架的现状与未来

注:该文章首发3D视觉工坊,链接如下3D视觉工坊

前言

众所周知,三维重建的发展已经进入了稳定期,尤其是离线方案的发展几乎处于停滞期,在各大论刊上也很少见到传统sfm+mvs亮眼的文章。这也不难理解,传统的多视图几何内容已经被展现的体无完肤,即使能做出一些impressive创新,也需要非常坚厚的数学基础。这里就公布一些主流的离线视觉三维重建商业和开源的框架问世时间:

商用:
(1)Photoscan(现在称为Agisoft Metashape)的首个版本于2010年发布。
(2) ContextCapture 是由Bentley Systems开发的软件,首个版本发布于2015年。
(3) Inpho 是由Trimble开发的软件,发布时间比较早,但具体时间可能因版本而异。Trimble公司在2008年收购了Inpho公司,因此在此之前的版本应该是由Inpho公司发布的。
(4)Pix4D是一家提供专业无人机图像处理软件的公司,其软件可用于生成高质量的地图和模型。Pix4D软件的首个版本于2011年发布。
开源:
(1)openmvg 是2012年发布,应该是最早的且最具有代表性的三维重建框架。
(2)colmap是2016年发布的,一问世便处于巅峰位置,目前来看,仍然是处于incremental sfm 的榜首。
(3)除了openmvg和colmap ,还有ODM、opensfm、theiasfm、alicevision等这些都差不多在colmap 问世的前后时间。

据上可见,不管是商用的还是开源的都距现在已经有10多年左右的时间了,这10年商用软件早已经稳定且难以突破,国内三维重建方面的厂商更是数不胜数,同时利用这些开源框架去做一些有意义的产品是一件非常大的挑战且需要很长时间的积累与思考。

colmap 目前的现状

近两年AI技术的火热尤其是nerf和gaussian splatting 的出现,又将colmap推了一把,传统mvs的地位仿佛受到了挑战,虽然说nerf/gs的效果是无法胜任传统mvs的精度,但是作为"看看"的条件,是远远足够了。且传统重复纹理、low texture 如水、玻璃这些难以重建的场景也被nerf/gs解决。而目前来看,开源的大多数nerf/gs框架的输入几乎都是colmap的sfm的结果(这里重申一下并不是nerf/gs的输入必须是colmap,也可以是vslam的结果也可以是一些商业软件的结果),使用colmap的原因很简单:开源SOTA且容易安装。

图1. Gaussian splatting结果
除此之外,colmap被偏爱的一个领域是AR方面,AR的核心是空间计算,即VPS(Visual positioning System)。而视觉定位的基石在于定位地图的构建,而目前大多数的公司的AR定位地图的构建都是基于sfm的路线。如以下公司:

(1)韩国maxst

图2. maxst vps pipeline
maxst使用的方案是:Insta360 pro 全景相机 + sfm 建图(全景拆分为若干个pinhole)。

(2)Blue Vision Labs–(Lyft收购)

图3. Blue vision vps pipeline
Blue vision的方案:车载8个fov 70度的相机,建图使用sfm pipeline 并且使用openmvg框架,单次定位返回时间970ms(4G)。

(3)香港neogoma

图4. neogoma vps
neogoma的方案:手机扫描 + web sfm 建图路线。

存在的问题与未来

不管是colmap(sfm)是用来作为nerf/gaussian splating从业从人员的输入源,还是作为AR众包地图的构建,还是用来4D时空标注的辅助,在使用的时候难免会处理大场景数据而不是简单的跑一个小数据来作为demo展示。通常这个时候很多问题就随即出现,人们就开始抱怨:为什么colmap如此慢?它的bottlenecks是什么?为什么会出现drift?为什么车载数据就跑了两帧程序就终止?为什么...?等等让人哭笑不得的问题。如果你不是一个三维死忠爱好者或者只是想要把数据快速处理完毕,那么针对以上的抱怨解决方法不需要你去深究colmap的源码,痛苦的去improved,只需要调参也可以达到你的目的。

对于调参人员来说
(1)为什么colmap如此慢?
如果你的数据是车载数据即forward motion,那么其实local ba 足够,不需要太频繁的global ba(众所周知ba的复杂度是(camera_params+6N+3n)^3,因为每次新加入的图像主要和其周围的地图有关系。所以调整mapper以下参数即可:

i.减少ba_global_max_refinements次数 (5改为1)
ii.增大模型增大到一定比例触发global ba的参数
Mapper.ba_global_images_ratio 、 Mapper.ba_global_points_ratio 、Mapper.ba_global_images_freq
(2)为什么车载数据就跑了两帧程序就终止?
如果你的数据质量不佳或者是车载数据,车载数据是比较困难处理的,因为baseline短且图像两边的特征消失的很快,这个时候采用默认参数去跑,通常会出现初始化完后就终止了程序,这个时候就要调小初始最小三角化角度Mapper.init_min_tri_angle(默认16调成5)。
对于研究源码的人员来说,colmap的improved方面数不胜数,离一个可用的状态需要做很多的工作
(1)关于相机模型的选择,在处理数据的时候,如果相机模型选择简单的,会造成欠拟合,出现blend map之类的现象,如果选择复杂的相机模型就会出现不收敛的情况。
(2)关于匹配方面,colmap中匹配有词汇树匹配方法,但是deep learning的方法已经完全超越BOW,如可以用netvlad、cosplace近几年的方法来替换传统的检索方式。
(3)关于view graph,特征检测和匹配完后,会生成view graph,这时候并不是一股脑就去sfm,view graph 的优化既可以减少冗余,也可以改善整个网形,提升sfm的鲁棒性。

图5.view graph

(4)关于dirft问题,控制点(GCP)/gps约束都可以很好的改善,这个问题已经在三年前colmap课程中讲过,当然在加入外部约束的时候,less is more的约束同时也会增添不少风采,如sift的feature scale 定权可以很明显的降低误差,如图6:

图6.左边是feature sclae和右边没有feature scale

(5)关于colmap 慢的问题,这便是pipeline的问题,采用分组sfm便可解决,整个过程是:view graph 聚类分组–>每个组内 local sfm --> local sfm merge 。做好分组sfm的基本是local sfm 足够的鲁棒。

图7.vismap 11095张鱼眼sfm结果(不同颜色代表分组)

(6)关于colmap 鲁棒性方面,对于forword motion数据,p3p/pnp的效果并不一定好,这个时候采用hybird方式不免是一种明智的做法,流程是:先rotation averaging 然后采用p2p解算pose,具体参见HSfM: Hybrid Structure-from-Motion(崔海楠)的工作。初次之外,也可以在rotation averaging后,利用得到全局rotation 和pnp解算的r进行约束,也就是除了重投影误差,还有图像对之间Rotation的惩罚项。

(7)关于colmap sfm的评判机制/标准,目前所有的论文最终评判sfm的metric都是:track length、重投影误差、3D点个数、每张影响的2D点个数,但是重投影误差是无意义的,即使重投影误差很小,sfm也会出现dirft,因为3D点是源于pose和匹配点,Pose dirft会造成3D点不是"真",那么投影回来误差自然也不会大,所以选择一个合理的metric是值得思考的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL 解释器小记

解释器的结果通常通过上述表格展示: 1. select_type 表示查询的类型 simple: 表示简单的选择查询,没有子查询或连接操作 primary:表示主查询,通常是最外层的查询 subquery :表示子查询,在主查询中嵌套的查询 derived: 表示派…

【王道数据结构】【chapter8排序】【P360t2】

试编写一个算法,使之能够在数组L[1……n]中找出第k小的元素(即从小到大排序后处于第k个位置的元素)(可以直接采用排序,但下面的排序的代码只是为了方便核对是不是第k小的元素,k从0开始计算) #in…

出海手游收入一路高歌,营销上如何成功?

出海手游收入一路高歌,营销上如何成功? 以RPG和SLG为代表的中重度游戏一直是国内厂商在海外市场的传统优势品类,因为它们具有较高的投资回报率,是国内厂商在国际市场上取得成功的“吸金”利器。 据伽马数据发布的《2023全球移动游…

SpringCloud搭建微服务之Consul服务配置

1. 概述 前面有介绍过Consul既可以用于服务注册和发现,也可以用于服务配置,本文主要介绍如何使用Consul实现微服务的配置中心,有需要了解如何安装Consul的小伙伴,请查阅SpringCloud搭建微服务之Consul服务注册与发现 &#xff0c…

steam怎么付款

信用卡支付 登录Steam账户,选择需要购买的游戏或其他物品,点击“加入购物车”。在购物车页面点击“去结账”按钮,进入付款页面。在付款页面选择信用卡付款方式,填写信用卡信息,输入验证码,点击确认付款。 …

Servlet 新手村引入-编写一个简单的servlet项目

Servlet 新手村引入-编写一个简单的servlet项目 文章目录 Servlet 新手村引入-编写一个简单的servlet项目一、编写一个 Hello world 项目1.创建项目2.引入依赖3.手动创建一些必要的目录/文件4.编写代码5.打包程序6.部署7.验证程序 二、更方便的处理方案(插件引入&am…

autocrlf和safecrlf

git远程拉取及提交代码,windows和linux平台换行符转换问题,用以下两行命令进行配置: git config --global core.autocrlf false git config --global core.safecrlf true CRLF是windows平台下的换行符,LF是linux平台下的换行符。…

基于springboot+vue的公交线路查询系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

Find My运动相机|苹果Find My技术与相机结合,智能防丢,全球定位

运动相机设计用于在各种运动和极限环境中使用,如徒步、登山、攀岩、骑行、滑翔、滑雪、游泳和潜水等,它们通常具有防抖防震、深度防水和高清画质的特点,能够适应颠簸剧烈的环境,甚至可以承受一定程度的摔落,一些运动相…

基于systick实现获取系统运行时间

基于systick实现获取系统运行时间 文章目录 基于systick实现获取系统运行时间systick.c代码结构:代码功能:总结 systick.c #include <stdint.h> #include "gd32f30x.h"static volatile uint64_t g_sysRunTime 0;/** ***************************************…

数学建模【聚类模型】

一、聚类模型简介 “物以类聚&#xff0c; 人以群分”&#xff0c;所谓的聚类&#xff0c;就是将样本划分为由类似的对象组成的多个类的过程。聚类后&#xff0c;我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测&#xff0c;也可以探究不同类之间的相关性和…

springboot233大学生就业需求分析系统

大学生就业需求分析系统设计与实现 摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff…

五种查看Spring容器中bean的方法

五种查看Spring容器中bean的方法 在Spring应用程序中&#xff0c;了解和查看容器中的Bean是进行调试和问题排查的关键。Spring提供了多种方法来查看容器中注册的Bean&#xff0c;以便我们深入了解应用程序的内部结构和调试潜在问题。本文将介绍五种常用的查看Spring容器中Bean的…

C++ map用法详细总结40例

文章目录 1. 定义与初始化2. 插入元素3. 查找元素4. 删除元素5. 遍历6. 访问成员函数7. 修改元素8. 注意事项9. 使用 equal_range 查找键值范围10. 使用 emplace 添加元素11. 使用 cbegin 和 cend 获取常量迭代器12. 排序规则自定义13. 使用 multimap 存储重复键14. 判断 map 是…

Python音乐信息管理库之beets使用详解

概要 在数字化时代,音乐管理变得越来越重要,特别是对于音乐爱好者和专业音乐人士而言。Python作为一种功能强大的编程语言,拥有着丰富的音乐处理库,其中Beet就是一款备受推崇的音乐信息管理工具。本文将深入探讨Beet库的功能特性、使用方法以及应用场景,并提供丰富的示例…

WPF真入门教程31--WPF版房屋租售系统

1、教程回顾 到现在为止&#xff0c;“蒸”入门系列教程已完成了30刺由浅入深地讲解&#xff0c;当然不可能讲到了WPF的所有技能点&#xff0c;但读者看到了wpf的内部各种功能及之间的联系&#xff0c;在此基础上&#xff0c;再提供一个完整有效的综合项目&#xff0c;本项目采…

tcp的三次握手和四次挥手?

一&#xff1a;引出 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection的东西&#xff1b;由于TCP不存在连接的概念&#xff0c;只存在请求和响应&#xff0c;请求和响应都是数据包&#xff0c;它们之间都是经过由TCP创建的一个从客户端发起&#xff…

身份验证错误。要求的函数不受支持。远程计算机:[IP地址]。这可能是由于CredSSP加密数据库修正

出现“身份验证错误。要求的函数不受支持。远程计算机&#xff1a;[IP地址]。这可能是由于CredSSP加密数据库修正”的问题&#xff0c;通常是因为Windows更新后&#xff0c;远程桌面连接&#xff08;RDP&#xff09;的安全性增强&#xff0c;特别是与CredSSP&#xff08;Creden…

[RoarCTF 2019]Easy Calc

这题考查的是: 字符串解析特性目录读取文件内容读取 字符串解析特性详解&#xff1a;PHP字符串解析特性 &#xff08;$GET/$POST参数绕过&#xff09;&#xff08;含例题 buuctf easycalc&#xff09;_参数解析 绕过-CSDN博客 ascii码查询表&#xff1a;ASCII 表 | 菜鸟工具 …

AI智能雷达名片小程序平台版源码系统 带完整的安装代码包以及安装部署教程

在当今数字化快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已渗透到各个领域&#xff0c;尤其是在商务沟通领域&#xff0c;传统的名片已经不能满足现代商业的需求。小编给大家分享一款名为“AI智能雷达名片小程序平台版”的源码系统&#xff0c;该系统不仅提…