網(wǎng)站空間續(xù)費合同中山排名推廣
Swin Transformer 是一種基于 Transformer 的視覺模型,由 Microsoft 研究團隊提出,旨在解決傳統(tǒng) Transformer 模型在計算機視覺任務中的高計算復雜度問題。其全稱是 Shifted Window Transformer,通過引入分層架構(gòu)和滑動窗口機制,Swin Transformer 在性能和效率之間取得了平衡,廣泛應用于圖像分類、目標檢測、分割等視覺任務,稱為新一代的backbone,可直接套用在各項下游任務中。在Swin Transformer中,提供大、中、小不同版本模型,可以進行自由選擇合適的使用。
論文原文:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
1.??介紹
????????Transformer 最初在自然語言處理(NLP)領(lǐng)域大獲成功,但直接將 Transformer 應用于計算機視覺任務存在很多挑戰(zhàn)。傳統(tǒng)Transformer中,拿到了圖像數(shù)據(jù),將圖片進行劃分成一個個patch,盡可能patch細一些。但是圖像中像素點太多了,如果需要更多的特征,就必須構(gòu)建很長的序列。而越長的序列算起注意力肯定越慢,自注意力機制的計算復雜度是,當處理高分辨率圖像時,這種復雜度會快速增長,這就導致了效率問題。
????????而且圖像中許多視覺信息依賴于局部關(guān)系,而標準 Transformer 處理的是全局關(guān)系,可能無法有效捕獲局部特征。Swin Transformer便采用窗口和分層的形式來替代長序列的方法,CNN中經(jīng)常提到感受野,在Transformer中對應的就是分層。也就是說,我們可以將當前這件事做L次(Lx),每次都會兩兩進行合并,向量數(shù)越來越小(400個token-200個token-100個token),窗口的大小也會增大。分層操作也就是,第一層的時候token很多,第二層合并token,第三層合并token,就像我們的卷積和池化的操作。而在傳統(tǒng)的Transformer中,第一層怎么做,第二層第三層也會采用同樣的尺寸進行,都是一樣的操作。
2. Swin Transformer 整體架構(gòu)
2.1. Patch Embedding
????????在 Swin Transformer 中,Patch Embedding 負責將輸入圖像分割成多個小塊(patches),并將這些小塊的像素值嵌入到一個高維空間中,形成適合 Transformer 處理的特征表示。在傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò)(CNN)中,卷積操作可以用來提取局部特征。在 Swin Transformer 中,為了將輸入圖像轉(zhuǎn)化為適合 Transformer 模型處理的 patch 序列,首先對輸入圖像進行分塊。假設(shè)輸入圖像的大小為 224x224x3
,其通過一個卷積操作實現(xiàn)。卷積操作可以將每個局部區(qū)域的像素值映射為一個更高維的特征向量。假設(shè)輸入圖像大小為 224x224x3
,應用一個卷積層,參數(shù)為 Conv2d(3, 96, kernel_size=(4, 4), stride=(4, 4))
,這表示卷積核的大小是 4x4
,步長是 4
,輸入的通道數(shù)是 3
(RGB圖像),輸出的通道數(shù)是 96
。卷積后,圖像的空間維度會變小,輸出的特征圖的尺寸會變?yōu)?56x56
(通過計算:(224 - 4) / 4 + 1 = 56
)。所以,卷積后的輸出大小是 56x56x96
,這表示每個空間位置(56x56)都有一個96維的特征向量。
????????在 Swin Transformer 中,通常將圖像通過卷積操作分割成不重疊的小塊(patches)。每個小塊對應一個特征向量。例如,56x56x96
的輸出可以視為有 3136
個 patch,每個 patch 是一個 96 維的向量。這些特征向量將作為 Transformer 模型的輸入序列。根據(jù)不同的卷積參數(shù)(如 kernel_size 和 stride),你可以控制生成的 patch 的數(shù)量和每個 patch 的維度。例如,如果使用更小的卷積核和步長,可以得到更細粒度的 patch,反之則可以得到較大的 patch。
kernel_size
決定了每個 patch 的空間大小。stride
決定了每個 patch 之間的間隔,即步長。
2.2. window_partition
????????在 Swin Transformer 中,圖像的特征表示不僅僅是通過 Patch Embedding
來獲得,還通過 窗口劃分(Window Partition) 來進一步細化和處理,通過窗口內(nèi)的局部注意力機制來增強計算效率并捕捉局部特征。
????????假設(shè)輸入的圖像經(jīng)過卷積處理后得到了大小為 56x56x96
的特征圖,將這個特征圖劃分為多個小窗口(window),每個窗口包含一部分局部信息,其中窗口大小為7x7
,特征圖大小為56x56。
為了將特征圖劃分成大小為 7x7
的窗口,我們首先計算在空間維度(高和寬)上可以分成多少個窗口,水平和垂直方向上,每個 7x7
窗口可以覆蓋 56 / 7 = 8
個窗口(總共 8x8 = 64
個窗口),窗口內(nèi)部的特征圖由 96
個通道組成。因此,在劃分后,特征圖的維度將變?yōu)?(64, 7, 7, 96)
,其中:
64
表示窗口的數(shù)量(即8x8 = 64
個窗口)。7x7
是每個窗口的空間維度。96
是每個窗口內(nèi)的特征通道數(shù)。
????????在 Swin Transformer 中,Token 通常指的是圖像中的局部特征,每個 Token 是圖像的一個小區(qū)域。在 Window Partition 過程中,我們將整個圖像的 Token 重新組織成窗口(Window)。之前每個 Token 對應一個圖像位置,現(xiàn)在每個 Token 對應一個窗口的內(nèi)部特征。所以,原來每個 Token(如卷積后的每個空間位置)代表了圖像的一部分信息,現(xiàn)在我們通過窗口劃分來捕捉更大范圍的局部信息。這種劃分有助于模型專注于圖像的局部結(jié)構(gòu),同時減少計算量,因為每個窗口只在局部范圍內(nèi)進行注意力計算。
2.3. W-MSA(Windwow multi-head self attention)
????????在 Swin Transformer 中,W-MSA (Window Multi-Head Self Attention) 是關(guān)鍵的注意力機制,它通過在每個窗口內(nèi)部獨立地計算自注意力(Self-Attention)來減少計算復雜度,并捕捉局部特征。
????????通過 Window Partition 將特征圖劃分為 64
個窗口,每個窗口的尺寸為 7x7
,并且每個位置的特征通道數(shù)為 96
,因此每個窗口的形狀為 (7, 7, 96),
這些窗口將作為 W-MSA 的輸入。在 Multi-Head Self-Attention 中,首先需要將輸入特征矩陣(窗口內(nèi)的特征)通過三個不同的矩陣進行線性變換,得到 查詢(Q)、鍵(K) 和 值(V),這三個矩陣用于計算注意力得分。對于每個頭(Head),計算過程是獨立的。假設(shè)有 3
個頭,那么每個頭的輸入特征維度為 96 / 3 = 32
,因為 96
維的輸入被平均分成了 3 個頭,每個頭負責 32 維的特征。在 W-MSA 中,針對每個窗口獨立計算自注意力得分,計算方法如下:
-
對每個窗口中的
49
個像素點(即每個位置的特征向量)進行查詢Q、鍵K、值V的計算。 -
自注意力得分(Attention Score) 是通過計算查詢與鍵的點積(或者其他相似度度量)得到的,這可以表示為:
其中,
是每個頭的維度(在這里是 32),Q 和 K 的乘積衡量了每個位置之間的相似性。
-
Softmax:通過 Softmax 操作將得分歸一化,使其成為概率分布,得到每個位置與其他位置的相關(guān)性。
-
加權(quán)值(Weighted Sum):使用得分對值V進行加權(quán)求和,得到每個位置的最終輸出表示。
????????每個頭的自注意力計算都會產(chǎn)生一個形狀為 (64, 3, 49, 49)
的結(jié)果,其中,64
表示窗口的數(shù)量,3
表示頭的數(shù)量,49
是每個窗口中位置的數(shù)量(7x7
),49
代表每個位置對其他位置的注意力得分(自注意力矩陣)。因此,每個頭會計算出每個窗口內(nèi)所有位置之間的自注意力得分,輸出的形狀為 (64, 3, 49, 49)
。
2.4. window_reverse
? ?Window Reverse
操作的目的是將計算得到的 (64, 49, 96)
特征圖恢復回原始的空間維度 (56, 56, 96)
。為此,我們需要將每個窗口的 49
個位置(7x7
)重新排列到原始的圖像空間中。步驟:
-
Reshape 操作: 每個窗口的特征圖形狀是
(49, 96)
,我們將其轉(zhuǎn)換成(7, 7, 96)
的形狀,表示每個窗口中的每個像素點都有一個96
維的特征向量。 -
按窗口拼接: 將所有
64
個窗口按照它們在特征圖中的位置重新排列成56x56
的大特征圖。原始的輸入特征圖大小是56x56
,這意味著64
個窗口將按照8x8
的網(wǎng)格排列,并恢復到一個(56, 56, 96)
的特征圖。
????????在 Window Reverse 操作后,恢復得到的特征圖形狀是 (56, 56, 96)
,這與卷積后的特征圖的形狀一致。56x56
是恢復后的空間維度,代表每個像素點在特征圖中的位置;96
是每個像素點的特征維度,表示每個位置的特征信息。
2.5. SW-MASA
為什么要滑動窗口(Shifted Window)?
????????原始的 Window MSA 將圖像劃分為固定的窗口(例如 7x7
),并在每個窗口內(nèi)計算自注意力。這樣做的一個問題是每個窗口內(nèi)部的信息相對封閉,沒有與相鄰窗口之間的信息交流。因此,模型容易局限于各自的小區(qū)域,無法充分捕捉不同窗口之間的關(guān)聯(lián)。
????????通過引入 滑動窗口(Shifted Window)機制,窗口在原來位置的基礎(chǔ)上向四個方向移動一部分,重疊區(qū)域與原窗口有交集。這樣,原本相互獨立的窗口就可以共享信息,增強了模型的表達能力和全局感知。
位移操作(Shift Operation)
????????位移操作的細節(jié)如下:
- 初始的窗口被劃分為
4x4
的塊(例如7x7
窗口),每個塊進行獨立的自注意力計算。 - 在進行位移時,原來
4x4
的窗口將被平移,變成新的大小為9x9
的窗口,窗口重疊區(qū)域包含了不同窗口之間的信息。 - 通過平移,模型能獲取到更廣泛的信息,使得窗口之間能夠通過共享信息來融合彼此的特征,避免局部化。
????????Shifted Window MSA 會導致計算量的增加,特別是在窗口滑動后,窗口數(shù)量從 4x4
變?yōu)?9x9
,計算量幾乎翻倍。為了控制計算量的增長,可以通過 mask 操作 來減少不必要的計算。在位移后,窗口之間會重疊。為了避免重復計算,我們可以使用 mask 來屏蔽掉不需要計算的部分。在計算注意力時,對于每個位置的 Q 和 K 的匹配,使用 softmax 時,設(shè)置不需要計算的位置的值為負無窮,這樣對應位置的注意力值將接近零,不會對結(jié)果產(chǎn)生影響。
????????在進行 SW-MSA 后,輸出的特征圖的形狀仍然是 56x56x96
,與輸入特征圖的大小一致。通過 shifted window 和 mask 操作,模型不僅保留了原始的窗口內(nèi)的自注意力計算,還增強了窗口之間的信息交換和融合。即使窗口被移動了,經(jīng)過計算后的特征也需要回到其原本的位置,也就是還原平移,保持圖像的完整性。
2.6. PatchMerging
????????PatchMerging 是 Swin Transformer 中的一種下采樣操作,但是不同于池化,這個相當于間接的(對H和W維度進行間隔采樣后拼接在一起,得到H/2,W/2,C*4),目的是將輸入特征圖的空間維度(即高和寬)逐漸減小,同時增加通道數(shù),從而在保持計算效率的同時獲得更高層次的特征表示。它是下采樣的過程,但與常規(guī)的池化操作不同,PatchMerging 通過將相鄰的 patch 拼接在一起,并對拼接后的特征進行線性變換,從而實現(xiàn)下采樣。具體來說,在 Swin Transformer 中,隨著網(wǎng)絡(luò)層數(shù)的加深,輸入的特征圖會逐漸減小其空間尺寸(即 H 和 W 維度),而同時增加其通道數(shù)(即 C 維度),以便模型可以捕捉到更為復雜的高層次信息。
????????假設(shè)輸入的特征圖形狀為 H x W x C
,PatchMerging
通過以下步驟來實現(xiàn)下采樣和通道數(shù)擴展:
-
分割和拼接(Splitting and Concatenation):
- 輸入的特征圖會按照一定的步長(通常是 2)進行分割,即對每個
2x2
的 patch 進行合并。 - 這樣原本的
H x W
的空間尺寸會縮小一半,變成H/2 x W/2
。 - 然后,將每個
2x2
的 patch 內(nèi)部的特征進行拼接,得到新的特征維度。假設(shè)原始通道數(shù)為C
,拼接后的通道數(shù)為4C
。
- 輸入的特征圖會按照一定的步長(通常是 2)進行分割,即對每個
-
卷積操作:
- 對拼接后的特征進行 卷積,以進一步增強特征表達。卷積操作用于轉(zhuǎn)換特征空間,雖然通道數(shù)增加了,但通過卷積,特征能夠更加豐富。
2.7. 分層計算
????????在 Swin Transformer 中,模型的每一層都會進行下采樣操作,同時逐步增加通道數(shù)。每次 PatchMerging 后的特征圖會作為輸入進入下一層的 Attention 計算。通過這種方式,Swin Transformer 能夠逐漸提取到越來越復雜的特征,同時保持計算效率。每一層的 PatchMerging 操作實際上是將輸入的特征圖通過 線性變換(通常是卷積)合并成更高維度的特征圖,從而為后續(xù)的注意力計算提供更豐富的表示。
? ? ? ? 從圖中可以得到,通道數(shù)在每層中并不是從C變成4C而是2C,這是因為中間又加了一層卷積操作。
3.?實驗結(jié)果
????????在ImageNet22K數(shù)據(jù)集上,準確率能達到驚人的86.4%。另外在檢測,分割等任務上表現(xiàn)也很優(yōu)異。
參考資料:
【深度學習】詳解 Swin Transformer (SwinT)-CSDN博客
深度學習之Swin Transformer學習篇(詳細 - 附代碼)_swintransformer訓練-CSDN博客
圖解Swin Transformer - 知乎
【論文精讀】Swin Transformer - 知乎
ICCV2021最佳論文:Swin Transformer論文解讀+源碼復現(xiàn),迪哥帶你從零解讀霸榜各大CV任務的Swin Transformer模型!_嗶哩嗶哩_bilibili