摘要:盡管基于CNNs的backbone在多種視覺任務中取得重大進展,但本文提出了一個用于密集預測任務的、無CNN的的簡單backbone——Pyramid Vision Transformer(PVT)。相比于ViT專門用于圖像分類的設計,PVT将金字塔結構引入到transformer,使得可以進行下遊各種密集預測任務,如檢測、分割等。與現有技術相比,PVT有如下優點:(1)相比于ViT的低分辨率輸出、高計算複雜度、高記憶體占用,PVT不僅可以對圖像進行密集劃分訓練以達到搞輸出分辨率的效果(這對密集預測很重要),還可以使用一個逐漸縮小的金字塔來降低大feature maps的計算量;(2)PVT兼具了CNNs和Transformer的優點,使其成為一個通用的無卷積backbone,可以直接替換基于CNN的backbone;(3)大量實驗表明,PVT可以提高多種下遊任務的性能,如目标檢測、語義/執行個體分割等。
比如,參數量相當的情況下, RetinaNet+PVT可以在COCO上達到40.4AP,而RetinNet+ResNet50隻有36.3AP。作者希望PVT能夠成為像素級預測任務的一種可供選擇的backbone,并促進後續的研究。
CNN通過stack CNN 層來學習一個階層化的feature representations, 并且随着層數的增加,感受野越來越大, channel數越來越大,feature map尺寸越來越小,然後後邊連接配接一到多個特定的任務網絡來執行具體的任務;
如圖b, 經典的ViT是一個柱式結構,實際上就是stack transformer block, 為了把NLP中的Transformer用到Vision中,慣用做法是通過網格化把feature轉化為sequence of patches,每個patches的尺寸一般為32 x 32,
如圖c即為所提出的Pyramid Vision Transformer (PVT), 也是首先把figure 轉化為Sequence of patches, 從結構來說也是學習一個階層化的representation,隻不過基本的building block 已經由 Conv. 替換為 Attention module.
PVT和ViT都是純Transformer的模型,沒有任何卷積操作,而兩者主要的不同在于PVT引入了特征金字塔結構。在ViT中,使用的是傳統Transformer,其輸入與輸出尺寸相同。由于資源限制,ViT的輸出隻能是一個比較粗糙的feature map,如16*16、32*32,相應的其輸出步幅也比較低,如16步長、32步長。結果就導緻ViT很難直接用于那些對分辨率要求比較高的密集預測任務。PVT通過引入漸進縮減金字塔打破了Transformer的這種限制,可以像傳統CNN backbone那樣生成多尺度feature map。此外,還設計了一個簡單有效的注意力層—SRA,來處理高分辨率feature maps并減低計算複雜度和記憶體消耗。總的來說,PVT相比ViT有如下優勢:
(1)更加靈活:可以在不同的stage生成不同分辨率、通道的feature maps
(2)更加通用:可以輕松嵌入到大多下遊任務的模型中
(3)對計算、記憶體更加友好:可以處理高分辨率的feature maps
PVT模型變體配置信
在YOLOv5項目中添加模型作為Backbone使用的教程:
(1)将YOLOv5項目的models/yolo.py修改parse_model函數以及BaseModel的_forward_once函數
(2)在models/backbone(建立)檔案下建立pvt.py,添加如下的代碼:
(3)在models/yolo.py導入模型并在parse_model函數中修改如下(先導入檔案):
(4)在model下面建立配置檔案:yolov5_pvt.yaml
(5)運作驗證:在models/yolo.py檔案指定--cfg參數為建立的yolov5_pvt.yaml