YOLO Vision 2026:

YOLO auf einem benutzerdefinierten Datensatz feinabstimmen#

Feinabstimmung passt ein vortrainiertes Modell an, damit es neue Klassen erkennt. Dabei wird mit erlernten Gewichten statt mit einer zufälligen Initialisierung begonnen. Statt das Modell Hunderte von Epochen von Grund auf zu trainieren, nutzt die Feinabstimmung vortrainierte COCO-Merkmale und konvergiert in einem Bruchteil der Zeit auf benutzerdefinierten Daten.

Dieser Leitfaden behandelt die Feinabstimmung von YOLO26 auf benutzerdefinierten Datensätzen – von der grundlegenden Nutzung bis zu fortgeschrittenen Techniken wie dem Einfrieren von Layern und dem zweistufigen Training.

Feinabstimmung im Vergleich zum Training von Grund auf#

Ein vortrainiertes Modell hat bereits allgemeine visuelle Merkmale gelernt – Kantenerkennung, Texterkennung und Formverständnis – und zwar aus Millionen von Bildern. Transferlernen durch Feinabstimmung nutzt dieses Wissen wieder und bringt dem Modell nur bei, wie die neuen Klassen aussehen. Dadurch konvergiert es schneller und benötigt weniger Daten. Beim Training von Grund auf wird dieses gesamte Wissen verworfen, sodass das Modell alles ausgehend von Pixelmustern neu lernen muss, was deutlich mehr Ressourcen erfordert. Im Leitfaden zur YAML-Konfiguration von Modellen erfährst du, wie sich reine Architekturdateien .yaml von Checkpoints unterscheiden.

FeinabstimmungTraining von Grund auf
StartgewichteAuf COCO vortrainiert (80 Klassen)Zufällige Initialisierung
BefehlYOLO("yolo26n.pt")YOLO("yolo26n.yaml")
KonvergenzSchneller – das Backbone ist bereits trainiertLangsamer – alle Layer lernen von Grund auf
DatenanforderungenGeringer – vortrainierte Merkmale gleichen weniger Daten ausHöher – das Modell muss alle Merkmale allein aus dem Datensatz lernen
Wann verwendenBenutzerdefinierte Klassen mit natürlichen BildernDomänen, die sich grundlegend von COCO unterscheiden (medizinisch, Satelliten, Radar)
Für die Feinabstimmung ist kein zusätzlicher Code erforderlich

Wenn eine .pt-Datei mit YOLO("yolo26n.pt") geladen wird, werden die vortrainierten Gewichte im Modell gespeichert. Der anschließende Aufruf von .train(data="custom.yaml") überträgt automatisch alle kompatiblen Gewichte auf die neue Modellarchitektur, initialisiert nicht passende Layer neu (beispielsweise den Erkennungskopf, wenn sich die Klassenanzahl unterscheidet) und beginnt mit dem Training. Das manuelle Laden von Gewichten, die Bearbeitung von Layern oder benutzerdefinierter Transferlerncode ist nicht erforderlich.

So funktioniert die Übertragung vortrainierter Gewichte#

Wenn ein vortrainiertes Modell auf einem Datensatz mit einer anderen Klassenanzahl feinabgestimmt wird (beispielsweise von 80 COCO-Klassen auf 5 benutzerdefinierte Klassen), führt Ultralytics eine formbewusste Gewichtsübertragung durch:

  1. Backbone und Neck werden vollständig übertragen – diese Layer extrahieren allgemeine visuelle Merkmale, und ihre Formen sind unabhängig von der Klassenanzahl.
  2. Der Erkennungskopf wird teilweise neu initialisiert – die Klassifikationsausgabelayer (cv3, one2one_cv3) haben Formen, die an die Klassenanzahl gebunden sind (80 gegenüber 5). Kompatible Zeilen mit übereinstimmenden Klassennamen werden vor der Initialisierung nicht übereinstimmender Zeilen neu zugeordnet. Die Box-Regressionslayer (cv2, one2one_cv2) im Kopf haben unabhängig von der Klassenanzahl feste Formen und werden daher normal übertragen.
  3. Der weitaus größte Teil der Gewichte wird übertragen, wenn die Klassenanzahl geändert wird. Bei der Feinabstimmung von YOLO26n von COCO (80 Klassen) auf einen Datensatz mit 5 Klassen werden beispielsweise 606 von 708 Gewichtstensoren übertragen, zusätzlich zu allen kompatiblen Klassifikationszeilen, die anhand ihres Namens zugeordnet wurden.

Bei Datensätzen mit derselben Klassenanzahl wie das vortrainierte Modell werden 100 % der Gewichte übertragen, einschließlich des Erkennungskopfs (beispielsweise bei der Feinabstimmung von auf COCO vortrainierten Gewichten auf einem anderen Datensatz mit 80 Klassen).

Klassen mit Namensaliasen übertragen#

Ultralytics überträgt übereinstimmende Zeilen des Klassifikationskopfs anhand des Klassennamens zwischen Datensätzen und ignoriert dabei Groß- und Kleinschreibung sowie umgebende Leerzeichen. Wenn gleichwertige Klassen unterschiedliche Namen verwenden, benenne die Klassen des Quell-Checkpoints vor dem Laden im Speicher um. Dadurch bleiben vortrainierte Klassifikationsgewichte für gemeinsame Konzepte erhalten, die andernfalls als nicht übereinstimmend behandelt und zufällig initialisiert würden.

Dieses Beispiel zur Umwandlung von Objects365 v2 in COCO benennt die Quellklassen im geladenen Checkpoint um. train() übernimmt sie anschließend als vortrainierte Gewichte:

from ultralytics import YOLO

# Source Objects365 v2 name (lowercased) -> target COCO name
ALIASES = {
    "wild bird": "bird",
    "handbag/satchel": "handbag",
    "luggage": "suitcase",
    "bowl/basin": "bowl",
    "orange/tangerine": "orange",
    "monitor/tv": "tv",
    "stuffed toy": "teddy bear",
    "hair dryer": "hair drier",
}

model = YOLO("path/to/yolo26s-objects365.pt")
# Objects365 class names are Title-Cased, so match on the lowercased name
model.model.names = {i: ALIASES.get(name.lower(), name) for i, name in model.model.names.items()}
model.train(data="coco.yaml", epochs=100, imgsz=640)

Die Einstellung cls_remap aktiviert diese namensbasierte Übertragung standardmäßig. Während des Trainings wird Remapped N/M cls head rows from pretrained weights by class name ausgegeben, wenn kompatible Zeilen kopiert werden. Setze cls_remap=False, um die Funktion zu deaktivieren.

Beispiel für eine grundlegende Feinabstimmung#

Beispiel
from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # load pretrained model
model.train(data="custom.yaml", epochs=50, imgsz=640)

Auswahl der Modellgröße#

Größere Modelle bieten mehr Kapazität, haben aber auch mehr zu aktualisierende Parameter. Dadurch kann sich bei begrenzten Trainingsdaten das Risiko einer Überanpassung erhöhen. Ein praktischer Ansatz ist, mit einem kleineren Modell (YOLO26n oder YOLO26s) zu beginnen und erst dann zu skalieren, wenn die Validierungsmetriken stagnieren. Die optimale Modellgröße hängt von der Komplexität der Aufgabe, der Klassenanzahl, der Vielfalt des Datensatzes und der für die Bereitstellung verfügbaren Hardware ab. Auf der vollständigen YOLO26-Modellseite findest du verfügbare Größen und Leistungsbenchmarks.

Auswahl von Optimierer und Lernrate#

Die Standardeinstellung optimizer=auto wählt den Optimierer und die Lernrate anhand der Gesamtzahl der Trainingsiterationen aus:

  • 10.000 Iterationen oder weniger (kleine Datensätze oder wenige Epochen): AdamW mit einer niedrigen, automatisch berechneten Lernrate
  • Mehr als 10.000 Iterationen (große Datensätze): MuSGD (ein hybrider Muon+SGD-Optimierer) mit lr=0.01

Für die meisten Feinabstimmungsaufgaben funktioniert die Standardeinstellung ohne manuelle Anpassung gut. Lege den Optimierer explizit fest, wenn:

  • Das Training instabil ist (der Verlust stark ansteigt oder divergiert): Verwende optimizer=AdamW, lr0=0.001 für eine stabilere Konvergenz
  • Ein großes Modell auf einem kleinen Datensatz feinabgestimmt wird: Ein explizit festgelegter Optimierer mit niedrigerer Lernrate, beispielsweise optimizer=AdamW, lr0=0.001, kann dabei helfen, vortrainierte Merkmale zu erhalten
Automatischer Optimierer überschreibt manuelles lr0

Wenn optimizer=auto verwendet wird, werden die Werte lr0 und momentum ignoriert. Um die Lernrate manuell zu steuern, lege den Optimierer explizit fest: optimizer=SGD, lr0=0.005.

Layer einfrieren#

Das Einfrieren verhindert, dass bestimmte Layer während des Trainings aktualisiert werden. Dies beschleunigt das Training und reduziert die Überanpassung, wenn der Datensatz im Verhältnis zur Modellkapazität klein ist.

Der Parameter freeze akzeptiert entweder eine Ganzzahl oder eine Liste. Eine Ganzzahl freeze=10 friert die ersten 10 Layer (Indizes 0–9) ein, die den größten Teil des YOLO26-Backbones abdecken. Das Backbone erstreckt sich über die Layer 0–10. Daher lässt freeze=10 den letzten C2PSA-Block (Layer 10) trainierbar. Verwende freeze=11, um das gesamte Backbone einzufrieren. Eine Liste kann Layerindizes wie freeze=[0, 3, 5] für ein teilweises Einfrieren des Backbones oder Modulnamenszeichenfolgen wie freeze=["23.cv2", "23.one2one_cv2"] für eine detaillierte Steuerung bestimmter Zweige innerhalb eines Layers enthalten (hier beider Box-Regressionszweige des Erkennungskopfs).

Beispiel
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=50, freeze=10)

Die richtige Tiefe des Einfrierens hängt davon ab, wie ähnlich die Zieldomäne den vortrainierten Daten ist und wie viele Trainingsdaten verfügbar sind:

SzenarioEmpfehlungBegründung
Großer Datensatz, ähnliche Domänefreeze=None (Standard)Es sind genügend Daten vorhanden, um alle Layer ohne Überanpassung anzupassen
Kleiner Datensatz, ähnliche Domänefreeze=10Erhält die Merkmale des Backbones und reduziert die Anzahl trainierbarer Parameter
Sehr kleiner Datensatzfreeze=23Nur der Erkennungskopf wird trainiert, wodurch das Risiko einer Überanpassung minimiert wird
Domäne weit von COCO entferntfreeze=NoneDie Merkmale des Backbones lassen sich möglicherweise nicht gut übertragen und müssen neu trainiert werden

Die Tiefe des Einfrierens kann auch als Hyperparameter behandelt werden. Einige Werte (0, 5, 10) auszuprobieren und die Validierungs-mAP zu vergleichen, ist eine praktische Möglichkeit, die beste Einstellung für einen bestimmten Datensatz zu finden.

Wichtige Hyperparameter für die Feinabstimmung#

Für die Feinabstimmung sind im Allgemeinen weniger Anpassungen der Hyperparameter erforderlich als für das Training von Grund auf. Die wichtigsten Parameter sind:

  • epochs: Die Feinabstimmung konvergiert schneller als das Training von Grund auf. Beginne mit einem moderaten Wert und verwende patience, um das Training frühzeitig zu beenden, wenn die Validierungsmetriken stagnieren.
  • patience: Der Standardwert 100 ist für lange Trainingsläufe ausgelegt. Eine Reduzierung auf 10–20 verhindert, dass Zeit für bereits konvergierte Läufe verschwendet wird.
  • warmup_epochs: Das Warmup führt die Lernrate während der ersten Epochen schrittweise an ihren geplanten Wert heran, sodass frühe Batches die vortrainierten Merkmale weniger wahrscheinlich beeinträchtigen. Behalte bei der Feinabstimmung einen Wert ungleich null bei. Das vollständige Warmup von 3 Epochen ist jedoch nicht erforderlich: Die evolutionäre Suche hinter der offiziellen YOLO26-COCO-Feinabstimmung – einer Fortsetzung über mehrere Epochen ausgehend von Objects365-Gewichten – legte für jede Modellgröße ungefähr eine Epoche fest.

Die vollständige Liste der Trainingsparameter findest du in der Referenz zur Trainingskonfiguration. Für Verhalten, das sich über die Parameter nicht steuern lässt – etwa Lernraten pro Layer, Gradientenbeschneidung oder benutzerdefinierte Validierungsmetriken – leite den Trainer ab.

Zweistufige Feinabstimmung#

Bei der zweistufigen Feinabstimmung wird das Training in zwei Phasen aufgeteilt. In der ersten Phase wird das Backbone eingefroren und nur der Neck und der Kopf trainiert. Dadurch können sich die Erkennungslayer an die neuen Klassen anpassen, ohne die vortrainierten Merkmale zu beeinträchtigen. In der zweiten Phase werden alle Layer freigegeben und das vollständige Modell wird mit einer niedrigeren Lernrate trainiert, um das Backbone für die Zieldomäne zu verfeinern.

Dieser Ansatz ist besonders nützlich, wenn sich die Zieldomäne deutlich von COCO unterscheidet (medizinische Bilder, Luftaufnahmen, Mikroskopie). In solchen Fällen muss das Backbone möglicherweise angepasst werden, während das gleichzeitige Training aller Layer zu Instabilität führt. Informationen zum automatischen Freigeben mithilfe eines Callback-basierten Ansatzes findest du unter Backbone einfrieren und freigeben.

Zweistufige Feinabstimmung
from ultralytics import YOLO

# Stage 1: freeze backbone, train head and neck
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)

# Stage 2: unfreeze all, fine-tune with lower lr
model = YOLO("runs/detect/stage1/weights/best.pt")
model.train(data="custom.yaml", epochs=30, optimizer="AdamW", lr0=0.001, name="stage2", exist_ok=True)

Häufige Probleme#

Das Modell erzeugt keine Vorhersagen#

  • Unzureichende Trainingsdaten: Das Training mit sehr wenigen Beispielen ist die häufigste Ursache. Das Modell kann aus zu wenigen Daten weder lernen noch verallgemeinern. Stelle sicher, dass vor der Untersuchung anderer Ursachen genügend vielfältige Beispiele pro Klasse vorhanden sind.

  • Datensatzpfade prüfen: Ungültige Bildpfade lösen einen Datensatzfehler aus. Einzelne fehlende oder leere Labeldateien werden als Hintergrundbilder behandelt und während des Scannens gemeldet. Ein Trainingssplit ohne Labels löst einen Fehler aus. Validiere den Datensatz vor dem Training:

    yolo detect val model=yolo26n.pt data=custom.yaml
  • Konfidenzschwellenwert senken: Wenn Vorhersagen vorhanden sind, aber herausgefiltert werden, versuche conf=0.1 während der Inferenz.

  • Klassenanzahl überprüfen: Stelle sicher, dass nc in data.yaml mit der tatsächlichen Klassenanzahl in den Labeldateien übereinstimmt.

Validierungs-mAP stagniert früh#

  • Mehr Daten hinzufügen: Die Feinabstimmung profitiert deutlich von zusätzlichen Trainingsdaten, insbesondere von vielfältigen Beispielen mit unterschiedlichen Blickwinkeln, Beleuchtungsbedingungen und Hintergründen.
  • Klassenverteilung prüfen: Unterrepräsentierte Klassen weisen eine niedrige AP auf. Füge weitere Beispiele hinzu oder passe cls_pw anhand des Validierungssets an.
  • Augmentierung reduzieren: Bei sehr kleinen Datensätzen kann eine starke Augmentierung mehr schaden als nutzen. Versuche mosaic=0.5 oder mosaic=0.0.
  • Auflösung erhöhen: Bei Datensätzen mit kleinen Objekten kannst du imgsz=1280 ausprobieren, um Details zu erhalten.

Leistung bei ursprünglichen Klassen verschlechtert sich nach der Feinabstimmung#

Dieses Phänomen wird als katastrophales Vergessen bezeichnet. Das Modell verliert zuvor gelerntes Wissen, wenn es ausschließlich auf neuen Daten feinabgestimmt wird. Ohne Bilder des ursprünglichen Datensatzes zusammen mit den neuen Daten lässt sich das Vergessen meist nicht vermeiden. So kannst du es abmildern:

  • Datensätze zusammenführen: Füge während der Feinabstimmung neben den neuen Klassen auch Beispiele der ursprünglichen Klassen ein. Dies ist die einzige zuverlässige Möglichkeit, das Vergessen zu verhindern.
  • Backbone und Neck einfrieren: Wenn sowohl das Backbone als auch der Neck eingefroren werden und nur der Erkennungskopf trainiert wird, kann dies bei kurzen Feinabstimmungsläufen mit sehr niedriger Lernrate hilfreich sein.
  • Weniger Epochen trainieren: Je länger das Modell ausschließlich mit neuen Daten trainiert wird, desto stärker nimmt das Vergessen zu.

FAQ#

  • Es gibt kein festgelegtes Minimum. Die Ergebnisse hängen von der Komplexität der Aufgabe, der Klassenanzahl und der Ähnlichkeit der Domäne zu COCO ab. Vielfältigere Bilder (unterschiedliche Beleuchtung, Blickwinkel und Hintergründe) sind wichtiger als die reine Anzahl. Beginne mit den verfügbaren Daten und erweitere sie, wenn die Validierungsmetriken nicht ausreichen.

  • Lade eine vortrainierte .pt-Datei und rufe .train() mit dem Pfad zu einer benutzerdefinierten data.yaml auf. Ultralytics übernimmt automatisch die Gewichtsübertragung, die Neuinitialisierung des Erkennungskopfs und die Auswahl des Optimierers. Im Abschnitt Grundlegende Feinabstimmung findest du das vollständige Codebeispiel.

  • Die häufigsten Ursachen sind ungültige Bildpfade, fehlende oder leere Labeldateien, eine Abweichung zwischen nc in der YAML-Datei und den tatsächlichen Labeldateien oder ein zu hoher Konfidenzschwellenwert. Eine vollständige Checkliste zur Fehlerbehebung findest du unter Häufige Probleme.

  • Das hängt von der Datensatzgröße und der Ähnlichkeit der Domäne ab. Bei kleinen Datensätzen mit einer COCO ähnlichen Domäne verhindert das Einfrieren des Backbones (freeze=10) eine Überanpassung. Bei Domänen, die sich stark von COCO unterscheiden, ermöglicht das Freigeben aller Layer (freeze=None) die Anpassung des Backbones. Detaillierte Empfehlungen findest du unter Layer einfrieren.

  • Füge neben den neuen Klassen auch Beispiele der ursprünglichen Klassen in die Trainingsdaten ein. Wenn das nicht möglich ist, hilft das Einfrieren weiterer Layer (freeze=10 oder höher) zusammen mit einer niedrigeren Lernrate, das vortrainierte Wissen zu bewahren. Weitere Informationen findest du unter Leistung bei ursprünglichen Klassen verschlechtert sich.

Kommentare