> [name=謝朋諺(Adam Hsieh)] > [time=Tue, Jul 25, 2023 3:27 PM] --- # MonoDTR: Monocular 3D Object Detection with Depth-Aware Transformer [論文連結](https://arxiv.org/pdf/2203.10981.pdf) {%pdf https://arxiv.org/pdf/2203.10981.pdf %} ## Outline > [TOC] ## Reference > [MonoDTR Monocular 3D Object Detection with Depth-Aware Transformer 论文学习](https://blog.csdn.net/calvinpaean/article/details/131783577) > [MonoDTR:带深度-觉察Transformer的3D目标单目检测](https://zhuanlan.zhihu.com/p/520663135) > [Github KuanchihHuang / MonoDTR](https://github.com/KuanchihHuang/MonoDTR) --- ## 摘要重點 - 提出了 MonoDTR,一種用於 Monocular 3D object detection 的 end-to-end depth-aware transformer network。 1. Depth-Aware Feature Enhancement(DFE)module,通過 implicitly learns depth-aware features 輔助監督學習,好處是不用額外的計算成本。 2. Depth-Aware Transformer(DTR)module,整合了上下文和 depth-aware 的能力。 - 引入與傳統的 pixel-wise positional encoding 不同,本文導入一種新的 Depth Positional Encoding (DPE),將深度位置輸入到 Transformer 中,並得到一個最好的 3D detection 結果。 ## Contribution ![](https://hackmd.io/_uploads/SJ07T4Ioh.png) :::info :bulb: 不同的深度輔助 monocular 3D object Detection 框架 (a) Pseudo-LiDAR-based 通過 Monocular 深度估計將影像提升到 3D 坐標,然後使用基於 3D LiDAR 的 Detector 來恢復物件位置。 (b) Fusion-based 的方法從影像和估計的深度圖中提取特徵,然後融合它們來預測物件。 (c) 本文的 MonoDTR 通過額外的深度監督學習深度感知特徵,並以 end-to-end 的方式執行 3D 物件偵測。 ::: :::warning :warning: 請注意,Depth Supervision 僅在訓練階段使用。 ::: 1. 提出了一種新穎的框架 MonoDTR,通過輔助監督學習深度感知特徵來協助 Monocular 3D Object Detction,從而避免使用現成的 Depth Estimation 帶來高計算成本和不准確的深度先驗。 2. 提出了第一個 Depth-Aware Transformer module,可以有效地整合 context-aware 和 depth-aware 功能。另外提出一種新的 Depth Positional Encoding(DPE) 來將深度位置提示注入到 Transformer 中。 3. 在 KITTI 資料集上這篇論文的方法優於最先進的 Monocular 方法並實現了 Real-time Detection。此外,所提出的 Depth-aware可以輕鬆地在現有的影像框架中即插即用,以提高性能。 ## Framework Overview ![](https://hackmd.io/_uploads/H1ZLEWLon.png) :::info :bulb: MonoDTR 框架的概述 - **Depth-aware Feature Enhancement(DFE)** module 學習 depth-aware 的特徵 - Conv layer 也會同步學習 context-aware 特徵 - **Depth-aware Transformer(DTR)** 會整合 **Depth Positional Encoding(DPE)** 的深度位置 hints 和 context-aware 的資料。 - 最後 **Detection Head** 會預測 3D bounding boxes。 - 另外 Auxiliary Depth Supervision 只有在訓練過程會用到。 ::: - Backbone: **DLA-102** - 架設輸入影像大小: $H_{inp}\times W_{inp}$ - 經過 Backbone 輸出的特徵為: $F\in \mathbb{R}^{C\times H\times W}$,$H=\dfrac{H_{inp}}{8},W=\dfrac{W_{inp}}{8},C=256$ - **DFE**: 用於學習 Depth-Aware 特徵,同時使用多個卷積層平行提取 Context-Aware 特徵。並透過 **DPE** 將深度位置 encoding 輸入到 **DTR** Transformer 中。 - **DTR**: 負責整合 **DFE** 的 Depth-Aware 特徵跟多卷積層的 Context-Aware 特徵。 - Anchor-based 的 Detection Head 和 Loss 則用在 2D 和 3D 物件偵測上。 ## Depth-Aware Feature Enhancement Module(DFE) ![](https://hackmd.io/_uploads/HJJOVQLo3.png) :::info :bulb: **DFE** 架構 (a) 產生初始 Depth-Aware 特徵 $X$ 還有預測深度分布 $D$ (b) 估計深度原型的特徵表示為 $F_d$ (c\) 產生強化版深度原型特徵 $F'$,並跟一開始的 Depth-Aware 特徵 $X$ 做一個結合。 ::: - 在訓練階段利用精確的深度圖進行輔助監督式學習,使 DFE 模塊學習 Depth-Aware 特徵。 - 與過去論文使用額外的 backbone 或複雜的架構來 encoding 深度的方法相比,這邊生成深度感知特徵是透過輕量級 module 輔助 3D 物件偵測,從而顯著減少計算成本。 ### Learning initial depth-aware feature - 參考上圖 (a),假設從 backbone 吐出的特徵 $F\in \mathbb{R}^{C\times H\times W}$,這邊使用 2 層 Conv 來預測離散深度類別(bins) $D\in \mathbb{R}^{D\times H\times W}$ - 機率表示每個 pixel 的深度值屬於某個深度類別的信心水準。 - 為了將深度 Ground Truth 從連續空間離散化為離散化區間,這邊利用 Linear-Increasing discretization(LID) 來製定深度 bins。 - 另外中間的深度特徵可表示為 $X\in \mathbb{R}^{C\times H\times W}$,最後會用到~~ ### Depth prototype representation learning - 參考上圖 (b) 聚合同一深度類別每個 Pixel 的深度特徵,得到每個深度類別的特徵中心(depth prototype) - 實作上,會使用一組卷積層來預測深度圖 $D$ 並且合併鄰近的深度類別(bins),最後類別數量會由 $D$ 降到 $D'=D/r$,$r$ 就是我們降的 scale;這將有助於共享相似深度的資訊,也可以減少後面的計算量。 - 然後聚合所有 Pixel $X′$ 的特徵,並用他們屬於深度類別 $d$ 的機率做加權,得到 $F_d$ 可以表示為: $$\mathbf{F}_d=\sum_{\mathcal{i\in I}}\widetilde{P}_{di}X'_i,\ \ d=\{1,...,D'\}$$ - $X'_i$ 是在 $X'$ 內第 $i$ 個 pixel 特徵 - $\mathcal{I}\in \mathbb{R}^{H\times W}$ 是特徵圖的 pixel 集合 - $\widetilde{P}_{di}$ 是第 $d$ 個深度 prototype 的標準化機率 - $F_d$ 可以表示為每個深度機率的 global cotext 資訊 ### Feature enhancement with depth prototype - 如上圖 (c\),我們可以基於 depth prototype 表示來重新建立 Depth-Aware 特徵,讓每個 pixel 都可以從全域角度來理解出現的深度類別,新特徵表示為: $$F'=\sum_{d=1}^{D'}\widetilde{P}_{di}F_d$$ - Concatenate 一開始的深度特徵 $X$ 以及新建立的 $F'$ 特徵,然後再透過一個 $1\times1$ 的卷積層來輸出,以上就是整個 DFE 架構。 ## Depth-Aware Transformer ### Transformer Encoder - **Transformer Encoder** 主要是針對改善 context-aware 特徵,也就是透過 self-attention 機制來幫助,可定義: $Q \in \mathbb{R}^{N\times C}$, key $K \in \mathbb{R}^{N\times C}$, and value $V \in \mathbb{R}^{N\times C}$ - $N$ 是 Sequence 長度 - 而 Single head self-attention layer 就可以被表示為: $$Attention(Q,K,V)=softmax(\dfrac{QK^T}{\sqrt{C}})V$$ - Context-Aware Flatten 特徵 $X_c\in\mathbb{R}^{N\times C}$,並且 $N=H\times W$ 作為輸入進 Transformer Encoder 的特徵。 ### Transformer Decoder - **Transformer Decoder** 的輸入特徵是 depth-aware features,而不是 embedding(object query)。 :::success :fire: 原因是在 Monocular 3D 物體偵測任務中,由於透視投影近處和遠處的鏡頭視圖常常會導致物體尺度發生顯著變化,會使得簡單的 embedding 難以完全表示物件的屬性並處理複雜的尺度變化情況。 :car: 相比之下,大量的 distance-aware 線索會隱藏在 depth-aware 特徵中,反而有較好的效果。 :bomb: Decoder 可以利用 Transformer 中 cross-attention 的來有效地表達 context-aware 和 depth-aware 特徵之間的關係,從而獲得更好的性能。 ::: ### Depth positional encoding(DPE) - **Depth positional encoding (DPE)** 它通常是用 sin 函數生成的,或者根據視覺任務中圖像的像素位置以可學習的方式生成的。 :::success :bus: 觀察到深度資訊比 pixel-level 關係更能讓機器理解 3D 世界,因此我們首先提出了一種通用 Depth Positional Encoding(DPE)模塊,將每個像素的深度位置提示嵌入到 Transformer 中。 ::: ![](https://hackmd.io/_uploads/BkU9rB8in.png) :::info :bulb: Depth Positional Rncoding (DPE) module - DPE 是基於 DFE module 的深度類別 predicted 結果。 ::: - 通過 learnable embedding 建構深度類別(bin) encoding $E_d=[e_1,...,e_D]\in \mathbb{R}^{D\times C}$ - 根據每個 pixel 預測深度類別 $D$ 的 argmax 值,可以從 $E_d$ 中查詢到初始的深度位置編碼為 $P\in \mathbb{R}^{H\times W\times C}$,為了進一步從鄰近的像素點表示位置資訊,對 $\mathbf{P}$ 使用了一個 kernal 大小為 $3\times 3$ 的卷積層 $\mathcal{G}$,得到最終的編碼,記做 DPE。 ### Computation reduction - **Computation reduction** 標準的 self-attention 公式大概會耗費 $O(N^2)$ 的時間複雜度和記憶體,本文使用 Linear Transformer 來近似於 softmax 的操作,原版的公式為: $$sim(q,k)=exp(\dfrac{q^Tk}{\sqrt{C}})$$ 這邊會取代為: $$sim(q,k)=\phi(q)\phi(k)$$ 其中 $\phi(x)=elu(x)+1$,而 elu(·) 是一種 exponential linear 單元的 activation function。 所以透過這種方法可以讓 $\phi(K)$ 跟 $V$ 的組合降低計算量到 $O(N)$。 :::success :fire: 這段比較亂,所以貼上人家寫的解說,原網址: https://blog.csdn.net/calvinpaean/article/details/131783577 ![](https://hackmd.io/_uploads/r17whr8jn.png) ::: ## 2D-3D Detection and Loss ### Anchor definition - 使用帶預定義的 2D-3D anchor single-stage detector 來回歸 bounding box。 - 每個預定義的 anchor 是由 2D box 這些參數組成 $[x_{2d}, y_{2d}, w_{2d}, h_{2d}]$,3D box 則由這些參數組成: $[x_p, y_p, z, w_{3d}, h_{3d}, l_{3d}, \theta]$ - 其中 $[x_{2d}, y_{2d}]$ 還有 $[x_p, y_p]$ 代表 2D box 中心跟 3D 物件投影在影像上的中心 - $[w_{2d}, h_{2d}]$ 還有 $[w_{3d}, h_{3d}, l_{3d}]$ 則分別代表 2D, 3D bounding box 的物理尺寸 - $z$ 代表 3D 物件的深度 - $\theta$ 代表物件角度 - 在訓練期間,本文投影所有 Ground Truth bounding box 在 2D 平面上並跟所有 2D anchor 計算 IoU,將 $IoU > 0.5$ 的 anchor 分配給相應的 3D box 來做優化。 ### Output transformation - 跟 Yolov3 一樣,對每個 anchor 都會預測 $[t_x, t_y, t_w, t_h]_{2d}$ 和 $[t_x, t_y, t_w, t_h, t_l, t_z, t_\theta]_{3d}$,目的是將 2D 框和 3D 框的 residual 值參數化,並預測分類得分 $cls$。 - 輸出 Bounding box 可以根據 anchor 和 network 的預測值恢復出來:![](https://hackmd.io/_uploads/HJl_XIIo3.png) - 其中 $(\hat{·})$ 表示恢復的 3D bounding box 參數。 - 另外 2D box 中心$[x_{2d}, y_{2d}]$ 還有 3D 的投影中心 $[x_p, y_p]$ 是使用相同的 anchor 中心點。 ### Loss Function 整體 loss 的總和公式為:$$\mathcal{L}=\mathcal{L}_{cls}+\mathcal{L}_{reg}+\mathcal{L}_{dep}$$ - 其中 $\mathcal{L}_{cls}$ 是類別 loss,$\mathcal{L}_{reg}$ 是 regression 的 loss,$\mathcal{L}_{dep}$ 是 depth supervision loss - 另外分類 loss 是採用 **Focal Loss**,回歸 loss 是使用 **Smoth-L1 Loss**,深度類別則使用如下的 **Focal Loss**: $$\mathcal{L}_{dep}=\dfrac{1}{|\mathcal{P}|}\sum_{p \in \mathcal{P}}FL(D(p),\hat{D}(p))$$ - $\mathcal{P}$ 是在影像中有合理深度標籤的 pixel 區域 - $\hat{D}$ 是深度類別(bin) 的 Ground Truth,主要來自 LiDAR ## Experiments ### Setup - **Dataset**: KITTI 3D object detection dataset - Training data: 7481(3712 training set, 3769 validation set) - Testing data: 7518 - **Evaluation metric**: 使用 Average Precision(AP) 來計算 - 使用 40 recall 位置來計算 $AP_{40}$,而不是原版得 $AP_{11}$ - 基準測試中的檢測難度根據 size、occlusion 和 truncation 分為三個 level(“Easy”、“Mod.”、“Hard”)。 - 所有方法均用 KITTI 的 Mod. level 的 $AP_{3D}$ 進行排名。 - 這些 cars、cyclists 和 pedestrian 類別的 IoU 閾值設置分別為 0.7、0.5、0.5。 - **Implementation details**: - Optimizer: Adam - Batch size: 4 - Epochs: 120 - Learning Rate: 0.0001,and decays with a cosine annealing schedule. - Anchors: 每個 pixel 上有 48 個 anchor - 3 種 anchor 比例 $\{0.5, 1.0, 1.5\}$ - 高度有 12 個 scale,遵循指數函數 $24\times 2^{i/4},\ \ i=\{0,...,15 \}$。 - 3D anchors: 計算 Ground Truth 裡面的 mean 跟 variance 來給予每個 anchor 先驗知識。 - Crop 每張影像的前 100 個像素以減少 inference 時間,並將所有影像大小調整為 $288\times1280$。 - 在訓練階段,使用 random horizontal mirroring 作為 Data Augmentation。 - 在 Inference 階段,我們丟棄信心值低於 0.75 的預測,並採用 IoU 0.4 的 NMS 來減少 bounding box。 ### Main Results ![](https://hackmd.io/_uploads/BJ3f8Ews3.png) :::info :bulb: KITTI test set 在 Car 類別的的 Detection Performance,紅色是最好的 AP 值,藍色是第二好的。 ☀ 使用單張 Nvidia Tesla v100 GPU 來跑 1 個 batch 的速度也呈現在上面,這邊可以跑到 37 fps。 ::: ![](https://hackmd.io/_uploads/SyV_9Evsh.png) :::info :bulb: KITTI validation set 在 Car 類別的的 Detection Performance,粗體代表是最好的 AP 值。 ::: ![](https://hackmd.io/_uploads/rJ4JiVvi2.png) :::info :bulb: KITTI test set 在 Pedestrian 和 Cyclist 類別且取 0.5 閾值的 Detection Performance,粗體代表是最好的 AP 值。 ::: ### Ablation Study :fire: **Effectiveness of each proposed components** ![](https://hackmd.io/_uploads/S1loh4Di3.png) :::info :bulb: 在 KITTI validation set 上對於 Car 類別的 Ablation 實驗。 - **(a)** Baseline: 只使用 context-aware 特徵做 3D object detection - **(b)** 在 Transformer 中用 depth-aware 特徵取代 object query 也就是: baseline + DETR-like transformer. - **\(c\)** 用 depth-aware 特徵取代 DORN 論文裡面用的特徵提取方法。 **(d)** 使用 Convolutional 的 concate 方法整合 context-aware 跟 depth-aware 特徵 - **(e)** 沒有使用 depth prototype 特徵 $F'$ 來強化的模型。 - **(f)** MonoDTR - **(d)**, **(f)** 證明了應用 DTR module **(f)** 比簡單的卷積串聯 **(d)** 更有效地整合 context-aware 和 dep-aware 特徵。 ::: ![](https://hackmd.io/_uploads/Sy6HbHPoh.png) :::info :bulb: 在不同 IoU 閾值、不同深度範圍在 Baseline 跟 MonoDTR 的比較,資料是用 validation set,並只看 Car 類別 ::: :fire: **Comparison with different positional encodings** ![](https://hackmd.io/_uploads/SyzXfSDin.png) :::info :bulb: 不同的 positional encoding 機制比較,資料是用 KITTI 的 validation set,類別只看 Car。 ::: :fire: **Plugging into the existing image-only methods** ![](https://hackmd.io/_uploads/r1JkXBPs2.png) :::info :bulb: 使用本篇的 depth-aware modules 來外加在其他 Monocular 純影像的方法比較,資料是用 KITTI validation set。 ::: ### Qualitative Results ![](https://hackmd.io/_uploads/HyaAQSwsh.png) :::info :bulb: 在 KITTI validation set 的 Qualitative examples - 左邊都是一般鏡頭影像,右邊是 bird eye view - 紫色框代表的是 MonoDTR prediction 結果 - 綠色框代表 Ground Truth - 紅色框代表 Baseline prediction 結果 ::: ## Conclusion - 提出 Depth-Aware 的 Transformer netwrok。 - 提出輕量級的 Depth-Aware Transformer DFE module 來學習 depth-aware features。 - 整合了 Context-Aware, Depth-Aware 特徵,另外 novel Depth Positional Encoding (DPE) 塞入 Transformer 也讓效果提升。 ## 補充說明 ### Auxiliary Depth Supervision :fire: **Depth ground truth generation** 將 LiDAR 信號投影到影像平面中以生成 Sparse 的 Ground Truth 深度圖。 然後我們應用 **linear-increasing discretization(LID)** 方法將連續深度 $d$ 轉換為離散深度 bins。LID 定義如下: $$d=d_{min}+\dfrac{d_{max}−d_{min}}{D(D+1)}·i(i+1), i=\{1, ..., D\}$$ - $i$ 是深度 bin 的 index - 深度 bins 的數量 $D$ 設置為 96,深度範圍 $[d_{min},\ d_{max}]$ 設置為 $[1,\ 80]$。 - 如果深度超出範圍,將會被標記為 invalid,而且不會使用在模型上。 :fire: **Different discretization methods** ![](https://hackmd.io/_uploads/S1IM7IPjh.png) :::info :bulb: 比較不同離散方法的結果 - Dataset: KITTI validation set - Category: Car - Metrics: $AP_{40}$ - Uniform Discretization (UD) with fixed bin size: $\dfrac{d_{max}−d_{min}}{D}$ - Spacing-Increasing Discretization (SID): 透過 log space 的方式慢慢增加 bin size ::: ### Results on nuScenes Dataset ![](https://hackmd.io/_uploads/Sy7ONUwin.png) :::info :bulb: 在 nuScenes val set 的 Detection 結果。 - 上面數字跟實際論文不符,因為是作者自己去拿 MMDetection3D 然後用跟原論文一樣的超參數做訓練,但只訓練 12 epochs 的結果。 ::: ### Qualitative Visualization :fire: **More visualization results** ![](https://hackmd.io/_uploads/Byz28Lvs3.png) ![](https://hackmd.io/_uploads/S1An8Uvin.png) :::info :bulb: 在 KITTI validation set 上的多分類視覺化結果 - 橘色代表 Car - 藍色代表 Pedestrian - 綠色代表 Dyclist ::: ![](https://hackmd.io/_uploads/r1cvvIwi3.png) ![](https://hackmd.io/_uploads/BJQ_vIvon.png) :::info :bulb: 在 KITTI validation set 上車子的預測 - 在 BEV 呈現的紫色代表 MonoDTR 的結果 - 綠色代表在 BEV 上的 Ground Truth - 粉紅色代表 Baseline 的預測結果 ::: :fire: **Failure case** ![](https://hackmd.io/_uploads/r15ATqPjn.png) :::info :bulb: Failure case - 紫色是 MonoDTR 預測結果 - 綠色是 Gtound Truth - 預測失敗主要是物件中心的深度預測失敗 :::