最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

多視圖幾何三維重建實戰(zhàn)系列- Cascade-MVSNet

2020-12-11 17:07 作者:3D視覺工坊  | 我要投稿

來源:公眾號|3D視覺工坊(系投稿)

作者:浩南

「3D視覺工坊」技術交流群已經成立,目前大約有12000人,方向主要涉及3D視覺、CV&深度學習、SLAM、三維重建、點云后處理、自動駕駛、CV入門、三維測量、VR/AR、3D人臉識別、醫(yī)療影像、缺陷檢測、行人重識別、目標跟蹤、視覺產品落地、視覺競賽、車牌識別、硬件選型、學術交流、求職交流、ORB-SLAM系列源碼交流、深度估計等。工坊致力于干貨輸出,不做搬運工,為計算機視覺領域貢獻自己的力量!歡迎大家一起交流成長~

添加小助手微信:CV_LAB,備注學校/公司+姓名+研究方向即可加入工坊一起學習進步。

QQ群「3D視覺研習社」,群號:574432628

MVSNet在2018年提出后,在估計深度圖的應用中取得了非常好的結果。應用CNN于立體匹配的技術也使得傳統(tǒng)的匹配效率整體提高。但是因為使用3D卷積神經網絡進行深度正則化處理,所以即便在比較低的分辨率(900*600)下,也需要比較高的GPU消耗。針對該問題,該團隊在CVPR2019上提出利用循環(huán)神經網絡對3D代價體進行切片處理,大幅度減少GPU消耗,使得該網絡框架不僅可以估計更大范圍的場景,且估計精度更高。

本篇文章仍將就MVSNet內存消耗大的問題,介紹CVPR2020的一篇文章:Cascade Cost Volume for High-Resolution Multi-View Stereo and Stereo Matching. 該文章沿用MVSNet深度估計的框架,具體創(chuàng)新在于改進Cost Volume的構造方式,使得利用深度學習估計深度時,在較低GPU消耗上估計高分辨率、大場景的深度。

1、背景介紹

基于深度學習的多視圖立體,例如經典的MVSNet網絡架構,通常會構造一個三維的代價體去回歸場景的深度值,但MVSNet常受限于顯存限制而無法對高分辨率的影像進行深度估計。

在MVSNet框架的基礎上,多種方法對顯存增長問題提出了改進方案,上一篇文章我們介紹了R-MVSNet,該方法利用循環(huán)神經網絡GRU,對三維代價體進行切片,這樣不僅保留了靠前的深度和紋理信息,也減少了GPU的消耗,深度估計精度和深度估計范圍要優(yōu)于MVSNet,不同方法的比較結果可通過圖1體現(xiàn)。


圖1 效果比較圖

不同于R-MVSNet,本篇文章(以下簡稱“Cascade-MVSNet”)則仍舊使用了MVSNet網絡框架中的3D卷積神經網絡對深度代價體進行正則化,但不同于其代價體的構造,Cascade-MVSNet利用鏈式代價體構造的策略,先估計較為粗糙的深度值,然后再進一步縮小深度估計范圍,提高深度估計精度,實現(xiàn)了在較小的GPU消耗的條件下,得到較高分辨率和較高精度的深度圖,經過稠密重建后,Cascade-MVSNet的結果也比之前所提到的方法要更為完整(圖2)。


圖2 稠密重建結果比較

2、代價體構造回顧

沿用立體匹配的視差估計框架,通常深度學習方法都會構造一個沿深度方向的代價體,例如MVSNet借鑒平面掃描算法的原理,構造由沿不同深度而前視平行的平面組成一個相機椎體,然后每一個相機椎體經過采樣,變成長寬一致的特征體,通過可微分化的單應性變換將不同視角下的特征扭曲到參考視角上,構成代價體。

一般來說,代價體的長寬則是由輸入影像分辨率提供的,深度范圍則是通過稀疏重建后的結果提供先驗條件。這樣的構造方式,使得代價體正則化時,三維代價體的內存消耗會以三次指數的速率增長(圖3)。


圖3 代價體構造示意圖

上一篇文章中R-MVSNet使用循環(huán)神經網絡,對將代價體沿深度切成不同的深度圖,利用GRU結構進行正則化處理,相比較MVSNet,能減少GPU的消耗??墒茄h(huán)神經網絡會涉及一個遺忘的過程,導致網絡不能很好地保留像素周圍的紋理信息,所以點云完整度不能得到很好地保留(圖4)。


圖4 RNN代價體正則化過程

3、Cascade-MVSNet

為了解決信息保留和GPU消耗的兩個問題,Cascade-MVSNet提出一種級聯(lián)的代價體構造方法,并輸出從粗到細的深度估計值。

首先來看其整個網絡的架構(圖5)。


圖5 Cascade網絡框架示意圖

可以看到,整個網絡的結構還是沿襲了MVSNet框架(圖6),還是以多視圖的影像作為輸入,然后經過可微分單應性變換形成不同視角下的特征體,在通過代價體構造,形成一個代價體,之后通過回歸估計深度值。這里不再對MVSNet作更多的贅述,感興趣的朋友可以回顧之前的文章:MVSNet。


圖6 MVSNet深度估計框架

此篇文章不同的是:整個網絡利用級聯(lián)式代價體的構造策略。首先,原始輸入影像,利用特征金字塔網絡先對原始影像進行降采樣,降低特征體的分辨率,使得可以擁有較為精確的深度估計范圍。通過初始的MVSNet框架估計出低分辨率下的深度圖后,進入下一階段。

下一階段開始時,先進行上采樣,然后以上一層的深度估計范圍作為參考,確定改成的深度估計范圍和深度估計間隔。最后輸出一個較高分辨率的深度圖。

如圖7,根據稀疏重建給予的先驗深度范圍,第一階段的深度估計范圍將包含整個場景。所以,會和低分辨率影像建立一個體量較小的代價體(圖5)。在之后的階段中,深度估計范圍會進一步縮小。



圖7 不同階段的深度估計范圍變化

除了深度估計范圍的縮小,深度估計間隔也會進一步縮小,越小的深度估計間隔代表著越精細的深度估計精度。


在第k個階段,假設當前的深度估計范圍Rk和深度平面估計間隔Ik,所以對應的深度估計平面數可以


計算。當該階段的圖像分辨率固定后,一個更大的深度估計范圍會產生更為精確的深度估計結果,但同時也會提升GPU的消耗。同時根據特征金字塔網絡的特點,在級聯(lián)式代價體構造過程中,每個階段將按照上一階段的兩倍數量,即在每個階段的圖像的分辨率分別是之前的兩倍。

4、Loss的設置

Cascade-MVSNet仍舊是監(jiān)督學習下的網絡結構,同時,因為仍舊沿用MVSNet的網絡架構,所以Loss的構造和MVSNet的loss構造形式類似,不同的是,Cascade-MVSNet使用的是級聯(lián)式的學習策略,所以Loss構造定義為:


其中,Lk指的是第k個階段的總Loss,λk則表示當前階段的權重。一般來說,分辨率越高,設置的權重越大。

5、Cascade-MVSNet實戰(zhàn)操作

首先,再次感謝Yaoyao(香港科技大學)給出已經預處理好的數據,感謝Alibaba集團提供的開源代碼。因為Cascade-MVSNet的深度估計框架沿用MVSNet,所以其輸入和MVSNet要求一致,這里不再重復說明,詳細數據處理內容,請大家回顧實戰(zhàn)系列-MVSNet。

1)環(huán)境配置

參考Alibaba的github主頁中的installation,即可完成環(huán)境配置。

(https://github.com/alibaba/cascade-stereo)

2)深度估計

環(huán)境配置結束后,需要打開CasMVSNet文件夾(圖8),整個cascade-stereo包含多視圖立體和雙目立體,本篇文章只關注多視圖立體方面的應用。所以進入CasMVNSet的文件夾。


圖8 CasMVSNet目錄

具體的配置這里不再重復,Github上的README.md介紹已經十分詳盡。運行之后可以得到的結果如下:

·Scan10 數據庫



原圖 b) 深度圖 c) 深度置信度圖

圖9 深度圖估計結果


圖10 稠密重建結果

3)具體分析

代碼分析:

Github上提供了一個shell的腳本,在終端直接運行即可,以下對代碼進行簡要介紹:

#!/usr/bin/env bashTESTPATH="data/DTU/dtu_test_all"TESTLIST="lists/dtu/test.txt"CKPT_FILE=$1python test.py --dataset=general_eval --batch_size=1 --testpath=$TESTPATH --testlist=$TESTLIST --loadckpt $CKPT_FILE ${@:2}

上述bash中,需要首先設置Test圖片的位置,這里設置為下載好的數據集即可,TestList表示設置需要對那幾個數據進行深度處理和重建,例如,我想對10,15,24號數據集重建,那Testlist中只要包含scan10, scan15, scan24即可。

CKPT_FILE是訓練好的網絡的地址,通過官網可以下載預訓練的模型。

在test.py中,主要有幾個flag需要注意,代碼如下:

parser.add_argument('--max_h', type=int, default=864, help='testing max h')parser.add_argument('--max_w', type=int, default=1152, help='testing max w')parser.add_argument('--filter_method', type=str, default='normal', choices=["gipuma", "normal"], help="filter method")parser.add_argument('--fusibile_exe_path', type=str, default='../fusibile/fusibile')parser.add_argument('--prob_threshold', type=float, default='0.9')parser.add_argument('--num_consistent',?type=float,?default='4')

注意,可以改變測試分辨率的大小,但需要為32的倍數,且最好保證為16:9的長寬比例。其次,使用gipuma進行稠密重建時,需要預下載fusion這個庫,這個在https://github.com/YoYo000/fusibile可以下載,然后在終端輸入:

Mkdir buildCd buildCmake ..Make

之后將 --fusibile_exe_path的地址設置為可執(zhí)行文件所在的地方。第三個要注意的flag是—prob_threshold,這個表示gipuma算法中利用置信度過濾深度圖的閾值,如圖11)所示,如果當前像素的置信度較高(c-上部),則說明當前像素的深度估計比較準確,若置信度較低,則說明當前像素上,深度估計有多個峰值,不能確定哪一個是最優(yōu)深度,也表示當前像素估計的深度不準。因此,利用該閾值對深度圖進行過濾,在稠密重建的時候,置信度較低的像素就不進行深度融合。


圖11 置信度解釋示意圖[2]

結果分析:

通過輸出多個中間結果,對Cascade結果進行分析,首先是跑分結果,通過表1可得,利用Cascade的代價圖構造方式在精度和完整度上都比之前的方法更優(yōu),比傳統(tǒng)方法提升了近15個點,比R-MVSNet方法提升了近10個點。

表1 跑分比較結果表


其次,從深度圖估計結果看(圖12),深度圖較為平滑、完整,且估計精度比較高,估計錯誤的大多數是背景或者白色無紋理地區(qū)。通過對當前深度圖的點云映射(圖13),當前網絡在原圖視角下可以保持較高的分辨率,當在meshlab中旋轉視角,可以看到當前視角估計出來的稠密點云效果完整,主體部分基本正確,背景部分存在偏差是正常的體現(xiàn),在整體融合的時候可以濾除掉。


圖12 scan15深度估計結果


圖13 單圖恢復點云結果

更多結果:




圖14 深度估計結果


圖15 稠密重建結果

以上結果均由筆者親自試驗,效果能達到論文中描述的水平,且GPU消耗基本在7GB以內,可行性比較高。

6、總結

Cascade-MVSNet是一種利用級聯(lián)式代價體構造,解決MVSNet在深度估計過程中的GPU消耗過大問題、點云完整度不高的深度學習方法。通過實驗,該方法在現(xiàn)有的MVSNet框架下,能以較小的GPU消耗,得到較高精度的深度估計結果,同時也能保留較高的完整度。

MVS的深度學習實戰(zhàn)系列到目前為止就先告一段落,本系列我們首先回顧了MVS的傳統(tǒng)原理和傳統(tǒng)方法,并介紹了COLMAP等軟件的具體操作,之后,介紹了MVSNet、R-MVSNet和Cascade-MVSNet三個深度學習框架和三維重建的pipeline,希望大家通過本系列的分享,加深對MVS三維重建的理解。

附錄

開源數據集下載鏈接:在公眾號「計算機視覺工坊」,后臺回復「mvsnet」,即可直接下載。

我們需要下載的是用于測試的數據集,所以打開百度云鏈接時,點擊 “mvsnet”,再點擊“preprocessed_inputs”,下載其中的“dtu.zip”和“tankandtemples.zip”即可(圖16)。


圖16 開源數據集下載

感謝香港科技大學姚遙開源的數據集鏈接。

圖9 深度圖估計結果


圖10 稠密重建結果

3)具體分析

代碼分析:

Github上提供了一個shell的腳本,在終端直接運行即可,以下對代碼進行簡要介紹:

#!/usr/bin/env bashTESTPATH="data/DTU/dtu_test_all"TESTLIST="lists/dtu/test.txt"CKPT_FILE=$1python test.py --dataset=general_eval --batch_size=1 --testpath=$TESTPATH --testlist=$TESTLIST --loadckpt $CKPT_FILE ${@:2}

上述bash中,需要首先設置Test圖片的位置,這里設置為下載好的數據集即可,TestList表示設置需要對那幾個數據進行深度處理和重建,例如,我想對10,15,24號數據集重建,那Testlist中只要包含scan10, scan15, scan24即可。

CKPT_FILE是訓練好的網絡的地址,通過官網可以下載預訓練的模型。

在test.py中,主要有幾個flag需要注意,代碼如下:

parser.add_argument('--max_h', type=int, default=864, help='testing max h')parser.add_argument('--max_w', type=int, default=1152, help='testing max w')parser.add_argument('--filter_method', type=str, default='normal', choices=["gipuma", "normal"], help="filter method")parser.add_argument('--fusibile_exe_path', type=str, default='../fusibile/fusibile')parser.add_argument('--prob_threshold', type=float, default='0.9')parser.add_argument('--num_consistent',?type=float,?default='4')

注意,可以改變測試分辨率的大小,但需要為32的倍數,且最好保證為16:9的長寬比例。其次,使用gipuma進行稠密重建時,需要預下載fusion這個庫,這個在https://github.com/YoYo000/fusibile可以下載,然后在終端輸入:

Mkdir buildCd buildCmake ..Make

之后將 --fusibile_exe_path的地址設置為可執(zhí)行文件所在的地方。第三個要注意的flag是—prob_threshold,這個表示gipuma算法中利用置信度過濾深度圖的閾值,如圖11)所示,如果當前像素的置信度較高(c-上部),則說明當前像素的深度估計比較準確,若置信度較低,則說明當前像素上,深度估計有多個峰值,不能確定哪一個是最優(yōu)深度,也表示當前像素估計的深度不準。因此,利用該閾值對深度圖進行過濾,在稠密重建的時候,置信度較低的像素就不進行深度融合。


圖11 置信度解釋示意圖[2]

結果分析:

通過輸出多個中間結果,對Cascade結果進行分析,首先是跑分結果,通過表1可得,利用Cascade的代價圖構造方式在精度和完整度上都比之前的方法更優(yōu),比傳統(tǒng)方法提升了近15個點,比R-MVSNet方法提升了近10個點。

表1 跑分比較結果表


其次,從深度圖估計結果看(圖12),深度圖較為平滑、完整,且估計精度比較高,估計錯誤的大多數是背景或者白色無紋理地區(qū)。通過對當前深度圖的點云映射(圖13),當前網絡在原圖視角下可以保持較高的分辨率,當在meshlab中旋轉視角,可以看到當前視角估計出來的稠密點云效果完整,主體部分基本正確,背景部分存在偏差是正常的體現(xiàn),在整體融合的時候可以濾除掉。


圖12 scan15深度估計結果


圖13 單圖恢復點云結果

更多結果:




圖14 深度估計結果


圖15 稠密重建結果

以上結果均由筆者親自試驗,效果能達到論文中描述的水平,且GPU消耗基本在7GB以內,可行性比較高。

6、總結

Cascade-MVSNet是一種利用級聯(lián)式代價體構造,解決MVSNet在深度估計過程中的GPU消耗過大問題、點云完整度不高的深度學習方法。通過實驗,該方法在現(xiàn)有的MVSNet框架下,能以較小的GPU消耗,得到較高精度的深度估計結果,同時也能保留較高的完整度。

MVS的深度學習實戰(zhàn)系列到目前為止就先告一段落,本系列我們首先回顧了MVS的傳統(tǒng)原理和傳統(tǒng)方法,并介紹了COLMAP等軟件的具體操作,之后,介紹了MVSNet、R-MVSNet和Cascade-MVSNet三個深度學習框架和三維重建的pipeline,希望大家通過本系列的分享,加深對MVS三維重建的理解。

附錄

開源數據集下載鏈接:在公眾號「計算機視覺工坊」,后臺回復「mvsnet」,即可直接下載。

我們需要下載的是用于測試的數據集,所以打開百度云鏈接時,點擊 “mvsnet”,再點擊“preprocessed_inputs”,下載其中的“dtu.zip”和“tankandtemples.zip”即可(圖16)。


圖16 開源數據集下載

感謝香港科技大學姚遙開源的數據集鏈接。


多視圖幾何三維重建實戰(zhàn)系列- Cascade-MVSNet的評論 (共 條)

分享到微博請遵守國家法律
德昌县| 四平市| 德昌县| 宝山区| 黄骅市| 离岛区| 榕江县| 弋阳县| 元氏县| 遵义县| 同江市| 堆龙德庆县| 大荔县| 莒南县| 阿鲁科尔沁旗| 绥芬河市| 民乐县| 西城区| 民和| 阳东县| 铁岭市| 石河子市| 郧西县| 富锦市| 封丘县| 丰原市| 丰台区| 永安市| 辛集市| 家居| 钟山县| 双辽市| 金寨县| 舟曲县| 公安县| 华亭县| 天镇县| 永康市| 义马市| 南溪县| 凯里市|