<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          OutLook Attention:具有局部信息感知能力的ViT

          共 6185字,需瀏覽 13分鐘

           ·

          2021-07-19 18:43


          分類任務(wù)中,SOTA模型準(zhǔn)確率和Model size的對應(yīng)圖

          【寫在前面】

          近段時間,Transformer-based模型在Visual Recognition領(lǐng)域取得了非常大的進(jìn)展。但是如果不借助額外的訓(xùn)練數(shù)據(jù),Transformer-based模型離CNN-based模型還是具有一定的差距(NFNet-F5(CNN-based):86.8%,CaiT(Transformer-based):86.5%)。作者認(rèn)為,這是因為token embedding并沒有進(jìn)行細(xì)粒度特征表示,因此本文提出了一種新的Attention方式,通過局部信息的感知,能夠獲得更加細(xì)粒度的特征表示。

          1. 論文和代碼地址

          VOLO: Vision Outlooker for Visual Recognition

          論文地址:https://arxiv.org/abs/2106.13112

          官方代碼:https://github.com/sail-sg/volo

          一看就懂的核心代碼: https://github.com/xmu-xiaoma666/External-Attention-pytorch/blob/master/attention/OutlookAttention.py

          2. Motivation

          前面說到了,token embedding進(jìn)行特征表示是粗粒度的。為什么是token embedding就是粗粒度的呢?因為一張圖片的size往往是比較大的(e.g., 224x224),CNN因為只對局部的信息進(jìn)行感知(在正常圖片上進(jìn)行滑動窗口操作),所以計算復(fù)雜度和圖片大小呈線性關(guān)系。如果將圖片進(jìn)行token embedding,直接進(jìn)行Transformer的操作,那就會導(dǎo)致計算復(fù)雜度“爆炸”,因為Transformer中的Self-Attention(SA)的復(fù)雜度與輸入特征的大小是呈平方關(guān)系的。

          所以Vision Transformer需要將圖片先進(jìn)行token embedding到比較小的size(e.g.,  14x14),才能保證計算量在一個合理的范圍內(nèi)。但這就導(dǎo)致了一個信息損失的問題,因為token embedding到較小的size會丟失一些細(xì)粒度的信息。

          “Embedding的圖片太大,會導(dǎo)致計算量過大;embedding的圖片過小,會導(dǎo)致信息損失太大”,如何在保證合理計算量的情況下,獲得更加細(xì)粒度的特征表示,這就是本文要解決的問題。

          3. 方法

          本文的模型可以分為兩步:

          第一步,通過一系列Outlooker獲得更加細(xì)粒度的特征表示。

          第二步,通過一系列的Transformer結(jié)構(gòu)聚合global的信息

          3.1. Outlooker

          本文提出的Outlooker其實和Transformer的Multi-head Attention非常相似。不同之處在將Multi-head Attention中的Self-Attention換成了OutlookAttention,從而能夠獲取更加細(xì)粒度的特征表示。

          Outlooker的計算步驟如下:

          3.2. Outlook Attention

          Outlook Attention的核心思想如下:

          1)每個空間位置的特征足夠豐富,用于產(chǎn)生局部聚合其相鄰特征的注意力權(quán)重;

          2)深層的和局部的空間聚合可以有效地編碼細(xì)粒度的信息。

          下面來看Outlook Attention的框架圖:

          整個框架分為兩個分支,上面的分支用于生成attention map,下面的分支用于生成投影后的value。

          3.2.1. 生成Attention Map

          首先看上面的分支,特征x首先被embedding到了,其中K是局部感知的大小

          然后,我們將的特征reshape成(,) 。

          緊接著,我們將最后一個維度進(jìn)行softmax,我們就能到了每個位置和周圍個位置的注意力權(quán)重。因此,我只需要將這個attention map和embedding后的value相乘就得到了新的feature。

          3.2.2. 映射到新的特征v

          下面我們來看下面的分支,由兩部分組成。

          第一部分是Linear,這個操作是為了將輸入的特征x進(jìn)行一個embedding,映射到一個新的特征V。

          然后就是就是unfold操作,unfold操作就是卷積中的滑動窗口操作。不同的是這里只有“卷”,沒有“積”。就是將特征中的KxK的區(qū)域給取出來。

          3.2.3. 獲取weighted特征

          前面在3.2.2中,我們已經(jīng)獲得了每個位置的attention map,因此,我們在這一步中只需要做矩陣相乘,就可以得到Outlook Attention之后的結(jié)果。最后我們通過Fold函數(shù),就能將feature map還原到輸入的大小。

          從下面這張圖可以看出,在Outlook Attention中,每一個中心點(diǎn)的位置都要周圍kxk個位置進(jìn)行attention操作,這個步驟就有點(diǎn)類似卷積。

          Outlook Attention的偽代碼如下:

          pytorch可執(zhí)行的代碼:

          class OutlookAttention(nn.Module):

              def __init__(self,dim,num_heads=1,kernel_size=3,padding=1,stride=1,qkv_bias=False,
                              attn_drop=0.1)
          :

                  super().__init__()
                  self.dim=dim
                  self.num_heads=num_heads
                  self.head_dim=dim//num_heads
                  self.kernel_size=kernel_size
                  self.padding=padding
                  self.stride=stride
                  self.scale=self.head_dim**(-0.5)

                  self.v_pj=nn.Linear(dim,dim,bias=qkv_bias)
                  self.attn=nn.Linear(dim,kernel_size**4*num_heads)

                  self.attn_drop=nn.Dropout(attn_drop)
                  self.proj=nn.Linear(dim,dim)
                  self.proj_drop=nn.Dropout(attn_drop)

                  self.unflod=nn.Unfold(kernel_size,padding,stride) #手動卷積
                  self.pool=nn.AvgPool2d(kernel_size=stride,stride=stride,ceil_mode=True

              def forward(self, x) :
                  B,H,W,C=x.shape

                  #映射到新的特征v
                  v=self.v_pj(x).permute(0,3,1,2#B,C,H,W
                  h,w=math.ceil(H/self.stride),math.ceil(W/self.stride)
                  v=self.unflod(v).reshape(B,self.num_heads,self.head_dim,self.kernel_size*self.kernel_size,h*w).permute(0,1,4,3,2#B,num_head,H*W,kxk,head_dim

                  #生成Attention Map
                  attn=self.pool(x.permute(0,3,1,2)).permute(0,2,3,1#B,H,W,C
                  attn=self.attn(attn).reshape(B,h*w,self.num_heads,self.kernel_size*self.kernel_size \
                              ,self.kernel_size*self.kernel_size).permute(0,2,1,3,4#B,num_head,H*W,kxk,kxk
                  attn=self.scale*attn
                  attn=attn.softmax(-1)
                  attn=self.attn_drop(attn)

                  #獲取weighted特征
                  out=(attn @ v).permute(0,1,4,3,2).reshape(B,C*self.kernel_size*self.kernel_size,h*w) #B,dimxkxk,H*W
                  out=F.fold(out,output_size=(H,W),kernel_size=self.kernel_size,
                              padding=self.padding,stride=self.stride) #B,C,H,W
                  out=self.proj(out.permute(0,2,3,1)) #B,H,W,C
                  out=self.proj_drop(out)

                  return out

          3.3. VOLO的不同變種

          作者在文中給出了不同變種的VOLO,其中Stage 1為Outlook Attention+MLP,Stage 2為Self-Attention+MLP。

          3.4. 復(fù)雜度分析

          文中給出了Self-Attention、Local Self-Attention,和Outlook Attention的復(fù)雜度。通常,所以O(shè)A的復(fù)雜度是低于SA和LSA的。

          4. 實驗

          不同VOLO變種在Imagenet上的準(zhǔn)確率對比

          用不同模塊進(jìn)行局部感知的結(jié)果(說明OA確實比LSA和Conv更強(qiáng)一些)

          在分割任務(wù)上的performance

          5. 總結(jié)

          這篇論文其實也是在為了解決Self-Attention只有全局信息感知的缺點(diǎn),Outlook Attention相當(dāng)于是加入了一個局部感知的功能,使得模型能夠感知局部特征,從而使最終提取的特征更加細(xì)粒度。這篇工作也是將ImageNet數(shù)據(jù)集上Performance刷到了一個新高度。


          - END -

          歡迎加入GiantPandaCV交流群,可以添加號主微信




          瀏覽 68
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲小说区图片区都市 | 北条麻妃无码精品 | 亚洲欧美日韩豆花 | 黄色免费日本欧美 | 99爱精品 |