> [name=謝朋諺(Adam Hsieh)]
> [time=Thu, Jul 20, 2023 5:45 PM]
---
# DD3D: Is Pseudo-Lidar needed for Monocular 3D Object detection?
[論文連結](https://arxiv.org/pdf/2108.06417.pdf)
{%pdf https://arxiv.org/pdf/2108.06417.pdf %}
## Outline
> [TOC]
## Reference
> [[ICCV2021] Is Pseudo-Lidar needed for Monocular 3D Object detection? (DD3D)](https://zhuanlan.zhihu.com/p/406918022)
> [【3D目标检测】Is Pseudo-Lidar needed for Monocular 3D Object detection?](https://blog.csdn.net/qq_44173974/article/details/129477968)
> [Monocular 3D Detection总结(一)](https://zhuanlan.zhihu.com/p/450995240)
---
## 摘要重點
- 提出一種 end-to-end、single stage、monocular 3D 物體檢測器 DD3D,它可以受益於 pseudo-lidar 方法等深度預訓練,但沒有他們的缺點(overfitting 或更複雜)。
- 本文架構專為深度預測和 3D detection 設計,允許我們擴展 unlabeled 的 pre-training data。
- 本文在 KITTI-3D 資料集上汽車和行人的 AP 分別為 16.34% 和 9.28%,在 NuScenes 上的 mAP 為 41.5%(2021 年 8 月最高)。
## 本文動機
- 作者認為要從影像中解決深度的回歸問題,本來就不直覺,因此深度估計的誤差就是 pseudo-lidar 和 lidar-based 這兩個 Detector 差距的主要部分。
- 這篇主要貢獻就是做一個 **novel fully convolutional single-stage 3D detection architecture: DD3D**,有效利用 monocular 深度估計進行預訓練。
## Dense depth pre-training for 3D detection
### Architecture

:::info
:bulb: DD3D 是一種 Fully Convolutional Single-Stage Network,擴展了 FCOS 來執行 3D detection 和 dense depth 預測。
為了最大化重複使用 pre-train 特徵,所以在預測 **dense depth** 和 **3D bounding box** 共享了大部分的參數,至於 detection head 則共享了全部 FPN 的參數。
:::
透過 backbone 生成的每個特徵圖並接著 3 head netowrk(cls. head, 2D det. head, 3D det. head)。
- **cls. head** 模塊預測物件類別,他會輸出 **C** 個值,其中 **C** 是物件類別的數量。
- **2D det.** 透過 feature 產生每個 bounding box 的 4 個偏移量和 center-ness。
- **3D det.** 預測 3D bounding box 和每個 pixel 的深度,前面的輸入是塞 FPN 的結果,然後後面接著 4 個 $3\times3$ 的 2D Convolution ,每個特徵位置會產生 12 個值分別為:3D bounding box, pre-pixel depth map, 3D prediction confidence.
- $q=(q_w,q_x,q_y,q_z)$: 表示方向參數,作者這裡預測 3 個方向,而不是平常的一個方向
- $z_{\{c,p\}}$: 是用來深度預測,$z_c$ 是 bounding box 的 $z$ 分量,所以只跟前景特徵有關;$z_p$ 則是代表物件表面的深度,而是跟所有 pixel 有關,而我們可以透過下面公式來做轉換:$$d=\dfrac{c}{p}·(\sigma·z+\mu_l)$$ $$p=\sqrt{\dfrac{1}{f^2_x}+\dfrac{1}{f^2_y}}$$ 其中 $z\in \{z_c,z_p\}$ 是來自網路輸出,$d\in\{d_c,d_p\}$ 則是透過每層 FPN 輸出來訓練的 scaling factor 和 offset $(\sigma_l,\mu_l)$,$p$ 則是焦距長度的 pixel size(相機內參), $f_x$ and $f_y$, 和 $c$ 則是定值。
- 本文發現用相機內參有穩定訓練的效果,不僅可以從輸入影像推斷深度,還可以從像素大小推斷深度。
- 當訓練期間調整輸入影像的大小時,我們保持真實 3D 邊界框不變,但修改相機解析度可以透過下面公式來修正:$$K=[r_x\ r_y\ 1]\begin{bmatrix}f_x & 0 & p_x\\0 & f_y & p_y\\0 & 0 & 1\end{bmatrix}$$
其中 $r_x$ 和 $r_y$ 是 resize 比例,$K$ 是方程式中使用的新相機的固有矩陣。
最後,$\{z_p\}$ 共同表示根據每個 FPN 特徵計算的 dense depth maps 的低解析度版本,就可以透過上面這個公式來做轉換。
- $o = (\triangle u, \triangle v)$ 代表從特徵位置投影到相機平面上的 3D bounding box 中心的偏移量,可以理解為當前像素點所對應的物件的 3D bounding box 中心點投影相對於當前像素點的偏移量: $$C=K^{-1}\begin{bmatrix}u_b+\alpha_l\triangle_u \\ v_b+\alpha_l\triangle_v \\ 1\end{bmatrix}d_c$$
其中 $(u_b, v_b)$ 是在影像空間中的特徵位置,$\alpha_l$ 是一個從 FPN 各層輸出的 scaling factor。
- $\delta=(\delta_W,\delta_H,\delta_D)$ 代表尺寸參數,具體尺寸計算為:$$s=(W_0e^{\delta_W},H_0e^{\delta_H},D_0e^{\delta_D})$$
其中 $(W_0, H_0, D_0)$ 是每個類別的 box size,而這些數值是由訓練資料裡面預計算出的。
- $\beta_{3D}$ 表示 3D bounding box 預測的信心水準,它被轉換為機率公式(Sigmoid):$p_{3D} = (1+e^{-\beta 3D})^{-1}$,並乘以從 cls. head 計算出的類機率,以說明相對於 2D 信心分數的數值。
### Losses
- 2D 的訓練基本上沿用 FCOS: $$\mathcal{L}_{2D}=\mathcal{L}_{reg}+\mathcal{L}_{cls}+\mathcal{L}_{ctr}$$
- $\mathcal{L}_{reg}$ 是 IOU regression loss
- $\mathcal{L}_{cls}$ 是 binary focal loss
- $\mathcal{L}_{ctr}$ 是 binary cross entropy loss
- 3D bounding box regression 則是使用 disentangled L1 loss: $$\mathcal{L}_{3D}(B^*,B^\land)=\dfrac{1}{8}||B^*-B^\land||_1$$
- $B^*$ 和 $B^\land$ 分別是 3D box 8 個點的 ground truth 和 predict 值。
- 由於預測值包含:orientation、projected center、depth、and size,因此在計算 loss 的時候,總共計算四次,分別對四個預測值進行約束,以 orientation 為例,選用 orientation 的預測值和其他三個物理量(projected center、depth、and size)的 ground truth,來預測出 8 個頂點的坐標,加入到 loss 中。
- 3D Confidence 使用 self-supervised loss 它使用 3D 框預測中的誤差來計算 3D 置信度的替代目標: $$p^*_{3D}=e^{-\dfrac{1}{T}\mathcal{L}_{3D}(B^*,B^\land)}$$
其中 $T$ 是 temperature parameter。
所以最後 Confidence 的 loss 就是 $p_{3D}$ and $p^∗_{3D}$ 的 binary cross entropy。
- 而這個 DD3D 的總 loss 可以縮寫為:$$\mathcal{L}_{DD}=\mathcal{L}_{2D}+\mathcal{L}_{3D}+\mathcal{L}_{conf}$$
### Depth pre-training
作者在 depth training 任務下做預訓練,能夠使模型得到更準確的空間資訊。
在預訓練期間,使用所有 FPN level per-pixel 的深度預測輸出,即 $\{z_p\}$。
另外以 Sparse Lidar 投影在相機圖片上的點雲來當 Ground Truth,並根據 **Predict - Ground Truth** 計算 L1 距離:$$\mathcal{L}^l_{depth}=||D^*-D^\land_l||_1\odot M$$$$\mathcal{L}_{depth}=\sum_l\mathcal{L}^l_{depth}$$
其中 $D^∗$ 是 **Ground Truth Depth Map**,$D^\land_l$ 是 FPN 中第 $l$ 層的 **Predict Depth Map**(即插值 $z_p$),$M$ 是有效像素的 binary 指標。
:::info
:notebook_with_decorative_cover: 具體作法(論文前面提的比較含糊後面有個章節講實作)
DD3D 中作者先用一組在 COCO 數據集上預訓練的 2D 目標檢測參數初始化了特徵提取網絡 FPN,然後將深度估計網絡放到 DDAD15M 數據集上預訓練,然後在 KITTI-3D 中訓練。
:::
:::success
:bomb: 作者觀察:
* 使用 FPN 產出所有 scale 特徵,並丟入訓練預測,會比僅僅使用高解析度影像特徵更加穩定,尤其是從頭開始訓練時。
* 在大 batchsize 和高解析度輸入的情況下,相比於 SILog loss(scale-invariant mean square error in log space),L1 loss 訓練起來更加穩定。
* 因為作者在設計深度參數的時候採用了相機內參,因此在做遷移的時候會更加有效
:::
## Pseudo-Lidar 3D detection(Minor...)
PL 是一種 two-stage 方法,這邊主要是拿來對照本文實驗用的,流程跟設計大概如下:
1. 先將影像應用 monocular depth network 來預測每個 pixel 的深度。
2. 將密集深度圖轉換為 3D 點雲,然後使用 Lidar-based 3D detector 預測 3D bounding boxes。
**Monocular depth estimation**
估計的目的是計算每個像素 $p \in I$ 的深度 $D^\land = f_D(I(p))$。
這裡使用 SILog 損失,它比 PackNet 的 L1 產生更好的性能。
**Network architecture**
使用 PackNet 架構,目前最好的 monocular depth prediction architecture
**3D detection**
首先將估計的深度圖轉換為 3D 點雲,並將每個 3D 點與相應的像素值連接起來,這會產生包含顏色和 3D 坐標的 6D 張量(我猜是這樣 RGBXYZ)。
我們使用現成的 2D detector 來辨識輸入影像中的 RoI,並將 3D 檢測網絡應用於 6 通道圖像的每個 RoI 區域以生成 3D bounding box。
**Backbone, detection head and 3D confidence**
* 使用 Squeeze-and-Excitation layers 的 ResNet-18 backbone 來處理每個 RoI。
* 由於 RoI 既包含物件又包含背景像素,因此生成的特徵將通過基於 RoI 深度圖計算的前景 masks 進行過濾。
* Detection head 在 3 個距離範圍內為每個範圍生成一個 bounding box,然後根據輸入 RoI 的平均深度選擇最終輸出。
* 最後修改 detection head 以在每次檢測時輸出一個 3D 信心分數 $\gamma$,該值與 3D 檢測損失相關。
**Loss function** $$\mathcal{L}_{3D}^{PL}=\mathcal{L}_{center}+\mathcal{L}_{size}+\mathcal{L}_{heading}+\mathcal{L}_{corners}$$
本文使用 $\gamma^\land = e^{−L_{corners}}$ 的 binary cross entropy 公式定義了一個 loss,將預測的 3D 信心值 $\gamma$ 與 3D bounding box 坐標 loss 聯繫起來。最終的 PL 3D 檢測損失為: $$\mathcal{L}_{PL}=\mathcal{L}^{PL}_{3D}+\mathcal{L}^{PL}_{conf}$$
## Experimental Setup
### Dataset
**KITTI-3D**
- 8 個物件類別
- 使用 2 個 Average Precision 指標來評估 3 個類別(汽車、行人和騎自行車者)的 3D 檢測精度,這兩個平均精度指標是根據 3D bounding box 或 Bird-Eye-View(2D) bounding box IoU 上的特定類別閾值計算得出的,這些指標稱為 3D AP 和 BEV AP,使用 $AP|_{R40}$ 當作閾值指標。
- 訓練資料有 7,481 筆,測試資料有 7,518 筆。
- 在測試集裡面有分為三種難度區域:easy, moderate, hard,並會分別提供評估。
- 我們會將訓練集切為 3,712 筆 KITTI-3D train, 3,769 筆 KITTI-3D val。
**nuScenes**
- 由 1000 個 multi-modal 影片組成,其中有 6 個鏡頭來覆蓋整體完整的 360 度視角。
- 700 個用於訓練、150 個用於驗證、150 個用於測試。
- Benchmark 要在 2Hz 採樣的影片上找到 10 個物件類別的 3D bounding box。
- 評估指標 NuScenes Detection Score (NDS) 適用 4 個與中心距離不同閾值的 mAP 與 5 個 true positive 指標相結合來計算的。
- 這篇文僅用了 NDS 和 mAP,以及其中 3 個作者在意的 True Positive 指標,即 ATE、ASE 和 AOE。
**KITTI-Depth**
- 使用 KITTI-Depth 資料集來微調 PL 模型的深度網絡。
- 超過 93,000 個與 KITTI 原始數據集中的圖像相關的 depth map。
- 訓練影像多達三分之一與 KITTI-3D 影像重疊,避免 PL 模型產生偏差,我們通過刪除與任何 KITTI-3D 影像地理位置接近(即 50m 以內)的訓練影像來生成新的分割。
**DDAD15M**
- 主要用來預訓練 DDAD 和 PL 模型,但這是他們的內部資料集。
- 包含 25,000 個城市多鏡頭的駕駛場景。
- DDAD15M 是 DAAD 的更大版本,包含用於生成點雲的高解析度 Lidar Sensor 和 10Hz 的 6 個鏡頭。
- 影片長度大概都 10 秒,總共大約有 1500 萬個 Frame。
### Implementation detail
**DD3D**
- 使用 VoVNetV2 來當作 Backbone 並接上 FPN。
- 在預訓練 DD3D 時,先使用 COCO 在 2D det. 任務上預訓練參數並初始化 backbone,並使用 DDAD15M 資料集對 dense depth 預測進行預訓練。
- 通過調整輸入影像大小和水平翻轉來做 Data Augmentation。
- 我們觀察到 "Car" BEV AP 在 KITTI validation set 上獲得了 2.3% 的改進,但在 nuScenes validation set 上沒有任何幫助。
- 觀察到執行中的 varience 很小,即 0.5 ∼ 1.2% BEV AP。
**PL**
- 在訓練 PackNet 時,僅使用 DDAD15M 的前置鏡頭影像來預訓練 PackNet,並訓練直至收斂。
- 在 KITTI Eigen-clean split 資料上對網路進行 5 個 epoch 的微調。
## Results
### Benchmark evaluation
**KITTI-3D**

:::info
:bulb: KITTI-3D 在 Car 類別下的評估 $AP|_{R40}$ 指標.
粗體和底線代表最好和第二好的結果。
:::

:::info
:bulb: KITTI-3D 在 Pedestrian, Cyclist 類別下的評估 $AP|_{R40}$ 指標.
:::
**nuScenes**

:::info
:bulb: nuScenes 測試集上的評估
- *表示結果在本論文出版之前尚未有明確的文件寫上他們的結果。
- 底線表示第二好的結果,粗體代表最好的結果。
- PointPillars 是 Lidat-base detector。
:::

:::info
:bulb: nuScenes 測試集針對 Car, Pedestrian, Bicycle 對於不同距離閾值的結果。
:::

:::info
:bulb: Qualitative visualization of DD3D detections.
- 前兩 row 是 KITTI-3D 結果
- 最後一 row 是 nuScenes
:::
### Is depth-pretraining effective?
**Ablating large-scale depth pre-training**
去除 COCO 資料集的初始化參數會導致效果小幅下降,但是去掉 DDAD15M 這個大資料集的預訓練之後,效果顯著下降。

:::info
:bulb: DD3D 和 PL 在 KITTI-3D validation set 上的消融性分析
- 上面的 KITTI 表示使用 KITTI-Depth 資料集的特徵做 Eigen-clean split 的密集深度預測。
- DDAD15M 表示使用 DDAD15M 資料集的密集深度預測。
- COCO 表示使用 COCO 資料集做初始預訓練的 2D Detection。
- 右箭頭 (→) 表示連續的預訓練階段。
:::
- 當我們省略深度預訓練並直接在 Detection 任務中使用 DLA-34 backbone 做微調 DD3D 時,觀察到 Car Moderate BEV AP 損失了 5.3%。
- 相反,當我們刪除最初的 COCO 預訓練(即從頭開始在 DDAD15M 上進行預訓練)時,觀察到相對較小的損失,即 2.0%。
- 對於 V2-99 較大的主幹網,去除深度預訓練的效果更加顯著,即 -10.7%。
**Dense depth prediction as pre-training task**
作者分別使用 2D detection 和 depth prediction 作為預訓練,發現在 depth prediction 資料集上預訓練效果更好。

:::info
:bulb: 預訓練任務 Depth vs 2D Detection
- 先從 COCO 做一個初始模型
- nusc-det 代表 2D detection 任務
- nusc-depth 代表 depth dense prediction 任務
- 上面的結果是跑在 KITTI-3D validation set 上
- 兩個預訓練階段皆使用一組通用影像,這些影像用 2D bounding box 和通過 Lidar 點雲獲得的 sparse depth maps。
- 這邊實驗使用相同的 training steps 和 batch size(15K, 512)
- 預訓練實驗的資料來自 nuScenes 的 training set 136,571 張影像組成。
:::
**How does depth-pretraning scale?**
作者發現隨著預訓練資料集的增大,帶來的提升也越來越大。

:::info
:bulb: DD3D 和 PL 預訓練在不同 size 的深度資料
- fine-tuned 在 KITTTI-3D training data 還有評估在 KITTI-3D val.
- Pre-train 這兩個方法在 DDAD15M,並分為四個預訓練數量: 0.6M, 3M, 6M, and 15M 張影像。
:::
### The limitations of PL methods
**1. In-domain depth fine-tuning of PL**

上面這表格很明顯在 DDAD15M 預訓練後,還需要再 KITTI 微調一下,不然效果會很差。
**2. Limited generalizability of PL**
作者認為 domain 內 fine-tune 對某些影像資料過度擬合,導致在 validation 的結果會比在 testing 結果差距很大,而且會特別比其他的方法差距更大。
## Details of training DD3D and PL
### DD3D
- 預訓練期間
- Batch Size: 512
- Steps 375K
- Learning Rate 從 0.02 開始,在第 305K 和 365K step 時衰減 0.1。
- Image Size(and projected depth map)的大小為 $1600 × 900$,我們將其大小調整為 $910 × 512$。
- 調整 depth maps 大小時,我們通過將所有非零深度值分配給調整大小後影像空間中 nearest-neighbor pixel 來保留 sparse depth values(請注意,這與 naive nearest-neighbor interpolation 不同,如果原始圖像中的 nearest-neighbor pixel 沒有深度值,則目標深度值被指定為零。)
- 觀察到訓練在 30 個 epoch 後收斂。
- Optimizer: Adam ,β = 0.99。
- 對於所有監督深度預訓練分割,我們使用預測深度和投影地面實況深度之間的 L1 損失。
- Training 3D detector
- Learning Rate 從 0.002 開始,當達到整個訓練過程的 85% 和 95% 時,學習率衰減 0.1。
- Batch Size: 64
- 分別為 KITTI-3D 和 nuScenes 訓練 25K 和 120K 步。
- 每個 FPN 內 Level 的 $\mu_l$ 和 $\sigma_l$ 分別初始化為每個 FPN level 的 3D bounding box depth 的平均值和標準差,$\alpha_l$ 初始化為 FPN level 內的 stride size,並且 $c$ 固定為 $\dfrac{1}{500}$。
- 原始預測通過 NMS 和 IoU 來在 2D bounding box 上進行過濾。
- 對於 nuScenes 基準測試,為了解決相鄰攝像機重疊視錐體中的重複檢測問題,在將檢測到的框轉換為全局參考幀後,在所有 6 個同步圖像(即樣本)上應用了一個額外的基於 BEV 的 NMS。
## DD3D architecture details
### FPN
- FPN 是一個 bottom-up feed-forward CNN 和一個自上而下的網路組成,前者計算 subsampling factor 為 2 的特徵圖,後者俱有橫向連接,從低分辨率特徵中恢復高分辨率特徵。
- FPN 產生 5 個 level 的特徵圖。
- **DLA-34 FPN** 則產生 3 個 level 的特徵圖($strides = 8、16、32$),本文通過應用步幅為 2 的兩個 $3 \times 3$ 2D 卷積來添加兩個較低分辨率的特徵($strides = 64、128$)。
- **V2-99** 預設產生 4 個 level 的特徵($strides = 4、8、16、32$),因此僅需要使用一個額外的 conv 來完成 level 5 特徵圖。
:::warning
:warning: **DLA-34** 和 **V2-99** 網絡導出的 FPN 特徵的最終分辨率不同,DLA-34 的 $strides=8, 16, 32, 64, 128$,V2-99 的 $strides= 4, 8, 16, 32, 64$。
:::
### 2D detection head
僅使用 ground truth bounding box 的中心部分來分配 $\mathcal{L}_{reg}$ 和 $\mathcal{L}_{3D}$ 中的正樣本。
## Conclusion
提出 DD3D 是一個 end-to-end 的 single-stage 3D object detector,享有 Pseudo Lidar 的好處(scaling accuracy using large-scale depth data),卻沒有其限制(impractical training, issues in generalization)