Vision Transformers (ViTs): Wie Transformer die Computer Vision neu prägen

In den vergangenen Jahren haben Transformer das Gebiet der natürlichen Sprachverarbeitung im Machine Learning grundlegend verändert. Modelle wie GPT und BERT haben neue Maßstäbe für das Verstehen und Erzeugen menschlicher Sprache gesetzt. Dasselbe Konzept wird inzwischen auch auf den Bereich Computer Vision übertragen. Eine der spannendsten Entwicklungen in diesem Feld sind Vision Transformers, kurz ViTs. Wie in der Arbeit An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale beschrieben, sollen ViTs und andere transformerbasierte Modelle konvolutionale neuronale Netze (CNNs) als Standardansatz ablösen. Vision Transformers eröffnen einen neuen Weg zur Lösung von Aufgaben in der Computer Vision. Statt auf klassische CNNs zu setzen, die über viele Jahre das Fundament bildbasierter Anwendungen waren, verwenden ViTs die Transformer-Architektur zur Verarbeitung von Bildern. Dabei behandeln sie Bildausschnitte ähnlich wie Wörter in einem Satz, sodass das Modell Beziehungen zwischen diesen Ausschnitten lernen kann – vergleichbar mit dem Verständnis von Kontext in einem Textabschnitt.

Im Unterschied zu CNNs zerlegen ViTs Eingabebilder in kleinere Patches, wandeln diese in Vektoren um und verringern ihre Dimensionalität mithilfe von Matrixmultiplikation. Anschließend verarbeitet ein Transformer-Encoder diese Vektoren als Token-Embeddings. In diesem Artikel betrachten wir Vision Transformers genauer und zeigen die wichtigsten Unterschiede zu konvolutionalen neuronalen Netzen. Besonders interessant ist ihre Fähigkeit, globale Muster in Bildern zu erfassen – ein Bereich, in dem CNNs häufig an Grenzen stoßen.

Voraussetzungen

  • Grundlagen neuronaler Netze: Ein allgemeines Verständnis dafür, wie neuronale Netze Daten verarbeiten.
  • Convolutional Neural Networks (CNNs): Vertrautheit mit CNNs und ihrer Bedeutung in der Computer Vision.
  • Transformer-Architektur: Kenntnisse über Transformer, insbesondere im Zusammenhang mit NLP.
  • Bildverarbeitung: Verständnis zentraler Konzepte wie Bilddarstellung, Kanäle und Pixelarrays.
  • Attention-Mechanismus: Vertrautheit mit Self-Attention und ihrer Fähigkeit, Beziehungen zwischen Eingaben zu modellieren.

Was sind Vision Transformers?

Vision Transformers nutzen Attention- und Transformer-Mechanismen zur Bildverarbeitung – ähnlich wie Transformer in der natürlichen Sprachverarbeitung. Der Unterschied besteht darin, dass statt Tokens ein Bild in Patches aufgeteilt und als Folge linearer Embeddings dargestellt wird. Diese Patches werden auf dieselbe Weise verarbeitet wie Wörter oder Tokens im NLP-Bereich.

Statt das gesamte Bild gleichzeitig zu analysieren, zerlegt ein ViT das Bild in kleine Teile, ähnlich wie bei einem Puzzle. Jeder Abschnitt wird in eine numerische Darstellung, also einen Vektor, umgewandelt, der seine Merkmale beschreibt. Anschließend untersucht das Modell alle diese Teile gemeinsam und erkennt mithilfe eines transformerbasierten Mechanismus, wie sie miteinander zusammenhängen.

Im Gegensatz zu CNNs verlassen sich ViTs nicht darauf, spezielle Filter oder Kerne über ein Bild laufen zu lassen, um bestimmte Eigenschaften wie Kanten zu erkennen. Bei CNNs ähnelt dieser Faltungsprozess dem schrittweisen Abtasten eines Bildes. Die Filter bewegen sich über das gesamte Bild und heben wichtige Merkmale hervor. Das Netzwerk kombiniert mehrere solcher Filterebenen, sodass im Verlauf immer komplexere Muster erkannt werden können.

Bei CNNs verkleinern Pooling-Schichten die Größe der Feature-Maps. Diese Schichten bewerten die extrahierten Merkmale und unterstützen Vorhersagen für Aufgaben wie Bilderkennung oder Objekterkennung. Allerdings arbeiten CNNs mit einem festen rezeptiven Feld, was ihre Fähigkeit einschränkt, weitreichende Abhängigkeiten abzubilden.

Wie CNNs Bilder betrachten

ViTs besitzen zwar häufig mehr Parameter, nutzen jedoch Self-Attention für eine ausdrucksstärkere Merkmalsdarstellung und verringern dadurch die Abhängigkeit von extrem tiefen Architekturen. CNNs müssen meist deutlich tiefer aufgebaut werden, um eine ähnliche Repräsentationsstärke zu erreichen, was den Rechenaufwand erhöht.

Ein weiterer Nachteil von CNNs liegt darin, dass sie keine bildweiten Muster von Natur aus erfassen, da ihre Filter auf lokale Bereiche fokussiert sind. Um das gesamte Bild oder weit entfernte Zusammenhänge zu verstehen, müssen CNNs viele Schichten stapeln und Pooling einsetzen, damit sich das Sichtfeld schrittweise erweitert. Durch diese sukzessive Verdichtung kann jedoch globale Information verloren gehen.

ViTs gehen hier einen anderen Weg: Sie teilen das Bild in Patches auf, die als eigenständige Eingabetokens behandelt werden. Mithilfe von Self-Attention vergleichen ViTs alle Patches gleichzeitig und lernen, wie sie zueinander in Beziehung stehen. Dadurch können sie Muster und Abhängigkeiten über das gesamte Bild hinweg erfassen, ohne diese schrittweise über viele Ebenen aufbauen zu müssen.

Was ist Inductive Bias?

Bevor wir fortfahren, ist es sinnvoll, den Begriff Inductive Bias zu verstehen. Darunter versteht man die Annahmen, die ein Modell über die Struktur von Daten trifft. Während des Trainings helfen diese Annahmen dabei, die Generalisierungsfähigkeit des Modells zu verbessern und Verzerrungen zu verringern. Bei CNNs gehören dazu insbesondere folgende Eigenschaften:

  • Lokalität: Bildmerkmale wie Kanten oder Texturen treten häufig in kleinen, lokal begrenzten Bereichen auf.
  • Zweidimensionale Nachbarschaftsstruktur: Benachbarte Pixel stehen mit höherer Wahrscheinlichkeit in Beziehung zueinander, weshalb Filter auf räumlich angrenzende Regionen angewendet werden.
  • Translationsäquivalenz: Ein Merkmal, das in einem Bereich des Bildes erkannt wird, beispielsweise eine Kante, behält dieselbe Bedeutung, auch wenn es an anderer Stelle erscheint.

Diese Vorannahmen machen CNNs für Bildaufgaben besonders effizient, da sie gezielt auf die räumlichen und strukturellen Eigenschaften von Bildern ausgelegt sind.

Vision Transformers verfügen im Vergleich dazu über deutlich weniger bildspezifischen Inductive Bias als CNNs. Bei ViTs bedeutet das:

  • Globale Verarbeitung: Self-Attention-Schichten arbeiten über das gesamte Bild hinweg, sodass das Modell weitreichende Beziehungen und Abhängigkeiten erfassen kann, ohne auf lokale Regionen beschränkt zu sein.
  • Minimale 2D-Struktur: Die zweidimensionale Struktur des Bildes wird nur zu Beginn genutzt, wenn das Bild in Patches zerlegt wird, sowie beim Fine-Tuning, wenn Positions-Embeddings für andere Auflösungen angepasst werden. Anders als CNNs gehen ViTs nicht davon aus, dass benachbarte Pixel zwangsläufig zusammengehören.
  • Gelernte räumliche Beziehungen: Positions-Embeddings kodieren zu Beginn keine festen zweidimensionalen räumlichen Beziehungen. Stattdessen lernt das Modell diese Zusammenhänge erst aus den Trainingsdaten.

Wie Vision Transformers funktionieren

Vision Transformers basieren auf der klassischen Transformer-Architektur, die ursprünglich für eindimensionale Textsequenzen entwickelt wurde. Damit sich diese Architektur auf zweidimensionale Bilder anwenden lässt, werden die Bilder zunächst in kleinere Patches fester Größe unterteilt, zum Beispiel P × P Pixel. Diese Patches werden anschließend in Vektoren umgeformt. Hat ein Bild die Maße H × W und C Kanäle, ergibt sich die Anzahl der Patches zu N = H × W / P × P. Diese Zahl bestimmt gleichzeitig die effektive Eingabesequenzlänge für den Transformer. Danach werden die flach dargestellten Patches linear in einen festen Merkmalsraum D projiziert, wodurch sogenannte Patch-Embeddings entstehen.

Zusätzlich wird ein spezielles lernbares Token – ähnlich dem [CLS]-Token in BERT – an den Anfang der Patch-Sequenz gestellt. Dieses Token lernt eine globale Repräsentation des gesamten Bildes, die später für Klassifikationsaufgaben verwendet wird. Ergänzend dazu werden Positions-Embeddings hinzugefügt, damit das Modell Informationen über die Lage der einzelnen Patches im Bild behalten kann und die räumliche Struktur nicht verloren geht.

Die so entstehende Sequenz von Embeddings wird anschließend durch den Transformer-Encoder geführt. Im Inneren des Encoders wechseln sich zwei Hauptoperationen ab: Multi-Headed Self-Attention (MSA) und ein Feedforward-Netzwerk, das oft als MLP-Block bezeichnet wird. Jede Schicht verwendet vor diesen Operationen Layer Normalization (LN) und danach Residualverbindungen, um das Training stabiler zu machen. Die Ausgabe des Transformer-Encoders – insbesondere der finale Zustand des [CLS]-Tokens – dient schließlich als Repräsentation des Bildes.

Für Klassifikationsaufgaben wird auf das abschließende [CLS]-Token ein einfacher Head gesetzt. Während des Pretrainings ist dieser Head meist ein kleines mehrschichtiges Perzeptron (MLP), im Fine-Tuning dagegen häufig nur eine einzelne lineare Schicht. Durch diesen Aufbau können ViTs globale Beziehungen zwischen Patches sehr effektiv modellieren und die volle Stärke von Self-Attention für das Bildverständnis nutzen.

In einem hybriden Vision-Transformer-Modell beginnt der Ablauf etwas anders. Statt Rohbilder direkt in Patches zu zerlegen, wird die Eingabesequenz aus Feature-Maps erzeugt, die zuvor von einem CNN berechnet wurden. Das CNN verarbeitet das Bild zunächst und extrahiert sinnvolle räumliche Merkmale. Diese Merkmale werden anschließend in Patches überführt. Danach werden die Patches abgeflacht und – wie beim Standard-ViT – mithilfe derselben trainierbaren linearen Projektion in einen festen Merkmalsraum überführt. Eine besondere Variante dieses Ansatzes nutzt Patches der Größe 1×1, bei denen jeder Patch genau einer räumlichen Position in der CNN-Feature-Map entspricht.

In diesem Fall werden die räumlichen Dimensionen der Feature-Map abgeflacht und die resultierende Sequenz in die Eingabedimension des Transformers projiziert. Wie beim klassischen ViT werden anschließend ein Klassifikationstoken und Positions-Embeddings ergänzt, um Positionsinformationen zu bewahren und ein globales Bildverständnis zu ermöglichen. Dieser hybride Ansatz verbindet die lokalen Merkmalsextraktionsfähigkeiten von CNNs mit der globalen Modellierungsstärke von Transformern.

Code-Demo

Nachfolgend finden Sie ein Codebeispiel, das zeigt, wie Vision Transformers auf Bilder angewendet werden können.

# Install the necessary libraries  
pip install -q transformers
from transformers import ViTForImageClassification  
from PIL import Image  
from transformers import ViTImageProcessor
import requests  
import torch
# Load the model and move it to ‘GPU’  
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224')  
model.to(device)
# Load the image to perform predictions  
url = 'link to your image'  
image = Image.open(requests.get(url, stream=True).raw)

processor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224')  
inputs = processor(images=image, return_tensors="pt").to(device)  
pixel_values = inputs.pixel_values  
# print(pixel_values.shape)

Das ViT-Modell analysiert das Bild. Es besteht aus einem BERT-ähnlichen Encoder sowie einem linearen Klassifikations-Head, der auf dem finalen Hidden State des [CLS]-Tokens aufsetzt.

with torch.no_grad():  
  outputs = model(pixel_values)  
logits = outputs.logits

# logits.shape

prediction = logits.argmax(-1)  
print("Predicted class:", model.config.id2label[prediction.item()])

Hier sehen Sie eine grundlegende Implementierung eines Vision Transformers (ViT) mit PyTorch. Der Code umfasst die wesentlichen Bausteine wie Patch-Embedding, Positionskodierung und den Transformer-Encoder. Er eignet sich für einfache Klassifikationsaufgaben.

import torch
import torch.nn as nn
import torch.nn.functional as F

class VisionTransformer(nn.Module):
    def __init__(self, img_size=224, patch_size=16, num_classes=1000, dim=768, depth=12, heads=12, mlp_dim=3072, dropout=0.1):
        super(VisionTransformer, self).__init__()
        
        # Image and patch dimensions
        assert img_size % patch_size == 0, "Image size must be divisible by patch size"
        self.num_patches = (img_size // patch_size) ** 2
        self.patch_dim = (3 * patch_size ** 2)  # Assuming 3 channels (RGB)
        
        # Layers
        self.patch_embeddings = nn.Linear(self.patch_dim, dim)
        self.position_embeddings = nn.Parameter(torch.randn(1, self.num_patches + 1, dim))
        self.cls_token = nn.Parameter(torch.randn(1, 1, dim))
        self.dropout = nn.Dropout(dropout)
        
        # Transformer Encoder
        self.transformer = nn.TransformerEncoder(
            nn.TransformerEncoderLayer(d_model=dim, nhead=heads, dim_feedforward=mlp_dim, dropout=dropout),
            num_layers=depth
        )
        
        # MLP Head for classification
        self.mlp_head = nn.Sequential(
            nn.LayerNorm(dim),
            nn.Linear(dim, num_classes)
        )
    
    def forward(self, x):
        # Flatten patches and embed
        batch_size, channels, height, width = x.shape
        patch_size = height // int(self.num_patches ** 0.5)

        x = x.unfold(2, patch_size, patch_size).unfold(3, patch_size, patch_size)
        x = x.contiguous().view(batch_size, 3, patch_size, patch_size, -1)
        x = x.permute(0, 4, 1, 2, 3).flatten(2).permute(0, 2, 1)
        x = self.patch_embeddings(x)
        
        # Add positional embeddings
        cls_tokens = self.cls_token.expand(batch_size, -1, -1)
        x = torch.cat((cls_tokens, x), dim=1)
        x = x + self.position_embeddings
        x = self.dropout(x)
        
        # Transformer Encoder
        x = self.transformer(x)
        
        # Classification Head
        x = x[:, 0]  # CLS token
        return self.mlp_head(x)

# Example usage
if __name__ == "__main__":
    model = VisionTransformer(img_size=224, patch_size=16, num_classes=10, dim=768, depth=12, heads=12, mlp_dim=3072)
    print(model)
    
    dummy_img = torch.randn(8, 3, 224, 224)  # Batch of 8 images, 3 channels, 224x224 size
    preds = model(dummy_img)
    print(preds.shape)  # Output: [8, 10] (Batch size, Number of classes)

Zentrale Komponenten

  • Patch-Embedding: Bilder werden in kleinere Patches unterteilt, abgeflacht und linear in Embeddings überführt.
  • Positionskodierung: Den Patch-Embeddings werden Positionsinformationen hinzugefügt, da Transformer Positionen nicht von sich aus berücksichtigen.
  • Transformer-Encoder: Self-Attention- und Feedforward-Schichten lernen die Beziehungen zwischen den einzelnen Patches.
  • Klassifikations-Head: Die Klassenwahrscheinlichkeiten werden mithilfe des CLS-Tokens ausgegeben.

Dieses Modell kann auf jedem beliebigen Bilddatensatz trainiert werden, etwa mit einem Optimierer wie Adam und einer Verlustfunktion wie Cross-Entropy. Um bessere Ergebnisse zu erzielen, ist ein Pretraining auf einem großen Datensatz vor dem Fine-Tuning in vielen Fällen sinnvoll.

Beliebte weiterführende Arbeiten

DeiT (Data-efficient Image Transformers) von Facebook AI: Hierbei handelt es sich um Vision Transformers, die mithilfe von Knowledge Distillation besonders effizient trainiert werden. DeiT stellt vier Varianten bereit: deit-tiny, deit-small sowie zwei deit-base-Versionen. Für die Bildvorbereitung wird DeiTImageProcessor verwendet.

BEiT (BERT Pre-Training of Image Transformers) von Microsoft Research: Inspiriert von BERT setzt BEiT auf selbstüberwachtes Masked Image Modeling und erzielt bessere Ergebnisse als überwacht trainierte ViTs. Während des Trainings kommt VQ-VAE zum Einsatz.

DINO (Self-supervised Vision Transformer Training) von Facebook AI: Mit DINO trainierte ViTs sind in der Lage, Objekte auch ohne explizite Überwachung zu segmentieren. Entsprechende Checkpoints sind online verfügbar.

MAE (Masked Autoencoders) von Facebook trainieren ViTs vor, indem maskierte Patches (75 %) rekonstruiert werden. Nach dem Fine-Tuning übertrifft diese einfache Methode überwachte Pretraining-Ansätze.

Fazit

Zusammenfassend stellen ViTs eine leistungsstarke Alternative zu CNNs dar, da sie Transformer auf die Bilderkennung anwenden, den Inductive Bias reduzieren und Bilder als Sequenzen aus Patches interpretieren. Dieser einfache, zugleich aber sehr gut skalierbare Ansatz hat auf vielen Benchmarks zur Bildklassifikation Ergebnisse auf dem neuesten Stand der Technik erzielt – insbesondere in Kombination mit groß angelegtem Pretraining. Dennoch bleiben verschiedene Herausforderungen bestehen, etwa die Erweiterung von ViTs auf Aufgaben wie Objekterkennung und Segmentierung, die weitere Verbesserung selbstüberwachter Pretraining-Methoden sowie die Frage, wie sich durch noch größere Skalierung zusätzliche Leistungssteigerungen erzielen lassen.

Quelle: digitalocean.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren:

Moderne Hosting Services mit Cloud Server, Managed Server und skalierbarem Cloud Hosting für professionelle IT-Infrastrukturen

LangMem SDK für KI-Agenten: Langzeitgedächtnis Guide

AI/ML, Tutorial
Vijona8 Juni um 13:37 Uhr LangMem SDK für KI-Agenten: Langzeitgedächtnis, Architektur, Integration, Leistung und Alternativen KI-Agenten, die auf großen Sprachmodellen basieren, waren lange mit einer wesentlichen Einschränkung konfrontiert: Ihr Gedächtnis ist…