MiDaS(Monocular Depth Sensing)是一種基于單目深度估計的技術,它通過深度學習方法使用單張RGB圖像(普通2D圖像)來估算場景的深度圖(Depth Map)。相比于傳統的依賴專用深度傳感器(如LiDAR或ToF相機)的深度感知方法,MiDaS 不需要額外的硬件,僅依賴普通的單目攝像頭即可對場景的深度進行預測。
以下是通俗化的 MiDaS 原理解析:
1. 什么是深度估計?
在計算機視覺中,深度估計旨在為場景中的每個像素估算與攝像機的距離。這種深度信息可以用灰度圖表示:
- 場景中的物體越近,像素值越亮(深度越小)。
- 場景中的物體越遠,像素值越暗(深度越大)。
MiDaS 生成的結果通常是標準化后的相對深度(Relative Depth),而非絕對物理尺度上的距離。
2. MiDaS 的核心原理
(1) 深度估計的訓練目標
MiDaS 的核心目標是通過神經網絡從單張 RGB 圖像提取有意義的特征,并學習將其映射為深度圖。其訓練過程基于多種深度相關數據集,將網絡訓練成為能泛化到多場景、多分辨率、多種鏡頭的深度估計模型。
與其他深度估計方法相比,MiDaS 關注生成相對深度關系,即:預測場景中的物體之間哪個更遠,哪個更近,而非精確的實際測量值。
(2) 網絡結構
- MiDaS 使用了一種基于圖像特征提取的編碼器-解碼器(Encoder-Decoder)架構。
- 編碼器負責提取圖像中的全局特征(例如形狀、邊緣等),并壓縮到低維特征空間。
- 解碼器將這些特征逐步上采樣,生成與輸入圖像相同分辨率的深度圖。
- 最新版本的 MiDaS 使用?Vision Transformer(ViT)?或強大的卷積網絡(如 ResNet 或 EfficientNet)作為特征提取器,使模型能夠捕捉更多場景中的長距離依賴關系和復雜特征。
(3) 訓練數據來源
- MiDaS 是一種跨領域模型,它通過不同的深度相關數據集進行聯合訓練,比如:
- 近景目標的精準深度數據集(如 MegaDepth、ReDWeb)。
- 室內場景(如 NYU Depth 數據集)。
- 廣域尺度的景深(如 DIW 數據集)。
- 使用了一種叫?Scale-Invariant Loss(尺度不變損失)?的策略,使模型能夠在平滑過渡和深度關系中保持穩健。
(4) 輸出相對深度
- MiDaS 的結果表示的是像素間的相對深度關系,而不是物理距離。
- 比如說,輸出的深度圖可能告訴我們“樹在汽車后面”,但不能直接告訴我們“樹距離攝像頭 10 米”。
3. MiDaS 的執行流程
-
輸入處理
- 一張 RGB 圖像被輸入至深度估計模型。
- 圖像經過預處理(如標準化和縮放)以適應網絡輸入。
-
特征提取
- 編碼器提取圖像的高維抽象特征,捕捉全局場景結構以及物體之間的關系。
-
深度預測
- 解碼器將特征映射為二維深度圖,并通過獨特的損失函數優化輸出結果,使相對深度信息更加準確。
-
后處理與輸出
- 將神經網絡輸出的深度圖標準化(例如歸一化到0-255),方便視覺化或后續任務使用。
在 MiDaS(或單目深度估計)中,模型的核心目標是從輸入的 RGB 圖像中學習到場景的深度關系,并通過特定的損失函數來優化。這些公式主要圍繞以下幾個方面展開:前向傳播中的深度表示,網絡參數優化的損失函數,以及標準化(后處理)操作。
MiDaS 的核心任務是將輸入 RGB 圖像(3 通道)映射到一個深度圖(Depth Map,1 通道)。可以用以下公式表示:
MiDaS 使用多種深度相關的訓練數據,其中一部分數據只提供相對深度,而非絕對深度。為此,MiDaS 引入一種尺度不變損失(Scale-Invariant Loss),專注于優化深度關系,而不受絕對尺度的影響。
(1) 尺度不變損失(Scale-Invariant Loss)
尺度不變損失函數用于訓練深度估計模型,讓其專注于預測正確的點間深度關系,而忽略整體深度的絕對大小。這一損失由兩部分組成:點對點誤差項和整體協方差項。
(2) 梯度一致性損失(Gradient Consistency Loss)
此外,為了使預測深度圖展現更平滑的遠近關系,MiDaS 還引入了一個梯度一致性損失,用于比較深度圖的梯度變化(即物體邊緣和紋理等特征):
(3) 總體損失
結合尺度不變損失和梯度一致性損失,MiDaS 的總體損失函數可以表示為:
λgrad?:控制梯度損失對總損失的影響權重(通常是一個超參數)。
輸出的深度圖經常是未歸一化的相對深度,因此需要后處理(標準化)以便易于理解或進一步處理。假設原始深度圖的像素值為?D^iD^i?,我們可以對其進行線性歸一化到區間?[0,1][0,1]:
由于 MiDaS 使用的網絡(如 ResNet 或 Vision Transformer)會對輸入圖像進行下采樣,再解碼生成深度圖,可能會導致輸出的深度圖分辨率低于原始圖像分辨率。因此需要插值進行分辨率恢復:
雙線性插值(Bilinear Interpolation):
在推理階段,單張 RGB 輸入圖像?II?進入模型后,經過編碼器提取特征,再通過解碼器生成深度圖:
- Wencode?:編碼器權重,提取圖像的特征??(I)。
- Wdecode?:解碼器權重,將低維特征還原以輸出深度圖。
-
最終得到的深度圖可以通過歸一化和后處理調整,以適用于具體任務。
大致的方法可以歸納為將一張三通道(RGB)的圖片編碼為一通道(單通道)的過程,但背后還涉及更多的細節來確保模型不僅僅是簡單地轉換通道,而是能夠精準地提取和預測深度信息。
簡單歸納:RGB(三通道) -> Depth Map(一通道)
但是,不同于對顏色、紋理等直接編碼,這里的一通道并不是像灰度圖那樣只表示亮度,而是深度信息,即圖像中每個像素都含有該點與相機之間的相對距離。模型的核心任務是從三通道圖像中理解物體的幾何關系和場景的三維信息,而這需要模型具備一些特殊能力:
實際做了哪些復雜的事情
-
特征提取:看透二維信息的本質
- 對于三通道的輸入圖片來說,RGB 中的紅、綠、藍通道值本身其實只包含像素亮度信息。要估計深度,模型需要從二維特征中提取潛在的三維信息。
- 舉個例子:模型要認出兩顆球相互遮擋,并判斷哪個更靠近鏡頭。
- 這就需要依賴神經網絡的編碼器部分(通常是采用預訓練的 ResNet 或 Transformer 變種網絡),學習到這些復雜的特征關系。
-
相對深度 vs 絕對深度
- 由于單目深度估計只能基于一張圖片,它缺乏真實場景的絕對度量(比如激光雷達提供的真實深度值),所以預測出的深度圖是一個相對深度圖。
- 比如一棵樹比一棟建筑物近,但具體的米數可能無法得知。
-
損失函數引導的深度學習
- 模型在訓練時依賴特殊的損失函數,比如 MiDaS 提到的尺度不變損失(Scale-Invariant Loss),這類損失函數能避免模型被圖片縮放和場景比例的問題干擾,讓它更關注哪些物體更近,哪些更遠。
-
梯度一致性:確保邊界清晰
- 為了讓深度預測能捕捉到物體的輪廓和邊界,模型還通過梯度損失或邊緣一致性損失,強制讓深度圖中的變化(比如邊緣處的深度差)與原圖片的結構相一致。
-
后處理:標準化單通道深度圖
- 深度圖本身是理論上的相對值,因此最后的輸出通常會經過歸一化或插值來調整尺度或增強可視化效果