Zum Inhalt springen

Transferlernen mit eingefrorenen Schichten in YOLOv5

📚 Dieser Leitfaden erklärt, wie man YOLOv5 🚀 Layer einfriert, wenn Transfer Learning implementiert wird. Transfer Learning ist eine leistungsstarke Machine-Learning (ML)-Technik, mit der Sie ein Modell schnell mit neuen Daten nachtrainieren können, ohne das gesamte Netzwerk von Grund auf neu zu trainieren. Indem Sie die Gewichtungen der anfänglichen Layer einfrieren und nur die Parameter späterer Layer aktualisieren, 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; bei allen Modulen vor diesem Index werden die Gewichte eingefroren. verwenden model.model (a nn.Sequential), um die Modulreihenfolge zu überprüfen, wenn Sie bestätigen müssen, welche Indizes einem bestimmten Block entsprechen.

Nur Backbone einfrieren

Einfrieren des gesamten Backbone (Schichten 0 bis 9), was bei der Anpassung des Modells an neue Objektklassen üblich ist, wobei die allgemeinen Fähigkeiten zur Merkmalsextraktion, die aus einem großen Datensatz wie COCO:

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

Diese Strategie ist effektiv, wenn Ihr Zieldatensatz ähnliche visuelle Merkmale auf niedriger Ebene (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 für 50 Epochen, beginnend mit dem offiziellen COCO-vorab trainierten 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 Schichten das Training erheblich beschleunigen kann, aber zu einer leichten Verringerung der endgültigen mAP (mittlere durchschnittliche Genauigkeit) führen kann. Das Training aller Schichten ergibt im Allgemeinen die beste Genauigkeit, während das Einfrieren mehrerer Schichten ein schnelleres Training auf Kosten einer potenziell geringeren Leistung ermöglicht.

mAP50 beim Vergleich verschiedener GefrierstrategienmAP50 während des Trainings

Ergebnisse des mAP50 zum Vergleich verschiedener GefrierstrategienmAP50 während der Ausbildung

Tabelle zur Zusammenfassung der LeistungsergebnisseZusammenfassende 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 TrainingsGPU-Speicher zugewiesen (%)

Prozentsatz der GPU-Speicherauslastung während des TrainingsGPU-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 2 Jahren ✏️ Aktualisiert vor 17 Tagen
glenn-jocherUltralyticsAssistantRizwanMunawar

Kommentare