PyTorch torchvision Computer-Vision-Modul
torchvision ist eine Erweiterungsbibliothek im PyTorch-Ökosystem speziell für Computer-Vision-Aufgaben. Sie bietet die folgenden Kernfunktionen:
- Vortrainierte Modelle: Enthält Implementierungen klassischer CNN-Architekturen (wie ResNet, VGG, AlexNet usw.)
- Dataset-Werkzeuge: Integrierte gängige visuelle Datensätze (wie CIFAR10, MNIST, ImageNet usw.)
- Bildtransformationen: Bietet verschiedene Methoden zur Bildvorverarbeitung und Daten-Augmentierung
- Hilfswerkzeuge: Enthält Hilfsfunktionen wie Videoverarbeitung, Bildoperationen usw.
# 安装 torchvision(通常与 PyTorch 一起安装) pip install torch torchvision
Analyse der Kernkomponenten
1. torchvision.models
Bietet vortrainierte Computer-Vision-Modelle, die direkt für Transfer Learning verwendet werden können:
Beispiel
import torchvision.models as models
# Vortrainiertes Modell laden
resnet18 = models.resnet18(pretrained=True)
alexnet = models.alexnet(pretrained=True)
vgg16 = models.vgg16(pretrained=True)
# Vortrainiertes Modell laden
resnet18 = models.resnet18(pretrained=True)
alexnet = models.alexnet(pretrained=True)
vgg16 = models.vgg16(pretrained=True)
Liste gängiger Modelle:
| Modellname | Anwendungsfall | Parameteranzahl | Top-1-Genauigkeit |
|---|---|---|---|
| ResNet | Allgemeine Bildklassifizierung | 11M-60M | 69%-80% |
| VGG | Merkmalsextraktion | 138M | 71.3% |
| MobileNet | Mobile Anwendung | 3.4M | 70.6% |
| EfficientNet | Effizientes Modell | 5M-66M | 77%-84% |
2. torchvision.datasets
Integrierte gängige Computer-Vision-Datensätze zur Vereinfachung des Datenladevorgangs:
Beispiel
from torchvision import datasets
# CIFAR10-Datensatz laden
train_data = datasets.CIFAR10(
root='data',
train=True,
download=True,
transform=transforms.ToTensor()
)
# MNIST-Datensatz laden
test_data = datasets.MNIST(
root='data',
train=False,
download=True
)
# CIFAR10-Datensatz laden
train_data = datasets.CIFAR10(
root='data',
train=True,
download=True,
transform=transforms.ToTensor()
)
# MNIST-Datensatz laden
test_data = datasets.MNIST(
root='data',
train=False,
download=True
)
Unterstützte Datensatztypen:
Beispiel
graph TD
A[torchvision.datasets] --> B[Klassifizierungsdatensätze]
A --> C[Detektionsdatensätze]
A --> D[Segmentierungsdatensätze]
B --> B1[CIFAR10/100]
B --> B2[MNIST/FashionMNIST]
B --> B3[ImageNet]
C --> C1[COCO]
C --> C2[VOC]
D --> D1[Cityscapes]
A[torchvision.datasets] --> B[Klassifizierungsdatensätze]
A --> C[Detektionsdatensätze]
A --> D[Segmentierungsdatensätze]
B --> B1[CIFAR10/100]
B --> B2[MNIST/FashionMNIST]
B --> B3[ImageNet]
C --> C1[COCO]
C --> C2[VOC]
D --> D1[Cityscapes]
3. torchvision.transforms
Zentrale Werkzeuge für Bildvorverarbeitung und Datenaugmentierung:
Beispiel
from torchvision import transforms
# Bildtransformations-Pipeline definieren
transform = transforms.Compose([
transforms.Resize(256), # Größe ändern
transforms.CenterCrop(224), # Zentrierter Zuschnitt
transforms.ToTensor(), # In Tensor umwandeln
transforms.Normalize( # Normalisieren
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
# Bildtransformations-Pipeline definieren
transform = transforms.Compose([
transforms.Resize(256), # Größe ändern
transforms.CenterCrop(224), # Zentrierter Zuschnitt
transforms.ToTensor(), # In Tensor umwandeln
transforms.Normalize( # Normalisieren
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
Klassifizierung gängiger Transformationsmethoden:
| Kategorie | Beispielmethoden | Zweck |
|---|---|---|
| Geometrische Transformationen | RandomRotation, RandomResizedCrop | Positionsinvarianz erhöhen |
| Farbtransformationen | ColorJitter, Grayscale | Farbrobustheit verbessern |
| Unschärfe/Rauschen | GaussianBlur, RandomErasing | Overfitting verhindern |
| Kombinierte Transformationen | RandomApply, RandomChoice | Flexible Kombinationsstrategie |
Praktisches Beispiel: Bildklassifizierungs-Pipeline
1. Datenvorbereitung
Beispiel
import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# Datentransformationen definieren
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(10),
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# Datensatz laden
train_set = datasets.CIFAR10(
root='./data',
train=True,
download=True,
transform=train_transform
)
# Data Loader erstellen
train_loader = DataLoader(
train_set,
batch_size=32,
shuffle=True
)
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# Datentransformationen definieren
train_transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomRotation(10),
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# Datensatz laden
train_set = datasets.CIFAR10(
root='./data',
train=True,
download=True,
transform=train_transform
)
# Data Loader erstellen
train_loader = DataLoader(
train_set,
batch_size=32,
shuffle=True
)
2. Modelltraining
Beispiel
import torch.nn as nn
import torch.optim as optim
# Vortrainiertes Modell verwenden
model = models.resnet18(pretrained=True)
# Letzte Schicht ändern (an die 10 Klassen von CIFAR10 anpassen)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 10)
# Verlustfunktion und Optimierer definieren
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
# Trainingsschleife
for epoch in range(10):
for images, labels in train_loader:
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
import torch.optim as optim
# Vortrainiertes Modell verwenden
model = models.resnet18(pretrained=True)
# Letzte Schicht ändern (an die 10 Klassen von CIFAR10 anpassen)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 10)
# Verlustfunktion und Optimierer definieren
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
# Trainingsschleife
for epoch in range(10):
for images, labels in train_loader:
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
Erweiterte Funktionen
1. Benutzerdefinierter Datensatz
Beispiel
from torchvision.datasets import VisionDataset
class CustomDataset(VisionDataset):
def __init__(self, root, transform=None):
super().__init__(root, transform=transform)
# Implementiere __getitem__ und __len__
def __getitem__(self, index):
# Gib (image, target)-Tupel zurück
pass
def __len__(self):
# Datensatzgröße zurückgeben
pass
class CustomDataset(VisionDataset):
def __init__(self, root, transform=None):
super().__init__(root, transform=transform)
# Implementiere __getitem__ und __len__
def __getitem__(self, index):
# Gib (image, target)-Tupel zurück
pass
def __len__(self):
# Datensatzgröße zurückgeben
pass
2. Modell-Export und Bereitstellung
Beispiel
# In das ONNX-Format exportieren
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
model,
dummy_input,
"model.onnx",
input_names=["input"],
output_names=["output"]
)
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
model,
dummy_input,
"model.onnx",
input_names=["input"],
output_names=["output"]
)
Best-Practice-Empfehlungen
1. Strategie zur Datenaugmentierung:
- Verwenden Sie zufällige Transformationen, um Daten während des Trainings zu augmentieren
- Verwenden Sie nur deterministische Transformationen während der Validierung/Testphase
2. Tipps zum Transferlernen:
Beispiel
# Alle Parameter außer der letzten Schicht einfrieren
for param in model.parameters():
param.requires_grad = False
model.fc.requires_grad = True
for param in model.parameters():
param.requires_grad = False
model.fc.requires_grad = True
3. Leistungsoptimierung:
- Verwenden Sie
num_workersParameter zur Beschleunigung des Datenladens - Bei großen Datensätzen sollten Sie die Verwendung von ... in Betracht ziehen
DatasetTeilmenge von
4. Häufige Fehler:
- Vergessen aufzurufen
zero_grad() - Verwirrt
train()undeval()mode - Die Form des Bildtensors entspricht nicht den Modellanforderungen (sollte C×H×W sein)