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 SchlĂŒsselbereichen: 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