---
# System prepended metadata

title: DETR (DEtection TRansformer)
tags: [detection, 2022Q2技術研討]

---

###### tags: `2022Q2技術研討`, `detection`

# DETR (DEtection TRansformer)
## 簡介
:pushpin: 本篇論文是 FB 首度將 NLP 的 transformer 用在 CV 的 object detection 上，將 object detection 視作一個 direct set prediction problem，並且精簡了很多 object detection 上的額外操作(non-maximum suppression, anchor generation) 的 state-of-art 的目標檢測模型。(2020 年的拍謝XD)

[github codes](https://github.com/facebookresearch/detr)

## 與傳統 Faster R-CNN 流程比較

![](https://i.imgur.com/KLJd7oU.png)
- 流程非常的簡潔

## 模型架構
### transformer encoder / decoder 架構
![](https://i.imgur.com/oRGVpCT.png)

1. <font color=red>Backbone</font>: 先跑CNN，然後把最後一層透過Conv1d降維，得到了feature map，然後轉成(d,HW)的shape等下準備餵進transformer
2. <font color=red>Transformer encoder</font>: 然後把1.的output丟到transformer encoder上做multi-head self-attention
	- transformer只在一開始加了position encoding，TEDR覺得一次不夠，每一個encoder block都給你加好加滿
3. <font color=red>Transformer decoder</font>: 在transformer decoder的部分，使用N個d維的vector來當作object query vector
	- decoder也給你每層加position encoding，值得一提的是這裡的position encoding是直接用query vector
4. <font color=red>Prediction feed-forward networks (FFNs)</font>: 最後接FFN(feed-forward networks)產生N個prediction，前面有提到這個N會比image object數量還來的大，所以會有一個特殊的class叫做no object，可以把他想成圖片的背景

![](https://i.imgur.com/Scwj846.png)

### loss function 簡介
:pushpin: bipartite matching (二分匹配)

![](https://i.imgur.com/1iPZbK1.png)

- 兩邊 sets 的元素數量都是 N ，所以我們是可以做一個配對的操作，讓左邊的元素都能找到右邊的一個配對元素，每個左邊元素找到的右邊元素都是不同的，也就是一一對應。這樣的組合可以有 N! 種，這個 N 即是模型可以預測的最大數量。
- 透過[匈牙利演算法](https://blog.csdn.net/u014754127/article/details/78086014)來處理 matching problem

:pushpin: object detection set prediction loss

符號定義：
- y 是 ground truth 的 objects set，$\hat{y} = { \hat{y_i} }^N_{i=1}$ 是 predicts set
- 這邊會假設 $N$ 是一個大於 image 所應應有的 object 數量(根據 coco dataset 作者選了 N=100)，不過這樣後續匹配的時候就<font color=red>必須對 ground truth 去做 padding 才能湊到 N 組 object</font>，pad 的方式是使用用$\varnothing$(代表沒有 object)來 padding
- $y_i$ 是 ground truth 的一組 object，每一個 $y_i$ 包含了 class label 和 bounding box 的四個值: $y_{i}=\left(c_{i}, b_{i}\right)$ (class labels and box coordinates x,y,w,h)
- 對於一個 $y_i$，他對應到的 prediction 是 $\hat{y}_{\sigma(i)}$ (用匈牙利演算法)

![](https://i.imgur.com/3KlkPAw.png)

- $-\log \hat{p}_{\hat{\sigma}(i)}\left(c_{i}\right)$是<font color=red>希望predict分類分的越準越好</font>
    - $\hat{p}_{\sigma(i)}\left(c_{i}\right)$是$\sigma (i)$被預測維class $c_i$的機率
    - 當分的正確的時候(也就是機率=1)這一項就是0
- $1_{\left\{c\_{i} \neq \varnothing\right\}} \mathcal{L}_{\mathrm{box}}\left(b_{i}, \hat{b}_{\hat{\sigma}}(i)\right)$則是<font color=red>bounding box的重合度匹配</font>
    - 使用了 L1 loss 和 IOU(單純用 L1 loss 會造成這個loss 過於依賴 bounding box 的大小，所以加上了 IOU)

:pushpin: object quries (又稱 prediction slots)
- object queries 是可學習的 embedding，與當前輸入影象的內容無關（不由當前影象內容計算得到）

![](https://i.imgur.com/SKL77Ml.jpg)

> 每個點都是一個 object，上圖是從 COCO 2017 val set 的所有 object 預測分佈在各 object queries 的情形
> - 綠色的點代表小 bbox
> - 紅色的點代表大的 horizontal bbox
> - 藍色的點代表大的 vertical bbox

- object quries 是隨機初始化，並隨著網路的訓練而更新，可以想成是學習了整個訓練集上的統計資訊
- 在目標檢測中每個 object query 可以看作是一種可學習的動態anchor

## 成效
![](https://i.imgur.com/J1xylRn.png)


### 特色
- 將目標檢測問題看做 Set Prediction 問題，用二分圖匹配實現 label assignment，準度比加強版的 Faster R-CNN 好
- parallel decoding
- less computation (no nms)
- anchor free

### 問題
- 收斂速度慢 (在 COCO 基準上，DETR 需要 500 個 epoch 才能收斂，這比 Faster R-CNN 慢了 10 到 20 倍)
    - 在初始化時transformer中每個query對所有位置給予幾乎相同的權重，這使得網路需要經過長時間的訓練將attention收斂到特定的區域
- 對於小 object 的準確度較低
    - 只取 cnn 最後的 layer 看的是比較大物件的 features (Transformer 的編碼器中注意力權重計算的複雜度與畫素個數的平方成正比，所以沒有辦法用高解析度的 feature map)
- 同一張圖片太多 object 時，預測力大幅下降 (training data 比較沒有這種 case)
![](https://i.imgur.com/paIOTtI.png)

## 參考資料
https://www.gushiciku.cn/pl/gXi7/zh-tw
