監(jiān)督學(xué)習(xí):從幾何結(jié)構(gòu)到深度估計(jì)與視覺(jué)里程計(jì))
做三維視覺(jué)研究的人應(yīng)該對(duì)“單目視頻無(wú)監(jiān)督學(xué)習(xí)”這幾個(gè)詞很敏感。我自己的體會(huì)是剛接觸這類(lèi)工作的時(shí)候最大的困惑在于沒(méi)有深度標(biāo)注沒(méi)有相機(jī)位姿標(biāo)注就用一臺(tái)單目相機(jī)對(duì)著場(chǎng)景拍一段視頻憑什么讓神經(jīng)網(wǎng)絡(luò)學(xué)會(huì)判斷遠(yuǎn)近、知道自己動(dòng)了多少這個(gè)題目的答案其實(shí)就藏在了標(biāo)題里的“結(jié)構(gòu)”二字上。單目視頻本身確實(shí)沒(méi)有標(biāo)簽但它天然攜帶一套由物理成像規(guī)則決定的幾何結(jié)構(gòu)——同一個(gè)真實(shí)場(chǎng)景點(diǎn)在不同幀里的像素位置不同、鄰近像素的深度不會(huì)完全跳變、相機(jī)運(yùn)動(dòng)與畫(huà)面變化之間存在嚴(yán)格約束關(guān)系。這些結(jié)構(gòu)不需要人工標(biāo)注視頻拍出來(lái)就已經(jīng)在了。這個(gè)項(xiàng)目解決的核心問(wèn)題就是如何把這些幾何結(jié)構(gòu)變成可微的監(jiān)督信號(hào)把一段段普通視頻直接“喂”成訓(xùn)練集讓網(wǎng)絡(luò)在完全沒(méi)有標(biāo)注的情況下學(xué)會(huì)深度感知與相機(jī)自運(yùn)動(dòng)估計(jì)。放到2018年11月這個(gè)時(shí)間節(jié)點(diǎn)看這套思路踩在了一個(gè)重要拐點(diǎn)上大家開(kāi)始從昂貴的真值標(biāo)注轉(zhuǎn)向從幾何中“白嫖”監(jiān)督信號(hào)而它給后續(xù)無(wú)監(jiān)督三維感知的研究鋪了一條很關(guān)鍵的路。這篇文章我會(huì)沿著“到底在解決什么問(wèn)題、幾何一致性怎么變成監(jiān)督信號(hào)、具體怎么實(shí)現(xiàn)、訓(xùn)練時(shí)會(huì)踩哪些坑”這條線展開(kāi)適合想理解無(wú)監(jiān)督深度估計(jì)與視覺(jué)里程計(jì)范式的同學(xué)參考。1. 先搞懂標(biāo)題單目視頻、無(wú)監(jiān)督、結(jié)構(gòu)這三個(gè)詞的分量1.1 單目視頻難在哪單目視頻就是一臺(tái)普通攝像頭拍的連續(xù)圖像幀序列。跟雙目相機(jī)或者RGB-D傳感器不一樣單目視頻在某一幀里只記錄了一個(gè)視角的二維投影信息物體距離的線索全部被“壓扁”到圖像亮度、邊緣、遮擋關(guān)系這些間接信號(hào)里了。人類(lèi)兩只眼睛靠視差感受深度司機(jī)單眼也能憑借運(yùn)動(dòng)中物體相對(duì)運(yùn)動(dòng)來(lái)判斷距離這說(shuō)明單目視頻里確實(shí)存在深度線索只是比較隱蔽。對(duì)于深度學(xué)習(xí)來(lái)說(shuō)難的不是“能不能提取線索”而是“用什么作為標(biāo)準(zhǔn)答案去教網(wǎng)絡(luò)”。如果有真值深度圖問(wèn)題就退化為一個(gè)標(biāo)準(zhǔn)的監(jiān)督學(xué)習(xí)回歸任務(wù)。但真值深度圖的獲取成本非常高激光雷達(dá)設(shè)備貴標(biāo)定麻煩而且不同場(chǎng)景、不同天氣、不同路況下要重新采集。相比之下馬路上隨便一臺(tái)行車(chē)記錄儀拍出來(lái)的視頻一天就能積累大量數(shù)據(jù)。如何把這些廉價(jià)視頻用起來(lái)就是無(wú)監(jiān)督單目深度估計(jì)存在的根本理由。1.2 無(wú)監(jiān)督學(xué)習(xí)不是沒(méi)有監(jiān)督無(wú)監(jiān)督這個(gè)詞其實(shí)有迷惑性。這套方法并不是完全沒(méi)有人監(jiān)督而是把監(jiān)督信號(hào)從“人工標(biāo)注”換成了“輸入數(shù)據(jù)內(nèi)部的自洽關(guān)系”。視頻里有一個(gè)非常硬的自洽關(guān)系如果網(wǎng)絡(luò)估算出了當(dāng)前幀里每個(gè)像素的深度又估算出了相機(jī)在相鄰幀之間的運(yùn)動(dòng)那么就可以把前一幀的像素投影到當(dāng)前幀理論上應(yīng)該得到一個(gè)和真實(shí)當(dāng)前幀幾乎一樣的重建圖像。如果重建對(duì)不上說(shuō)明深度或者位姿估計(jì)錯(cuò)了如果重建完全對(duì)得上說(shuō)明這套“深度位姿”的解釋是符合視頻幾何結(jié)構(gòu)的。網(wǎng)絡(luò)訓(xùn)練的目標(biāo)就變成了不斷最小化這種圖像重建誤差。換句話說(shuō)輸入視頻本身就是老師網(wǎng)絡(luò)自己和自己相互校驗(yàn)這就是自監(jiān)督或者說(shuō)偽監(jiān)督的本質(zhì)。這種監(jiān)督信號(hào)雖然不如人工真值精確但它隨視頻數(shù)據(jù)源源不斷覆蓋面可以做得很大泛化到新場(chǎng)景的能力往往比監(jiān)督模型更穩(wěn)。1.3 “結(jié)構(gòu)”在這里具體指什么標(biāo)題里的structure不是一個(gè)抽象口號(hào)它指代了幾類(lèi)可量化的幾何信息。第一類(lèi)是時(shí)序結(jié)構(gòu)相鄰幀之間同一個(gè)靜態(tài)場(chǎng)景點(diǎn)應(yīng)當(dāng)滿足極線約束相機(jī)的旋轉(zhuǎn)和平移決定了像素點(diǎn)移動(dòng)的方向和大小。第二類(lèi)是空間結(jié)構(gòu)真實(shí)場(chǎng)景一般由光滑表面組成物體內(nèi)部深度變化是平緩的只有在物體邊緣處深度才會(huì)發(fā)生跳變這個(gè)先驗(yàn)可以用邊緣感知的平滑約束表達(dá)。第三類(lèi)是投影結(jié)構(gòu)針孔相機(jī)模型下深度、視差、相機(jī)運(yùn)動(dòng)之間存在嚴(yán)格的三維-二維投影關(guān)系這是一個(gè)可微的數(shù)學(xué)公式能夠把網(wǎng)絡(luò)輸出的深度和位姿串成一個(gè)完整的重建鏈路。有傳統(tǒng)運(yùn)動(dòng)恢復(fù)結(jié)構(gòu)背景的人可能會(huì)好奇既然幾何公式就能解出結(jié)構(gòu)和運(yùn)動(dòng)為什么還要神經(jīng)網(wǎng)絡(luò)這恰恰是理解這篇工作價(jià)值點(diǎn)的關(guān)鍵——它不是扔掉幾何而是把幾何公式嵌進(jìn)網(wǎng)絡(luò)訓(xùn)練過(guò)程當(dāng)作約束用深度網(wǎng)絡(luò)的強(qiáng)表達(dá)能力補(bǔ)足傳統(tǒng)幾何方法在低紋理、重復(fù)紋理、大弱紋理區(qū)域穩(wěn)定性差的短板。結(jié)構(gòu)在這里就是連接學(xué)習(xí)與幾何的一座橋。2. 免費(fèi)監(jiān)督信號(hào)幾何一致性是怎么把視頻變成訓(xùn)練集的2.1 視圖合成一句話講清楚自監(jiān)督循環(huán)如果要用一句話概括整套訓(xùn)練框架我會(huì)說(shuō)讓網(wǎng)絡(luò)學(xué)會(huì)“用一個(gè)畫(huà)面解釋另一個(gè)畫(huà)面”。具體展開(kāi)是這樣的對(duì)于視頻中的某一幀作為目標(biāo)幀取它前后的相鄰幀作為源幀。網(wǎng)絡(luò)用一個(gè)深度子網(wǎng)絡(luò)預(yù)測(cè)目標(biāo)幀每個(gè)像素的深度用一個(gè)位姿子網(wǎng)絡(luò)預(yù)測(cè)目標(biāo)幀和源幀之間的相對(duì)相機(jī)運(yùn)動(dòng)。有了深度和位姿就能在源幀上采樣像素顏色把它們映射到目標(biāo)幀的位置合成一張偽目標(biāo)幀。這個(gè)合成過(guò)程在圖形學(xué)里叫視圖合成在深度學(xué)習(xí)里通常用可微的雙線性采樣實(shí)現(xiàn)從而讓誤差梯度能從像素值一路反傳到深度圖和位姿上。光度誤差計(jì)算的是目標(biāo)幀真實(shí)像素和合成圖像像素的差異用逐像素顏色差加結(jié)構(gòu)相似度加權(quán)混合。如果網(wǎng)絡(luò)預(yù)測(cè)的深度和位姿完全準(zhǔn)確合成圖像應(yīng)該和目標(biāo)幀高度一致。任何不一致都被當(dāng)作“預(yù)測(cè)錯(cuò)了”的信號(hào)反饋給網(wǎng)絡(luò)。這個(gè)過(guò)程實(shí)際上是在告訴網(wǎng)絡(luò)你給出的深度和位姿解釋必須能夠重建出和真實(shí)視頻一致的畫(huà)面否則就不是一個(gè)符合幾何結(jié)構(gòu)的解釋。這個(gè)循環(huán)的妙處在于它對(duì)網(wǎng)絡(luò)施加了極其嚴(yán)格的自洽約束而且對(duì)數(shù)據(jù)集沒(méi)有任何標(biāo)注要求只要視頻連續(xù)幀間有足夠的重疊視野。2.2 三種常用的結(jié)構(gòu)先驗(yàn)光靠光度誤差訓(xùn)練大膽的做法往往會(huì)失敗因?yàn)閱渭兿袼仡伾町惔嬖诖罅坎B(tài)解比如一堵白墻在任意深度下重建出來(lái)都差不多。所以實(shí)際有效的方法是疊加結(jié)構(gòu)先驗(yàn)。第一類(lèi)是邊緣感知平滑約束它利用的是場(chǎng)景空間連續(xù)性。具體做法是在深度圖的梯度項(xiàng)前面乘一個(gè)基于輸入圖像梯度的衰減系數(shù)——圖像邊緣區(qū)域衰減系數(shù)小允許深度跳變平坦區(qū)域衰減系數(shù)大強(qiáng)制深度平滑。我通常在逆深度空間做這個(gè)約束因?yàn)槟嫔疃仍诰鶆驁?chǎng)景中變化更線性數(shù)值穩(wěn)定性更好這也是在這類(lèi)任務(wù)中普遍采用的固化技巧。平滑約束看起來(lái)樸素卻直接決定了深度圖的質(zhì)量權(quán)重設(shè)置一定要小心調(diào)太大深度圖會(huì)糊成一片調(diào)太小深度圖又顯得粗糙噪點(diǎn)多。第二類(lèi)是幾何重投影約束它對(duì)應(yīng)視頻幀間時(shí)序結(jié)構(gòu)。深度和位姿不是兩個(gè)獨(dú)立變量它們共同決定像素映射關(guān)系。同一個(gè)深度值配上不同的位姿投影到目標(biāo)幀的位置完全不同。網(wǎng)絡(luò)可以試圖用錯(cuò)誤的深度配合錯(cuò)誤的位姿來(lái)“湊”出對(duì)的光度損失幾何重投影約束通過(guò)強(qiáng)制深度和位姿聯(lián)合重建來(lái)打掉這類(lèi)簡(jiǎn)并解。實(shí)際工程中這個(gè)約束就體現(xiàn)在前向重投影加反向重投影的一致性上可以遞歸地將多幀圖像統(tǒng)一到同一個(gè)坐標(biāo)框架下做校驗(yàn)。第三類(lèi)是多尺度結(jié)構(gòu)約束。直接用原始分辨率算光度損失梯度感受野有限低紋理大塊區(qū)域誤差難以收斂。常見(jiàn)的做法是構(gòu)造圖像金字塔在每個(gè)尺度上都計(jì)算深度圖、位姿和光度損失。低分辨率尺度提供大范圍的粗糙結(jié)構(gòu)高分辨率尺度提供細(xì)節(jié)邊緣多尺度疊加既加速收斂又提升深度圖的整體一致性。這種思路在傳統(tǒng)光流估計(jì)里同樣普遍屬于把成熟經(jīng)驗(yàn)遷到深度學(xué)習(xí)訓(xùn)練中的典型操作。2.3 運(yùn)動(dòng)物體和遮擋如何被結(jié)構(gòu)約束處理單目視頻里不全是靜態(tài)場(chǎng)景經(jīng)過(guò)的車(chē)輛、行人都會(huì)破壞二維像素運(yùn)動(dòng)與相機(jī)運(yùn)動(dòng)之間的簡(jiǎn)單對(duì)應(yīng)關(guān)系。如果強(qiáng)行對(duì)動(dòng)態(tài)物體像素施加靜態(tài)幾何重建約束網(wǎng)絡(luò)會(huì)在深度圖上把動(dòng)態(tài)物體“攤”到背景里或者糊成一片造成深度估計(jì)錯(cuò)誤。結(jié)構(gòu)約束并不能自動(dòng)把動(dòng)態(tài)物體識(shí)別出來(lái)需要額外機(jī)制。一種常用手段是讓網(wǎng)絡(luò)額外預(yù)測(cè)一個(gè)像素級(jí)的運(yùn)動(dòng)物體掩膜掩膜置信度高的區(qū)域不參與光度損失計(jì)算相當(dāng)于顯式告訴網(wǎng)絡(luò)“這里是違反剛性結(jié)構(gòu)的不要用幾何去解釋它?!?更優(yōu)雅的做法是對(duì)每個(gè)像素同時(shí)嘗試用深度驅(qū)動(dòng)的靜態(tài)重投影結(jié)果和直接學(xué)習(xí)的光流結(jié)果來(lái)重建圖像哪個(gè)重建誤差更小就把哪個(gè)當(dāng)作監(jiān)督信號(hào)這個(gè)“取最小值”的思路可以在不需要顯式掩膜的情況下自動(dòng)躲開(kāi)運(yùn)動(dòng)物體區(qū)域。我在實(shí)際使用中兩者的效果差異并不懸殊顯式掩膜在運(yùn)動(dòng)物體較多、較復(fù)雜的數(shù)據(jù)上更穩(wěn)定而求最小值方案則少了一個(gè)需要調(diào)權(quán)重、容易過(guò)擬合的輔助頭實(shí)現(xiàn)更簡(jiǎn)潔尤其適合作為初始版本跑通全流程。3. 從零搭建一套單目視頻無(wú)監(jiān)督深度估計(jì)系統(tǒng)3.1 數(shù)據(jù)準(zhǔn)備與預(yù)處理數(shù)據(jù)準(zhǔn)備的核心是構(gòu)建訓(xùn)練樣本對(duì)。我用的方案是從長(zhǎng)視頻序列中按固定間隔采樣連續(xù)三個(gè)片段當(dāng)前幀作為目標(biāo)幀兩側(cè)各取一幀作為源幀。采樣間隔不能太大否則相鄰幀之間視野重疊太少重建難度陡增也不能太小否則運(yùn)動(dòng)量不足光度損失區(qū)分度不高網(wǎng)絡(luò)學(xué)不出有效信息。一個(gè)穩(wěn)妥的經(jīng)驗(yàn)是先把相機(jī)內(nèi)參矩陣提前標(biāo)定好并固定住訓(xùn)練時(shí)直接把內(nèi)參輸入位姿和深度子網(wǎng)絡(luò)讓整個(gè)過(guò)程在已知投影參數(shù)的條件下工作。如果內(nèi)參未知又想訓(xùn)練也可以把內(nèi)參矩陣設(shè)計(jì)成可學(xué)習(xí)參數(shù)收斂后能恢復(fù)出大概的焦距和主點(diǎn)位置但訓(xùn)練穩(wěn)定性會(huì)明顯下降初學(xué)者不建議一上來(lái)就這樣做。預(yù)處理環(huán)節(jié)最重要的是去除運(yùn)動(dòng)模糊嚴(yán)重的幀、曝光異常幀以及相鄰幀內(nèi)容完全不重疊的過(guò)渡段。無(wú)監(jiān)督訓(xùn)練對(duì)輸入圖像質(zhì)量比監(jiān)督訓(xùn)練敏感得多因?yàn)楸O(jiān)督信號(hào)本身來(lái)自像素一致性圖像質(zhì)量差等于監(jiān)督信號(hào)本身就帶噪聲。我常用一個(gè)非常簡(jiǎn)單但有效的篩選邏輯計(jì)算相鄰幀的光流幅度直方圖如果平均像素位移太小或者有效像素比例太低就把這個(gè)樣本對(duì)丟棄等于人為保證了訓(xùn)練樣本的運(yùn)動(dòng)覆蓋范圍。3.2 網(wǎng)絡(luò)設(shè)計(jì)深度子網(wǎng)絡(luò)和位姿子網(wǎng)絡(luò)整套框架兩個(gè)子網(wǎng)絡(luò)各司其職。深度子網(wǎng)絡(luò)輸入單幀圖像輸出同分辨率的逆深度圖。編碼器采用帶殘差連接的卷積網(wǎng)絡(luò)逐級(jí)下采樣解碼器通過(guò)上采樣與跳躍連接逐步恢復(fù)高分辨率輸出。輸出層的激活函數(shù)非常關(guān)鍵常用softplus或sigmoid再縮放確保逆深度始終為正數(shù)因?yàn)槲锢砩仙疃炔豢赡苁秦?fù)數(shù)。為什么不直接回歸深度而是回歸逆深度這和成像的幾何特性有關(guān)相同絕對(duì)誤差對(duì)近處物體和遠(yuǎn)處物體的影響完全不同逆深度變化曲線更平緩數(shù)值穩(wěn)定性更好而且逆深度在遠(yuǎn)距離上趨向于零用有界激活函數(shù)也更容易擬合。位姿子網(wǎng)絡(luò)輸入的是目標(biāo)幀和源幀的通道拼接張量輸出一個(gè)六維相對(duì)位姿向量前三維是旋轉(zhuǎn)的軸角表示后三維是平移向量。旋轉(zhuǎn)用軸角表示而不是旋轉(zhuǎn)矩陣因?yàn)檩S角維度低、約束少網(wǎng)絡(luò)更容易回歸。平移一般取單位方向向量因?yàn)閱文抗烙?jì)本質(zhì)上存在尺度不確定性網(wǎng)絡(luò)無(wú)法同時(shí)確定真實(shí)平移距離和真實(shí)深度絕對(duì)值只能估計(jì)它們的相對(duì)比例關(guān)系。這種尺度模糊是單目幾何的固有問(wèn)題靠網(wǎng)絡(luò)結(jié)構(gòu)無(wú)法根除只能通過(guò)損失設(shè)計(jì)和歸一化手段保持訓(xùn)練過(guò)程中的一致性。3.3 損失函數(shù)光度項(xiàng)、平滑項(xiàng)、結(jié)構(gòu)項(xiàng)損失函數(shù)是整套訓(xùn)練的核心通常按權(quán)重組合三部分。光度項(xiàng)用顏色差和結(jié)構(gòu)相似度加權(quán)混合顏色差取L1范數(shù)比L2更魯棒因?yàn)長(zhǎng)2會(huì)過(guò)度懲罰圖像中少數(shù)高亮像素的偏差拉崩整個(gè)訓(xùn)練結(jié)構(gòu)相似度則用來(lái)保護(hù)圖像紋理和局部亮度結(jié)構(gòu)防止生成圖像看起來(lái)平滑但細(xì)節(jié)丟失。實(shí)際計(jì)算時(shí)對(duì)彩色圖在三個(gè)通道上平均然后以0.85:0.15的比例把結(jié)構(gòu)相似度損失和L1損失混合這個(gè)比例是實(shí)踐中很穩(wěn)的默認(rèn)值可以直接作為開(kāi)局參數(shù)。平滑項(xiàng)放在逆深度圖上使用輸入圖像梯度作衰減公式表達(dá)為平滑權(quán)重乘以逆深度梯度的平方。我習(xí)慣對(duì)四個(gè)方向的梯度同時(shí)計(jì)算因?yàn)橹凰銠M向和縱向會(huì)在對(duì)角線方向留下明顯的鋸齒深度偽影。結(jié)構(gòu)項(xiàng)則是一類(lèi)可選的校正項(xiàng)用于把深度和位姿推算出來(lái)的三維一致性再拉回到同一參考框架下比如讓靜態(tài)區(qū)域的深度與位姿投影深度保持一致。它對(duì)精度提升有幫助但會(huì)引入更多超參數(shù)如果只是起步階段我建議先固定結(jié)構(gòu)項(xiàng)權(quán)重為零把光度項(xiàng)和平滑項(xiàng)調(diào)穩(wěn)后再逐步添加。3.4 訓(xùn)練參數(shù)與多尺度技巧訓(xùn)練參數(shù)這塊我常用的基礎(chǔ)配置是先固定分辨率在長(zhǎng)邊640、短邊192左右批量大小為4優(yōu)化器用Adam初始學(xué)習(xí)率設(shè)為1E-4每20個(gè)訓(xùn)練輪次衰減0.5倍。訓(xùn)練輪次一般在50到100之間具體取決于數(shù)據(jù)集規(guī)模和計(jì)算資源。超過(guò)這個(gè)幅度之后損失曲線通常已經(jīng)進(jìn)入平臺(tái)期再訓(xùn)練容易把網(wǎng)絡(luò)推到過(guò)度自信的局部最優(yōu)產(chǎn)生背景深度塌縮一類(lèi)的問(wèn)題。多尺度技巧是提升訓(xùn)練穩(wěn)定性的重要手段。我把輸入圖像和深度圖同時(shí)構(gòu)建成四層金字塔從最粗糙尺度到最精細(xì)尺度分別計(jì)算光度損失然后全部累加。粗糙尺度梯度平滑、覆蓋范圍大幫助網(wǎng)絡(luò)快速建立全局結(jié)構(gòu)精細(xì)尺度提供高頻細(xì)節(jié)讓深度邊緣更銳利。多尺度訓(xùn)練對(duì)低紋理區(qū)域的效果尤其明顯因?yàn)榇髩K平坦區(qū)域的像素匹配在同尺度下存在嚴(yán)重多解性但下采樣后視野變大匹配歧義被顯著削弱。實(shí)際效果上加多尺度損失后深度圖的整體輪廓完整度通常會(huì)有肉眼可辨的提升。4. 實(shí)驗(yàn)怎么看指標(biāo)、可視化與代表性結(jié)果4.1 量化指標(biāo)到底在比什么做深度估計(jì)實(shí)驗(yàn)總是免不了面對(duì)一堆指標(biāo)縮寫(xiě)。絕對(duì)相對(duì)誤差把每個(gè)像素的深度預(yù)測(cè)誤差除以真值深度再平均它的含義是相對(duì)誤差比例越接近零越好平方相對(duì)誤差對(duì)大誤差更敏感少數(shù)離群點(diǎn)就會(huì)把它拉得很高均方根誤差和它的對(duì)數(shù)變體衡量絕對(duì)誤差水平閾值準(zhǔn)確率統(tǒng)計(jì)預(yù)測(cè)深度與真值深度比值落在某個(gè)倍數(shù)范圍內(nèi)的像素比例一般報(bào)告1.25、1.25平方、1.25立方三檔這個(gè)指標(biāo)更直觀地反映深度比例正確性比前兩類(lèi)指標(biāo)更接近人眼判斷。這套無(wú)監(jiān)督方法在公開(kāi)駕駛數(shù)據(jù)集上的表現(xiàn)大致能達(dá)到監(jiān)督方法的七到八成精度。這個(gè)差距要理性看待尤其要注意的是無(wú)監(jiān)督方法完全沒(méi)看任何真值標(biāo)注還能在泛化性上占據(jù)優(yōu)勢(shì)。用別的數(shù)據(jù)集做跨域測(cè)試時(shí)監(jiān)督方法經(jīng)常出現(xiàn)系統(tǒng)性偏差而無(wú)監(jiān)督模型因?yàn)橹灰蕾嚬舛纫恢滦詫?duì)場(chǎng)景風(fēng)格的依賴更小反而更耐遷移。我沒(méi)有引用具體數(shù)字因?yàn)椴煌瑪?shù)據(jù)切分、不同圖像分辨率下結(jié)果差別很大讀者真正要記住的是排序邏輯而非絕對(duì)值。4.2 可視化深度圖怎么判斷好壞定量指標(biāo)之外深度圖可視化是最直接的質(zhì)量判斷手段。好的深度圖應(yīng)該具備三個(gè)特征整體輪廓完整近處物體和遠(yuǎn)處天空背景層次分明邊緣清晰物體邊界與圖像顏色邊緣對(duì)齊平坦區(qū)域平滑干凈沒(méi)有雪花狀噪聲和條帶偽影。我常用的可視化方式是把逆深度圖用對(duì)數(shù)映射轉(zhuǎn)為偽彩色圖顯示因?yàn)樵寄嫔疃戎捣植紘?yán)重偏向零附近直接線性映射會(huì)丟失近處細(xì)節(jié)對(duì)數(shù)映射能把近處和遠(yuǎn)處的層次都清楚地展示出來(lái)。如果深度圖和真值圖做差額可視化邊緣處有細(xì)線狀殘差是正?,F(xiàn)象因?yàn)檎嬷瞪疃葌鞲衅骱拖鄼C(jī)之間有標(biāo)定誤差物體邊緣在空間上是跳躍的。真正需要警惕的是大面積塊狀殘差尤其是圖像紋理很弱的區(qū)域這說(shuō)明平滑約束權(quán)重過(guò)大或者多尺度約束缺失深度圖被“抹平”了。另一個(gè)常見(jiàn)問(wèn)題是深度圖整體偏灰、動(dòng)態(tài)范圍小通常是輸出層被歸一化到過(guò)窄范圍導(dǎo)致的可以把輸出激活函數(shù)的縮放范圍調(diào)大。4.3 什么樣的場(chǎng)景最容易翻車(chē)單目無(wú)監(jiān)督深度估計(jì)有三個(gè)顯著弱點(diǎn)。第一個(gè)是場(chǎng)景中大量出現(xiàn)動(dòng)態(tài)物體車(chē)流、行人成群穿過(guò)畫(huà)面結(jié)構(gòu)約束在這些像素上完全失效處理不好就會(huì)把車(chē)輛深度錯(cuò)誤地吸收到背景平面上。第二個(gè)是重復(fù)紋理與弱紋理環(huán)境比如同色系路面、大面積白墻、隧道走廊像素匹配多解性極其嚴(yán)重方便起見(jiàn)可以用“白墻挑戰(zhàn)”這個(gè)說(shuō)法去理解——無(wú)論網(wǎng)絡(luò)預(yù)測(cè)這面墻在哪個(gè)深度重建出來(lái)的顏色都一樣如果沒(méi)有平滑約束幫助網(wǎng)絡(luò)根本不知道墻到底離自己多遠(yuǎn)。第三個(gè)是光照突變比如進(jìn)出隧道的一瞬間幀與幀之間的整體亮度變化會(huì)直接破壞光度一致性讓網(wǎng)絡(luò)誤以為有巨大的偽深度運(yùn)動(dòng)。針對(duì)這些坑實(shí)際做法上至少要準(zhǔn)備三手方案運(yùn)動(dòng)物體多的時(shí)候把最小值重投影機(jī)制或顯式掩膜打開(kāi)弱紋理場(chǎng)景提高平滑約束權(quán)重同時(shí)把多尺度金字塔層數(shù)加一層光照突變場(chǎng)景對(duì)圖像做逐幀亮度歸一化或者在采樣時(shí)盡量避開(kāi)臨時(shí)光照劇變的片段。這三個(gè)方面每一條都能單獨(dú)拎出來(lái)做詳細(xì)實(shí)驗(yàn)但掌握好最基本的手段已經(jīng)能避免九成的低質(zhì)量訓(xùn)練結(jié)果。5. 實(shí)操踩坑記錄訓(xùn)練無(wú)監(jiān)督深度估計(jì)的九宗罪5.1 常見(jiàn)問(wèn)題一覽表在實(shí)際訓(xùn)練這套框架的過(guò)程中我踩過(guò)不少坑也有很多同行問(wèn)過(guò)相似的問(wèn)題。這里把出現(xiàn)頻率最高的幾類(lèi)問(wèn)題整理成一個(gè)速查表訓(xùn)練遇到異常時(shí)可以按表排查?,F(xiàn)象可能原因處理手段訓(xùn)練幾百步損失紋絲不動(dòng)輸入圖像沒(méi)有歸一化到合理范圍或?qū)W習(xí)率過(guò)大導(dǎo)致震蕩檢查圖像預(yù)處理和初始學(xué)習(xí)率降到1E-5試跑幾百步深度圖一片糊平滑權(quán)重太大或分辨率過(guò)低把平滑權(quán)重降為原來(lái)的五分之一提高輸入分辨率深度圖出現(xiàn)大面積近處黑斑動(dòng)態(tài)物體干擾光度損失把物體深度拉向背景打開(kāi)最小值重投影機(jī)制或增加顯式運(yùn)動(dòng)掩膜訓(xùn)練損失下降但深度圖明顯有錯(cuò)誤層次相機(jī)內(nèi)參設(shè)置錯(cuò)誤焦距方向與真實(shí)值偏差大逐項(xiàng)校驗(yàn)內(nèi)參標(biāo)定結(jié)果尤其在廣角相機(jī)上同一序列不同幀深度尺度跳變尺度不確定性問(wèn)題在批訓(xùn)練中表達(dá)得不夠一致固定同一批樣本的深度歸一化方式或在損失中加入跨幀深度一致性圖像邊緣處深度出現(xiàn)描邊偽影平滑約束的梯度方向計(jì)算不全對(duì)角線方向無(wú)約束對(duì)四個(gè)方向梯度都計(jì)算平滑損失光度損失曲線震蕩劇烈數(shù)據(jù)里有曝光或運(yùn)動(dòng)模糊異常幀用平均光流幅度做樣本篩選剔除異常樣本對(duì)表格只是排查入口還要結(jié)合損失曲線和重建圖的具體形態(tài)做判斷。大多數(shù)情況下先看重建圖像是否清晰再?zèng)Q定動(dòng)哪個(gè)權(quán)重比盲目調(diào)參高效得多。5.2 從損失曲線到深度圖的排查順序我的排查流程基本固定遇到訓(xùn)練效果不好先不看深度圖先看光度損失曲線。如果訓(xùn)練收斂但重建圖像里目標(biāo)幀和合成幀之間仍然存在大面積錯(cuò)位首先懷疑位姿子網(wǎng)絡(luò)沒(méi)有訓(xùn)好停掉平滑項(xiàng)、純用光度項(xiàng)跑到前期看重建圖是否能在靜態(tài)區(qū)域接近真實(shí)畫(huà)面。如果重建圖沒(méi)問(wèn)題再打開(kāi)平滑項(xiàng)觀察深度圖連續(xù)性和物體邊界逐個(gè)因素疊加定位問(wèn)題出在哪一個(gè)環(huán)節(jié)。很多人在開(kāi)始階段直接看最終深度圖被大量偽影干擾容易誤判模型整體性能。實(shí)際上分量排查法非常有效把平滑權(quán)重設(shè)為0多尺度只保留最粗糙一層這樣訓(xùn)練一輪得到的就是一個(gè)“結(jié)構(gòu)雛形圖”雖然粗糙但輪廓正確。然后一層層加回細(xì)節(jié)模塊每一步都保留可對(duì)比的中間模型出現(xiàn)質(zhì)量倒退時(shí)就鎖定是某一步引入的問(wèn)題。這種從粗到細(xì)的訓(xùn)練排查方式比一次性堆滿所有技巧更快可靠。5.3 我保留的幾個(gè)實(shí)用小技巧最后分享幾個(gè)我在多輪實(shí)戰(zhàn)后沉淀下來(lái)的技巧算是對(duì)整套訓(xùn)練流程的補(bǔ)充。第一個(gè)技巧是給訓(xùn)練數(shù)據(jù)做簡(jiǎn)單在線增強(qiáng)例如隨機(jī)水平翻轉(zhuǎn)和輕微顏色抖動(dòng)。水平翻轉(zhuǎn)天然提供了位姿俯仰角的正負(fù)對(duì)稱(chēng)樣本對(duì)位姿子網(wǎng)絡(luò)收斂有明顯幫助顏色抖動(dòng)則提升網(wǎng)絡(luò)對(duì)光照變化的魯棒性。但注意不要做重度幾何變形比如隨機(jī)裁剪縮放那會(huì)破壞相機(jī)內(nèi)參的一致假設(shè)反而讓光度損失失真。第二個(gè)技巧是周期性地保存完整重建圖不只是深度圖。重建圖和原圖疊在一起看能立刻暴露深度估計(jì)錯(cuò)誤的具體來(lái)源——是運(yùn)動(dòng)物體遮擋還是低紋理區(qū)域匹配失敗還是位姿漂移。把這些失敗樣本按類(lèi)別存下來(lái)等于給自己建立了一個(gè)定制化的class-specific錯(cuò)誤集后期調(diào)優(yōu)時(shí)目標(biāo)清楚很多。第三個(gè)技巧關(guān)于學(xué)習(xí)率衰減策略。無(wú)監(jiān)督深度估計(jì)的損失面非常不平坦固定的學(xué)習(xí)率在后期容易出現(xiàn)平臺(tái)期。我會(huì)在前三分之一訓(xùn)練輪次保持較大學(xué)習(xí)率快速進(jìn)入合理區(qū)域然后用余弦式衰減把學(xué)習(xí)率慢慢壓到很低最后幾百個(gè)輪次再凍結(jié)學(xué)習(xí)率做微調(diào)。這個(gè)策略比均勻指數(shù)衰減在實(shí)際訓(xùn)練中更容易獲得穩(wěn)定的深度圖。第四個(gè)技巧是如果數(shù)據(jù)中有大段靜止畫(huà)面務(wù)必剔除。相機(jī)完全靜止時(shí)相鄰幀之間沒(méi)有視差光度損失無(wú)法約束深度網(wǎng)絡(luò)只能靠平滑項(xiàng)“猜”出全圖均值長(zhǎng)時(shí)間混合這種樣本會(huì)顯著拉低整體深度結(jié)構(gòu)質(zhì)量。我自己踩過(guò)這個(gè)坑后會(huì)在數(shù)據(jù)篩選階段用圖像差分方差做一道過(guò)濾靜止幀比例從源頭壓到最低。這套無(wú)監(jiān)督單目視頻方法的框架能力邊界我很清楚它解決的是“沒(méi)有真值也能學(xué)深度和運(yùn)動(dòng)”的問(wèn)題但并不意味著可以零成本替代一切有監(jiān)督方案。實(shí)際使用時(shí)我更傾向于把它當(dāng)作深度估計(jì)與視覺(jué)里程計(jì)落地的前置模塊先跑通無(wú)監(jiān)督基線把幾何結(jié)構(gòu)這條鏈路打通再根據(jù)具體任務(wù)注入少量真值或者語(yǔ)義標(biāo)簽做領(lǐng)域微調(diào)等于是用更少的人工標(biāo)注拿到一個(gè)基礎(chǔ)性能不錯(cuò)的模型。如果你正要上手這個(gè)方向我建議按這篇文章的順序先把數(shù)據(jù)篩選、網(wǎng)絡(luò)結(jié)構(gòu)、損失權(quán)重三件事做到及格再去嘗試更花哨的結(jié)構(gòu)變體。扎實(shí)的基線永遠(yuǎn)比復(fù)雜的魔改更能說(shuō)明問(wèn)題。