Passer au contenu

Apprentissage par transfert avec des couches gelées dans YOLOv5

📚 Ce guide explique comment geler les couches YOLOv5 🚀 lors de la mise en œuvre de l'apprentissage par transfert. L'apprentissage par transfert est une technique puissante d'apprentissage automatique (AA) qui vous permet de réentraîner rapidement un modèle sur de nouvelles données sans avoir à réentraîner l'ensemble du réseau à partir de zéro. En gelant les poids des couches initiales et en mettant à jour uniquement les paramètres des couches ultérieures, vous pouvez réduire considérablement les besoins en ressources de calcul et le temps d'entraînement. Cependant, cette approche pourrait légèrement impacter la précision du modèle final.

Avant de commencer

Tout d'abord, clonez le référentiel YOLOv5 et installez les dépendances nécessaires répertoriées dans requirements.txt. Assurez-vous d'avoir un Python>=3.8.0 environnement avec PyTorch>=1.8 installé. Pré-entraîné modèles et requis jeux de données sera téléchargé automatiquement à partir de la dernière version de YOLOv5 version.

git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependencies

Comment fonctionne le gel de calques

Lorsque vous gelez des couches dans un réseau neuronal, vous empêchez leurs paramètres (poids et biais) d'être mis à jour pendant le processus d'entraînement. Dans PyTorch, ceci est réalisé en définissant le requires_grad attribut des tensors de la couche à False. Par conséquent, les gradients ne sont pas calculés pour ces couches pendant rétropropagation, ce qui permet d'économiser des calculs et de la mémoire.

Voici comment YOLOv5 implémente le gel de calques dans son script d’entraînement :

# Freeze specified layers
freeze = [f"model.{x}." for x in range(freeze)]  # Define layers to freeze based on module index
for k, v in model.named_parameters():
    v.requires_grad = True  # Ensure all parameters are initially trainable
    if any(x in k for x in freeze):
        print(f"Freezing layer: {k}")
        v.requires_grad = False  # Disable gradient calculation for frozen layers

Exploration de l'architecture du modèle

Il est essentiel de comprendre la structure du modèle YOLOv5 pour décider quels calques figer. Vous pouvez inspecter les noms de tous les modules et leurs paramètres à l’aide de l’extrait de code python suivant :

# Assuming 'model' is your loaded YOLOv5 model instance
for name, param in model.named_parameters():
    print(name)

"""
Example Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
"""

L'architecture YOLOv5 se compose généralement d'un backbone (couches 0 à 9 dans les configurations standard comme YOLOv5s/m/l/x) chargé de l'extraction de caractéristiques, et d'une tête (les couches restantes) qui effectue la détection d'objets.

# Example YOLOv5 v6.0 backbone structure
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]]  # Layer 0: Initial convolution (P1/2 stride)
    - [-1, 1, Conv, [128, 3, 2]] # Layer 1: Downsampling convolution (P2/4 stride)
    - [-1, 3, C3, [128]]          # Layer 2: C3 module
    - [-1, 1, Conv, [256, 3, 2]] # Layer 3: Downsampling convolution (P3/8 stride)
    - [-1, 6, C3, [256]]          # Layer 4: C3 module
    - [-1, 1, Conv, [512, 3, 2]] # Layer 5: Downsampling convolution (P4/16 stride)
    - [-1, 9, C3, [512]]          # Layer 6: C3 module
    - [-1, 1, Conv, [1024, 3, 2]]# Layer 7: Downsampling convolution (P5/32 stride)
    - [-1, 3, C3, [1024]]         # Layer 8: C3 module
    - [-1, 1, SPPF, [1024, 5]]    # Layer 9: Spatial Pyramid Pooling Fast

# Example YOLOv5 v6.0 head structure
head:
    - [-1, 1, Conv, [512, 1, 1]] # Layer 10
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]] # Layer 11
    - [[-1, 6], 1, Concat, [1]] # Layer 12: Concatenate with backbone P4 (from layer 6)
    - [-1, 3, C3, [512, False]] # Layer 13: C3 module
    # ... subsequent head layers for feature fusion and detection

Options de gel

Vous pouvez contrôler les couches qui sont gelées en utilisant le --freeze argument dans la commande d'entraînement. Cet argument spécifie l'index du premier non gelé module ; tous les modules précédant cet index auront leurs poids gelés.

Geler uniquement le Backbone

Pour geler l'ensemble du backbone (couches 0 à 9), ce qui est courant lors de l'adaptation du modèle à de nouvelles classes d'objets tout en conservant les capacités générales d'extraction de caractéristiques apprises à partir d'un grand ensemble de données tel que COCO :

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10

Cette stratégie est efficace lorsque votre jeu de données cible partage des caractéristiques visuelles de bas niveau similaires (contours, textures) avec les données d'entraînement d'origine (par exemple, COCO) mais contient des catégories d'objets différentes.

Geler toutes les couches sauf les couches de détection finales

Pour geler presque l'ensemble du réseau, en ne laissant que les dernières couches de convolution de sortie (qui font partie du Detect module, généralement le dernier module, par exemple, le module 24 dans YOLOv5s) entraînable :

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24

Cette approche est utile lorsque vous devez principalement ajuster le modèle pour un nombre différent de classes de sortie tout en conservant la grande majorité des caractéristiques apprises intactes. Elle nécessite le moins de ressources de calcul pour le fine-tuning.

Comparaison des performances

Pour illustrer les effets du gel des couches, nous avons entraîné YOLOv5m sur le jeu de données Jeu de données Pascal VOC pour 50 epochs, en partant du modèle COCO officiel pré-entraîné poids (yolov5m.pt). Nous avons comparé trois scénarios : l'entraînement de toutes les couches (--freeze 0), le gel du backbone (--freeze 10), et le gel de toutes les couches de détection sauf les dernières (--freeze 24).

# Example command for training with backbone frozen
python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml --freeze 10

Résultats de précision

Les résultats montrent que le gel des couches peut accélérer considérablement l'entraînement, mais peut entraîner une légère réduction du mAP (précision moyenne) final. L'entraînement de toutes les couches donne généralement la meilleure précision, tandis que le gel de plus de couches offre un entraînement plus rapide au prix d'une performance potentiellement inférieure.

Résultats de la formation mAP50 comparant différentes stratégies de gel Comparaison mAP50 pendant l'entraînement

Résultats de la formation mAP50-95 comparant différentes stratégies de gel Comparaison mAP50-95 pendant l'entraînement

Tableau récapitulatif des résultats de performance Tableau récapitulatif des métriques de performance

Utilisation des ressources

Le fait de geler davantage de couches réduit considérablement les besoins en mémoire GPU et l'utilisation globale. Cela fait de l'apprentissage par transfert avec des couches gelées une option intéressante lorsque l'on travaille avec des ressources matérielles limitées, ce qui permet d'entraîner des modèles plus grands ou d'utiliser des tailles d'image plus importantes que ce qui serait possible autrement.

Pourcentage de mémoire GPU allouée pendant l’entraînement Mémoire GPU allouée (%)

Pourcentage d’utilisation de la mémoire GPU pendant l’entraînement Utilisation du GPU (%)

Quand utiliser le gel de couches

Le gel des couches pendant l'apprentissage par transfert est particulièrement avantageux dans plusieurs situations :

  1. Ressources de calcul limitées : Si vous avez des contraintes sur la mémoire GPU ou la puissance de traitement.
  2. Petits ensembles de données : Lorsque votre ensemble de données cible est considérablement plus petit que l'ensemble de données de pré-entraînement d'origine, le gel permet d'éviter le surapprentissage.
  3. Prototypage rapide : Lorsque vous devez rapidement adapter un modèle existant à une nouvelle tâche ou à un nouveau domaine pour une évaluation initiale.
  4. Domaines de caractéristiques similaires : Si les caractéristiques de bas niveau de votre nouvel ensemble de données sont très similaires à celles de l’ensemble de données sur lequel le modèle a été pré-entraîné.

Explorez davantage les nuances de l’apprentissage par transfert dans notre entrée de glossaire et envisagez des techniques telles que le réglage des hyperparamètres pour optimiser les performances.

Environnements pris en charge

Ultralytics propose divers environnements prêts à l'emploi avec des dépendances essentielles telles que CUDA, CuDNN, Python et PyTorch préinstallés.

État du projet

État de l’intégration continue de YOLOv5

Ce badge confirme que tous les tests d'intégration continue (CI) des actions GitHub YOLOv5 réussissent. Ces tests CI évaluent rigoureusement la fonctionnalité et les performances de YOLOv5 à travers les opérations clés : l'entraînement, la validation, l'inférence, l'exportation et les benchmarks. Ils garantissent un fonctionnement cohérent et fiable sur macOS, Windows et Ubuntu, en s'exécutant automatiquement toutes les 24 heures et à chaque nouveau commit de code.



📅 Créé il y a 1 an ✏️ Mis à jour il y a 4 mois

Commentaires