天天看點

YOLO算法改進Backbone系列之DaViT

作者:Nuist目标檢測

摘要:在這項工作中,我們介紹了雙注意視覺變換器(DaViT),這是一個簡單而有效的視覺變換器架構,能夠在保持計算效率的同時捕捉全局環境。我們建議從一個正交的角度來處理這個問題:利用 "空間标記 "和 "通道标記 "的自我注意機制。對于空間标記,空間次元定義了标記的範圍,而通道次元定義了标記的特征次元。對于通道标記,我們有相反的情況:通道次元定義了标記的範圍,而空間次元定義了标記的特征次元。我們進一步沿序列方向對空間和通道令牌進行分組,以保持整個模型的線性複雜性。我們表明,這兩個self-attention是互相補充的。

(i)由于每個通道标記包含整個圖特征,通道注意力通過在計算通道之間的注意力分數時考慮到所有的空間位置,自然地捕捉到全局的聯系和特征;(ii)空間注意力通過進行跨空間位置的細粒度的聯系來完善局部特征,這反過來有助于通道注意力的全局資訊模組化。大量的實驗表明,我們的DaViT在四個不同的任務上以高效的計算實作了最先進的性能。在沒有額外資料的情況下,DaViT-Tiny、DaViT-Small和DaViT-Base在ImageNet-1K上分别以2830萬、4970萬和8790萬的參數達到了82.8%、84.2%和84.6%的最高精度。當我們用15億個弱監督圖像和文本對進一步擴大DaViT的規模時,DaViT-Gaint在ImageNet-1K上達到了90.4%的最高精度。

雙attention機制從兩個正交的角度來進行self-attention:

(1)對spatial tokens進行self-attention,此時空間次元(HW)定義了tokens的數量,而channel次元(C)定義了tokens的特征大小,這其實也是ViT最常采用的方式

(2)對channel tokens進行self-attention,這和前面的處理完全相反,此時channel次元(C)定義了tokens的數量,而空間次元(HW)定義了tokens的特征大小

可以看出兩種self-attention完全是相反的思路。為了減少計算量,兩種self-attention均采用分組的attention:對于spatial token而言,就是在空間次元上劃分成不同的windows,這就是Swin中所提出的window attention,論文稱之為spatial window attention;而對于channel tokens,同樣地可以在channel次元上劃分成不同的groups,論文稱之為channel group attention。這兩種attention如下圖所示:

YOLO算法改進Backbone系列之DaViT

DaViT的雙注意力機制包括以下兩種self-attention方式:

l 空間self-attention:對于空間次元上的tokens,DaViT将其劃分為不同的視窗,這類似于Swin中的視窗注意力(spatial window attention)。通過在空間次元上進行self-attention,DaViT能夠捕捉到不同位置之間的關系

l 通道self-attention:對于通道次元上的tokens,DaViT将其劃分為不同的組(channel group attention)。通過在通道次元上進行self-attention,DaViT能夠捕捉到不同特征之間的關系

Dual attention block:它包含兩個transformer block:空間視窗self-attention block和通道組self-attention block。通過交替使用這兩種類型的attention機制,Davit模型能實作局部細粒度和全局圖像級互動。

YOLO算法改進Backbone系列之DaViT

DaViT采用金字塔結構,共包含4個stages,每個stage的開始時都插入一個 patch embedding 層。作者在每個stage疊加dual attention block,這個block就是将兩種attention(還包含FFN)交替地堆疊在一起,其分辨率和特征次元保持不變。采用stride=4的7x7 conv,然後是4個stage,各stage通過stride=2的2x2 conv來進行降采樣。

DaViT-Tiny,DaViT-Small和DaViT-Base三個模型的配置如下所示:

YOLO算法改進Backbone系列之DaViT

在YOLOv5項目中添加模型作為Backbone使用的教程:

(1)将YOLOv5項目的models/yolo.py修改parse_model函數以及BaseModel的_forward_once函數

YOLO算法改進Backbone系列之DaViT
YOLO算法改進Backbone系列之DaViT

(2)在models/backbone(建立)檔案下建立Davit.py,添加如下的代碼:

YOLO算法改進Backbone系列之DaViT

(3)在models/yolo.py導入模型并在parse_model函數中修改如下(先導入檔案):

YOLO算法改進Backbone系列之DaViT

(4)在model下面建立配置檔案:yolov5_davit.yaml

YOLO算法改進Backbone系列之DaViT

(5)運作驗證:在models/yolo.py檔案指定--cfg參數為建立的yolov5_davit.yaml

YOLO算法改進Backbone系列之DaViT

繼續閱讀