一、比賽任務(wù)簡(jiǎn)要介紹
任務(wù)要求:
基于全景圖像的室內(nèi)外定位,即利用全景圖像中特征點(diǎn)的位置關(guān)系來確定全景相機(jī)拍攝的坐標(biāo)。
簡(jiǎn)單說就是每個(gè)場(chǎng)景他都給一組圖片(用Insta360 Pro2相機(jī)拍攝的六個(gè)魚眼圖片和對(duì)應(yīng)的合成全景圖),圖片如下:

給定了標(biāo)定的相機(jī)內(nèi)參以及訓(xùn)練集的絕對(duì)坐標(biāo),如下(圖片名稱,x,y,z):

任務(wù)要求:
對(duì)同一個(gè)場(chǎng)景下測(cè)試集的圖片進(jìn)行定位
二、比賽進(jìn)程回顧
整體回顧就是各種方法的baseline大作戰(zhàn)
目前戰(zhàn)況如下:

第一階段 -- 深度學(xué)習(xí)直接回歸坐標(biāo)
前期就感覺深度學(xué)習(xí)肯定好,因?yàn)榇蠹叶荚诟氵@個(gè),然后調(diào)研了不少方法,比較有代表性的就是posenet--《PoseNet: A Convolutional Network for Real-Time 6-DOF Camera Relocalization》
這個(gè)方法就是直接用深度學(xué)習(xí)去預(yù)測(cè)相機(jī)的坐標(biāo),網(wǎng)絡(luò)里在卷積層后面加上了LSTM,把一組圖片給他輸入,網(wǎng)絡(luò)就能學(xué)習(xí)到一個(gè)場(chǎng)景下的一些信息去預(yù)測(cè)相機(jī)位置。
不過這方法嘗試幾次基本無解,原論文backbone是VGG能跑到30分吧,即便是跑ResNet34和50的backbone也就能提高一兩個(gè)點(diǎn)。但是當(dāng)時(shí)第一已經(jīng)快40分了。
最后又研究下,最新的CVPR19論文《Understanding the Limitations of CNN-based Absolute Camera Pose Regression》直接就說了,那些用CNN回歸相機(jī)位姿的方法其實(shí)最后都退化成圖像檢索了,整個(gè)網(wǎng)絡(luò)就是在從學(xué)到的圖像庫中檢索一個(gè)最相似的圖片返回給你。
所以放棄深度學(xué)習(xí)了。
第二階段 -- 傳統(tǒng)三維重建
初期OpenMVG + 默認(rèn)參數(shù)
開始考慮了好多方法,因?yàn)楫吘褂泻芏嗫蚣苈?,但是還是選擇了openMVG,主要是他有 球形相機(jī)模型。這個(gè)模型可以讓你直接將全景圖放進(jìn)去重建,不需要進(jìn)行什么去畸變切成透視圖的操作。
然后有了顯著提升:

感覺還不錯(cuò),直接比CNN高了十幾點(diǎn)!
當(dāng)時(shí)我發(fā)現(xiàn)問題就是,我為了追求高精度用的自己合成的高清照片,但是我同學(xué)用的他們給的相機(jī)自身合成的小分辨率圖片得到的結(jié)果竟然比我好三個(gè)點(diǎn)。
我越想越不對(duì)勁,然后檢查一下他們給的小分辨率圖片的Exif信息,發(fā)現(xiàn)有的竟然有GPS坐標(biāo)!感覺貌似找到了原因。。。
就這樣我用OpenMVG到了50點(diǎn)。
中期OpenMVG + 各種特征點(diǎn) + 調(diào)參
SIFT、AKAZE、LFNET、D2NET、ContextDesc都嘗試過。
總結(jié)說吧,都是半斤八兩,深度特征點(diǎn)很多情況更差,也就ContextDesc有時(shí)候能高那么一兩個(gè)點(diǎn)。
我放幾張圖就能感受到:
首先是LFNET,一張圖片提取一萬個(gè)特征點(diǎn)來匹配:

簡(jiǎn)直慘不忍睹,可能是訓(xùn)練集問題吧,這個(gè)網(wǎng)絡(luò)的描述點(diǎn)泛化能力不咋地。
然后是D2Net:

簡(jiǎn)直是隨機(jī)匹配666
比較好的是ContextDesc:

好太多了,但是這個(gè)描述點(diǎn)計(jì)算起來超級(jí)慢,超級(jí)消耗資源。
最后放上最傳統(tǒng)的SIFT吧:

雖然不知道正確匹配的結(jié)果,但是看起來就覺得sift果然是經(jīng)典。
現(xiàn)在COLMAP + 調(diào)參
直接錘爆OpenMVG,參數(shù)都不用調(diào)整,直接auto跑起來就是65分!baseline太高了,而且大家都發(fā)現(xiàn)這個(gè)東西了。感覺隨時(shí)都可能被頂下來。
做法:
COLMAP沒球形相機(jī)模型,所以我只好crop出來的透視相機(jī)來跑重建,原圖如下:

Crop后的小圖片:

問題挺多的,總結(jié)下吧:
- 由于是切割的圖片,會(huì)導(dǎo)致重建出來的屬于同一地點(diǎn)的相機(jī)有偏移。
image.png
在這種情況下,直接求平均值肯定不是最好的解決方案。我查閱很多COLMAP的文檔和Issue,關(guān)于相機(jī)間的的相對(duì)位姿是可以做到硬約束的,我也實(shí)現(xiàn)了這個(gè)腳本。但是目前看來這個(gè)硬約束就是在重建的結(jié)果基礎(chǔ)上再做一次全局的BA,提升非常有限,甚至?xí)?dǎo)致結(jié)果變差(很簡(jiǎn)單,就是在之前重建的基礎(chǔ)上有同屬于一個(gè)位置的不同相機(jī)被SfM當(dāng)作不在一個(gè)地點(diǎn),而且這個(gè)差距還比較大,這時(shí)候強(qiáng)行給一個(gè)約束就會(huì)將別的很好的相機(jī)拉過去強(qiáng)行滿足這個(gè)條件,自然結(jié)果不會(huì)好,畢竟tracks什么都還是之前計(jì)算的。) - 有的場(chǎng)景表現(xiàn)的還不如OpenMVG
主要是全景圖問題,這個(gè)Colmap用的是crop后的圖片,在紋理比較少的地方就會(huì)丟失相機(jī),而全景圖先天具有特點(diǎn)就是視野非常大,即便是某處沒紋理但是其他地方也有紋理,這就對(duì)重建非常有利。 - 最重要是怎么調(diào)參來提高精度
感覺重建的結(jié)果不一定跟圖片的分辨路呈正相關(guān)結(jié)果。有時(shí)候小的圖片反而更好。
圖片大時(shí)候提取特征點(diǎn)數(shù)目也要變多,但是不是越多越好,就我實(shí)驗(yàn)一張圖三十萬的特征點(diǎn)跟一萬特征點(diǎn)很多時(shí)候不是變好的。
match嚴(yán)格那么精度有所提高但是相機(jī)會(huì)丟失,寬松了精度就下來了。
reconstruction時(shí)候怎么才能不讓他初始化距離為1,因?yàn)檫@樣轉(zhuǎn)換誤差比較大。
大場(chǎng)景global肯定比incremental好,但是colmap其實(shí)沒有這個(gè)選項(xiàng),只能通過調(diào)節(jié)局部BA和全局BA頻率來降低累積的誤差。
