So nehmen Sie eine Feinabstimmung von YOLO eines benutzerdefinierten Datensatzes vor
Beim Fine-Tuning wird ein vortrainiertes Modell so angepasst, dass es neue Klassen erkennt, wobei von den erlernten Gewichten ausgegangen wird, anstatt eine zufällige Initialisierung vorzunehmen. Anstatt über Hunderte von Epochen hinweg von Grund auf neu zu trainieren, nutzt das Fine-Tuning vortrainierte COCO Merkmale und konvergiert in einem Bruchteil der Zeit auf benutzerdefinierte Daten.
Dieser Leitfaden behandelt die Feinabstimmung von YOLO26 auf benutzerdefinierten Datensätzen, von der grundlegenden Anwendung bis hin zu fortgeschrittenen Techniken wie dem Einfrieren von Schichten und dem zweistufigen Training.
Feineinstellung vs. Training von Grund auf
Ein vortrainiertes Modell hat bereits allgemeine visuelle Merkmale – Kantenerkennung, Texturerkennung, Formverständnis – anhand von Millionen von Bildern erlernt. Beim Transferlernen durch Feintuning wird dieses Wissen wiederverwendet, und dem Modell wird lediglich beigebracht, wie die neuen Klassen aussehen. Deshalb konvergiert es schneller und benötigt weniger Daten. Beim Training von Grund auf wird all dies verworfen, und das Modell muss alles von Grund auf neu lernen, angefangen bei Mustern auf Pixelebene, was deutlich mehr Ressourcen erfordert.
| Feinabstimmung | Training von Grund auf | |
|---|---|---|
| Startgewichte | Vortrainiert auf COCO 80 Klassen) | Zufällige Initialisierung |
| Befehl | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Konvergenz | Schneller – das Backbone ist bereits trainiert | Langsamer – alle Ebenen lernen von Grund auf |
| Datenanforderungen | Weniger – vortrainierte Merkmale gleichen den Mangel an Daten aus | Höher – Das Modell muss alle Merkmale allein aus dem Datensatz lernen |
| Wann anzuwenden | Benutzerdefinierte Klassen mit Naturbildern | Bereiche, die sich grundlegend von COCO unterscheiden COCO Medizin, Satelliten, Radar) |
Für die Feinabstimmung ist kein zusätzlicher Code erforderlich
Wenn ein .pt Die Datei wird geladen mit YOLO("yolo26n.pt")werden die vortrainierten Gewichte im Modell gespeichert. Der Aufruf von .train(data="custom.yaml") Danach werden alle kompatiblen Gewichte automatisch in die neue Modellarchitektur übertragen, nicht übereinstimmende Schichten (wie beispielsweise der Erkennungskopf, wenn die Anzahl der Klassen abweicht) neu initialisiert und das Training gestartet. Es ist kein manuelles Laden von Gewichten, keine Bearbeitung von Schichten und kein benutzerdefinierter Code für das Transferlernen erforderlich.
So funktioniert der Transfer vortrainierter Gewichte
Wenn ein vortrainiertes Modell anhand eines Datensatzes mit einer anderen Anzahl von Klassen (beispielsweise von den 80 Klassen COCO auf 5 benutzerdefinierte Klassen) feinabgestimmt wird, Ultralytics eine formbewusste Gewichtsübertragung Ultralytics :
- Vollständige Übertragung von Backbone und Neck – diese Schichten extrahieren allgemeine visuelle Merkmale, und ihre Formen sind unabhängig von der Anzahl der Klassen.
- Der Erkennungskopf wird teilweise neu initialisiert - die Klassifizierungs-Ausgabeschichten (
cv3,one2one_cv3) haben Formen, die an die Klassenanzahl gebunden sind (80 gegenüber 5), sodass sie nicht übertragen werden können und zufällig initialisiert werden. Box-Regressionsschichten (cv2,one2one_cv2) im Kopf haben feste Formen, unabhängig von der Anzahl der Klassen, sodass sie normal übertragen werden. - Beim Ändern der Klassenanzahl wird der Großteil der Gewichte übernommen. Lediglich die klassenspezifischen Schichten im Erkennungskopf werden neu initialisiert – die Zweige für das Backbone, den Hals und die Box-Regression bleiben unverändert.
Bei Datensätzen mit derselben Anzahl an Klassen wie das vortrainierte Modell (beispielsweise beim Feintuning von COCO Gewichten auf einem anderen Datensatz mit 80 Klassen) werden 100 % der Gewichte übertragen, einschließlich des Erkennungsmoduls.
Beispiel für eine grundlegende Feinabstimmung
Beispiel
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load pretrained model
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)
yolo detect train model=yolo26n.pt data=path/to/data.yaml epochs=50 imgsz=640
Auswahl einer Modellgröße
Größere Modelle verfügen über mehr Kapazität, erfordern jedoch auch die Aktualisierung einer größeren Anzahl von Parametern, was bei begrenzten Trainingsdaten das Risiko einer Überanpassung erhöhen kann. Ein praktischer Ansatz besteht darin, mit einem kleineren Modell (YOLO26n oder YOLO26s) zu beginnen und erst dann zu skalieren, wenn die Validierungsmetriken ein Plateau erreichen. Die optimale Modellgröße hängt von der Komplexität der Aufgabe, der Anzahl der Klassen, der Vielfalt des Datensatzes und der für den Einsatz verfügbaren Hardware ab. Die verfügbaren Größen und Leistungsbenchmarks finden Sie auf der vollständigen YOLO26-Modellseite.
Auswahl des Optimierers und der Lernrate
Die Standardeinstellung optimizer=auto Diese Einstellung wählt den Optimierer und die Lernrate auf der Grundlage der Gesamtzahl der Trainingsiterationen aus:
- < 10,000 iterations (small datasets or few epochs): AdamW with a low, auto-calculated learning rate
- > 10.000 Iterationen (große Datensätze): MuSGD (ein hybriderSGD ) mit lr=0,01
Für die meisten Feinabstimmungsaufgaben funktioniert die Standardeinstellung gut, ohne dass eine manuelle Anpassung erforderlich ist. Sie sollten den Optimierer explizit festlegen, wenn:
- Das Training ist unbeständig (Verlustspitzen oder -abweichungen): Versuchen Sie
optimizer=AdamW, lr0=0.001für eine stabilere Konvergenz - Feinstimmung eines großen Modells anhand eines kleinen Datensatzes: eine niedrigere Lernrate wie
lr0=0.001trägt dazu bei, vortrainierte Merkmale zu erhalten
Der automatische Optimierer überschreibt die manuelle Einstellung „lr0“
Wenn optimizer=autowird die lr0 und momentum Werte werden ignoriert. Um die Lernrate manuell zu steuern, legen Sie den Optimierer explizit fest: optimizer=SGD, lr0=0.005.
Eisige Schichten
Durch das Einfrieren wird verhindert, dass bestimmte Schichten während des Trainings aktualisiert werden. Dies beschleunigt das Training und verringert das Überanpassen, wenn der Datensatz im Verhältnis zur Modellkapazität klein ist.
Die freeze Der Parameter akzeptiert entweder eine Ganzzahl oder eine Liste. Eine Ganzzahl freeze=10 friert die ersten 10 Schichten ein (0 bis 9, was dem Backbone in YOLO26 entspricht). Eine Liste kann Schichtenindizes enthalten wie freeze=[0, 3, 5] für das teilweise Einfrieren des Backbones oder Modulnamen-Zeichenfolgen wie freeze=["23.cv2"] für eine detaillierte Steuerung bestimmter Verzweigungen innerhalb einer Ebene.
Beispiel
model.train(data="custom.yaml", epochs=50, freeze=10)
model.train(data="custom.yaml", epochs=50, freeze=[0, 1, 2, 3, 4])
# Freeze the box regression branch of the detection head
model.train(data="custom.yaml", epochs=50, freeze=["23.cv2"])
Die richtige Einfriertiefe hängt davon ab, wie ähnlich die Zieldomäne den vortrainierten Daten ist und wie viele Trainingsdaten zur Verfügung stehen:
| Szenario | Empfehlung | Begründung |
|---|---|---|
| Großer Datensatz, ähnlicher Bereich | freeze=None (Standard) | Genügend Daten, um alle Schichten anzupassen, ohne dass es zu einem Überanpassung kommt |
| Kleiner Datensatz, ähnlicher Bereich | freeze=10 | Behält die wesentlichen Merkmale bei und reduziert die Anzahl der trainierbaren Parameter |
| Sehr kleiner Datensatz | freeze=23 | Es werden nur die Datensätze des Erkennungskopfes trainiert, wodurch das Risiko des Überanpassens minimiert wird |
| Domain weit entfernt von COCO | freeze=None | Die Kernkompetenzen lassen sich möglicherweise nicht gut übertragen und erfordern eine Umschulung |
Die Freeze-Tiefe kann auch als Hyperparameter betrachtet werden – das Ausprobieren einiger Werte (0, 5, 10) und der Vergleich mAP eine praktische Methode, um die beste Einstellung für einen bestimmten Datensatz zu finden.
Wichtige Hyperparameter für die Feinabstimmung
Die Feinabstimmung erfordert in der Regel weniger Anpassungen der Hyperparameter als ein Training von Grund auf. Die wichtigsten Parameter sind:
epochs: Die Feinabstimmung konvergiert schneller als ein Training von Grund auf. Beginnen Sie mit einem moderaten Wert und verwenden Siepatiencefrühzeitig aufzuhören, wenn sich die Validierungskennzahlen nicht mehr verändern.patience: Der Standardwert von 100 ist für lange Trainingsläufe ausgelegt. Eine Reduzierung auf 10–20 verhindert, dass Zeit für Läufe verschwendet wird, die bereits konvergiert sind.warmup_epochs: Beim standardmäßigen Warmup (3 Epochen) wird die Lernrate schrittweise von Null an erhöht, wodurch verhindert wird, dass große Gradientenaktualisierungen die vortrainierten Merkmale in den frühen Iterationen beeinträchtigen. Es wird empfohlen, die Standardeinstellung auch für das Fine-Tuning beizubehalten.
Eine vollständige Liste der Trainingsparameter finden Sie in der Referenz zur Trainingskonfiguration.
Zweistufige Feinabstimmung
Bei der zweistufigen Feinabstimmung wird das Training in zwei Phasen unterteilt. In der ersten Phase wird das Backbone eingefroren und nur der Hals und der Kopf trainiert, sodass sich die Erkennungsschichten an die neuen Klassen anpassen können, ohne die vortrainierten Merkmale zu beeinträchtigen. In der zweiten Phase werden alle Schichten entsperrt und das gesamte Modell mit einer niedrigeren Lernrate trainiert, um das Backbone für den Zielbereich zu verfeinern.
Dieser Ansatz ist besonders nützlich, wenn sich die Zieldomäne erheblich von COCO unterscheidet COCO medizinische Bilder, Luftbilder, Mikroskopie), wo das Backbone zwar angepasst werden muss, ein gleichzeitiges Training aller Komponenten jedoch zu Instabilität führt. Informationen zum automatischen Aufheben des Freezing bei einem Callback-basierten Ansatz finden Sie unter „Freezing und Aufheben des Freezing des Backbones“.
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, lr0=0.001, name="stage2", exist_ok=True)
Häufige Fallstricke
Das Modell liefert keine Vorhersagen
- Unzureichende Trainingsdaten: Das Training mit sehr wenigen Beispielen ist die häufigste Ursache – das Modell kann bei zu geringen Datenmengen weder lernen noch verallgemeinern. Stellen Sie sicher, dass pro Klasse genügend vielfältige Beispiele vorhanden sind, bevor Sie andere Ursachen untersuchen.
- Datenpfade überprüfen: falsche Pfade in
data.yamlErzeugt stillschweigend keine Beschriftungen. Ausführenyolo detect val model=yolo26n.pt data=your_data.yamlvor dem Training, um sicherzustellen, dass die Labels korrekt geladen werden. - Niedrigere Konfidenzschwelle: Wenn Vorhersagen vorhanden sind, aber herausgefiltert werden, versuche
conf=0.1während der Inferenz. - Anzahl der Klassen überprüfen: sicherstellen
ncindata.yamlentspricht der tatsächlichen Anzahl der Klassen in den Label-Dateien.
Bei der Validierung mAP frühzeitig mAP
- Weitere Daten hinzufügen: Die Feinabstimmung profitiert erheblich von zusätzlichen Trainingsdaten, insbesondere von vielfältigen Beispielen mit unterschiedlichen Blickwinkeln, Beleuchtungsverhältnissen und Hintergründen.
- Klassenbilanz prüfen: Unterrepräsentierte Gruppen werden AP niedrigen AP haben. Verwenden Sie
cls_pwum eine Gewichtung nach umgekehrter Häufigkeitsklasse anzuwenden (beginnen mitcls_pw=0.25Bei mäßiger Unausgewogenheit erhöhen Sie die Dosis auf1.0(bei starkem Ungleichgewicht). - Vergrößerung reduzieren: Bei sehr kleinen Datensätzen kann eine umfangreiche Datenvergrößerung mehr schaden als nützen. Versuchen Sie
mosaic=0.5odermosaic=0.0. - Auflösung erhöhen: Bei Datensätzen mit kleinen Objekten versuchen Sie
imgsz=1280um Details zu bewahren.
Nach der Feinabstimmung verschlechtert sich die Leistung bei den ursprünglichen Klassen
Dies wird als „katastrophales Vergessen“ bezeichnet – das Modell verliert zuvor erworbenes Wissen, wenn es ausschließlich auf neue Daten trainiert wird. Dieses Vergessen lässt sich meist nicht vermeiden, wenn die Bilder des ursprünglichen Datensatzes nicht zusammen mit den neuen Daten einbezogen werden. Um dies zu mildern:
- Datensätze zusammenführen: Beziehen Sie bei der Feinabstimmung Beispiele der ursprünglichen Klassen neben den neuen Klassen mit ein. Dies ist die einzige zuverlässige Methode, um ein Vergessen zu verhindern.
- Rückenknochen und Hals einfrieren: Das Einfrieren sowohl des Rückenknochens als auch des Halses, sodass nur der Erkennungskopf trainiert wird, ist hilfreich für kurze Feinabstimmungsläufe mit einer sehr niedrigen Lernrate.
- Trainieren Sie das Modell über weniger Epochen: Je länger das Modell ausschließlich mit neuen Daten trainiert wird, desto stärker nimmt der Vergessensprozess zu.
FAQ
Wie viele Bilder benötige ich, um YOLO zu trainieren?
Es gibt keine festgelegte Mindestanzahl – die Ergebnisse hängen von der Komplexität der Aufgabe, der Anzahl der Klassen und davon ab, wie ähnlich die Domäne COCO ist. Vielfältigere Bilder (unterschiedliche Lichtverhältnisse, Blickwinkel, Hintergründe) sind wichtiger als die reine Menge. Beginnen Sie mit dem, was Sie haben, und erweitern Sie den Umfang, falls die Validierungsmetriken unzureichend sind.
Wie kann ich YOLO26 anhand eines benutzerdefinierten Datensatzes feinabstimmen?
Ein vortrainiertes Modell laden .pt Datei speichern und aufrufen .train() mit dem Pfad zu einer benutzerdefinierten data.yaml. Ultralytics übernimmt dies Ultralytics Gewichtsverlagerung, die Neuinitialisierung des Erkennungskopfes und die Auswahl des Optimierers. Siehe die Grundlegende Feinabstimmung Abschnitt mit dem vollständigen Code-Beispiel.
Warum erkennt mein feinabgestimmtes YOLO nichts?
Die häufigsten Ursachen sind falsche Pfade in data.yaml (was stillschweigend keine Beschriftungen erzeugt), eine Diskrepanz zwischen nc in der YAML-Datei und den eigentlichen Label-Dateien oder einen zu hohen Konfidenzschwellenwert. Siehe Häufige Fallstricke für eine vollständige Checkliste zur Fehlerbehebung.
Welche YOLO sollte ich für das Fine-Tuning einfrieren?
Das hängt von der Größe des Datensatzes und der Domänenähnlichkeit ab. Bei kleinen Datensätzen mit einer Domäne, die der von COCO ähnelt, führt das Einfrieren des Backbones (freeze=10) verhindert ein Überanpassen. Bei Domänen, die sich stark von COCO unterscheiden, sollten alle Schichten ungefroren bleiben (freeze=None) ermöglicht es dem Backbone, sich anzupassen. Siehe Eisige Schichten für detaillierte Empfehlungen.
Wie kann ich „katastrophales Vergessen“ verhindern, wenn ich YOLO neue Klassen abstimme?
Fügen Sie den Trainingsdaten neben den neuen Klassen auch Beispiele der ursprünglichen Klassen hinzu. Falls dies nicht möglich ist, frieren Sie weitere Schichten ein (freeze=10 oder höher) und die Verwendung einer niedrigeren Lernrate trägt dazu bei, das vortrainierte Wissen zu erhalten. Siehe Bei den ursprünglichen Klassen verschlechtert sich die Leistung für weitere Details.