Zum Inhalt springen

Transferlernen mit eingefrorenen Schichten in YOLOv5

📚 Dieser Leitfaden erklärt, wie man Einfriert YOLOv5 🚀 Schichten bei der Implementierung von Transfer Learning. Transfer Learning ist eine leistungsstarke Machine-Learning-(ML-)Technik, mit der Sie ein Modell schnell mit neuen Daten neu trainieren können, ohne das gesamte Netzwerk von Grund auf neu trainieren zu müssen. Durch das Einfrieren der Gewichtungen der anfänglichen Schichten und das Aktualisieren der Parameter späterer Schichten können Sie den Bedarf an Rechenressourcen und die Trainingszeit erheblich reduzieren. Dieser Ansatz kann sich jedoch geringfügig auf die endgültige Modell-Genauigkeit auswirken.

Bevor Sie beginnen

Klonen Sie zunächst das YOLOv5-Repository und installieren Sie die erforderlichen Abhängigkeiten, die in requirements.txt. Stellen Sie sicher, dass Sie eine Python>=3.8.0 Umgebung mit PyTorch>=1.8 installiert. Vorab trainiert Modelle und erforderlich Datensätze wird automatisch von der neuesten YOLOv5 Version heruntergeladen Veröffentlichung.

git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependencies

Wie Layer Freezing funktioniert

Wenn Sie Layer in einem einfrieren neuronales Netzwerk, verhindern Sie, dass ihre Parameter (Gewichte und Biases) während des Trainingsprozesses aktualisiert werden. In PyTorch wird dies erreicht, indem Sie die requires_grad Attribut der Tensoren der Ebene zu False. Folglich werden für diese Schichten während des Backpropagation, wodurch Rechenleistung und Speicher gespart werden.

Hier wird beschrieben, wie YOLOv5 Layer Freezing in seinem Trainingsskript implementiert:

# Freeze specified layers
freeze = [f"model.{x}." for x in range(freeze)]  # Define layers to freeze based on module index
for k, v in model.named_parameters():
    v.requires_grad = True  # Ensure all parameters are initially trainable
    if any(x in k for x in freeze):
        print(f"Freezing layer: {k}")
        v.requires_grad = False  # Disable gradient calculation for frozen layers

Erkundung der Modellarchitektur

Das Verständnis der Struktur des YOLOv5-Modells ist entscheidend für die Entscheidung, welche Schichten eingefroren werden sollen. Sie können die Namen aller Module und ihrer Parameter mit dem folgenden Python-Snippet überprüfen:

# Assuming 'model' is your loaded YOLOv5 model instance
for name, param in model.named_parameters():
    print(name)

"""
Example Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
"""

Die YOLOv5-Architektur besteht typischerweise aus einem Backbone (Schichten 0-9 in Standardkonfigurationen wie YOLOv5s/m/l/x), das für die Merkmalsextraktion verantwortlich ist, und einem Head (den verbleibenden Schichten), der die Objekterkennung durchführt.

# Example YOLOv5 v6.0 backbone structure
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]]  # Layer 0: Initial convolution (P1/2 stride)
    - [-1, 1, Conv, [128, 3, 2]] # Layer 1: Downsampling convolution (P2/4 stride)
    - [-1, 3, C3, [128]]          # Layer 2: C3 module
    - [-1, 1, Conv, [256, 3, 2]] # Layer 3: Downsampling convolution (P3/8 stride)
    - [-1, 6, C3, [256]]          # Layer 4: C3 module
    - [-1, 1, Conv, [512, 3, 2]] # Layer 5: Downsampling convolution (P4/16 stride)
    - [-1, 9, C3, [512]]          # Layer 6: C3 module
    - [-1, 1, Conv, [1024, 3, 2]]# Layer 7: Downsampling convolution (P5/32 stride)
    - [-1, 3, C3, [1024]]         # Layer 8: C3 module
    - [-1, 1, SPPF, [1024, 5]]    # Layer 9: Spatial Pyramid Pooling Fast

# Example YOLOv5 v6.0 head structure
head:
    - [-1, 1, Conv, [512, 1, 1]] # Layer 10
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]] # Layer 11
    - [[-1, 6], 1, Concat, [1]] # Layer 12: Concatenate with backbone P4 (from layer 6)
    - [-1, 3, C3, [512, False]] # Layer 13: C3 module
    # ... subsequent head layers for feature fusion and detection

Einfrieroptionen

Sie können steuern, welche Layer mithilfe von eingefroren werden. --freeze Argument im Trainingsbefehl. Dieses Argument gibt den Index des ersten nicht eingefroren Modul; alle Module vor diesem Index haben ihre Gewichte eingefroren.

Nur Backbone einfrieren

Um das gesamte Backbone einzufrieren (Schichten 0 bis 9), was üblich ist, wenn das Modell an neue Objektklassen angepasst wird, während die allgemeinen Merkmalsextraktionsfähigkeiten, die von einem großen Datensatz wie COCO gelernt wurden, beibehalten werden:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10

Diese Strategie ist effektiv, wenn Ihr Zieldatensatz ähnlicheLow-Level visuelle Merkmale (Kanten, Texturen) mit den ursprünglichen Trainingsdaten (z. B. COCO) teilt, aber unterschiedliche Objektkategorien enthält.

Alle bis auf die letzten Erkennungsebenen einfrieren

Um fast das gesamte Netzwerk einzufrieren und nur die letzten Faltungsschichten der Ausgabe zu belassen (Teil des Detect Modul, typischerweise das letzte Modul, z. B. Modul 24 in YOLOv5s) trainierbar:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24

Dieser Ansatz ist nützlich, wenn Sie das Modell hauptsächlich für eine andere Anzahl von Ausgabeklassen anpassen müssen, während der Großteil der gelernten Features intakt bleibt. Er erfordert die geringsten Rechenressourcen für das Fine-Tuning.

Leistungsvergleich

Um die Auswirkungen des Einfrierens von Schichten zu veranschaulichen, haben wir YOLOv5m auf dem Pascal VOC Datensatz für 50 Epochen, beginnend mit dem offiziellen, vortrainierten COCO Gewichte (yolov5m.pt). Wir haben drei Szenarien verglichen: das Trainieren aller Schichten (--freeze 0), das Einfrieren des Backbones (--freeze 10), und das Einfrieren aller Schichten außer den letzten Erkennungsschichten (--freeze 24), oder Auto-Modus mit angegebener Auslastungsfraktion (

# Example command for training with backbone frozen
python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml --freeze 10

Genauigkeitsergebnisse

Die Ergebnisse zeigen, dass das Einfrieren von Layern das Training erheblich beschleunigen kann, aber zu einer leichten Reduzierung der endgültigen mAP (Mean Average Precision) führen kann. Das Trainieren aller Layer führt im Allgemeinen zur besten Genauigkeit, während das Einfrieren von mehr Layern ein schnelleres Training ermöglicht, jedoch möglicherweise zu Lasten der Leistung geht.

Training mAP50 Ergebnisse im Vergleich verschiedener Einfrierstrategien mAP50-Vergleich während des Trainings

Training mAP50-95 Ergebnisse im Vergleich verschiedener Einfrierstrategien mAP50-95-Vergleich während des Trainings

Tabelle zur Zusammenfassung der Leistungsergebnisse Zusammenfassende Tabelle der Leistungsmetriken

Ressourcenauslastung

Das Einfrieren von mehr Layern reduziert den GPU-Speicherbedarf und die Gesamtauslastung erheblich. Dies macht Transfer Learning mit eingefrorenen Layern zu einer attraktiven Option, wenn mit begrenzten Hardwareressourcen gearbeitet wird, da das Training größerer Modelle oder die Verwendung größerer Bildgrößen ermöglicht wird, als dies sonst möglich wäre.

Prozentsatz des zugewiesenen GPU-Speichers während des Trainings GPU-Speicher zugewiesen (%)

Prozentsatz der GPU-Speicherauslastung während des Trainings GPU-Auslastung (%)

Wann Layer Freezing verwendet werden sollte

Das Einfrieren von Schichten während des Transferlernens ist in verschiedenen Situationen besonders vorteilhaft:

  1. Begrenzte Rechenressourcen: Wenn Sie Einschränkungen hinsichtlich GPU-Speicher oder Rechenleistung haben.
  2. Kleine Datensätze: Wenn Ihr Zieldatensatz deutlich kleiner ist als der ursprüngliche Pre-Training-Datensatz, hilft das Einfrieren, Overfitting zu verhindern.
  3. Schnelle Prototypenerstellung: Wenn Sie ein bestehendes Modell schnell an eine neue Aufgabe oder Domäne zur ersten Evaluierung anpassen müssen.
  4. Ähnliche Feature-Domänen: Wenn die Low-Level-Features in Ihrem neuen Datensatz denen in dem Datensatz, mit dem das Modell vortrainiert wurde, sehr ähnlich sind.

Erfahre mehr über die Nuancen des Transferlernens in unserem Glossareintrag und ziehe Techniken wie Hyperparameter-Optimierung in Betracht, um die Leistung zu optimieren.

Unterstützte Umgebungen

Ultralytics bietet verschiedene sofort einsatzbereite Umgebungen mit wesentlichen Abhängigkeiten wie CUDA, CuDNN, Python und PyTorch, die vorinstalliert sind.

Projektstatus

YOLOv5 Kontinuierlicher Integrationsstatus

Dieses Badge bestätigt, dass alle YOLOv5 GitHub Actions Continuous Integration (CI)-Tests erfolgreich bestanden wurden. Diese CI-Tests bewerten die Funktionalität und Leistung von YOLOv5 bei wichtigen Operationen rigoros: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu und werden automatisch alle 24 Stunden und bei jedem neuen Code-Commit ausgeführt.



📅 Erstellt vor 1 Jahr ✏️ Aktualisiert vor 4 Monaten

Kommentare