|
設(shè)為星標(biāo),干貨直達(dá)! 自從ViT之后,關(guān)于vision transformer的研究呈井噴式爆發(fā),從思路上分主要沿著兩大個(gè)方向,一是提升ViT在圖像分類的效果;二就是將ViT應(yīng)用在其它圖像任務(wù)中,比如分割和檢測(cè)任務(wù)上,這里介紹的PVT(Pyramid Vision Transformer) 就屬于后者。PVT相比ViT引入了和CNN類似的金字塔結(jié)構(gòu),使得PVT像CNN那樣作為backbone應(yīng)用在dense prediction任務(wù)(分割和檢測(cè)等)。 CNN結(jié)構(gòu)常用的是一種金字塔架構(gòu),如上圖所示,CNN網(wǎng)絡(luò)一般可以劃分為不同的stage,在每個(gè)stage開(kāi)始時(shí),特征圖的長(zhǎng)和寬均減半,而特征維度(channel)擴(kuò)寬2倍。這主要有兩個(gè)方面的考慮,一是采用stride=2的卷積或者池化層對(duì)特征降維可以增大感受野,另外也可以減少計(jì)算量,但同時(shí)空間上的損失用channel維度的增加來(lái)彌補(bǔ)。但是ViT本身就是全局感受野,所以ViT就比較簡(jiǎn)單直接了,直接將輸入圖像tokens化后就不斷堆積相同的transformer encoders,這應(yīng)用在圖像分類上是沒(méi)有太大的問(wèn)題。但是如果應(yīng)用在密集任務(wù)上,會(huì)遇到問(wèn)題:一是分割和檢測(cè)往往需要較大的分辨率輸入,當(dāng)輸入圖像增大時(shí),ViT的計(jì)算量會(huì)急劇上升;二是ViT直接采用較大patchs進(jìn)行token化,如采用16x16大小那么得到的粗粒度特征,對(duì)密集任務(wù)來(lái)說(shuō)損失較大。這正是PVT想要解決的問(wèn)題,PVT采用和CNN類似的架構(gòu),將網(wǎng)絡(luò)分成不同的stages,每個(gè)stage相比之前的stage特征圖的維度是減半的,這意味著tokens數(shù)量減少4倍,具體結(jié)構(gòu)如下: 每個(gè)stage的輸入都是一個(gè)維度的3-D特征圖,對(duì)于第1個(gè)stage,輸入就是RGB圖像,對(duì)于其它stage可以將tokens重新reshape成3-D特征圖。在每個(gè)stage開(kāi)始,首先像ViT一樣對(duì)輸入圖像進(jìn)行token化,即進(jìn)行patch embedding,patch大小均采用2x2大?。ǖ?個(gè)stage的patch大小是4x4),這意味著該stage最終得到的特征圖維度是減半的,tokens數(shù)量對(duì)應(yīng)減少4倍。PVT共4個(gè)stage,這和ResNet類似,4個(gè)stage得到的特征圖相比原圖大小分別是1/4,1/8,1/16和1/32。由于不同的stage的tokens數(shù)量不一樣,所以每個(gè)stage采用不同的position embeddings,在patch embed之后加上各自的position embedding,當(dāng)輸入圖像大小變化時(shí),position embeddings也可以通過(guò)插值來(lái)自適應(yīng)。 不同的stage的tokens數(shù)量不同,越靠前的stage的patchs數(shù)量越多,我們知道self-attention的計(jì)算量與sequence的長(zhǎng)度的平方成正比,如果PVT和ViT一樣,所有的transformer encoders均采用相同的參數(shù),那么計(jì)算量肯定是無(wú)法承受的。PVT為了減少計(jì)算量,不同的stages采用的網(wǎng)絡(luò)參數(shù)是不同的。PVT不同系列的網(wǎng)絡(luò)參數(shù)設(shè)置如下所示,這里為patch的size,為特征維度大小,為MHA(multi-head attention)的heads數(shù)量,為FFN的擴(kuò)展系數(shù),transformer中默認(rèn)為4。 可以見(jiàn)到隨著stage,特征的維度是逐漸增加的,比如stage1的特征維度只有64,而stage4的特征維度為512,這種設(shè)置和常規(guī)的CNN網(wǎng)絡(luò)設(shè)置是類似的,所以前面stage的patchs數(shù)量雖然大,但是特征維度小,所以計(jì)算量也不是太大。不同體量的PVT其差異主要體現(xiàn)在各個(gè)stage的transformer encoder的數(shù)量差異。 PVT為了進(jìn)一步減少計(jì)算量,將常規(guī)的multi-head attention (MHA)用spatial-reduction attention (SRA)來(lái)替換。SRA的核心是減少attention層的key和value對(duì)的數(shù)量,常規(guī)的MHA在attention層計(jì)算時(shí)key和value對(duì)的數(shù)量為sequence的長(zhǎng)度,但是SRA將其降低為原來(lái)的。SRA的具體結(jié)構(gòu)如下所示:
class Attention(nn.Module):從PVT的網(wǎng)絡(luò)設(shè)置上,前面的stage的取較大的值,比如stage1的,說(shuō)明這里直接將Q和V的數(shù)量直接減為原來(lái)的1/64,這個(gè)就大大降低計(jì)算量了。 PVT具體到圖像分類任務(wù)上,和ViT一樣也通過(guò)引入一個(gè)class token來(lái)實(shí)現(xiàn)最后的分類,不過(guò)PVT是在最后的一個(gè)stage才引入: 具體到分類任務(wù)上,PVT在ImageNet上的Top-1 Acc其實(shí)是和ViT差不多的。其實(shí)PVT最重要的應(yīng)用是作為dense任務(wù)如分割和檢測(cè)的backbone,一方面PVT通過(guò)一些巧妙的設(shè)計(jì)使得對(duì)于分辨率較大的輸入圖像,其模型計(jì)算量不像ViT那么大,論文中比較了ViT-Small/16 ,ViT-Small,PVT-Small和ResNet50四種網(wǎng)絡(luò)在不同的輸入scale下的GFLOPs,可以看到PVT相比ViT要好不少,當(dāng)輸入scale=640時(shí),PVT-Small和ResNet50的計(jì)算量是類似的,但是如果到更大的scale,PVT的增長(zhǎng)速度就遠(yuǎn)超過(guò)ResNet50了。 PVT的另外一個(gè)相比ViT的優(yōu)勢(shì)就是其可以輸出不同scale的特征圖,這對(duì)于分割和檢測(cè)都是非常重要的。因?yàn)槟壳按蟛糠值姆指詈蜋z測(cè)模型都是采用FPN結(jié)構(gòu),而PVT這個(gè)特性可以使其作為替代CNN的backbone而無(wú)縫對(duì)接分割和檢測(cè)的heads。論文中做了大量的關(guān)于檢測(cè),語(yǔ)義分割以及實(shí)例分割的實(shí)驗(yàn),可以看到PVT在dense任務(wù)的優(yōu)勢(shì)。比如,在更少的推理時(shí)間內(nèi),基于PVT-Small的RetinaNet比基于R50的RetinaNet在COCO上的AP值更高(38.7 vs. 36.3),雖然繼續(xù)增加scale可以提升效果,但是就需要額外的推理時(shí)間:
相信未來(lái)會(huì)有更好的work!期待! 參考
|
|
|