> [name=謝朋諺(Adam Hsieh)]
> [time=Tue, Jul 18, 2023 3:51 PM]
---
# FCOS3D: Fully Convolutional One-Stage Monocular 3D Object Detection
[論文連結](https://arxiv.org/pdf/2104.10956.pdf)
{%pdf https://arxiv.org/pdf/2104.10956.pdf %}
## Outline
> [TOC]
## Reference
> [论文精读:《FCOS3D: Fully Convolutional One-Stage Monocular 3D Object Detection》](https://blog.csdn.net/zyw2002/article/details/128350300)
> [【3DBBox】FCOS3D: Fully Convolutional One-Stage Monocular 3D Object Detection](https://blog.csdn.net/djfjkj52/article/details/122309646)
> [Monocular 3D Detection总结(一)](https://zhuanlan.zhihu.com/p/450995240)
---
## 摘要重點
- 將通常 3D 使用的 7 Dof(seven-degrees-of-freedom) 目標轉換到影像平面上,並將他們解藕為 2D, 3D 的屬性。
- 訓練了 3D 中心點在 2D 上投影點的偏移量、深度、三維尺寸、航向角以及方向辨別。
- 在本文中,我們採用一種簡單而有效的方法來使 2D 檢測器能夠預測 3D 定位。
- 在 NeurIPS 2020 的 Nuscenes 3D 檢測比賽中,所有的純視覺方法中這篇的效果是最好的(2021 Sep.)。
## 作法簡述

:::info
:bulb: Fig.1. 2D detection 和 monocular 3D object detection 差別
同樣是輸入 RGB 圖像,2D anchor-free detector 需要預測從前景點到四個框邊的距離。
相比之下,monocular 3D anchor-free detector 需要預測物件的變換 3D 中心、3D 大小和方向。
:::
1. 首先將通常定義的 7-DoF 3D 位置投影到 2D 圖像上並獲得投影中心點,與之前的 2D 中心相比,我們將其命名為 3D 中心。通過此投影,3D 中心包含 2.5D 信息,即 2D 位置及其相應的深度。
2. 2D 位置可以進一步簡化為距圖像上某個點的 2D 偏移量,這是唯一可以在不同特徵級別之間標準化的 2D 屬性,就像在 2D 檢測中一樣。
3. 深度、3D 尺寸和方向在解耦後就會被視為 3D 屬性。
4. 在 FCOS 上構建模型,FCOS 是一個簡單的 ==Anchor-free fully convolutional single-stage detector==。
5. 首先考慮物件 2D 的 scale,並將其分配到不同的特徵級別。
6. 然後僅根據投影的 3D 中心分配每個訓練樣本的 regression 目標。
7. 與原本 2D 用到邊界距離來表示 center-ness 的 FCOS 相比,我們用基於 3D 中心的 2D 高斯分佈來表示 3D center-ness。
## Framework Overview

:::info
:bulb: Fig.2 Pipeline Overview
* 基本上跟 2D Detector 的 backbone 和 Neck 相似。
* 對於 Detection Head,使用 center-based 的例子重新制定 3D 目標,將其解耦為多任務學習。
* multi-level 目標分配和 center sampling 策略也相應調整,使該框架具有更好的處理 ground truth 重疊和 scale varience 問題的能力。
:::
- **Backbone**
- 預訓練好的 ResNet101 架構。
- 第一層 CNN Block 被固定住以避免 Overfitting
- **Neck**
- FPN for different scales
- 這邊沿用 FCOS 作法拿了 P3~P5 的特徵並把 P5 downsample 到 P6、P7 並也獲取他們的特徵輸出
- **Detection Head**
- 每個 shared head 有 4 個 shared convolutional block 組成,並且 small heads 針對不同的標的。
- 從經驗上看,對不同的測量數值做各自的 small head 更為有效,因此我們為每個目標設置一個。
- **Regression Targets**
- 在主幹的第 $i$ 層,特徵輸出表示為 $F_i \in \mathbb{R}^{H \times W \times C}$。
- 對於在 Feature map $F_i$ 上所有的位置 $(x,y)$,假設到第 $i$ 層的總步伐為 $s$,則相對應的位置應為:$(sx+\lfloor\dfrac{s}{2}\rfloor,sy+\lfloor\dfrac{s}{2}\rfloor)$。
- 因為本文使用的是 anchor free 的概念,所以並沒有 anchor box 需要回歸,所以也不需要使用 IOU 的做法去跟 anchors 還有 ground truth 做計算,而是只要這個點接近 box 中心點,他就可以當作是前景點。
- 在 2D 的時候我們通常是用上下左右來定義物件中心 $t,b,l,r$,如 Fig.1,但對於 3D 物體有六個面來說會有點困難,論文這邊改為回歸 2.5D 中心和 3D 尺寸,而回歸 2.5D 中心可以進一步簡化為分別回歸從中心到特定前景點的偏移量 $\triangle{x}, \triangle{y}$ 及其相應的深度 $d$。
- 此外,為了預測物體的異中心方向,我們將其分為兩部分: 用 $\pi$ 來表示角度 $\theta$ 和 2-bin 方向分類(車子朝哪邊)。
- $\theta$ 是對預測與真實框的 IOU 進行建模
- 2-bin 方向分類則專注於兩個框具有相反方向的對抗性情況。
- 除了這些與物體位置和方向相關的回歸目標之外,我們還回歸了像 FCOS 這樣的二元目標 center-ness $c$。有點像是 soft binary classifier 來確定哪些點更接近中心,並有助於抑制那些遠離物件中心的低質量預測。
- 總結來說,回歸需要預測 $\triangle{x}、\triangle{y}、d、w、l、h、\theta、v_x、v_y$、方向類別 $C_\theta$ 和 center-ness $c$,而分類分支需要輸出物件的類標籤及其屬性標籤。

:::info
:bulb: Fig.3 利用旋轉編碼方案具有相反方向的兩個對象基於 2-bin 邊界共享相同的旋轉偏移,因此具有相同的 $sin$ 值。
為了區分它們,本文從回歸分支預測一個方向的類別。
:::
- **Loss**
- 物件的類別分類使用標準的 Focal Loss:$$L_{cls} = −\alpha(1 − p)^\gamma log(p)$$
- $p$ 是對於預測框的分類機率。
- $\alpha$ 跟 $\gamma$ 沿用 RetinaNet 的設定: $\alpha=0.25、\gamma=2$
- 物件的屬性分類則使用 simple softmax classification loss,定義為 $L_{attr}$
- Rregression 的分支除了 center-ness 以外都是使用 smooth L1 loss,並針對不同的參數給予不同權重:$$L_{loc}=\Sigma_{b\in(\triangle x,\triangle y,d,w,l,h,\theta,v_x,v_y)}SmoothL1(\triangle b)$$
- 其中 $\triangle x, \triangle y, w, l, h, \theta$ 權重都是 1。
- $d$ 權重是 0.2。
- $v_x,v_y$ 權重是 0.05
:::warning
:warning: 請注意,雖然論文中是使用 $exp(x)$ 進行深度預測,但仍然在原始深度空間而不是 log 空間中計算 loss。
:::
- 方向分類使用 softmax classification loss 表示為 $L_{dir}$
- 中心度回歸使用 binary cross entropy 表示為 $L_{ct}$。
- 最終,全部總損失為:$$L=\dfrac{1}{N_{pos}}(\beta_{cls}L_{cls}+\beta_{attr}L_{attr}+\beta_{loc}L_{loc}+\beta_{dir}L_{dir}+\beta_{ct}L_{ct})$$
- $N_{pos}$ 代表 positive 預測數量而且 $\beta_{cls} =
\beta_{attr} = \beta_{loc} = \beta_{dir} = \beta_{ct} = 1$
- **Inference**
- 在 Inference 過程中,輸入一張影像並通過模型框架獲得 bounding box 及其類別分數、屬性分數和 center-ness 預測,我們將類別分數和 center-ness 相乘作為每個預測的信心水準,並在鳥瞰圖中像大多數 3D 檢測器一樣進行 Rotated Non-Maximum Suppression (NMS) 以獲得最終結果。
## 2D Guided Multi-Level 3D Prediction
### 由 ground-truth boxes 重疊引起的模糊性問題
- 原始的 FCOS 與基於 anchor 的方法不同,它不是分配不同大小的 anchor,而是直接將不同大小的 ground-truth boxes 分配給不同級別的特徵圖。
- 原始的 2D FCOS 首先計算每個特徵級別每個位置的 2D 回歸目標 $l^*、r^*、t^*、b^*$。
- 那麼滿足 $max(l^*、r^*、t^*、b^*) > m_i$ 或 $max(l^*、r^*、t^*、b^*) < m_{i−1}$ 的位置將被視為負樣本,其中 $m_i$ 表示特徵級別 $i$ 的最大回歸範圍。
:::info
:bulb: 這邊 $i$ 是設定為 $(0, 48, 96, 192, 384, ∞)$ for $m_2$ to $m_7$
:::
- 3D 這邊也遵循他的做法,而我們直接拿 3D Bounding Box 的外部矩形來生成 2D 邊界框,因此不需要任何的先驗框或 2D Detector。
- 當一個點位於同一特徵級別的多個地面實況框內時,應該將哪個框分配給它?
- 過去作法習慣找面積較小的框做為目標框,但這會導致大物體會受到較少的關注。
- 因此本文提出基於距離的作法,找出離中心較近的框作為回歸目標,因為更接近物體中心的點,應該更能獲得更全面和平衡的局部區域特徵。

:::success
:pencil: 本文提出的基於距離目標分配可以顯著提高每個類別的最佳 Recall 值,特別是對於拖車等大型物體。圖中工程車輛和交通錐縮寫為 CV 和 TC。
:::
- 除了基於中心的方法來處理模糊性之外,這邊還使用 3D 中心來確定前景點,即只有足夠靠近中心的點才會被視為正樣本。
- 本文定義一個超參數半徑來測量這個中心部分,到物體中心的距離小於 $radius\times strides$ 的點將被認為是正的,其中 $radius$ 設置為 1.5。
- 最後,我們用 $s_ix$ 替換不同回歸分支的每個輸出 $x$,以區分不同特徵級別的共享頭。
- 這裡 $s_i$ 是一個可訓練的標量,用於調整特徵級別 $i$ 的指數函數基數。
## 3D Center-ness with 2D Gaussian Distribution
- 在 FCOS 原本設計中 center-ness $c$ 被藉由 $l^*, r^*, t^*, b^*$ 來定義:$$c=\sqrt{\dfrac{min(l^*,r^*)}{max(l^*,r^*)}\times\dfrac{min(t^*,b^*)}{max(t^*,b^*)}}$$
- 因為本文是 3D center-ness 問題,因此本文利用 2D 高斯分佈定義 center-ness,並以投影 3D 中心為原點:$$c=e^{-\alpha((\triangle x)^2+(\triangle y)^2)}$$
- 這裡 $\alpha$ 用於調整從中心到外圍的強度衰減,設置為 2.5。
- 該 center-ness 目標的範圍從 0 到 1,因此這邊使用 Binary Cross Entropy (BCE) loss 來訓練該分支。
## Experimental Setup
### Dataset: nuScenes
- 它由從 1000 個場景收集的多模態數據組成,包括來自 6 個 surround-view cameras 的 RGB 圖像、5 個雷達和 1 個 LiDAR 的點圖。
- 它被分為 700/150/150 個場景用於訓練/驗證/測試。
- 共有 140 萬個帶註釋的 3D 邊界框,分為 10 個類別。
### Evaluation Metrics
- **Average Precision metric**
- nuScenes 資料集並沒有使用 3D IoU 進行閾值化,而是通過地平面上的 2D 中心距離 $d$ 定義匹配,以將檢測與對像大小和方向解耦。
- 在此基礎上,我們通過計算 recall and precision 超過 10% 的 precision-recall curve 下的標準化面積來計算 AP。
- 最後,根據所有匹配閾值 $\mathbb{D} = \{0.5,1,2,4\}$ 公尺和所有類別 $\mathbb{C}$ 計算 mAP:$$mAP=\dfrac{1}{|\mathbb{C}||\mathbb{D}|}\sum_{c\in \mathbb{C}}\sum_{d\in \mathbb{D}}AP_{c,d}$$
- **True Positive metrics**
- 除了 Average Precision 之外,我們還計算五種 True Positive 指標:**Average Translation Error (ATE)**, **Average Scale Error (ASE)**, **Average Orientation Error (AOE)**, **Average Velocity Error (AVE)** 還有 **Average Attribute Error (AAE)**
- 首先定義與匹配的地面真實中心距離 $d \leq 2m$ 的預測將被視為 True Positive。
- 然後對每一類對象獨立進行匹配和評分,每個指標是每個 recall 水平在 10% 以上的 average cumulative mean。
- **ATE** 是二維歐幾里德中心距 $2D(m)$。
- **ASE** 等於 $1 − IOU$,IOU 是在對齊平移和方向後在預測和標籤之間計算的。
- **AOE** 是預測和標籤之間的最小偏航角差異。
:::warning
:warning: 障礙物是在 180° 週期上測量的並不是 360°
:::
- **AVE** 是二維絕對速度誤差的 L2-Norm (m/s)。
- **AAE** 定義為 $1−acc$,其中 $acc$ 指屬性分類精度。
* 最後,根據這些指標,我們計算所有類別的平均 TP 指標: $$mTP=\dfrac{1}{|\mathbb C|}\sum_{c\in \mathbb{C}}TP_c$$
- **NuScenes Detection Score(NDS)**
- 傳統的 mAP 把 **location**、**size** 和 **orientations** 結合再一起評故,而且也無法知道該設置中的速度和屬性等等,因此這邊提出了一個更全面、解耦但簡單的指標,nuScenes Detection Score:$$NDS=\dfrac{1}{10}[5mAP+\sum_{mTP\in\mathbb{TP}}(1-min(1,mTP))]$$
- $mAP$ 指的是 mean Average Precision
- $\mathbb{TP}$ 是由五個 True Positive 指標組成的集合,另外 **mAVE**、**mAOE** 和 **mATE** 可能大於 1,因此應用界線將它們限制在 0~1 之間。
### Implementation Details
- **Network Architectures**
- 根據前面所述,基本上就是由 **ResNet101 backbone -> Feature Pyramid Networks (FPN)** 來產生 multi-level 的預測結果
- Detection heads 在多級特徵圖之間共享,只會在最後使用三個比例因子來區分它們的最終回歸結果,分別包括 offsets、depths 和 sizes。
- 所有 convolutional modules 均由基本 convolution、batch normalization 和activation layers 組成,並利用 normal distribution 進行權重初始化。
- **Training Parameters**
- Optimizer: SGD
- Training Policy: Gradient clip 和 warm-up
- Learning Rate 為 0.002,warm-up 迭代次數為 500,warm-up rate 為 0.33
- Batch Siez: 32
- GPU: 16 個 GTX 1080Ti
- 先用權重 0.2 訓練深度回歸基線模型,在切換權重為 1 來微調模型。
- **Data Augmentation**
- 僅在訓練和測試時用 image flip 來進行數據增強。
:::warning
:warning: 在翻轉圖像時,僅需要翻轉 2D 屬性的偏移量,並且需要在 3D 空間中相應地變換 3D 框。
:::
- 為了增加 test 時間,我們對 detection heads 輸出的分數圖進行計算平均,但 rotation 和 velocity 相關的分數除外。
## Results
### Quantitative Analysis

:::info
:rocket: Table 1: Results on the nuScenes dataset.
:::
**在測試集上的幾個比較模型:**
- 只用 **RGB** 圖像作為輸入: ==本文以 mAP 0.358 和 NDS 0.428 擁有最好的成效,特別在 mAP 方面比之前最好的方法高出了 2% 以上==。
- 使用 **LiDAR** 數據作為輸入: 有速度更快、重量更輕的 **PointPillars**,以及性能相對較高的**CBGS(MEGVII)**。
- 使用 **RGB** 圖像和雷達數據輸入: 這邊選擇 **CenterFusion** 作為基準。
可以看出,雖然我們的方法與 CBGS 有一定差距,但在 mAP 上超過了 **PointPillars** 和 **CenterFusion**。
- 使用其他模態數據的方法具有相對更好的 **NDS**,主要是因為 **mAVE** 更小。
原因是其他方法引入連續的 multi-frame 數據,例如來自 consecutive frames 的點雲數據,來預測物體的速度。
此外,雷達可以測量速度,因此即使使用單幀圖像,**CenterFusion** 也可以實現合理的速度預測。
然而,這些僅靠單張影像是無法實現的,因此如何從連續 frame 影像中挖掘速度資訊將是未來可以探索的方向之一。
**在驗證集上的幾個比較模型:**
- 只針對測試集中最好的 **CenterNet** 進行比較。
- 他們的方法不僅需要大約三天的時間來訓練(本文只需要訓練一天,可能跟預訓練 Backbone 有關),而且最簡單的 **mATE** 還不如我們的方法。
- 作者感覺應該是歸功於 rotation encoding scheme,在角度預測的準確性方面取得了顯著的提高。
- 最終在 **NDS** 上實現了 9% 左右的增益。

:::info
:rocket: Table 2: 各類別的詳細 mAP。
:::
### Qualitative Analysis

:::info
:bulb: Fig. 5 檢測結果的 Qualitative Analysis。
- 3D 邊界框預測分別投影到來自六個不同視圖和鳥瞰圖的圖像上。
- 不同類別的 bounding box 用不同的顏色標記。
- 我們可以看到,除了左側部分的一些錯誤類別預測檢測之外,結果基本上是合理的。
- 此外,我們的模型檢測到了一些小物體,但沒有被標記為 ground truth,例如右後攝像頭中的障礙物。
- 然而,除了這種設置中固有的遮擋問題之外,某些物件的深度和方向預測仍然不準確,可以在鳥瞰圖那張中看到錯誤的預測。
:::
- 👍 右後攝像頭中的障礙物沒有被標記,而是被我們的模型檢測到。
- 👎 在深度估計和被遮擋物體識別方面仍然存在明顯的問題。例如,很難檢測到左後圖像中被阻擋的汽車。
### Ablation Studies

:::info
:rocket: Table 3. 在 **nuScenes** validation 資料集的 Ablation studies
:::
- 將深度轉換為原始空間來計算損失是提高 **mAP** 的重要因素,而 Dist-based 的目標分配是提高整體 **NDS** 的重要因素。
- 用 ResNet101 替換原來的 ResNet50 和使用 DCN 也大有幫助。
- 由於 scale 和測量的差異,針對不同的回歸目標使用 disentangled heads 也是提高角度預測和 NDS 精度的好方法。
## Conclusion
- 提出 one-stage framework **FCOS3D**,用於 monocular 3D 物體檢測,無需任何 2D 檢測或 2D-3D 對應先驗。
- 將常用定義的 7-DoF 3D 目標轉換到 image domain,並將它們解耦為 2D 和 3D 屬性以適應 3D 設置。
- 針對物件的 2D scales 將其分配到不同的特徵級別,並僅根據 3D 中心點來進行分配。
- 此外,center-ness 是使用基於 3D 中心的 2D 高斯分佈重新定義的,以與我們的目標公式兼容。