Wissensdestillation#
Schnellstart#
Trainiere ein kleineres Schüler-Modell (Student) mit der Anleitung eines größeren Lehrer-Modells (Teacher), indem du das Argument distill_model hinzufügst:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt")Was ist Knowledge Distillation?#
Knowledge distillation überträgt Wissen von einem großen, präzisen Teacher-Modell auf ein kleineres Student-Modell. Der Student lernt, die internen Merkmalsdarstellungen des Teachers zu imitieren, wodurch oft eine bessere Genauigkeit als beim Training von Grund auf erreicht wird.

Nutze Distillation, wenn:
- Du ein kleineres, schnelleres Modell für die Bereitstellung benötigst
- Du ein hochpräzises Lehrermodell hast, das mit denselben Daten trainiert wurde
- Du eine bessere Genauigkeit als beim Standardtraining erreichen möchtest
Knowledge Distillation ist für detect-, segment-, pose- und obb-Aufgaben implementiert. Nur detect wurde bisher experimentell auf Genauigkeitsverbesserungen hin verifiziert.
Leistung#
Knowledge distillation verbessert das mAP des Students über die gesamte YOLO26-Familie auf COCO hinweg, ohne zusätzlichen Inferenzaufwand. Die folgende Tabelle vergleicht die Standard-YOLO26-Modelle (Baseline) mit denselben Modellen, die durch Distillation von ihrem empfohlenen Teacher trainiert wurden.
| Modell | Größe (Pixel) | mAPval 50-95 Baseline | mAPval 50-95 distilliert | mAPval 50-95 (e2e) Baseline | mAPval 50-95 (e2e) distilliert |
|---|---|---|---|---|---|
| YOLO26n-distill | 640 | 40.9 | 41.5 | 40.1 | 40.9 |
| YOLO26s-distill | 640 | 48.6 | 49.2 | 47.8 | 48.6 |
| YOLO26m-distill | 640 | 53.1 | 53.9 | 52.5 | 53.3 |
| YOLO26l-distill | 640 | 55.0 | 56.0 | 54.4 | 55.5 |
| YOLO26x-distill | 640 | 57.5 | 57.9 | 56.9 | 57.4 |
- mAPval-Werte gelten für Einzelmodelle mit einzelner Skalierung auf dem Datensatz COCO val2017.
Reproduzieren mityolo val detect data=coco.yaml device=0 - e2e-Werte verwenden den standardmäßigen NMS-freien Inferenzpfad; nicht-e2e-Werte verwenden die traditionelle NMS-Nachbearbeitung (
end2end=False). Siehe End-to-End Detection für Details.
Voraussetzungen#
Bevor du beginnst, stelle sicher, dass du die folgenden Anforderungen erfüllst:
- Trainiertes Lehrermodell: Ein vortrainiertes, hochpräzises Lehrermodell aus derselben YOLO-Familie wie das Schülermodell (z. B. YOLO26).
- Passender Datensatz und Aufgabe: Sowohl das Lehrer- als auch das Schülermodell müssen exakt denselben Datensatz und dieselbe Aufgabenkonfiguration verwenden.
- GPU-Ressourcen: Ausreichend GPU-Speicher (VRAM), um beide Modelle während des Trainings gleichzeitig zu laden und auszuführen (siehe FAQ für den typischen VRAM-Mehraufwand).
Empfohlene Modellpaare#
| Schüler | Empfohlener Lehrer |
|---|---|
yolo26n.pt | yolo26s.pt |
yolo26s.pt | yolo26m.pt |
yolo26m.pt | yolo26x.pt |
yolo26l.pt | yolo26x.pt |
Cross-Family-Distillation (z. B. YOLO11-Lehrer mit YOLO26-Schüler) wird nicht unterstützt.
Hauptparameter#
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
distill_model | str | None | Pfad zur Teacher-Modelldatei (z. B. yolo26x.pt). Das Festlegen dieses Pfads aktiviert die Knowledge distillation. |
dis | float | 6.0 | Distillationsverlust-Gewichtung. Steuert, wie stark der Distillationsverlust zum gesamten Trainingsverlust beiträgt. |
So funktioniert es#
- Das Teacher-Modell bleibt im Modus
evaleingefroren und führt bei jedem Batch eine Inferenz aus - Das Schülermodell trainiert mit Standard-Aufgabenverlusten plus Distillationsführung
- Merkmale werden von beiden Modellen an den drei Neck-Schichten extrahiert, die den Detect-Familien-Kopf speisen
- Ein Projektor-Netzwerk (leichtgewichtiges MLP) gleicht die Merkmalsdimensionen des Schülers an den Lehrer an
- Ein Score-gewichteter L2-Verlust vergleicht die projizierten Schülermerkmale mit den Lehrermerkmalen, gewichtet durch die Klassifikationskonfidenz des Lehrers
- Der Distillationsverlust wird mit den Standardverlusten unter Verwendung der Gewichtung
diskombiniert
flowchart TD
A[Input Image Batch]:::start --> T[Teacher Model<br/>frozen, eval mode]:::extern
A --> S[Student Model<br/>trainable]:::proc
T --> |Detect head inputs| TF[Teacher Features]:::extern
S --> |Detect head inputs| SF[Student Features]:::proc
SF --> P[1×1 Conv Projector<br/>with ReLU]:::decide
P --> AF[Aligned Student Features]:::proc
TF --> SW[Score-weighted L2 Loss]:::proc
AF --> SW
S --> D[Detection Head]:::proc
D --> DL[box_loss + cls_loss + dfl_loss]:::proc
SW --> |× dis| DIS[distillation loss]:::proc
DL --> TOTAL[Total Loss]:::out
DIS --> TOTAL
TOTAL --> BP[Backpropagate<br/>Student + Projector only]:::out
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef decide fill:#FF9800,color:#fff
classDef out fill:#9C27B0,color:#fff
classDef extern fill:#607D8B,color:#fffAufgabenunterstützung#
Die Implementierung der Distillation extrahiert Merkmale aus den drei Neck-Schichten, die den Detect-Family-Head des Modells speisen. Da die Heads segment, pose und obb von derselben Architektur Detect erben, ist die Distillation technisch gesehen auch mit diesen Aufgaben kompatibel.
Nur detect wurde experimentell gebenchmarkt und verifiziert. Du kannst Distillation für segment, pose oder obb ausführen, aber Genauigkeitsverbesserungen für diese Aufgaben sind noch nicht validiert.
from ultralytics import YOLO
# Segment
model = YOLO("yolo26n-seg.pt")
model.train(data="coco8-seg.yaml", epochs=100, distill_model="yolo26s-seg.pt")
# Pose
model = YOLO("yolo26n-pose.pt")
model.train(data="coco8-pose.yaml", epochs=100, distill_model="yolo26s-pose.pt")
# OBB
model = YOLO("yolo26n-obb.pt")
model.train(data="dota8.yaml", epochs=100, distill_model="yolo26s-obb.pt")Training#
Grundlegendes Training#
Das Training mit Distillation ist identisch mit dem Standardtraining. Gib den Pfad distill_model an, um es zu aktivieren:
from ultralytics import YOLO
# Load a student model
student = YOLO("yolo26m.pt")
# Train with knowledge distillation from a larger teacher model
results = student.train(data="coco8.yaml", epochs=100, distill_model="yolo26x.pt")Anpassung der Distillationsverlust-Gewichtung#
Der Parameter dis (Standard: 6.0) steuert den Beitrag des Distillationsverlusts:
from ultralytics import YOLO
student = YOLO("yolo26n.pt")
results = student.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt", dis=10.0)Fortsetzen des Distillationstrainings#
Das Distillationstraining unterstützt das Fortsetzen von Checkpoints. Das Teacher-Modell wird automatisch aus dem Pfad distill_model neu erstellt:
from ultralytics import YOLO
student = YOLO("runs/detect/train/weights/last.pt")
results = student.train(resume=True)Trainingsausgabe#
Wenn die Distillation aktiviert ist, erscheint eine zusätzliche Spalte dis_loss in den Trainingsprotokollen:
Epoch GPU_mem box_loss cls_loss dfl_loss dis_loss Instances Size
1/80 46.2G 1.566 5.404 0.003249 6.658 231 640Das exportierte Modell enthält nur die Schülergewichte – Dateigröße und Inferenzgeschwindigkeit entsprechen einem normal trainierten Schülermodell.
FAQ#
- Überprüfe, ob Lehrer und Schüler aus derselben YOLO-Generation stammen
- Bestätige, dass der Pfad
distill_modelkorrekt ist und die Datei geladen wird - Versuche,
diszu erhöhen, wenn der Verlustwert sehr klein ist - Stelle sicher, dass das Lehrermodell auf demselben Datensatz trainiert wurde
Füge den Parameter
distill_modelhinzu – alles andere funktioniert identisch. Während des Trainings wird ein zusätzlicher Distillationsverlust berechnet, aber das gespeicherte Modell ist ein Standard-YOLO-Modell ohne Mehraufwand.Ja. Erwarte ein 1,2-1,5x langsameres Training und ~1,1x mehr GPU-Speicher, da das Teacher-Modell bei jedem Batch eine Inferenz ausführt. Der Teacher läuft im Modus
evalohne Gradienten, wodurch der Mehraufwand überschaubar bleibt. Verwendeamp=True, um die Auswirkungen zu reduzieren.Knowledge Distillation funktioniert mit detect-, segment-, pose- und obb-Aufgaben, da sie Merkmale aus den drei Neck-Schichten destilliert, die den Detect-Familien-Kopf speisen. Classify- und semantic-Aufgaben werden nicht unterstützt.
Nur detect wurde experimentell auf Genauigkeitsverbesserungen verifiziert. Segment, Pose und Obb sind technisch kompatibel, aber noch nicht gebenchmarkt.
Der Lehrer und der Schüler müssen derselben YOLO-Familie angehören (z. B. YOLOv8, YOLO11 oder YOLO26). Cross-Family-Distillation (z. B. ein YOLO11-Lehrer mit einem YOLO26-Schüler) wird nicht unterstützt.