YOLO auf einem benutzerdefinierten Datensatz feinabstimmen#
Feinabstimmung passt ein vortrainiertes Modell an, damit es neue Klassen erkennt. Dabei werden gelernte Gewichte als Ausgangspunkt verwendet, statt mit zufälligen Werten zu beginnen. Statt Hunderte Epochen von Grund auf zu trainieren, nutzt die Feinabstimmung vortrainierte Merkmale aus COCO und konvergiert in einem Bruchteil der Zeit auf benutzerdefinierten Daten.
Diese Anleitung behandelt die Feinabstimmung von YOLO26 auf benutzerdefinierten Datensätzen – von der grundlegenden Verwendung bis hin zu fortgeschrittenen Techniken wie dem Einfrieren von Layern und dem Training in zwei Phasen.
Feinabstimmung im Vergleich zum Training von Grund auf#
Ein vortrainiertes Modell hat bereits anhand von Millionen Bildern allgemeine visuelle Merkmale gelernt – Kantenerkennung, Tex turerkennung und Formerkennung. Beim Transferlernen durch Feinabstimmung wird dieses Wissen wiederverwendet. Dem Modell wird lediglich beigebracht, wie die neuen Klassen aussehen. Deshalb konvergiert es schneller und benötigt weniger Daten. Beim Training von Grund auf geht all dieses Wissen verloren, und das Modell muss alles anhand von Pixelmustern neu lernen, was deutlich mehr Ressourcen erfordert. In der Anleitung zur Model-YAML-Konfiguration erfährst du, worin sich Dateien .yaml, die nur die Architektur beschreiben, von Checkpoints unterscheiden.
| Feinabstimmung | Training von Grund auf | |
|---|---|---|
| Ausgangsgewichte | Auf COCO vortrainiert (80 Klassen) | Zufällige Initialisierung |
| Befehl | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Konvergenz | Schneller – das Backbone wurde bereits trainiert | Langsamer – alle Layer lernen von Grund auf |
| Datenbedarf | Geringer – vortrainierte Merkmale gleichen die geringere Datenmenge aus | Höher – das Modell muss alle Merkmale allein anhand des Datensatzes lernen |
| Anwendungsfall | Benutzerdefinierte Klassen mit natürlichen Bildern | Bereiche, die sich grundlegend von COCO unterscheiden (Medizin, Satelliten, Radar) |
Wird eine Datei .pt mit YOLO("yolo26n.pt") geladen, werden die vortrainierten Gewichte im Modell gespeichert. Wird anschließend .train(data="custom.yaml") aufgerufen, überträgt das Modell automatisch alle kompatiblen Gewichte auf die neue Modellarchitektur, initialisiert nicht passende Layer neu (etwa den Erkennungskopf, wenn sich die Anzahl der Klassen unterscheidet) und startet das Training. Das manuelle Laden von Gewichten, Bearbeiten von Layern oder benutzerdefinierter Transfer-Learning-Code ist nicht erforderlich.
So funktioniert die Übertragung vortrainierter Gewichte#
Wird ein vortrainiertes Modell auf einem Datensatz mit einer anderen Anzahl von Klassen feinabgestimmt (zum Beispiel von den 80 COCO-Klassen auf 5 benutzerdefinierte Klassen), überträgt Ultralytics die Gewichte unter Berücksichtigung der Tensorformen:
- Backbone und Neck werden vollständig übernommen – diese Layer extrahieren allgemeine visuelle Merkmale. Ihre Formen sind unabhängig von der Anzahl der Klassen.
- Der Erkennungskopf wird teilweise neu initialisiert – die Klassifizierungsausgabeschichten (
cv3,one2one_cv3) haben Formen, die von der Anzahl der Klassen abhängen (80 gegenüber 5). Kompatible Zeilen mit übereinstimmenden Klassennamen werden zugeordnet, bevor nicht passende Zeilen initialisiert werden. Die Box-Regressionsschichten (cv2,one2one_cv2) im Kopf haben unabhängig von der Klassenanzahl feste Formen und werden daher regulär übernommen. - Beim Ändern der Klassenanzahl wird der weit überwiegende Teil der Gewichte übernommen. Bei der Feinabstimmung von YOLO26n mit COCO (80 Klassen) auf einen Datensatz mit 5 Klassen werden beispielsweise 606 von 708 Gewichtstensoren übertragen, zusätzlich zu allen kompatiblen Klassifizierungszeilen, die anhand ihres Namens zugeordnet werden.
Bei Datensätzen mit derselben Klassenanzahl wie das vortrainierte Modell (zum Beispiel bei der Feinabstimmung von auf COCO vortrainierten Gewichten auf einem anderen Datensatz mit 80 Klassen) werden 100 % der Gewichte einschließlich des Erkennungskopfs übernommen.
Klassen mithilfe von Namensaliasen zuordnen#
Ultralytics überträgt übereinstimmende Zeilen des Klassifizierungskopfs zwischen Datensätzen anhand des Klassennamens. Groß- und Kleinschreibung sowie Leerzeichen am Anfang und Ende werden dabei ignoriert. Haben gleichbedeutende Klassen unterschiedliche Namen, benenne die Klassen des Quell-Checkpoints vor dem Laden im Arbeitsspeicher um. So bleiben vortrainierte Klassifizierungsgewichte für gemeinsame Konzepte erhalten, die andernfalls als nicht zugeordnet gelten und zufällig initialisiert würden.
Dieses Objects365-Beispiel zur Umwandlung von v2 in COCO benennt die Quellklassen im geladenen Checkpoint um, den train() anschließend als vortrainierte Gewichte weitergibt:
from ultralytics import YOLO
# Quellname der Objects365 v2-Klasse (kleingeschrieben) -> Zielname der COCO-Klasse
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")
# Die Klassennamen in Objects365 sind in Titelschreibung angegeben. Daher erfolgt der Abgleich anhand des kleingeschriebenen Namens.
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. Mit cls_remap=False kannst du die Funktion deaktivieren.
Beispiel für eine einfache Feinabstimmung#
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # vortrainiertes Modell laden
model.train(data="custom.yaml", epochs=50, imgsz=640)Modellgröße auswählen#
Größere Modelle bieten mehr Kapazität, haben aber auch mehr Parameter, die aktualisiert werden müssen. Bei begrenzten Trainingsdaten kann dadurch die Gefahr einer Überanpassung steigen. Ein praktischer Ansatz ist, mit einem kleineren Modell (YOLO26n oder YOLO26s) zu beginnen und die Modellgröße nur dann zu erhöhen, wenn sich die Validierungsmetriken nicht mehr verbessern. Die optimale Modellgröße hängt von der Komplexität der Aufgabe, der Anzahl der Klassen, 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.
Optimizer und Lernrate auswählen#
Die Standardeinstellung optimizer=auto wählt den Optimizer 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-Optimizer) mit lr=0.01
Bei den meisten Feinabstimmungsaufgaben funktioniert die Standardeinstellung ohne manuelle Anpassungen gut. Lege den Optimizer ausdrücklich fest, wenn:
- Das Training instabil ist (der Verlust stark ansteigt oder divergiert): Versuche
optimizer=AdamW, lr0=0.001, um eine stabilere Konvergenz zu erreichen. - Ein großes Modell auf einem kleinen Datensatz feinabgestimmt wird: Ein ausdrücklich festgelegter Optimizer mit einer niedrigeren Lernrate, etwa
optimizer=AdamW, lr0=0.001, kann helfen, vortrainierte Merkmale zu erhalten.
Wenn optimizer=auto verwendet wird, werden die Werte lr0 und momentum ignoriert. Um die Lernrate manuell zu steuern, lege den Optimizer ausdrücklich fest: optimizer=SGD, lr0=0.005.
Layer einfrieren#
Beim Einfrieren werden bestimmte Layer während des Trainings nicht aktualisiert. Das beschleunigt das Training und verringert die Gefahr der Überanpassung, wenn der Datensatz im Verhältnis zur Modellkapazität klein ist.
Der Parameter freeze akzeptiert entweder eine Ganzzahl oder eine Liste. Mit der Ganzzahl freeze=10 werden die ersten 10 Layer eingefroren (Indizes 0–9), die den Großteil des YOLO26-Backbones ausmachen. Das Backbone umfasst die Layer 0–10. Daher lässt freeze=10 den letzten C2PSA-Block (Layer 10) trainierbar; mit freeze=11 frierst du das gesamte Backbone ein. Eine Liste kann Layer-Indizes wie freeze=[0, 3, 5] für das teilweise Einfrieren des Backbones oder Modulnamenszeichenfolgen wie freeze=["23.cv2", "23.one2one_cv2"] enthalten, um bestimmte Zweige innerhalb eines Layers gezielt zu steuern (hier beide Box-Regressionszweige des Erkennungskopfs).
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=50, freeze=10)Die geeignete Einfriertiefe hängt davon ab, wie ähnlich der Zieldomäne den vortrainierten Daten ist und wie viele Trainingsdaten verfügbar sind:
| Szenario | Empfehlung | Begründung |
|---|---|---|
| Großer Datensatz, ähnliche Domäne | freeze=None (Standard) | Genügend Daten, um alle Layer ohne Überanpassung anzupassen |
| Kleiner Datensatz, ähnliche Domäne | freeze=10 | Bewahrt Backbone-Merkmale und reduziert die Anzahl trainierbarer Parameter |
| Sehr kleiner Datensatz | freeze=23 | Nur der Erkennungskopf wird trainiert, wodurch das Risiko einer Überanpassung minimiert wird |
| Domäne unterscheidet sich stark von COCO | freeze=None | Backbone-Merkmale lassen sich möglicherweise nicht gut übertragen und müssen neu trainiert werden |
Die Einfriertiefe lässt sich auch als Hyperparameter behandeln. Einige Werte (0, 5, 10) auszuprobieren und die Validierungs-mAP zu vergleichen, ist ein praktischer Weg, um 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 nötig als für das Training von Grund auf. Am wichtigsten sind folgende Parameter:
epochs: Die Feinabstimmung konvergiert schneller als das Training von Grund auf. Beginne mit einem moderaten Wert und verwendepatience, um das Training vorzeitig zu beenden, sobald sich die Validierungsmetriken nicht mehr verbessern.patience: Der Standardwert 100 ist auf lange Trainingsläufe ausgelegt. Mit einem Wert von 10–20 vermeidest du, Zeit mit Trainingsläufen zu verschwenden, bei denen die Konvergenz bereits erreicht wurde.warmup_epochs: Das Aufwärmen führt die Lernrate über die ersten Epochen schrittweise an den geplanten Wert heran. Dadurch ist es weniger wahrscheinlich, dass frühe Batches vortrainierte Merkmale beeinträchtigen. Behalte beim Feinabstimmen einen Wert ungleich null bei, aber die standardmäßigen 3 Epochen sind nicht erforderlich: Die evolutionäre Suche hinter der offiziellen YOLO26-COCO-Feinabstimmung – einer Fortsetzung über mehrere Epochen mit Objects365-Gewichten – ergab für alle Modellgrößen etwa eine Epoche.
Die vollständige Liste der Trainingsparameter findest du in der Referenz zur Trainingskonfiguration. Wenn du Verhalten steuern möchtest, das sich nicht über die Parameter festlegen lässt – etwa Lernraten pro Layer, Gradient Clipping oder benutzerdefinierte Validierungsmetriken –, leite eine Trainer-Unterklasse ab.
Feinabstimmung in zwei Phasen#
Bei der Feinabstimmung in zwei Phasen wird das Training aufgeteilt. In der ersten Phase wird das Backbone eingefroren und nur Neck und Kopf werden trainiert. So können sich die Erkennungsschichten an die neuen Klassen anpassen, ohne vortrainierte Merkmale zu beeinträchtigen. In der zweiten Phase werden alle Layer freigegeben und das gesamte Modell wird mit einer niedrigeren Lernrate trainiert, um das Backbone für die Zieldomäne zu optimieren.
Dieser Ansatz eignet sich besonders, wenn sich die Zieldomäne deutlich von COCO unterscheidet (etwa bei medizinischen Bildern, Luftbildern oder Mikroskopie). In diesen 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 von Layern mithilfe eines Callbacks findest du unter Backbone einfrieren und freigeben.
from ultralytics import YOLO
# Phase 1: Backbone einfrieren, Kopf und Neck trainieren
model = YOLO("yolo26n.pt")
model.train(data="custom.yaml", epochs=20, freeze=10, name="stage1", exist_ok=True)
# Phase 2: alle Layer freigeben und mit einer niedrigeren lr feinabstimmen
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#
-
Zu wenige Trainingsdaten: Das Training mit sehr wenigen Beispielen ist die häufigste Ursache. Mit zu wenigen Daten kann das Modell weder lernen noch verallgemeinern. Stelle sicher, dass für jede Klasse genügend unterschiedliche Beispiele vorhanden sind, bevor du andere Ursachen untersuchst.
-
Datensatzpfade überprüfen: Ungültige Bildpfade verursachen einen Datensatzfehler. Einzelne fehlende oder leere Labeldateien werden als Hintergrundbilder behandelt und beim Einlesen gemeldet. Enthält ein Trainingssplit keine Labels, wird ein Fehler ausgelöst. Überprüfe den Datensatz vor dem Training:
yolo detect val model=yolo26n.pt data=custom.yaml -
Konfidenzschwelle senken: Wenn Vorhersagen vorhanden sind, aber herausgefiltert werden, versuche bei der Inferenz
conf=0.1. -
Klassenanzahl überprüfen: Stelle sicher, dass
ncindata.yamlmit der tatsächlichen Anzahl der Klassen in den Labeldateien übereinstimmt.
Die Validierungs-mAP stagniert früh#
- Mehr Daten hinzufügen: Zusätzliche Trainingsdaten verbessern die Feinabstimmung deutlich. Besonders hilfreich sind unterschiedliche Beispiele mit variierenden Blickwinkeln, Lichtverhältnissen und Hintergründen.
- Klassenverteilung überprüfen: Unterrepräsentierte Klassen haben einen niedrigen AP. Füge weitere Beispiele hinzu oder passe
cls_pwanhand des Validierungsdatensatzes an. - Augmentierung verringern: Bei sehr kleinen Datensätzen kann eine starke Augmentierung mehr schaden als nutzen. Versuche
mosaic=0.5odermosaic=0.0. - Auflösung erhöhen: Bei Datensätzen mit kleinen Objekten kannst du
imgsz=1280ausprobieren, um Details zu erhalten.
Die Leistung bei ursprünglichen Klassen verschlechtert sich nach der Feinabstimmung#
Dieses Phänomen wird als katastrophales Vergessen bezeichnet: Das Modell verliert zuvor erworbenes Wissen, wenn es ausschließlich mit neuen Daten feinabgestimmt wird. Ohne Bilder aus dem ursprünglichen Datensatz zusammen mit den neuen Daten lässt sich das Vergessen meist nicht vermeiden. So kannst du es begrenzen:
- Datensätze zusammenführen: Nimm bei der Feinabstimmung neben den neuen Klassen auch Beispiele der ursprünglichen Klassen auf. Nur so lässt sich das Vergessen zuverlässig verhindern.
- Backbone und Neck einfrieren: Wenn Backbone und Neck eingefroren werden, wird nur der Erkennungskopf trainiert. Das hilft bei kurzen Feinabstimmungsläufen mit einer sehr niedrigen Lernrate.
- Weniger Epochen trainieren: Je länger das Modell ausschließlich mit neuen Daten trainiert wird, desto stärker nimmt das Vergessen zu.
Häufig gestellte Fragen#
Es gibt keine feste Mindestanzahl. Die Ergebnisse hängen von der Komplexität der Aufgabe, der Anzahl der Klassen und der Ähnlichkeit der Domäne mit COCO ab. Unterschiedliche Bilder (mit variierenden Lichtverhältnissen, Blickwinkeln und Hintergründen) sind wichtiger als die reine Anzahl. Beginne mit den verfügbaren Daten und erweitere den Datensatz, wenn die Validierungsmetriken nicht ausreichen.
Lade eine vortrainierte Datei
.ptund rufe.train()mit dem Pfad zu einem benutzerdefiniertendata.yamlauf. Ultralytics übernimmt automatisch die Gewichtsübertragung, die Neuinitialisierung des Erkennungskopfs und die Auswahl des Optimizers. Das vollständige Codebeispiel findest du im Abschnitt Einfache Feinabstimmung.Häufige Ursachen sind ungültige Bildpfade, fehlende oder leere Labeldateien, eine Abweichung zwischen
ncin der YAML-Datei und den tatsächlichen Labeldateien oder eine zu hohe Konfidenzschwelle. Eine vollständige Checkliste zur Fehlerbehebung findest du unter Häufige Probleme.Das hängt von der Größe des Datensatzes und der Ähnlichkeit des Anwendungsbereichs ab. Bei kleinen Datensätzen mit einem Anwendungsbereich, der COCO ähnelt, verhindert das Einfrieren des Backbones (
freeze=10) eine Überanpassung. Bei Anwendungsbereichen, die sich stark von COCO unterscheiden, kann sich das Backbone anpassen, wenn alle Schichten aufgetaut bleiben (freeze=None). Ausführliche Empfehlungen findest du unter Schichten einfrieren.Nimm Beispiele der ursprünglichen Klassen zusammen mit den neuen Klassen in die Trainingsdaten auf. Ist das nicht möglich, hilft es, mehr Schichten einzufrieren (
freeze=10oder mehr) und eine niedrigere Lernrate zu verwenden, um das vortrainierte Wissen zu bewahren. Weitere Informationen findest du unter Die Leistung bei den ursprünglichen Klassen nimmt ab.