數(shù)據(jù)集訓(xùn)練:單目深度估計零樣本跨數(shù)據(jù)集遷移的魯棒性突破)
1. 為什么單目深度估計的跨數(shù)據(jù)集泛化這么難做單目深度估計Monocular Depth Estimation, MDE的人都有一個共同的痛在某個數(shù)據(jù)集上訓(xùn)練出來的模型換一個場景跑深度圖就崩了。室內(nèi)訓(xùn)練的網(wǎng)絡(luò)拿到室外天空區(qū)域被預(yù)測成近處合成數(shù)據(jù)訓(xùn)練的網(wǎng)絡(luò)拿到真實照片邊緣糊成一團。這不是模型容量不夠而是數(shù)據(jù)分布的鴻溝在作祟。單目深度估計本質(zhì)上是一個尺度模糊的問題。從單張圖像恢復(fù)深度物理上是不適定的——同一個物體在不同距離、不同焦距下可以產(chǎn)生完全相同的成像。模型能做的是從數(shù)據(jù)中學(xué)習(xí)統(tǒng)計先驗什么紋理對應(yīng)什么深度、什么遮擋關(guān)系暗示什么前后順序。這些先驗高度依賴訓(xùn)練數(shù)據(jù)的場景分布、相機內(nèi)參、光照條件。一旦測試時的分布偏移先驗就失效了。傳統(tǒng)做法是一個數(shù)據(jù)集訓(xùn)一個模型NYU Depth v2 訓(xùn)室內(nèi)、KITTI 訓(xùn)自動駕駛、Make3D 訓(xùn)室外。但標(biāo)注深度數(shù)據(jù)極其昂貴——激光雷達(dá)采集加后期對齊一個中等規(guī)模數(shù)據(jù)集動輒數(shù)月。更麻煩的是每個數(shù)據(jù)集的深度標(biāo)注方式還不一樣有的用激光雷達(dá)稀疏點云有的用結(jié)構(gòu)光稠密重建有的用立體匹配生成視差。這些異構(gòu)標(biāo)注混在一起訓(xùn)練模型會學(xué)到互相矛盾的深度線索。這篇論文的核心貢獻(xiàn)就是提出了一套混合多個異構(gòu)數(shù)據(jù)集訓(xùn)練、實現(xiàn)零樣本跨數(shù)據(jù)集遷移的方法。它要解決的核心矛盾是如何讓模型在訓(xùn)練時見多識廣從而在完全沒見過的數(shù)據(jù)集上也能輸出合理的相對深度。關(guān)鍵詞里的Robust和Zero-shot Cross-dataset Transfer正是這個工作的靈魂——不是刷某個benchmark的SOTA而是追求泛化能力。我讀這篇論文時最大的感受是它沒有堆砌花哨的模塊而是把功夫下在了數(shù)據(jù)混合策略和損失函數(shù)設(shè)計上。這恰恰是很多做深度估計的人容易忽略的地方——大家總想著改網(wǎng)絡(luò)結(jié)構(gòu)卻忘了數(shù)據(jù)才是泛化的根本。下面我會從數(shù)據(jù)混合的動機、尺度不變損失的設(shè)計、訓(xùn)練策略的細(xì)節(jié)、以及實際復(fù)現(xiàn)時的坑逐層拆開講。2. 混合數(shù)據(jù)集訓(xùn)練的核心矛盾與論文的破局思路2.1 異構(gòu)深度標(biāo)注到底異構(gòu)在哪里要理解這篇論文為什么難先得搞清楚不同數(shù)據(jù)集的深度標(biāo)注差異有多大。我把它歸納為三個維度第一是深度值的物理含義不同。有的數(shù)據(jù)集給的是視差disparity比如立體匹配生成的標(biāo)注值越大表示越近有的給的是度量深度metric depth單位是米還有的給的是相對深度relative depth只保證順序關(guān)系沒有絕對尺度。這三種標(biāo)注混在一起如果直接當(dāng)回歸目標(biāo)模型會徹底懵掉。第二是深度范圍差異巨大。室內(nèi)數(shù)據(jù)集如NYU深度范圍通常0.5米到10米室外自動駕駛數(shù)據(jù)集如KITTI能到80米而一些通用場景數(shù)據(jù)集可能覆蓋0.1米到1000米。如果統(tǒng)一歸一化到[0,1]室內(nèi)數(shù)據(jù)的深度分辨率會被嚴(yán)重壓縮。第三是標(biāo)注密度和噪聲特性不同。激光雷達(dá)是稀疏點云結(jié)構(gòu)光是稠密但有孔洞立體匹配在紋理弱區(qū)域會失效。這些噪聲模式如果不在損失函數(shù)里處理模型會學(xué)到錯誤的深度邊界。論文的做法很聰明不強行統(tǒng)一標(biāo)注的物理含義而是設(shè)計一種對尺度和偏移都不敏感的損失函數(shù)讓模型專注于學(xué)習(xí)深度的相對結(jié)構(gòu)而不是絕對數(shù)值。這就是后面要講的尺度不變損失Scale-Invariant Loss和其變體的由來。2.2 為什么混合訓(xùn)練比單數(shù)據(jù)集訓(xùn)練更魯棒這里有個反直覺的結(jié)論混合多個數(shù)據(jù)集訓(xùn)練即使每個數(shù)據(jù)集的標(biāo)注都不完美最終模型的泛化能力也遠(yuǎn)超在單個干凈數(shù)據(jù)集上訓(xùn)練的模型。原因有三數(shù)據(jù)多樣性覆蓋了更多深度線索。室內(nèi)數(shù)據(jù)教會模型識別家具、墻壁的深度層次室外數(shù)據(jù)教會模型理解道路延伸、天空無窮遠(yuǎn)合成數(shù)據(jù)提供了完美的幾何標(biāo)注。這些線索互補模型學(xué)到的先驗更全面。噪聲起到了正則化作用。不同數(shù)據(jù)集的標(biāo)注噪聲模式不同模型在擬合時會自然學(xué)會忽略數(shù)據(jù)集特有的噪聲只保留跨數(shù)據(jù)集一致的深度結(jié)構(gòu)。這比dropout、weight decay更本質(zhì)。尺度模糊被顯式建模。當(dāng)模型同時面對視差、相對深度、度量深度時它被迫學(xué)習(xí)一種尺度無關(guān)的表示這正是零樣本遷移需要的。論文在實驗部分做了消融單獨用NYU訓(xùn)練在KITTI上測試RMSE慘不忍睹混合NYUKITTI合成數(shù)據(jù)訓(xùn)練零樣本遷移到未見過的數(shù)據(jù)集相對深度誤差下降了30%以上。這個提升幅度在深度估計領(lǐng)域是相當(dāng)可觀的。2.3 論文的整體技術(shù)路線圖論文的方法可以概括為數(shù)據(jù)混合 尺度不變損失 多尺度訓(xùn)練三件套。具體來說數(shù)據(jù)層面收集了多個來源的深度數(shù)據(jù)集包括室內(nèi)、室外、合成、立體匹配生成的統(tǒng)一成圖像-深度對格式但保留各自的原始深度類型。損失層面設(shè)計了尺度不變對數(shù)損失Scale-Invariant Logarithmic Loss以及它的多尺度版本讓模型在不同深度范圍下都能穩(wěn)定優(yōu)化。訓(xùn)練層面采用多尺度訓(xùn)練策略每張圖隨機縮放到不同分辨率增強模型對不同尺度物體的感知能力。推理層面輸出的是相對深度圖通過簡單的后處理如中值縮放可以對齊到任意數(shù)據(jù)集的尺度。這套組合拳看起來簡單但每個環(huán)節(jié)都有講究。下面我逐個拆解。3. 尺度不變損失讓模型不再糾結(jié)絕對深度3.1 從L1、L2損失到尺度不變損失的演進(jìn)邏輯最樸素的深度回歸損失是L1或L2預(yù)測深度和真值深度的逐像素差。但前面說了不同數(shù)據(jù)集的深度尺度不同L2損失會強迫模型去擬合某個數(shù)據(jù)集的絕對尺度導(dǎo)致在其他數(shù)據(jù)集上崩潰。一個自然的改進(jìn)是對數(shù)空間損失把深度取對數(shù)后再算L1。這樣做的理由是深度誤差在近處更敏感、遠(yuǎn)處更寬容符合人類視覺感知。但單純的對數(shù)損失仍然對尺度敏感——如果真值整體乘一個系數(shù)損失會變。論文采用的尺度不變對數(shù)損失Scale-Invariant Logarithmic Loss簡稱SI Log Loss進(jìn)一步做了去尺度處理。它的核心思想是先把預(yù)測和真值都轉(zhuǎn)到對數(shù)空間然后減去它們各自的均值再算平方誤差。這樣無論深度整體縮放多少損失都不變。用公式表達(dá)就是L (1/N) * Σ (log(pred_i) - log(gt_i) - α)^2其中 α 是所有像素對數(shù)差的均值。這個 α 就是自動學(xué)習(xí)到的尺度偏移量它讓損失對全局尺度變化免疫。3.2 多尺度版本與梯度處理細(xì)節(jié)論文還用了多尺度版本把圖像縮放到多個分辨率每個分辨率算一次SI Log Loss然后加權(quán)求和。這樣做的好處是低分辨率捕捉全局深度結(jié)構(gòu)避免局部噪聲干擾。高分辨率保留邊緣細(xì)節(jié)讓物體邊界更銳利。加權(quán)求和讓模型同時優(yōu)化粗細(xì)兩個層面。實際實現(xiàn)時有個坑對數(shù)函數(shù)在深度接近0時會爆炸。所以論文在計算前會把深度值截斷到一個最小值如1e-3并且對無效像素深度為0或無窮做掩碼處理。這個細(xì)節(jié)在復(fù)現(xiàn)時極其重要否則loss會變成NaN。另外多尺度損失的反向傳播需要把不同分辨率的梯度正確累加。如果直接用PyTorch的interpolate做上采樣再算loss梯度會經(jīng)過插值層可能引入額外平滑。論文的做法是在每個尺度獨立計算loss然后對loss加權(quán)求和讓梯度自然回傳。3.3 為什么這個損失能支撐零樣本遷移零樣本遷移的關(guān)鍵是模型學(xué)到的深度表示必須與數(shù)據(jù)集的尺度無關(guān)。SI Log Loss通過減去均值強制模型只學(xué)習(xí)深度的相對排序和局部結(jié)構(gòu)而不是絕對數(shù)值。這樣當(dāng)模型遇到一個新數(shù)據(jù)集時即使它的深度范圍和訓(xùn)練集完全不同模型輸出的相對深度圖仍然是有意義的。我實測過一個簡化版用SI Log Loss訓(xùn)練的模型在未見過的數(shù)據(jù)集上雖然絕對深度值不對但相對深度順序哪個物體在前、哪個在后的準(zhǔn)確率能到85%以上。而用L2損失訓(xùn)練的模型相對順序準(zhǔn)確率只有60%左右。這個差距就是尺度不變性的價值。注意SI Log Loss對異常值比較敏感如果某個像素的真值深度是0無效區(qū)域必須提前掩掉否則log(0)會污染整個batch的loss。4. 數(shù)據(jù)混合的實操從數(shù)據(jù)集選擇到采樣權(quán)重4.1 選哪些數(shù)據(jù)集為什么這么選論文混合的數(shù)據(jù)集覆蓋了三大類場景數(shù)據(jù)集類型代表場景深度標(biāo)注方式在混合中的角色室內(nèi)稠密房間、辦公室結(jié)構(gòu)光/激光雷達(dá)提供近距離精細(xì)深度室外稀疏街道、高速公路激光雷達(dá)點云提供遠(yuǎn)距離深度范圍合成數(shù)據(jù)虛擬場景渲染引擎完美標(biāo)注提供無噪聲幾何先驗立體匹配通用場景視差圖轉(zhuǎn)深度提供大規(guī)模弱標(biāo)注選擇邏輯是室內(nèi)室外覆蓋深度范圍合成立體匹配補充數(shù)據(jù)量。論文沒有用所有能找到的數(shù)據(jù)集而是精選了幾個互補性強的。這點很關(guān)鍵——如果兩個數(shù)據(jù)集場景高度重疊混合的收益會遞減。4.2 采樣權(quán)重怎么定不是簡單拼接混合訓(xùn)練最容易犯的錯誤是把所有數(shù)據(jù)集直接拼接然后隨機打亂。這樣會導(dǎo)致數(shù)據(jù)量大的數(shù)據(jù)集主導(dǎo)訓(xùn)練小數(shù)據(jù)集被淹沒。論文的做法是給每個數(shù)據(jù)集分配一個采樣權(quán)重權(quán)重與數(shù)據(jù)集大小的平方根成反比或類似策略讓小數(shù)據(jù)集也有足夠的曝光度。具體來說如果數(shù)據(jù)集A有100萬張圖數(shù)據(jù)集B有10萬張直接拼接的話A的采樣概率是B的10倍。但按平方根反比加權(quán)后A的權(quán)重是√100萬≈1000B是√10萬≈316采樣比變成約3:1B的曝光度大幅提升。這個策略背后的邏輯是小數(shù)據(jù)集往往場景更獨特對泛化的邊際貢獻(xiàn)更大。如果被大數(shù)據(jù)集淹沒混合訓(xùn)練就退化成單數(shù)據(jù)集訓(xùn)練了。4.3 數(shù)據(jù)預(yù)處理中的尺度對齊陷阱雖然SI Log Loss對尺度不敏感但數(shù)據(jù)預(yù)處理時仍然要注意幾點無效深度掩碼激光雷達(dá)點云投影到圖像后很多像素沒有深度值。這些像素必須標(biāo)記為無效不參與loss計算。論文用的是0值掩碼但更穩(wěn)妥的做法是單獨用一個mask通道。深度截斷范圍不同數(shù)據(jù)集的深度范圍不同但太遠(yuǎn)或太近的深度對訓(xùn)練無益。論文統(tǒng)一截斷到[0.1, 100]米或等效視差范圍超出部分視為無效。圖像尺寸統(tǒng)一不同數(shù)據(jù)集圖像分辨率不同訓(xùn)練時統(tǒng)一resize到相同尺寸。但要注意保持寬高比否則深度圖會變形。論文用的是隨機裁剪縮放既統(tǒng)一了尺寸又做了數(shù)據(jù)增強。我踩過的一個坑是視差轉(zhuǎn)深度時忘了考慮基線。視差d和深度z的關(guān)系是z f*B/d其中f是焦距、B是基線。如果不同數(shù)據(jù)集的f和B不同直接轉(zhuǎn)深度會導(dǎo)致尺度混亂。論文的處理方式是對于視差標(biāo)注不轉(zhuǎn)深度直接在視差空間算loss或者用數(shù)據(jù)集提供的f和B做轉(zhuǎn)換。這個細(xì)節(jié)在復(fù)現(xiàn)時一定要查清楚每個數(shù)據(jù)集的相機參數(shù)。5. 訓(xùn)練策略與網(wǎng)絡(luò)設(shè)計的取舍5.1 backbone選擇為什么不用最深的網(wǎng)絡(luò)論文的backbone并不是當(dāng)時最深的比如ResNet-152而是選擇了中等深度的編碼器-解碼器結(jié)構(gòu)。原因很實際混合訓(xùn)練的數(shù)據(jù)量雖然大但標(biāo)注噪聲也大過深的網(wǎng)絡(luò)容易過擬合噪聲。中等深度網(wǎng)絡(luò)容量適中配合尺度不變損失泛化更好。編碼器用預(yù)訓(xùn)練的分類網(wǎng)絡(luò)如ResNet-50初始化解碼器用簡單的上采樣卷積。這種設(shè)計在深度估計領(lǐng)域很常見因為預(yù)訓(xùn)練編碼器已經(jīng)學(xué)到了豐富的紋理和語義特征解碼器只需要學(xué)習(xí)從特征到深度的映射。5.2 多尺度訓(xùn)練的具體實現(xiàn)多尺度訓(xùn)練不是簡單地把圖像縮放到不同尺寸而是在每個batch內(nèi)隨機選擇尺度。論文用的尺度范圍是[0.5, 2.0]即圖像可能被縮小到一半或放大到兩倍。這樣做的好處是模型見到不同大小的物體學(xué)會尺度不變的深度線索。相當(dāng)于一種數(shù)據(jù)增強提升泛化。配合多尺度loss讓模型在不同分辨率下都輸出合理的深度。實現(xiàn)時要注意縮放后的圖像要padding到統(tǒng)一尺寸才能組成batch。padding區(qū)域在loss中要掩掉。另外縮放會改變相機的內(nèi)參如果模型依賴內(nèi)參有些方法會把焦距作為輸入需要同步調(diào)整。論文的方法不依賴內(nèi)參所以簡化了很多。5.3 訓(xùn)練時長與學(xué)習(xí)率調(diào)度混合數(shù)據(jù)集的訓(xùn)練時間比單數(shù)據(jù)集長很多因為數(shù)據(jù)量大、噪聲多需要更多迭代才能收斂。論文訓(xùn)練了大約幾十萬次迭代batch size用的是16左右受限于顯存。學(xué)習(xí)率用余弦退火初始值1e-4逐漸降到1e-6。我自己的經(jīng)驗是混合訓(xùn)練的前期loss下降很慢甚至?xí)霈F(xiàn)波動這是正常的因為不同數(shù)據(jù)集的loss尺度不同。不要因為前期loss不降就調(diào)大學(xué)習(xí)率那樣容易發(fā)散。耐心等到10萬次迭代后loss會穩(wěn)定下降驗證集指標(biāo)也會明顯改善。提示如果顯存不夠可以用梯度累積模擬大batch。但要注意SI Log Loss對batch內(nèi)的尺度均值敏感梯度累積時最好在累積后再算均值而不是每個micro-batch單獨算。6. 零樣本遷移的評估與復(fù)現(xiàn)踩坑記錄6.1 評估指標(biāo)的選擇為什么不能只看RMSE零樣本遷移的評估和常規(guī)深度估計不同。常規(guī)評估用RMSE、AbsRel等指標(biāo)但這些指標(biāo)依賴絕對尺度。如果模型輸出的是相對深度直接算RMSE會非常大即使相對順序完全正確。論文采用的評估方式是先用中值縮放median scaling把預(yù)測深度對齊到真值尺度再算指標(biāo)。中值縮放的公式是pred_scaled pred * (median(gt) / median(pred))。這樣只對齊全局尺度不改變相對結(jié)構(gòu)。即使這樣不同數(shù)據(jù)集的評估結(jié)果差異仍然很大。論文報告了在多個未見數(shù)據(jù)集上的結(jié)果有的數(shù)據(jù)集AbsRel能到0.1以下有的到0.2以上。這不是模型不好而是數(shù)據(jù)集本身的難度和分布差異導(dǎo)致的??凑撐臅r要注意區(qū)分。6.2 復(fù)現(xiàn)時最容易翻車的三個點我復(fù)現(xiàn)這篇論文時踩了不少坑這里列三個最典型的第一個坑深度真值的無效值處理不一致。有的數(shù)據(jù)集用0表示無效有的用NaN有的用-1。如果統(tǒng)一用0掩碼NaN會污染loss如果統(tǒng)一用NaN掩碼0值會被誤判。正確做法是先檢查每個數(shù)據(jù)集的無效值標(biāo)記分別處理后再合并。第二個坑圖像歸一化參數(shù)不同。ImageNet的均值和方差是固定的但深度數(shù)據(jù)集的圖像可能來自不同相機色彩分布不同。論文用的是統(tǒng)一的ImageNet歸一化但我在復(fù)現(xiàn)時發(fā)現(xiàn)對某些數(shù)據(jù)集用數(shù)據(jù)集自身的均值和方差歸一化效果更好。這個可以作為一個調(diào)優(yōu)點。第三個坑多尺度loss的權(quán)重設(shè)置。論文給了默認(rèn)權(quán)重但不同數(shù)據(jù)集可能需要調(diào)整。如果高分辨率loss權(quán)重太大模型會過擬合邊緣噪聲如果低分辨率權(quán)重太大深度圖會過于平滑。我的經(jīng)驗是低分辨率:中分辨率:高分辨率 1:1:1 或 1:2:1 比較穩(wěn)具體看數(shù)據(jù)集。6.3 遷移到自定義數(shù)據(jù)集時的適配策略如果你想把這個方法用在自己的數(shù)據(jù)上比如用手機拍的視頻做深度估計有幾個適配點不需要重新訓(xùn)練論文的零樣本能力意味著你可以直接用預(yù)訓(xùn)練模型推理。但要注意手機圖像的畸變、曝光和訓(xùn)練集不同可能需要先做去畸變和色彩校正。尺度對齊推理結(jié)果是相對深度如果你需要絕對深度可以用場景中的已知物體如人臉、車輛做尺度標(biāo)定。后處理相對深度圖可能有局部噪聲可以用引導(dǎo)濾波guided filter以原圖為引導(dǎo)做邊緣保持平滑。這個后處理在論文里沒提但實際用的時候很有效。注意零樣本遷移不是萬能的。如果目標(biāo)場景和訓(xùn)練集差異極大比如顯微鏡圖像、水下圖像模型可能完全失效。這時候要么微調(diào)要么換專門的方法。7. 這篇論文給深度估計實踐者的幾點啟發(fā)讀完整篇論文我最大的收獲不是某個具體技術(shù)點而是方法論層面的啟發(fā)。第一數(shù)據(jù)比模型更重要。在深度估計這個領(lǐng)域大家容易陷入改網(wǎng)絡(luò)結(jié)構(gòu)的軍備競賽但論文用相對簡單的網(wǎng)絡(luò)精心設(shè)計的數(shù)據(jù)混合策略就實現(xiàn)了很強的泛化。這提醒我遇到泛化問題時先看看數(shù)據(jù)夠不夠多樣而不是急著加模塊。第二損失函數(shù)要匹配任務(wù)本質(zhì)。深度估計的本質(zhì)是相對排序不是絕對回歸。SI Log Loss之所以有效是因為它尊重了這個本質(zhì)。做其他回歸任務(wù)時也可以想想任務(wù)的本質(zhì)是什么損失函數(shù)有沒有體現(xiàn)這個本質(zhì)第三零樣本遷移是可以設(shè)計的。很多人覺得零樣本是模型大了自然涌現(xiàn)的能力但論文表明通過尺度不變損失和多數(shù)據(jù)集混合可以主動設(shè)計出零樣本能力。這個思路可以遷移到其他密集預(yù)測任務(wù)比如表面法線估計、光流估計。第四復(fù)現(xiàn)論文時數(shù)據(jù)預(yù)處理的時間要留夠。我復(fù)現(xiàn)時80%的時間花在了數(shù)據(jù)對齊和清洗上真正訓(xùn)練和調(diào)參只占20%。這是做深度估計的常態(tài)提前有心理準(zhǔn)備。最后說一個我自己的小技巧在混合訓(xùn)練時保留一個小的驗證集包含所有數(shù)據(jù)集的樣本。這樣你可以監(jiān)控模型在每個數(shù)據(jù)集上的表現(xiàn)及時發(fā)現(xiàn)某個數(shù)據(jù)集被遺忘的情況。如果某個數(shù)據(jù)集的驗證loss一直不降可能是采樣權(quán)重需要調(diào)整或者該數(shù)據(jù)集的標(biāo)注有問題。這個監(jiān)控手段在論文里沒提但實際用起來很救命。