多視圖幾何三維重建實戰系列之MVSNet


作者:浩南

來源:公眾號@3D視覺工坊

鏈接:多視圖幾何三維重建實戰系列之MVSNet

 

1. 概述
MVS是一種從具有一定重疊度的多視圖視角中恢復場景的稠密結構的技術,傳統方法利用幾何、光學一致性構造匹配代價,進行匹配代價累積,再估計深度值。雖然傳統方法有較高的深度估計精度,但由於存在在缺少紋理或者光照條件劇烈變化的場景中的錯誤匹配,傳統方法的深度估計完整度還有很大的提升空間。近年來卷積神經網絡已經成功被應用在特征匹配上,提升了立體匹配的精度。在這樣的背景下,香港科技大學Yaoyao等人,在2018年提出了一種基於深度學習的端到端深度估計框架——MVSNet[1]。雖然這兩年已經有更多的框架在精度和完整度上面超過了MVSNet,但筆者發現,無論是基於監督學習的R-MVSNet 、Cascade – MVSNet等網絡,還是基於自監督學習的M3VSNet,核心網型設計都是在借鑒MVSNet而完成的,而且MVSNet也是比較早期且較為完整的三維重建深度學習框架,了解該框架的原理、數據IO與實際操作能加深對2020年以來各種新方法的理解。本篇的主要內容為MVSNet的深度估計框架介紹、深度估計原理及如何利用MVSNet進行三維重建的具體操作。(注意:本方法需要11GB以上的GPU,推薦使用至少NVIDIA 1080Ti,且同樣建議使用Linux進行操作。驅動建議安裝CUDA9.0以上版本。)2. MVSNet框架圖1 MVSNet網絡形狀由上圖所示,MVSNet是一種監督學習的方法,以一個參考影像和多張原始影像為輸入,而得到參考影像深度圖的一種端到端的深度學習框架。網絡首先提取圖像的深度特征,然后通過可微分投影變換構造3D的代價體,再通過正則化輸出一個3D的概率體,再通過soft argMin層,沿深度方向求取深度期望,獲得參考影像的深度圖。3. 基於深度學習的深度估計原理按照立體匹配框架[2],基於M VSNet的深度圖估計步驟如下:深度特征提取,構造匹配代價,代價累計,深度估計,深度圖優化。深度特征提取。深度特征指通過神經網絡提取的影像特征,相比傳統SIFT、SURF的特征有更好的匹配精度和效率[3]。經過視角選擇之后,輸入已經配對的N張影像,即參考影像和候選集。首先利用一個八層的二維卷積神經網絡(圖2)提取立體像對的深度特征Fi,輸出32通道的特征圖.圖2 特征采樣的神經網絡為防止輸入的像片被降采樣后語義信息的丟失,像素的臨近像素之間的語義信息已經被編碼到這個32通道的特征中,並且各個圖像提取過程的網絡是權值共享的。

考慮到對亞像素的深度估計,以保證深度圖平滑,該單應性矩陣是完全可以微分的。通過投影變換,N張影像可形成N個特征體(圖3-b),這個特征體就是匹配代價的表示。代價累積。MVSNet的代價累積通過構造代價體實現的。代價體是一個由長、寬與參考影像長寬一樣的代價圖在深度方向連接而成的三維結構(圖4-a),在深度維度,每一個單位表示一個深度值。其中,某一深度的代價圖上面的像素表示參考影像同樣的像素在相同深度處,與候選集影像的匹配代價。

圖4  代價累計結果

當已知概率體時,最簡單的方法可以獲取參考影像的所有像素在不同深度的概率圖,按照贏者通吃原則[6]直接估計深度圖。然而,贏者通吃原則無法在亞像素級別估計深度,造成深度突變、不平滑情況。所以需要沿着概率體的深度方向,以深度期望值作為該像素的深度估計值,使得整個深度圖中的不同部分內部較為平滑。

深度圖優化。原始代價體往往是含有噪聲污染的,因此,為防止噪聲使得網絡過度擬合,MVSNet中使用基於多尺度的三維卷積神經網絡進行代價體正則化,利用U-Net網絡[7],對代價體進行降采樣,並提取不同尺度中的上下文信息和臨近像素信息,對代價體進行過濾(圖5)。圖5  MVSNet代價體正則化4. MVSNet實戰操作首先感謝Yaoyao(香港科技大學)給出的開源代碼和已經預處理好的模型和數據。其次,本節首先介紹MVSNet利用開源數據集中的數據進行深度估計和點雲恢復,之后,回顧該網絡數據IO相關的要求和數據文件夾結構,最后,介紹如何利用自己采集的數據進行深度估計和點雲恢復。4.1 利用開源數據集進行深度估計
1) 環境配置參考Yaoyao的github主頁中installation即可完成環境配置。https://github.com/YoYo000/MVSNet2) 數據整理在文末分享的百度雲盤中下載數據集preprocessed_inputs/dtu.zip和預訓練好的網絡models/tf_model_19307.zip。將tf_model解壓,在其中的3DCNNs/中獲得訓練好的模型 model.ckpt-100000.data-00000-of-00001。

將test.py 中的pretrained_model 地址改為tf_model中3DCNNs的地址。圖7 更改預訓練模型的地址解壓下載好的dtu.zip,到用於深度估計的數據集。以scan10為例,該文件夾的結構如下圖。圖8 scan10文件夾結構3) 深度估計運行代碼:

  •  

python test.py --dense_folder TEST_DATA_FOLDER --regularization '3DCNNs' --max_w 1152 --max_h 864 --max_d 192 --interval_scale 1.06

注意:

  • flag --dense_folder 要設定為scan10的地址。
  • flag –regularization表示正則化代價體的方式,MVSNet中使用的是3D卷積神經網絡。
  • 圖片的大小可以按照GPU的大小變更參數,但是需要時32的整數倍(特征提取時2D神經網絡要求圖像是32的整數倍)
  • Max_d 和interval_scale 建議先按照默認的要求,在使用自己的數據時,我們會給出調整的方式

4) 查看深度估計結果深度估計結束后,會在dense_folder文件夾中生成文件夾depths_mvsnet/。利用visualize.py 即查看相關的深度圖和概率圖(圖9),輸入代碼:python visualized.py XXXXXXX.pfm

圖9 MVSNet深度圖估計結果5) 點雲生成MVSNet只能生成深度圖,需要借助其他點雲融合方法。這里Yaoyao給出了一種方法——fusible.可以直接利用生成的深度圖和RGB圖片,生成稠密點雲。

  • 安裝fusible

git clone https://github.com/YoYo000/fusibilecd fusiblemkdir build && cmake .make .

  • 運行代碼
  •  

python depthfusion.py --dense_folder TEST_DATA_FOLDER --fusibile_exe_path FUSIBILE_EXE_PATH --prob_threshold 0.3

注意:每一個深度圖在估計的時候,都有一個對應的概率圖,及表示該像素沿深度方向不同的概率,所以flag –prob_threhold 表示用於過濾深度的概率閾值,即如果當前深度圖的某個像素的深度對應的概率低於該閾值,則在點雲融合的時候,該像素的深度不被使用,即該像素不會被投影到三維空間點。這樣可以對稠密點雲進行過濾優化。在dense_folder中,之后會生成新的文件夾points_mvsnet。在該文件夾下,找到consisitency_Check-time/final3d_model.ply. 即為融合之后的三維點雲,利用meshlab打開即可。圖10是筆者實驗過后的稠密點雲。

圖10 深度圖融合之后的稠密點雲
6) 流程回顧環境配置 -> 整理輸入數據 -> 配准好flag,運行代碼 -> 安裝深度融合軟件 -> 生成稠密點雲4.2 數據IO要求及數據配置回顧
MVSNet的整個流程完整、簡單,再回顧一下整個流程中文件夾的結構。1) Input輸入時,有一個初始的文件夾(--dense_folder),存放了兩個文件夾cams,images 和一個pair.txt.(圖8以scan10為例)其中images文件夾,包含了49張照片,是放置畸變校正之后RGB圖像的地方, cams中也包含了49個.txt文件,每一個txt文件就是對應序號圖片的相機內參數和外參數. 第三個pair.txt 保存了,當每一個照片為參考影像時, 與其最相似的前十張相片(具體的排序方式是:在稀疏重建過程中, 兩張相片共視的三維點數, 共視的三維點越多,則排名越高.)圖11 pair.txt文件逐行解釋如下:

10 選取排名較高的前十張影像 10號 得分 2346.41分 1號, 得分2036.53 9號 得分1243.89。所以,對於0號影像來說,篩選前5個類似影像為10號,1號,9號,12號,11號,從數據集找出對應的RGB圖片可觀察篩選情況(圖12)。

圖12 0號(ref) 10號 1號 9號 12號 11號 影像
如果將MVSNet暫時看成黑箱, 那么輸入到MVSNet的input文件夾,結構一定要遵從上述結構(圖8)。2) Output在深度估計結束后,  會在dense_folder下新建一個depths_mvsnet, 里面包含了生成的深度圖,點雲生成后,還有一個文件夾points_mvsnet,里面包含場景的三維點雲。圖13 output文件夾結構4.3 利用自采數據進行深度估計
將MVSNet看做一個黑箱, 需要將自采數據整理成4-1中dense_folder的文件夾結構,即需要每一個包含經過畸變矯正的RGB圖片的images文件夾、包含每一個相片的內外參數的cams文件夾,和一個pair.txt文件。一般的自采數據,可獲得RGB圖片,所以,需要再利用稀疏重建的原理獲得相機的內外參數和相關中間輸出。這里提供了一個完整的數據處理pipeline,第一,先利用COLMAP進行稀疏重建,第二,導出相機文件和稀疏場景的信息,第三利用Yaoyao提供的python代碼,將COLMAP結果直接轉換為MVSNet的輸入格式。具體步驟如下:1) 稀疏重建利用COLMAP進行稀疏重建,根據上一篇文章, 稀疏重建結束后,可得到了如下的場景。圖14 稀疏重建結果2) 圖像糾正點擊“reconstruction” 中的“dense reconstruction”. 打開稠密重建窗口,進行圖像畸變糾正。選擇dense_folder為worksapce地址,點擊“undistortion”進行圖像去畸變。(原理這里不再贅述)圖15 圖像糾正窗口再返回到dense_folder下,可以看到當前的文件夾結構(圖16)。這里的sparse是自動創建的保存相機數據和稀疏場景結構的文件夾。圖16 糾正之后的文件結構3) 導出相機參數和中間數據點擊COLMAP中“file”的 “export data as TXT”, 並以2)中的sparse/文件夾作為導出地址,導出三個文件:camera.txt, images.txt, points3D.txt.圖17 相機數據和中間數據(選中部分)

  • camera.txt是保存相機內參數的文件
  • images.txt是保存圖片外參數和圖片二維特征與三維空間點對應信息的文件
  • points3D.txt是保存三維空間點在世界坐標系下坐標、RGB值以及在各個影像上的軌跡(track)

4) 結果轉換感謝Yaoyao的結果轉換代碼(colmap2mvsnet.py),可以將COLMAP的結果直接轉化成MVSNet輸入需要的結果。執行代碼為:

  •  

python colmap2mvsnet.py –dense_folder our_dense_folder –max_d XXX –interval_scale XXX
  • Flag –dense_folder 需要以我們的dense_folder作為地址,里面必須包含sparse文件夾
  • --max_d 表示,最大估計的離散深度采樣區間數,因為MVSNet是按照平面掃描原理進行深度估計的,所以深度是離散采樣的,一般我們設定為192個深度采樣區間。
  • --interval_scale表示每個深度區間的大小,默認為1.06(mm)。
  • 深度估計范圍:已知深度最小值depth_min,則深度最大值滿足:

  • 注意:我們需要估計自采數據的深度范圍,已保證在深度采樣區間內,能對目標場景進行有效的深度估計,舉個例子,如果自采數據的深度范圍為45cm – 80cm,那么我們用於深度估計的區間范圍應該是35cm,從45 – 80cm。此時如果我們設定的深度區間為0 – 35cm,那么估計出來的深度圖肯定是錯誤的。所以對於自采數據,大家需要嘗試不同的深度區間,以找到合適的取值范圍。
  • 在估計自采數據的深度范圍時,需要修改Yaoyao的代碼,需要的朋友們可以私戳筆者,獲取修改之后的代碼。

5) 深度估計轉換結束后,將dense_folder中的取出cams,images兩個文件夾和pair.txt文件,放入一個新的文件夾中,該文件夾就可以作為MVSNet的輸入。然后,參考4-1節即可利用自采數據進行深度估計和稠密重建。


圖18 自采數據運行結果原圖,深度圖,稠密點雲6) 流程回顧利用自己采集的數據進行深度估計的步驟為:采集數據 -> 稀疏重建 -> COLMAP文件導出 -> 數據轉換 -> 輸入MVSNet  -> 輸出深度圖 -> 深度融合,恢復點雲。5. 總結MVSNet是一種端到端的基於監督學習的深度估計網絡,從2018年提出伊始,就作為一種比較流行的深度學習框架,其提出的深度代價匹配和構造方法能快速對MVS數據進行參考影像的深度估計,其精度相比較傳統方法也有一定的提升。可是,其在正則化過程中仍舊消耗近11GB的內存,這使得許多人在使用MVSNet的時候受到限制,下一篇文章,將講述如何利用循環神經網絡和一種鏈式的Cost Volume構造方法減少MVSNet的GPU消耗,敬請期待。參考文獻

[1] Yao Yao, Luo Zixin, Li Shiwei, Fang Tian, Quan Long. MVSNet: Depth Inference for Unstructured Multi-View Stereo. European Conference on Computer Vision (ECCV)

[2] Scharstein D , Szeliski R . A Taxonomy and Evaluation of Dense Two-Frame Stereo Correspondence Algorithms[J]. International Journal of Computer Vision, 2002, 47(1-3):7-42.

[3] Han, X., Leung, T., Jia, Y., Sukthankar, R., Berg, A.C.: Matchnet: Unifying feature and metric learning for patch-based matching. Computer Vision and Pattern Recognition (CVPR) (2015)

[4] Collins R T . A Space-Sweep Approach to True Multi-Image Matching[C] Computer Vision and Pattern Recognition, 1996. Proceedings CVPR '96, 1996 IEEE Computer Society Conference on. IEEE, 1996.

[5] Yang R , Pollefeys M . Multi-Resolution Real-Time Stereo on Commodity Graphics Hardware[C] 2003 IEEE Computer Society Conference on Computer Vision and Pattern Recognition, 2003. Proceedings. IEEE, 2003.

[6] Furukawa Y , Hernández, Carlos. Multi-View Stereo: A Tutorial[J]. Foundations & Trends in Computer Graphics & Vision, 2015, 9(1-2):1-148.

[7] Ronneberger, O., Fischer, P., Brox, T.: U-net: Convolutional networks for biomedical image segmentation. International Conference on Medical Image Computing and Computer Assisted Intervention (MICCAI) (2015)

附錄開源數據集下載鏈接:(感謝香港科技大學 姚遙開源的數據集鏈接)我們需要下載的是用於測試的數據集,在公眾號「3D視覺工坊」后台回復「mvsnet」,即可獲得下載鏈接。打開百度雲鏈接時,點擊 “mvsnet”,再點擊“preprocessed_inputs”,下載其中的“dtu.zip”和“tankandtemples.zip”即可(圖18)。圖19  目標目錄本文僅做學術分享,如有侵權,請聯系刪文。下載1在「3D視覺工坊」公眾號后台回復:3D視覺即可下載 3D視覺相關資料干貨,涉及相機標定、三維重建、立體視覺、SLAM、深度學習、點雲后處理、多視圖幾何等方向。
下載2「3D視覺工坊」公眾號后台回復:3D視覺github資源匯總即可下載包括結構光、標定源碼、缺陷檢測源碼、深度估計與深度補全源碼、點雲處理相關源碼、立體匹配源碼、單目、雙目3D檢測、基於點雲的3D檢測、6D姿態估計匯總等。
下載3「3D視覺工坊」公眾號后台回復:相機標定即可下載獨家相機標定學習課件與視頻網址;后台回復:立體匹配即可下載獨家立體匹配學習課件與視頻網址。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM