視覺三維重建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.pswp.cn/news/711414.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711414.shtml
英文地址,請注明出處:http://en.pswp.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平臺下的換行符。…

98 greenplum 集群搭建過程中碰到的幾個問題

前言 最近有搭建 greenplum 集群的需求 然后 在搭建的過程中碰到了一些問題, 還是有一些時間開銷 并且問題也稍微有些復雜, 因此記錄一下 1. Do not have enough valid segments to start the array. 報錯日志信息如下 20220408:14:15:29:021638 gpstart:gp1:gpadmin-[I…

基于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…

C語言-簡單的環形隊列的源碼示例

概述 環形隊列&#xff08;Circular Queue&#xff09;是一種常見的數據結構&#xff0c;特別適用于在單片機等資源受限的環境下實現緩沖區或隊列功能。下面是一個簡單的環形隊列的源碼示例&#xff0c;用C語言實現&#xff1a; #include <stdio.h> #include <stdint…

五種查看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庫的功能特性、使用方法以及應用場景,并提供豐富的示例…

市場需求預測模型

市場需求預測模型是一種用于預測某個市場或產品的需求量的數學模型。它基于歷史數據、市場趨勢以及其他相關因素&#xff0c;通過統計和分析的方法來預測未來的市場需求情況。 市場需求預測模型可以幫助企業制定合理的生產計劃、庫存管理和市場營銷策略。通過準確地預測市場需…

python實現數字規整(轉中文)

1.思路根據正則匹配數字類型比如手機號、年月日等進行相對的數字規整 話不多說直接上代碼&#xff0c;有新的類型可以按照當前方案進行新增 import redef match_year_digit(match):m str(match.group())relation {1: 一, 2: 二, 3: 三, 4: 四, 5: 五, 6: 六, 7: 七, 8: 八, …

WPF真入門教程31--WPF版房屋租售系統

1、教程回顧 到現在為止&#xff0c;“蒸”入門系列教程已完成了30刺由淺入深地講解&#xff0c;當然不可能講到了WPF的所有技能點&#xff0c;但讀者看到了wpf的內部各種功能及之間的聯系&#xff0c;在此基礎上&#xff0c;再提供一個完整有效的綜合項目&#xff0c;本項目采…