Link to this sectionDistillation de connaissances#
Link to this sectionDémarrage rapide#
Entraîne un modèle étudiant plus petit avec les conseils d'un modèle enseignant plus grand en ajoutant l'argument distill_model :
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt")Link to this sectionQu'est-ce que la distillation de connaissances ?#
La distillation de connaissances transfère les connaissances d'un modèle enseignant large et précis vers un modèle étudiant plus petit. L'étudiant apprend à imiter les représentations internes des caractéristiques de l'enseignant, atteignant souvent une meilleure précision qu'en partant de zéro.
Utilise la distillation lorsque :
- Tu as besoin d'un modèle plus petit et plus rapide pour le déploiement
- Tu possèdes un modèle enseignant de haute précision entraîné sur les mêmes données
- Tu souhaites une meilleure précision que celle fournie par l'entraînement standard
La distillation de connaissances est implémentée pour les tâches detect, segment, pose et obb. Seule la tâche detect a été vérifiée expérimentalement pour des améliorations de précision pour le moment.
Link to this sectionPerformance#
La distillation de connaissances améliore le mAP de l'étudiant sur toute la famille YOLO26 sur COCO, sans coût d'inférence supplémentaire. Le tableau ci-dessous compare les modèles YOLO26 standards (référence) avec les mêmes modèles entraînés avec la distillation depuis leur enseignant recommandé.
| Modèle | taille (pixels) | mAPval 50-95 référence | mAPval 50-95 distillé | mAPval 50-95 (e2e) référence | mAPval 50-95 (e2e) distillé |
|---|---|---|---|---|---|
| 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 |
- Les valeurs de mAPval sont pour un modèle unique à échelle unique sur le jeu de données COCO val2017.
Reproduis-le avecyolo val detect data=coco.yaml device=0 - Les valeurs e2e utilisent le chemin d'inférence par défaut sans NMS ; les valeurs non-e2e utilisent le post-traitement NMS traditionnel (
end2end=False). Voir Détection de bout en bout pour plus de détails.
Link to this sectionPrérequis#
Avant de commencer, assure-toi de remplir les conditions suivantes :
- Modèle enseignant entraîné : Un modèle enseignant pré-entraîné de haute précision issu de la même famille YOLO que le modèle étudiant (par ex. YOLO26).
- Jeu de données et tâche correspondants : Les modèles enseignant et étudiant doivent utiliser exactement la même configuration de jeu de données et de tâche.
- Ressources GPU : Une mémoire GPU (VRAM) suffisante pour charger et exécuter les deux modèles simultanément pendant l'entraînement (consulte la FAQ pour la surcharge typique de VRAM).
Link to this sectionPaires de modèles recommandées#
| Étudiant | Enseignant recommandé |
|---|---|
yolo26n.pt | yolo26s.pt |
yolo26s.pt | yolo26m.pt |
yolo26m.pt | yolo26x.pt |
yolo26l.pt | yolo26x.pt |
La distillation inter-familles (par ex. enseignant YOLO11 avec étudiant YOLO26) n'est pas prise en charge.
Link to this sectionParamètres clés#
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
distill_model | str | None | Chemin vers le fichier du modèle enseignant (par ex. yolo26x.pt). Définir ceci active la distillation de connaissances. |
dis | float | 6.0 | Poids de la perte de distillation. Contrôle dans quelle mesure la perte de distillation contribue à la perte totale d'entraînement. |
Link to this sectionComment ça marche#
- Le modèle enseignant reste gelé en mode
evalet exécute l'inférence sur chaque lot - Le modèle étudiant s'entraîne avec les pertes de tâche standards plus les conseils de distillation
- Les caractéristiques sont extraites des deux modèles au niveau des trois couches du cou qui alimentent la tête de la famille Detect
- Un réseau projecteur (MLP léger) aligne les dimensions des caractéristiques de l'étudiant pour correspondre à celles de l'enseignant
- Une perte L2 pondérée par le score compare les caractéristiques projetées de l'étudiant avec celles de l'enseignant, pondérées par la confiance de classification de l'enseignant
- La perte de distillation se combine aux pertes standards en utilisant le poids
dis
flowchart TD
A[Input Image Batch] --> T[Teacher Model<br/>frozen, eval mode]
A --> S[Student Model<br/>trainable]
T --> |Detect head inputs| TF[Teacher Features]
S --> |Detect head inputs| SF[Student Features]
SF --> P[1×1 Conv Projector<br/>with ReLU]
P --> AF[Aligned Student Features]
TF --> SW[Score-weighted L2 Loss]
AF --> SW
S --> D[Detection Head]
D --> DL[box_loss + cls_loss + dfl_loss]
SW --> |× dis| DIS[distillation loss]
DL --> TOTAL[Total Loss]
DIS --> TOTAL
TOTAL --> BP[Backpropagate<br/>Student + Projector only]Link to this sectionPrise en charge des tâches#
L'implémentation de la distillation extrait les caractéristiques des trois couches du cou qui alimentent la tête de la famille Detect du modèle. Comme les têtes segment, pose et obb héritent de la même architecture Detect, la distillation est techniquement compatible avec ces tâches également.
Seule la tâche detect a été évaluée et vérifiée expérimentalement. Tu peux exécuter la distillation pour segment, pose ou obb, mais les améliorations de précision pour ces tâches ne sont pas encore validées.
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")Link to this sectionEntraînement#
Link to this sectionEntraînement de base#
L'entraînement avec distillation est identique à l'entraînement standard. Fournis le chemin distill_model pour l'activer :
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")Link to this sectionAjustement du poids de la perte de distillation#
Le paramètre dis (par défaut : 6.0) contrôle la contribution de la perte de distillation :
from ultralytics import YOLO
student = YOLO("yolo26n.pt")
results = student.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt", dis=10.0)Link to this sectionReprise de l'entraînement par distillation#
L'entraînement par distillation prend en charge la reprise depuis des points de contrôle. Le modèle enseignant est reconstruit automatiquement à partir du chemin distill_model :
from ultralytics import YOLO
student = YOLO("runs/detect/train/weights/last.pt")
results = student.train(resume=True)Link to this sectionSortie de l'entraînement#
Lorsque la distillation est activée, une colonne dis_loss supplémentaire apparaît dans les journaux d'entraînement :
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 640Le modèle exporté contient uniquement les poids de l'étudiant—la taille du fichier et la vitesse d'inférence correspondent à un modèle étudiant entraîné normalement.
Link to this sectionFAQ#
Link to this sectionPourquoi ma perte de distillation ne diminue-t-elle pas ?#
- Vérifie que l'enseignant et l'étudiant sont de la même génération YOLO
- Confirme que le chemin
distill_modelest correct et que le fichier se charge - Essaie d'augmenter
dissi la valeur de la perte est très petite - Assure-toi que le modèle enseignant est entraîné sur le même jeu de données
Link to this sectionEn quoi la distillation diffère-t-elle de l'entraînement standard ?#
Ajoute le paramètre distill_model—tout le reste fonctionne à l'identique. Une perte de distillation supplémentaire est calculée pendant l'entraînement, mais le modèle enregistré est un modèle YOLO standard sans frais généraux.
Link to this sectionLa distillation de connaissances ralentit-elle l'entraînement ?#
Oui. Attends-toi à un entraînement 1,2 à 1,5 fois plus lent et environ 1,1 fois plus de mémoire GPU car le modèle enseignant exécute l'inférence sur chaque lot. L'enseignant tourne en mode eval sans gradients, ce qui rend la surcharge gérable. Utilise amp=True pour réduire l'impact.
Link to this sectionQuelles tâches et quels modèles sont pris en charge ?#
La distillation de connaissances fonctionne avec les tâches detect, segment, pose et obb car elle distille les caractéristiques des trois couches du cou qui alimentent la tête de la famille Detect. Les tâches classify et semantic ne sont pas prises en charge.
Seule la tâche detect a été vérifiée expérimentalement pour des améliorations de précision. Segment, pose et obb sont techniquement compatibles mais pas encore évalués.
L'enseignant et l'étudiant doivent appartenir à la même famille YOLO (par ex. YOLOv8, YOLO11 ou YOLO26). La distillation inter-familles (par ex. un enseignant YOLO11 avec un étudiant YOLO26) n'est pas prise en charge.