Heim > Backend-Entwicklung > Python-Tutorial > Vision Transformers (ViTs): Computer Vision mit Transformer-Modellen

Vision Transformers (ViTs): Computer Vision mit Transformer-Modellen

尊渡假赌尊渡假赌尊渡假赌
Freigeben: 2025-01-23 13:42:10
nach vorne
402 Leute haben es durchsucht

In den letzten Jahren haben Transformatoren den NLP-Bereich im maschinellen Lernen verändert. Modelle wie GPT und BERT haben neue Maßstäbe beim Verstehen und Erzeugen menschlicher Sprache gesetzt. Jetzt wird das gleiche Prinzip auf den Computer-Vision-Bereich angewendet. Eine neuere Entwicklung im Bereich Computer Vision ist Vision Transformatoren oder ViTs. Wie im Artikel „An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale“ ausführlich beschrieben wird, ViTs und transformatorbasierte Modelle sollen Faltungsmodelle ersetzen neuronale Netze (CNNs). Vision Transformers sind eine neue Herangehensweise an die Lösung von Computerproblemen Vision. Anstatt sich auf traditionelle Faltungs-Neuronale Netze zu verlassen (CNNs), die seit Jahrzehnten das Rückgrat bildbezogener Aufgaben bilden, ViTs verwenden die Transformer-Architektur zur Verarbeitung von Bildern. Sie behandeln Bildfelder wie Wörter in einem Satz, sodass das Modell das lernen kann Beziehungen zwischen diesen Patches, so wie es den Kontext in einem lernt Textabschnitt.

Im Gegensatz zu CNNs unterteilen ViTs eingegebene Bilder in Patches und serialisieren sie in Vektoren umwandeln und ihre Dimensionalität mithilfe einer Matrix reduzieren Multiplikation. Ein Transformator-Encoder verarbeitet diese Vektoren dann als Token-Einbettungen. In diesem Artikel befassen wir uns mit Vision Transformern und ihre Hauptunterschiede zu Faltungs-Neuronalen Netzen. Was macht Besonders interessant ist für sie ihre Fähigkeit, Globales zu verstehen Muster in einem Bild, mit denen CNNs möglicherweise zu kämpfen haben.

Was sind Vision-Transformatoren?

Vision-Transformatoren verwenden das Konzept der Aufmerksamkeit und der Transformatoren dazu Prozessbilder – dies ähnelt Transformatoren in einer natürlichen Sprache Verarbeitungskontext (NLP). Anstatt jedoch Token zu verwenden, wird das Bild verwendet in Patches aufgeteilt und als Folge linear eingebetteter Elemente bereitgestellt. Diese Patches werden genauso behandelt wie Token oder Wörter im NLP.

Anstatt das Gesamtbild gleichzeitig zu betrachten, schneidet ein ViT Zerlegen Sie das Bild wie ein Puzzle in kleine Teile. Jedes Stück wird gedreht in eine Liste von Zahlen (einen Vektor), die seine Merkmale beschreibt, und dann Das Modell schaut sich alle Teile an und findet heraus, in welcher Beziehung sie zueinander stehen einander mithilfe eines Transformationsmechanismus.

Im Gegensatz zu CNNs funktioniert ViTs durch die Anwendung spezifischer Filter oder Kernel ein Bild, um bestimmte Merkmale wie Kantenmuster zu erkennen. Das ist das Faltungsprozess, der dem Scannen eines Druckers sehr ähnlich ist Bild. Diese Filter gleiten durch das gesamte Bild und markieren es wesentliche Merkmale. Das Netzwerk stapelt dann mehrere Schichten Diese Filter identifizieren nach und nach komplexere Muster.
Bei CNNs reduzieren die Pooling-Layer die Größe der Feature-Maps. Diese Ebenen analysieren die extrahierten Features, um nützliche Vorhersagen zu treffen Bilderkennung, Objekterkennung usw. CNNs haben jedoch eine feste Funktion Empfangsfeld, wodurch die Fähigkeit zur Modellierung über große Entfernungen eingeschränkt wird Abhängigkeiten.

Wie sieht CNN Bilder?Vision Transformers (ViTs): Computer Vision mit Transformer-Modellen

ViTs verwenden, obwohl sie mehr Parameter haben, Selbstaufmerksamkeitsmechanismen für eine bessere Feature-Darstellung und reduziert den Bedarf an tieferen Schichten. CNNs erfordern eine deutlich tiefere Architektur, um etwas Ähnliches zu erreichen Darstellungskraft, was zu erhöhten Rechenkosten führt.

Darüber hinaus können CNNs keine Bildmuster auf globaler Ebene erfassen, weil Ihre Filter konzentrieren sich auf lokale Bereiche eines Bildes. Um das zu verstehen Egal, ob es sich um das gesamte Bild oder entfernte Beziehungen handelt, CNNs basieren auf der Stapelung vieler Ebenen und Bündelung, wodurch das Sichtfeld erweitert wird. Dieser Prozess kann jedoch verlieren globale Informationen, da Details Schritt für Schritt aggregiert werden.

ViTs hingegen unterteilen das Bild in Patches, die vorhanden sind werden als einzelne Eingabe-Tokens behandelt. Mithilfe der Selbstaufmerksamkeit vergleichen ViTs Sehen Sie sich alle Patches gleichzeitig an und erfahren Sie, wie sie zusammenhängen. Dies ermöglicht es ihnen um Muster und Abhängigkeiten im gesamten Bild ohne zu erfassen Bauen Sie sie Schicht für Schicht auf.

Was ist induktive Vorspannung?

Bevor wir fortfahren, ist es wichtig, das Konzept der induktiven Vorspannung zu verstehen. Induktive Verzerrung bezieht sich auf die Annahme, die ein Modell über Daten macht Struktur; Während des Trainings trägt dies dazu bei, dass das Modell allgemeiner wird und Voreingenommenheit reduzieren. In CNNs umfassen induktive Verzerrungen Folgendes:

  1. Lokalität: Merkmale in Bildern (wie Kanten oder Texturen) sind in kleinen Regionen lokalisiert.
  2. Zweidimensionale Nachbarschaftsstruktur: Pixel in der Nähe sind wahrscheinlicher zusammenhängen, sodass Filter auf räumlich benachbarte Regionen wirken.
  3. Übersetzungsäquivarianz: Merkmale, die in einem Teil des Bildes, wie einer Kante, erkannt werden, bleiben erhalten dieselbe Bedeutung, wenn sie in einem anderen Teil erscheinen.

Diese Verzerrungen machen CNNs, wie sie sind, für Bildaufgaben äußerst effizient von Natur aus darauf ausgelegt, die Räumlichkeit und Struktur von Bildern auszunutzen Eigenschaften.

Vision Transformers (ViTs) haben deutlich weniger bildspezifische induktive Vorspannung als CNNs. In ViTs:

  • Globale Verarbeitung: Selbstaufmerksamkeitsebenen wirken weiter das gesamte Bild, wodurch das Modell globale Beziehungen erfasst und Abhängigkeiten ohne Einschränkung durch lokale Regionen.
  • Minimale 2D-Struktur: Die 2D-Struktur des Bildes wird nur am Anfang verwendet (wenn das Bild in Patches unterteilt wird) und während der Feinabstimmung (um Positionseinbettungen für unterschiedliche anzupassen Beschlüsse). Im Gegensatz zu CNNs gehen ViTs nicht davon aus, dass Pixel in der Nähe vorhanden sind notwendigerweise zusammenhängend.
  • Erlernte räumliche Beziehungen: Positionelle Einbettungen in ViTs kodieren bei der Initialisierung keine spezifischen räumlichen 2D-Beziehungen. Stattdessen lernt das Modell alle räumlichen Beziehungen aus den Daten während des Trainings.

Wie Vision Transformers funktionieren

Vision Transformers (ViTs): Computer Vision mit Transformer-Modellen

Vision Transformers verwendet die Standard-Transformer-Architektur Entwickelt für 1D-Textsequenzen. Zur Verarbeitung der 2D-Bilder sind sie geeignet unterteilt in kleinere Patches fester Größe, z. B. P P-Pixel, die werden zu Vektoren abgeflacht. Wenn das Bild die Abmessungen H  B mit C hat Kanäle beträgt die Gesamtzahl der Patches N = H  W / P  P effektiv Eingabesequenzlänge für den Transformer. Diese abgeflachten Stellen sind dann linear in einen festdimensionalen Raum D projiziert, sogenannte Patch-Einbettungen.

Ein spezieller lernbarer Token, ähnlich dem [CLS]-Token in BERT, ist wird der Reihenfolge der Patch-Einbettungen vorangestellt. Dieser Token lernt a globale Bilddarstellung, die später zur Klassifizierung verwendet wird. Zusätzlich werden den Patch-Einbettungen Positionseinbettungen hinzugefügt Codieren Sie Positionsinformationen und helfen Sie dem Modell, die Räumlichkeit zu verstehen Struktur des Bildes.

Die Einbettungssequenz wird durch den Transformer-Encoder geleitet, der zwischen zwei Hauptoperationen wechselt: Multi-Headed Self-Attention (MSA) und einem Feedforward-Neuronalen Netzwerk, auch MLP-Block genannt. Jede Schicht beinhaltet Layer Normalization (LN) angewendet, bevor diese Operationen und Restverbindungen hinzugefügt wurden anschließend, um das Training zu stabilisieren. Der Ausgang des Transformer-Encoders, Als Bild wird insbesondere der Status des [CLS]-Tokens verwendet Darstellung.

Zur Klassifizierung wird dem endgültigen [CLS]-Token ein einfacher Kopf hinzugefügt Aufgaben. Während des Vortrainings ist dieser Kopf ein kleines mehrschichtiges Perzeptron (MLP), während es sich bei der Feinabstimmung typischerweise um eine einzelne lineare Schicht handelt. Das Architektur ermöglicht es ViTs, globale Beziehungen effektiv zu modellieren zwischen den Patches und nutzen Sie die volle Kraft der Selbstaufmerksamkeit für Ihr Image Verständnis.

In einem hybriden Vision Transformer-Modell, anstatt direkt zu teilen Rohbilder werden in Patches umgewandelt, die Eingabesequenz wird aus Feature-Maps abgeleitet generiert von einem CNN. Das CNN verarbeitet das Bild zunächst und extrahiert es sinnvolle räumliche Merkmale, die dann zur Erstellung von Patches verwendet werden. Diese Patches werden abgeflacht und in einen festdimensionalen Raum projiziert unter Verwendung der gleichen trainierbaren linearen Projektion wie in Standard Vision Transformatoren. Ein Sonderfall dieses Ansatzes ist die Verwendung von Größenfeldern 1×1, wobei jeder Patch einem einzelnen räumlichen Ort im entspricht Die Feature-Map von CNN.

In diesem Fall sind die räumlichen Dimensionen der Feature-Map abgeflacht und die resultierende Sequenz wird in die projiziert Eingangsdimension des Transformators. Wie beim Standard-ViT, a Zur Beibehaltung werden Klassifizierungstoken und Positionseinbettungen hinzugefügt Positionsinformationen zu erfassen und ein globales Bildverständnis zu ermöglichen. Das Der hybride Ansatz nutzt die Stärken der lokalen Merkmalsextraktion von CNNs und kombinieren sie gleichzeitig mit den globalen Modellierungsfunktionen von Transformers.

Code-Demo

Hier ist der Codeblock zur Verwendung der Vision Transformers Bilder.

# Install the necessary libraries  pip install -q transformers
Nach dem Login kopieren
from transformers import ViTForImageClassification  
from PIL import Image  
from transformers import ViTImageProcessor
Nach dem Login kopieren
import requests  
import torch
Nach dem Login kopieren
# 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)
Nach dem Login kopieren
# Load the Vision Transformers (ViTs): Computer Vision mit Transformer-Modellen to perform predictions  url = 'link to your Vision Transformers (ViTs): Computer Vision mit Transformer-Modellen'  Vision Transformers (ViTs): Computer Vision mit Transformer-Modellen = Image.open(requests.get(url, stream=True).raw)processor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224')  inputs = processor(Vision Transformers (ViTs): Computer Vision mit Transformer-Modellens=Vision Transformers (ViTs): Computer Vision mit Transformer-Modellen, return_tensors="pt").to(device)  pixel_values = inputs.pixel_values  
# print(pixel_values.shape)
Nach dem Login kopieren

Die Das ViT-Modell verarbeitet das Bild. Es besteht aus einem BERT-ähnlichen Encoder und einem Der lineare Klassifizierungskopf befindet sich oben auf dem endgültigen verborgenen Zustand das [CLS]-Token.

with torch.no_grad():  
  outputs = model(pixel_values)  logits = outputs.logits# logits.shapeprediction = logits.argmax(-1)  print("Predicted class:", model.config.id2label[prediction.item()])
Nach dem Login kopieren

Hier ist eine grundlegende Vision Transformer (ViT)-Implementierung mit PyTorch. Das Der Code umfasst die Kernkomponenten: Patch-Einbettung, Positionskodierung, und der Transformer-Encoder. Dieser kann zur einfachen Klassifizierung verwendet werden Aufgaben.

import torchimport torch.nn as nnimport torch.nn.functional as Fclass 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 usageif __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 Vision Transformers (ViTs): Computer Vision mit Transformer-Modellens, 3 channels, 224x224 size
    preds = model(dummy_img)
    print(preds.shape)  # Output: [8, 10] (Batch size, Number of classes)
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonVision Transformers (ViTs): Computer Vision mit Transformer-Modellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:digitalocean.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage