Zum Inhalt springen

Transferlernen mit eingefrorenen Schichten

📚 In dieser Anleitung wird erklärt, wie man YOLOv5 🚀 Schichten beim Transferlernen einfriert. Transferlernen ist eine nützliche Methode, um ein Modell schnell auf neue Daten zu trainieren, ohne dass das gesamte Netz neu trainiert werden muss. Stattdessen wird ein Teil der ursprünglichen Gewichte eingefroren und der Rest der Gewichte wird zur Berechnung des Verlusts verwendet und vom Optimierer aktualisiert. Dies erfordert weniger Ressourcen als ein normales Training und ermöglicht kürzere Trainingszeiten, kann aber auch zu einer Verringerung der endgültigen Trainingsgenauigkeit führen.

Bevor du anfängst

Klone das Repo und installiere die requirements.txt in einem Python>=3.8.0 Umgebung, einschließlich PyTorch>=1.8. Modelle und Datensätze werden automatisch von der neuesten YOLOv5 Version heruntergeladen.

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

Backbone einfrieren

Alle Ebenen, die der train.py entsprechen freeze Liste in train.py werden eingefroren, indem ihre Gradienten auf Null gesetzt werden, bevor das Training beginnt.

# Freeze
freeze = [f'model.{x}.' for x in range(freeze)]  # layers to freeze
for k, v in model.named_parameters():
    v.requires_grad = True  # train all layers
    if any(x in k for x in freeze):
        print(f'freezing {k}')
        v.requires_grad = False

Um eine Liste der Modulnamen zu sehen:

for k, v in model.named_parameters():
    print(k)

"""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
...
model.23.m.0.cv2.bn.weight
model.23.m.0.cv2.bn.bias
model.24.m.0.weight
model.24.m.0.bias
model.24.m.1.weight
model.24.m.1.bias
model.24.m.2.weight
model.24.m.2.bias
"""

Wenn wir uns die Modellarchitektur ansehen, sehen wir, dass das Rückgrat des Modells die Schichten 0-9 sind:

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  - [-1, 1, Conv, [64, 6, 2, 2]]  # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4
  - [-1, 3, C3, [128]]
  - [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
  - [-1, 6, C3, [256]]
  - [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 9, C3, [512]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C3, [1024]]
  - [-1, 1, SPPF, [1024, 5]]  # 9


# YOLOv5 v6.0 head
head:
  - [-1, 1, Conv, [512, 1, 1]]
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 6], 1, Concat, [1]]  # cat backbone P4
  - [-1, 3, C3, [512, False]]  # 13

  - [-1, 1, Conv, [256, 1, 1]]
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P3
  - [-1, 3, C3, [256, False]]  # 17 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 14], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C3, [512, False]]  # 20 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C3, [1024, False]]  # 23 (P5/32-large)

  - [[17, 20, 23], 1, Detect, [nc]]  # Detect(P3, P4, P5)

Wir können also die Freeze-Liste so definieren, dass sie alle Module enthält, die 'model.0.' - 'model.9.' in ihrem Namen enthalten:

python train.py --freeze 10

Alle Ebenen einfrieren

Um das gesamte Modell mit Ausnahme der letzten Ausgangsfaltungsschichten in Detect() einzufrieren, setzen wir freeze list so, dass es alle Module mit 'model.0. - model.23.' in ihrem Namen enthalten:

python train.py --freeze 24

Ergebnisse

Wir trainieren YOLOv5m auf VOC für die beiden oben genannten Szenarien zusammen mit einem Standardmodell (kein Einfrieren), ausgehend von den offiziellen COCO Pre-Trainings --weights yolov5m.pt:

train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml

Genauigkeitsvergleich

Die Ergebnisse zeigen, dass das Einfrieren das Training beschleunigt, aber die endgültige Genauigkeit leicht verringert.

Einfrieren von Trainingsergebnissen mAP50

Gefriertraining mAP50-95 Ergebnisse

Tabellenergebnisse

Vergleich der GPU-Auslastung

Interessanterweise ist die GPU-Auslastung umso geringer, je mehr Module eingefroren werden und je weniger GPU-Speicher für das Training benötigt wird. Dies deutet darauf hin, dass größere Modelle oder Modelle, die mit einer größeren Bildgröße trainiert werden, vom Einfrieren profitieren können, um schneller zu trainieren.

Zugewiesener GPU-Speicher für Schulungen in Prozent

GPU-Speicherauslastung beim Training in Prozent

Unterstützte Umgebungen

Ultralytics bietet eine Reihe gebrauchsfertiger Umgebungen, die jeweils mit wichtigen Abhängigkeiten wie CUDA, CUDNN vorinstalliert sind, Python, und PyTorch, um deine Projekte zu starten.

Projektstatus

YOLOv5 CI

Dieses Abzeichen zeigt an, dass alle YOLOv5 GitHub Actions Continuous Integration (CI) Tests erfolgreich bestanden wurden. Diese CI-Tests überprüfen die Funktionalität und Leistung von YOLOv5 in verschiedenen Bereichen: Training, Validierung, Inferenz, Export und Benchmarks. Sie gewährleisten einen konsistenten und zuverlässigen Betrieb unter macOS, Windows und Ubuntu. Die Tests werden alle 24 Stunden und bei jeder neuen Übertragung durchgeführt.



Erstellt am 2023-11-12, Aktualisiert am 2024-01-14
Autoren: glenn-jocher (4)

Kommentare