基於Transformer的目標檢測DETR

2021-10-25 19:44:31 字數 1828 閱讀 7594

transformer之前在nlp領域大放異彩,但是在cv界平平無奇。自從eccv20這篇基於transformer的目標檢測模型detr發表以後,transformer在cv中應用的探索越來越廣泛,今天先粗淺的解讀一下這篇**,剩下的慢慢學習。

在目標檢測領域,faster rcnn無疑是最經典的模型之一。但他需要很多anchor,proposal,以及非常複雜的後處理nms過程,這些操作是比較冗餘且耗時的。於是作者提出了乙個******的pipeline來實現目標檢測,這個pipeline即文中的detr。

這個detr的流程非常的清晰簡潔:首先一張image作為input,通過乙個cnn進行特徵提取,得到一張feature map;隨後將feature map的二維拆成一維,當作序列資料餵入有著encoder-decoder結構的transformer,得到若干個(n

nn個,足夠大,比一張圖**現最多的目標數要大)prediction box,包括了bbox的位置向量以及類別向量。最後將prediction與gt之間進行二分圖匹配,利用匈牙利演算法計算loss,實現end-to-end的訓練。損失函式如下:

下面談一下detr每個部分的結構:

(1)backbone:乙個cnn網路,對輸入image進行特徵提取,得到下取樣過後的特徵圖;

(2)encoder:首先用乙個1*1的卷積降維,接著毀掉特徵圖的二維空間結構,變為一維的特徵圖結構。然後送進若干個encoder layer,每乙個encoder layer包含乙個多頭self-attention模組和乙個ffn。由於transformer的結構是沒有空間位置關係的( permutation-invariant),所以在每乙個attention層都加乙個position encoding,這裡的位置編碼是通過正余弦和位置計算出來的固定值(與下面的object query區分);

上圖個人認為對decoder的理解很有幫助,之前encoder得到的輸出,position encoding和object query作為decoder的輸入。值得注意的是,object query相當於一種可學習的編碼(在**中表示為nn.embedding),有一些表示物體在影象中位置的一維,其維度為n

nn,表示通過decoder會產生出n

nn個output embedding;

(4)ffn:將上述每乙個output embedding分別餵入3層的mlp,得到每個box的中心座標,寬高,以及類別向量等資訊。

實驗部分我感覺非常棒,特別詳細而且discussion也很到位,在此不做贅述了,有興趣的小夥伴可以看下**,這裡就貼一張表:

detr和fasterrcnn相比的優缺點:

(1)transformer屬於non-local,因此在全域性的感知上要優於cnn。在detr中對於大目標的檢測效果好於fasterrcnn;但由於cnn結構是感受野逐層堆疊的,因此fasterrcnn在小目標檢測上面優於detr;

以上是個人對這篇文章一些粗鄙的認知,如有不當請指正。

references:

Transformer的殘差連線

在學習transformer的過程中,編碼器和解碼器都用到了殘差連線,下面我總結一下殘差連線。假如我們的輸入為x,要得到的輸出為h x 那麼我們可以通過 h f x x,轉換為學習f。等得到f的輸出後,在此基礎上加上x即可得h的輸出。在transformer中,此時的f即是下圖中的multi hea...

Transformer的幾個問題

transformer是 attention is all you need 提出來的,結構如下所示 講解transformer的文章很多,這裡不再重複,可以參考文獻1和文獻2 問題一 為什麼要除以d k sqrt dk 當d kd k dk 增大時,意味著q和k之間的點乘操作會增加,只要qik i...

Transformer的原理及框架

transformer是谷歌2017年發表的attention is all you need 中提到的seq2seq模型,我們常用的bert和gpt等都是基於transformer衍生的。本文主要參考了wmathor大佬的transformer 詳解和transformer 的 pytorch 實...