搞懂DEtection TRanformer(DETR)
文章目錄
- 1 bipartite matching loss
- 2 模型總體框架
- 2.1 backbone
- 2.2 transformer
- 2.2.1 encoder
- 2.2.2 decoder
- 2.2.3 prediction heads
- 3 模型效果
- 參考文獻
本文描述了筆者在閱讀了一些文獻之后,對 End-to-end Object Detection with Transformers(DETR) 的理解。DETR是一個令人非常興奮的目標檢測模型,它在思路上完全不同于現有的state-of-art的那些目標檢測模型,讓人對目標檢測這個任務重新思考。一句話概括一下,DETR就是一個不用nms,不用anchor,流程非常簡潔明了,且基于transformer的state-of-art的目標檢測模型。
1 bipartite matching loss
在講這篇論文之前,先來說一個這篇論文的精華思想——bipartite matching loss。假設我們現在有兩個sets,左邊的sets是模型預測得到的NNN個元素,每個元素里有一個bbox和對這個bbox預測的類別的概率分布,預測的類別可以是空,用?\phi?來表示;右邊的sets是我們的ground truth,每個元素里有一個標簽的類別和對應的bbox,如果標簽的數量不足NNN則用?\phi?來補充,,?\phi?可以認為是background。
兩邊sets的元素數量都是NNN,所以我們是可以做一個配對的操作,讓左邊的元素都能找到右邊的一個配對元素,每個左邊元素找到的右邊元素都是不同的,也就是一一對應。這樣的組合可以有N!N!N!種,所有組合記作σN\sigma_NσN?。這個NNN即是模型可以預測的最大數量。
我們的目的是在這所有的N!N!N!種中,找到使得LmatchL_{match}Lmatch?最小的那個組合,記作σ^\hat{\sigma}σ^。
Lmatch=?1{ci≠?}p^σ(i)(ci)+1{ci≠?}Lbox(bi,b^σ(i))L_{match} = -\mathbf{1}_{\{c_i \neq \phi\}}\hat{p}_{\sigma (i)}(c_i) + \mathbf{1}_{\{c_i \neq \phi\}}L_{box}(b_i, \hat{b}_{\sigma (i)}) Lmatch?=?1{ci??=?}?p^?σ(i)?(ci?)+1{ci??=?}?Lbox?(bi?,b^σ(i)?)
其中,1\mathbf{1}1是示1符號,后面括號的內容為真時取值1,否則取值0;iii表示ground truth中的第iii個元素;cic_ici?是ground truth中的第iii個class,即classiclass_iclassi?;bib_ibi?是ground truth中的第iii個bbox,即bboxibbox_{i}bboxi?;σ(i)\sigma(i)σ(i)是某個組合中ground truth第i個元素對應于predictions中的index;p^σ(i)\hat{p}_{\sigma(i)}p^?σ(i)?表示prediction中第σ(i)\sigma(i)σ(i)個probs,即probsσ(i)probs_{\sigma(i)}probsσ(i)?;b^σ(i)\hat{b}_{\sigma(i)}b^σ(i)?表示prediction中的第σ(i)\sigma(i)σ(i)個bbox,即bboxσ(i)bbox_{\sigma(i)}bboxσ(i)?。
寫成目標函數的形式就是
argminσ∈σN∑iNLmatch(yi,y^σ(i))argmin_{\sigma \in \sigma_N} \sum_{i}^{N} L_{match} (y_i, \hat{y}_{\sigma(i)}) argminσ∈σN??i∑N?Lmatch?(yi?,y^?σ(i)?)
其中的yyy可以看成class和bbox的一個組合。
在σN\sigma_NσN?中找使得LmatchL_{match}Lmatch?最小的那個組合的方法用的是Hungarian算法,這里不展開說,總之就是一個高效的可以幫我們找到最有最優σi\sigma_{i}σi?的啟發式算法。
這里還有一個沒有說到的就是LboxL_{box}Lbox?。由于文章中所使用的方法是沒有預先設計好的anchor的,是直接預測bbox的,所以如果像其他方法那樣直接計算L1L_1L1? loss的話,就會導致對于大的框和小的框的懲罰力度不一致,所以文章在使用L1L_1L1? loss的同時,也使用了scale-invariant的IoU loss。
Lbox(bi,b^σ(i))=λiouLiou(bi,b^σ(i))+λL1∣∣bi?b^σ(i)∣∣1L_{box}(b_i, \hat{b}_{\sigma (i)}) = \lambda_{iou}L_{iou}(b_i, \hat{b}_{\sigma (i)}) + \lambda_{L_1}||b_i - \hat{b}_{\sigma(i)}||_1 Lbox?(bi?,b^σ(i)?)=λiou?Liou?(bi?,b^σ(i)?)+λL1??∣∣bi??b^σ(i)?∣∣1?
其中, λiou\lambda_{iou}λiou?和 λL1\lambda_{L_1}λL1??是超參數。
注意這里的LmatchL_{match}Lmatch?是幫我們找最小組合的時候,Hungarian算法所使用的loss,并不是訓練模型的loss,并不是訓練模型的loss,并不是訓練模型的loss!!!
找到match之后,訓練模型用的loss是
LHungarian(y,y^)=∑1N[?logp^σ^(i)(ci)+1{ci≠?}Lbox(bi,b^σ(i))]L_{Hungarian}(y, \hat{y}) = \sum_{1}^{N} [-log\hat{p}_{\hat{\sigma} (i)}(c_i) + \mathbf{1}_{\{c_i \neq \phi\}}L_{box}(b_i, \hat{b}_{\sigma (i)})] LHungarian?(y,y^?)=1∑N?[?logp^?σ^(i)?(ci?)+1{ci??=?}?Lbox?(bi?,b^σ(i)?)]
注意這里和LmatchL_{match}Lmatch?的區別,在于從?1{ci≠?}p^σ(i)(ci)-\mathbf{1}_{\{c_i \neq \phi\}}\hat{p}_{\sigma (i)}(c_i)?1{ci??=?}?p^?σ(i)?(ci?)變成了?logp^σ^(i)(ci)-log\hat{p}_{\hat{\sigma} (i)}(c_i)?logp^?σ^(i)?(ci?)。也就是說我們在找match的時候,把和ground truth類別一致的,且bbox最接近的預測結果對應上就完事了,其他那些?\phi?,模型預測出來啥,我match并不關心。但是在算訓練模型的Hungarian loss時,就不一樣了,我不希望模型會預測出亂七八糟的結果,?\phi?就是?\phi?,沒有就是沒有,別整得似有似無的,該?\phi?的時候預測出東西了,就要懲罰你。因為我預測的時候可是沒有ground truth的,我沒法知道哪幾個是對的了。
至于為啥不在LmatchL_{match}Lmatch?的時候就用logloglog,作者解釋說是為了和LboxL_{box}Lbox?相對稱,經驗的結果。我估計是用了logloglog的話,Hungarian算法計算量會變大吧。
2 模型總體框架
DETR的模型架構非常簡單,所以這也使得它在幾乎所有深度學習框架下都可以實現,只要有CNN和transformer就可以了。總體框架如下圖所以,可以拆分為backbone,encoder,decoder和prediction heads四個部分。
2.1 backbone
backbone就是一個傳統的CNN模型,作用是抽取圖片的特征信息。假設輸入是H0×W0×3H_0 \times W_0 \times 3H0?×W0?×3的一張圖片,那么輸出就是一個H32×W32×2048\frac{H}{32} \times \frac{W}{32} \times 204832H?×32W?×2048的一個特征,記作H×W×CH \times W \times CH×W×C。
2.2 transformer
encoder,decoder和FFN共同構成了transformer,如下圖所示,和經典的transformer沒有太大的區別,結構上沒什么要說的,不了解transformer的小伙伴可以參見我的另一篇博客 – 搞懂transformer。用attention來做的好處就是,attention可以看到全局的信息,大框小框,不管什么奇形怪狀的框,分分鐘給你搞出來。
2.2.1 encoder
encoder會接收圖像特征,但是在此之前也會過一下一個1×11 \times 11×1的CNN,用來給特征層壓縮,從CCC降到ddd。又因為encoder吃的是一個序列,所以還要把這個H×W×CH \times W \times CH×W×C的拉成HW×CHW \times CHW×C。
然后把這個特征和一個用于提供圖像位置信息的positional encodings一起作為encoder的輸入。
2.2.2 decoder
decoder的輸入是encoder的輸出,positional encodings以及一個叫做object queries的向量。這個object queries是個比較神奇的東西,它是學出來的。我們先來看一下在這些object queries下,預測出來的框是什么樣子的。
上圖中,每個圖都是一個object query在COCO 2017 val set預測出來的框的結果。圖中的每個點都是一個框的中心點,綠色表示小框,紅色表示橫向的大框,藍色表示縱向的大框。可見每個query都有自己的特點,比如第一個query會一直問左邊的小框里是什么,第二個會問中間的大框是什么,等等。我們可以把每個object query看成一個關注于某個區域,某些大小物體的提問者。然后這些提問者就是模型訓練出來的提問者,各有所長。
2.2.3 prediction heads
最后的prediction heads就是幾層全連接,用來輸出預測的類別和框的位置大小。
3 模型效果
不管模型里有多少奇思妙想,最終的效果才是真家伙,是我們最關心的。那么這個DETR的效果如何呢?作者在COCO數據集上把DETR和Faster RCNN做了比較,下表就是比較的結果。
表中兩個區域都是Faster RCNN,backbone還都是重復的,別急,這個不是作者順手多復制了幾行。上面的是Detectron2的Faster RCNN的結果,中間的是用了GIoU, random crops train-time augmentation和the long 9x training schedule這些技巧的Faster RCNN的結果,最下面自然是DETR的結果。可見DETR和用了各種技巧的Faster RCNN效果差不多,還是很棒的。
得益于其獨特的loss,DETR對于相鄰的實例有著很好的區分效果。從下圖中可以看出,attention學的很棒。
不夠看的話,我們再來看一副把attention對應到原圖上的。attention很機智的把物體的邊界給學出來了。
除此之外,DETR還可以拓展到全景分割。這塊我沒怎么看,這里就不細講了。
參考文獻
[1] End-to-end Object Detection with Transformers
[2] https://www.youtube.com/watch?v=T35ba_VXkMY
[3] https://www.kaggle.com/tanulsingh077/end-to-end-object-detection-with-transformers-detr
總結
以上是生活随笔為你收集整理的搞懂DEtection TRanformer(DETR)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1570. 两个稀疏向
- 下一篇: LeetCode 2161. 根据给定数