Swin Transformer
Swin Transformer è un vision Transformer gerarchico che calcola l’autoattenzione in finestre locali spostate, così il costo cresce linearmente con le dimensioni dell’immagine.
Swin Transformer, abbreviazione di Shifted Window Transformer, è un transformer per la visione gerarchico che calcola l'autoattenzione all'interno di piccole finestre locali e le sposta tra livelli consecutivi. Ze Liu e colleghi di Microsoft Research Asia lo hanno introdotto nell'articolo del 2021 Swin Transformer: Hierarchical Vision Transformer using Shifted Windows, vincitore del Marr Prize per il miglior articolo a ICCV 2021. Le finestre locali fanno sì che il costo dell'attenzione cresca linearmente con il numero di pixel anziché quadraticamente, mentre l'unione graduale delle patch produce mappe delle caratteristiche multiscala simili a quelle di una rete neurale convoluzionale. Queste caratteristiche hanno reso i transformer backbone generici pratici per il rilevamento degli oggetti e la segmentazione di immagini ad alta risoluzione, non solo per la classificazione.
Come funzionano le finestre spostate#
Swin divide innanzitutto l'immagine in patch da 4×4 pixel e proietta ciascuna in un embedding di token, così un'immagine da 224×224 diventa una griglia di token 56×56 con 96 canali nel modello Tiny. L'attenzione globale su tutti i 3.136 token confronterebbe ogni token con tutti gli altri; Swin suddivide la griglia in finestre non sovrapposte di 7×7 token e calcola l'attenzione solo all'interno di ciascuna finestra. L'articolo esprime il costo dell'attenzione globale come 4hwC² + 2(hw)²C per una griglia h×w con C canali, rispetto a 4hwC² + 2M²hwC per finestre di M×M token, un valore lineare rispetto a hw.
Le finestre da sole non si scambierebbero mai informazioni, quindi ogni secondo blocco sposta la griglia delle finestre di mezza finestra, cioè 3 token, facendo sì che le nuove finestre attraversino i vecchi confini. Per mantenere costante il numero di finestre, l'implementazione fa scorrere ciclicamente la mappa delle caratteristiche e maschera l'attenzione tra token che nell'immagine originale non erano vicini. Ogni blocco aggiunge inoltre ai punteggi di attenzione un bias di posizione relativa appreso.
Tra una fase e l'altra, un livello di fusione delle patch concatena ciascun gruppo di 2×2 token vicini e lo proietta linearmente, dimezzando la risoluzione e raddoppiando i canali. Le quattro fasi producono mappe delle caratteristiche con risoluzioni pari a 1/4, 1/8, 1/16 e 1/32 di quella dell'input, gli stessi stride di ResNet; Swin si inserisce quindi nelle teste di rilevamento e segmentazione esistenti, come una rete piramidale di caratteristiche. L'implementazione torchvision mostra entrambi i meccanismi:
import torch
from torchvision.models import swin_t
# Swin-T architecture; random weights are enough to inspect its structure
model = swin_t().eval()
# Each pair of blocks uses 7x7 windows, the second shifted by 3 patches
regular, shifted = model.features[1]
print(f"Window {regular.attn.window_size}, shift {regular.attn.shift_size} then {shifted.attn.shift_size}")
# features alternates stages with patch merging; stage outputs are (batch, height, width, channels)
x = torch.randn(1, 3, 224, 224)
with torch.no_grad():
for i, layer in enumerate(model.features):
x = layer(x)
if i % 2 == 1:
print(f"Stage {i // 2 + 1}: {tuple(x.shape)}")Stampa Window [7, 7], shift [0, 0] then [3, 3], seguito dagli output delle fasi (1, 56, 56, 96), (1, 28, 28, 192), (1, 14, 14, 384) e (1, 7, 7, 768): ogni fase dimezza la griglia e raddoppia i canali, creando la piramide attesa dalle teste di predizione densa.
Swin Transformer, ViT e CNN a confronto#
Il ViT originale suddivide le immagini in patch da 16×16, mantiene un'unica risoluzione in tutti i livelli e applica l'attenzione globale, una soluzione adatta alla classificazione delle immagini ma costosa con gli input ad alta risoluzione del rilevamento e della segmentazione. Swin reintroduce due prior delle reti convoluzionali, la località e una gerarchia di caratteristiche, mantenendo però i pesi dipendenti dall'input del meccanismo di attenzione. Le sue finestre locali differiscono dall'attenzione a finestra scorrevole, in cui ogni token presta attenzione ai propri vicini, perché le finestre di Swin sono partizioni fisse condivise dai token, che si mappano in modo efficiente sulle moltiplicazioni tra matrici delle GPU.
Al momento del rilascio, il modello più grande, Swin-L preaddestrato su ImageNet-22K, ha raggiunto un'accuratezza top-1 dell'87,3% su ImageNet-1K, 58,7 box AP e 51,1 mask AP su COCO test-dev e 53,5 mIoU su ADE20K, i migliori risultati pubblicati allora nei benchmark di rilevamento e segmentazione semantica. Il suo successo ha dato impulso anche alla ricerca sulle convoluzioni: ConvNeXt di Meta (2022) ha modernizzato ResNet adottando scelte progettuali ispirate a Swin e ne ha eguagliato o superato l'accuratezza.
Swin può fungere da backbone per un modello Ultralytics personalizzato: il modulo TorchVision in un file YAML del modello carica swin_t di torchvision con i pesi ImageNet preaddestrati, mentre una testa di rilevamento YOLO si addestra sulla singola mappa delle caratteristiche con stride 32 che restituisce.
Varianti e applicazioni#
- Swin Transformer V2: nel 2022 ha esteso il progetto a 3 miliardi di parametri e immagini fino a 1.536×1.536 pixel, usando l'attenzione coseno scalata e un bias di posizione continuo a scala logaritmica per mantenere stabile l'addestramento.
- Riconoscimento delle azioni video: Video Swin Transformer estende le finestre a tre dimensioni, nello spazio e nel tempo, per classificare le azioni nei clip video.
- Super-risoluzione e restauro: SwinIR usa blocchi Swin per ingrandire le immagini, ridurre il rumore e rimuovere gli artefatti JPEG.
- Analisi delle immagini mediche: Swin-Unet e Swin UNETR combinano encoder Swin con decoder in stile U-Net; Swin UNETR segmenta i tumori cerebrali in volumi MRI 3D.










