Comment affiner YOLO un ensemble de données personnalisé
Le réglage fin permet d'adapter un modèle pré-entraîné afin qu'il reconnaisse de nouvelles classes, en partant des poids déjà appris plutôt que d'une initialisation aléatoire. Au lieu de procéder à un apprentissage complet pendant des centaines d'époques, le réglage fin exploite le modèle pré-entraîné COCO et converge vers des données personnalisées en un temps record.
Ce guide explique comment affiner le modèle YOLO26 sur des ensembles de données personnalisés, depuis son utilisation de base jusqu'aux techniques avancées telles que le gel des couches et l'apprentissage en deux étapes.
Réglage fin ou apprentissage à partir de zéro
Un modèle pré-entraîné a déjà acquis des caractéristiques visuelles générales – détection des contours, reconnaissance des textures, compréhension des formes – à partir de millions d'images. L'apprentissage par transfert, via le réglage fin, réutilise ces connaissances et se contente d'enseigner au modèle à quoi ressemblent les nouvelles classes ; c'est pourquoi il converge plus rapidement et nécessite moins de données. L'entraînement à partir de zéro fait fi de tout cela et oblige le modèle à tout apprendre, en commençant par les motifs au niveau des pixels, ce qui exige des ressources nettement plus importantes.
| Finetuning | Apprendre à partir de zéro | |
|---|---|---|
| Poids de départ | Pré-entraîné sur COCO 80 classes) | Initialisation aléatoire |
| Commande | YOLO("yolo26n.pt") | YOLO("yolo26n.yaml") |
| Convergence | Plus rapide : le réseau principal est déjà formé | Plus lent : toutes les couches partent de zéro |
| Exigences en matière de données | Moins de données - les caractéristiques pré-entraînées compensent ce manque | Plus élevé : le modèle doit apprendre toutes les caractéristiques à partir du seul ensemble de données |
| Quand l'utiliser | Cours personnalisés avec des images de la nature | Domaines fondamentalement différents de COCO médical, satellite, radar) |
Le réglage fin ne nécessite aucun code supplémentaire
Lorsqu'un .pt le fichier est chargé avec YOLO("yolo26n.pt"), les poids pré-entraînés sont enregistrés dans le modèle. L'appel de .train(data="custom.yaml") Le système transfère ensuite automatiquement tous les poids compatibles vers la nouvelle architecture du modèle, réinitialise les couches qui ne correspondent pas (comme la couche de détection lorsque le nombre de classes diffère) et lance l'apprentissage. Aucun chargement manuel des poids, aucune manipulation des couches ni aucun code personnalisé de transfert d'apprentissage n'est nécessaire.
Comment fonctionne le transfert de poids pré-entraînés
Lorsqu'un modèle pré-entraîné est affiné sur un ensemble de données comportant un nombre différent de classes (par exemple, les 80 classes COCO vers 5 classes personnalisées), Ultralytics un transfert de poids tenant compte de la forme :
- Transfert complet au niveau de la colonne vertébrale et du cou: ces couches extraient des caractéristiques visuelles générales et leurs formes sont indépendantes du nombre de classes.
- La tête de détection a été partiellement réinitialisée - les couches de sortie de classification (
cv3,one2one_cv3) ont des formes liées au nombre de classes (80 contre 5) ; elles ne peuvent donc pas être transférées et sont initialisées de manière aléatoire. Les couches de régression par boîtes (cv2,one2one_cv2) dans l'en-tête ont une structure fixe, quel que soit le nombre de classes, et sont donc transférées normalement. - La grande majorité des poids est transférée lors du changement de nombre de classes. Seules les couches spécifiques à la classification dans la tête de détection sont réinitialisées ; les branches de la structure principale, du cou et de la régression par boîtes restent inchangées.
Pour les ensembles de données comportant le même nombre de classes que le modèle pré-entraîné (par exemple, l'ajustement des paramètres COCO à un autre ensemble de données à 80 classes), 100 % des paramètres sont transférés, y compris la tête de détection.
Exemple de réglage de base
Exemple
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
Choisir une taille de modèle
Les modèles plus volumineux offrent une plus grande capacité, mais comportent également davantage de paramètres à mettre à jour, ce qui peut accroître le risque de surapprentissage lorsque les données d'entraînement sont limitées. Il est judicieux de commencer par un modèle plus petit (YOLO26n ou YOLO26s) et de passer à un modèle plus volumineux uniquement lorsque les indicateurs de validation atteignent un plateau. La taille optimale du modèle dépend de la complexité de la tâche, du nombre de classes, de la diversité de l'ensemble de données et du matériel disponible pour le déploiement. Consultez la page complète du modèle YOLO26 pour connaître les tailles disponibles et les benchmarks de performances.
Choix de l'optimiseur et du taux d'apprentissage
La valeur par défaut optimizer=auto Ce paramètre permet de sélectionner l'optimiseur et le taux d'apprentissage en fonction du nombre total d'itérations d'entraînement :
- < 10,000 iterations (small datasets or few epochs): AdamW with a low, auto-calculated learning rate
- > 10 000 itérations (ensembles de données volumineux) : MuSGD (unSGD hybrideSGD ) avec lr = 0,01
Pour la plupart des tâches de réglage fin, les paramètres par défaut fonctionnent bien sans qu'il soit nécessaire de les modifier manuellement. Envisagez de configurer explicitement l'optimiseur dans les cas suivants :
- La formation est instable (pics de perte ou écarts) : essayez
optimizer=AdamW, lr0=0.001pour une convergence plus stable - Affiner un grand modèle à partir d'un petit ensemble de données: un taux d'apprentissage plus faible, comme
lr0=0.001contribue à préserver les caractéristiques pré-entraînées
L'optimiseur automatique remplace le réglage manuel lr0
Quand optimizer=auto, la fonction lr0 et momentum ces valeurs sont ignorées. Pour contrôler manuellement le taux d'apprentissage, configurez explicitement l'optimiseur : optimizer=SGD, lr0=0.005.
Couches de gel
Le gel empêche certaines couches de se mettre à jour pendant l'apprentissage. Cela accélère l'apprentissage et réduit le surapprentissage lorsque l'ensemble de données est de taille réduite par rapport à la capacité du modèle.
L'argument freeze Ce paramètre accepte soit un nombre entier, soit une liste. Un nombre entier freeze=10 fige les 10 premières couches (de 0 à 9, ce qui correspond à la structure de base de YOLO26). Une liste peut contenir des indices de couches tels que freeze=[0, 3, 5] pour le gel partiel de la structure, ou des chaînes de caractères représentant des noms de modules telles que freeze=["23.cv2"] pour un contrôle précis sur des branches spécifiques au sein d'un niveau.
Exemple
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"])
La profondeur de gel optimale dépend du degré de similitude entre le domaine cible et les données pré-entraînées, ainsi que de la quantité de données d'entraînement disponibles :
| Scénario | Recommandation | Justification |
|---|---|---|
| Grand ensemble de données, domaine similaire | freeze=None (par défaut) | Suffisamment de données pour adapter toutes les couches sans surapprentissage |
| Petit ensemble de données, domaine similaire | freeze=10 | Conserve les caractéristiques fondamentales, réduit le nombre de paramètres à entraîner |
| Ensemble de données très restreint | freeze=23 | Seuls les réseaux de la tête de détection sont entraînés, ce qui réduit au minimum le risque de surapprentissage |
| Domaine situé loin de COCO | freeze=None | Les compétences fondamentales peuvent ne pas être facilement transférables et nécessiter une nouvelle formation |
La profondeur de gel peut également être considérée comme un hyperparamètre : tester plusieurs valeurs (0, 5, 10) et comparer mAP de validation mAP un moyen pratique de déterminer le meilleur réglage pour un ensemble de données donné.
Hyperparamètres clés pour le réglage fin
Le réglage fin nécessite généralement moins d'ajustements des hyperparamètres que l'apprentissage à partir de zéro. Les paramètres les plus importants sont les suivants :
epochs: Le réglage fin converge plus rapidement que l'apprentissage à partir de zéro. Commencez par une valeur modérée et utilisezpatiencede s'arrêter prématurément lorsque les indicateurs de validation atteignent un plateau.patience: La valeur par défaut de 100 est prévue pour les longues séries d'entraînement. En la réduisant à 10-20, on évite de perdre du temps sur des séries qui ont déjà convergi.warmup_epochs: Le processus d'échauffement par défaut (3 époques) augmente progressivement le taux d'apprentissage à partir de zéro, ce qui empêche les mises à jour de gradient importantes d'endommager les caractéristiques pré-entraînées lors des premières itérations. Il est recommandé de conserver la valeur par défaut, même pour le réglage fin.
Pour consulter la liste complète des paramètres d'entraînement, reportez-vous au guide de configuration de l'entraînement.
Réglage fin en deux étapes
L'ajustement en deux étapes divise l'entraînement en deux phases. La première étape fige la structure principale et n'entraîne que le cou et la tête, ce qui permet aux couches de détection de s'adapter aux nouvelles classes sans perturber les caractéristiques pré-entraînées. La deuxième étape débloque toutes les couches et entraîne l'ensemble du modèle avec un taux d'apprentissage plus faible afin d'affiner la structure principale pour le domaine cible.
Cette approche s'avère particulièrement utile lorsque le domaine cible diffère considérablement de COCO images médicales, images aériennes, microscopie), où le modèle de base peut nécessiter une adaptation, mais où l'entraînement simultané de l'ensemble du modèle entraîne une instabilité. Pour le dégel automatique à l'aide d'une approche basée sur des callbacks, voir « Gel et dégel du modèle de base ».
Réglage fin en deux étapes
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)
Pièges courants
Le modèle ne génère aucune prévision
- Données d'apprentissage insuffisantes: l'entraînement avec un nombre très limité d'échantillons est la cause la plus fréquente ; le modèle ne peut pas apprendre ni généraliser à partir d'une quantité de données trop faible. Assurez-vous de disposer d'un nombre suffisant d'exemples variés par classe avant d'examiner d'autres causes.
- Vérifier les chemins d'accès aux ensembles de données: chemins d'accès incorrects dans
data.yamlgénère silencieusement zéro étiquette. Exécuteryolo detect val model=yolo26n.pt data=your_data.yamlavant l'entraînement, pour vérifier que les étiquettes se chargent correctement. - Seuil de confiance inférieur: si des prédictions existent mais sont filtrées, essayez
conf=0.1pendant l'inférence. - Vérifier le nombre d'élèves: veiller à ce que
ncdansdata.yamlcorrespond au nombre réel de classes dans les fichiers d'étiquettes.
La courbe de validation mAP rapidement mAP
- Ajouter davantage de données: l'affinage des modèles tire un grand bénéfice de l'ajout de données d'entraînement supplémentaires, en particulier d'exemples variés présentant différents angles, éclairages et arrière-plans.
- Vérifier l'équilibre de la classe: les classes sous-représentées auront AP faible. Utilisez
cls_pwpour appliquer une pondération inverse de la classe de fréquence (commencer parcls_pw=0.25en cas de déséquilibre modéré, augmenter jusqu'à1.0(en cas de déséquilibre important). - Réduire l'augmentation: pour les très petits ensembles de données, une augmentation trop poussée peut faire plus de mal que de bien. Essayez
mosaic=0.5oumosaic=0.0. - Augmenter la résolution: pour les ensembles de données contenant de petits objets, essayez
imgsz=1280pour préserver les détails.
Les performances des classes d'origine se détériorent après le réglage fin
C'est ce qu'on appelle l'« oubli catastrophique » : le modèle perd les connaissances acquises précédemment lorsqu'il est entraîné exclusivement sur de nouvelles données. Cet oubli est généralement inévitable si l'on n'intègre pas les images de l'ensemble de données d'origine aux nouvelles données. Pour y remédier :
- Fusionner les ensembles de données: inclure des exemples des classes d'origine aux côtés des nouvelles classes lors du réglage fin. C'est le seul moyen fiable d'éviter l'oubli.
- Figer la colonne vertébrale et le cou: le fait de figer à la fois la colonne vertébrale et le cou pour ne faire apprendre que la tête de détection facilite les petites séries d'ajustement avec un taux d'apprentissage très faible.
- Réduire le nombre d'époques d'entraînement: plus le modèle s'entraîne longtemps exclusivement sur de nouvelles données, plus l'oubli s'accentue.
FAQ
Combien d'images faut-il pour affiner YOLO?
Il n'y a pas de seuil minimum fixe : les résultats dépendent de la complexité de la tâche, du nombre de classes et du degré de similitude entre le domaine et COCO. La diversité des images (éclairage, angles et arrière-plans variés) est plus importante que leur quantité brute. Commencez avec ce dont vous disposez et augmentez progressivement le volume si les indicateurs de validation ne sont pas satisfaisants.
Comment puis-je affiner le modèle YOLO26 sur un ensemble de données personnalisé ?
Charger un modèle pré-entraîné .pt enregistrer et appeler .train() avec le chemin d'accès à un fichier personnalisé data.yaml. Ultralytics gère Ultralytics transfert de poids, la réinitialisation de la tête de détection et la sélection de l'optimiseur. Voir la Réglages de base Consultez la section pour voir l'exemple de code complet.
Pourquoi mon YOLO , pourtant finement ajusté, ne détecte-t-il rien ?
Les causes les plus courantes sont des chemins d'accès incorrects dans data.yaml (qui ne génère aucune étiquette), une incompatibilité entre nc dans le fichier YAML et les fichiers d'étiquettes proprement dits, ou un seuil de confiance trop élevé. Voir Pièges courants pour consulter la liste complète des étapes de dépannage.
Quels YOLO dois-je geler pour le réglage fin ?
Cela dépend de la taille de l'ensemble de données et de la similitude du domaine. Pour les petits ensembles de données dont le domaine est similaire à COCO, le gel de la structure de base (freeze=10) évite le surapprentissage. Pour les domaines très différents de COCO, en laissant toutes les couches non gelées (freeze=None) permet au réseau fédérateur de s'adapter. Voir Couches de gel pour obtenir des recommandations détaillées.
Comment éviter l'oubli catastrophique lors du réglage fin YOLO de nouvelles classes ?
Ajoutez aux données d'entraînement des exemples des classes d'origine ainsi que des nouvelles classes. Si cela n'est pas possible, figez davantage de couches (freeze=10 (ou plus) et l'utilisation d'un taux d'apprentissage plus faible permet de préserver les connaissances acquises lors de la pré-formation. Voir Les performances diminuent pour les classes d'origine pour plus de détails.