Skip to content

Apprentissage par transfert avec des couches gelées dans YOLOv5

📚 Ce guide explique comment geler les couches de YOLOv5 🚀 lors de la mise en œuvre de l'apprentissage par transfert. L'apprentissage par transfert est une technique puissante 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. En gelant une partie des poids initiaux et en ne mettant à jour que le reste, vous pouvez réduire considérablement les ressources informatiques et le temps d'entraînement, bien que cette approche puisse avoir un léger impact sur la précision finale du modèle.

Avant de commencer

Clonez le repo et installez requirements.txt dans un fichier Python.8.0 incluant PyTorch.8. Les modèles et les jeux de données sont téléchargés automatiquement à partir de la dernièreversion de YOLOv5 .

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

Comment fonctionne la congélation des couches

Lorsque vous gelez des couches dans un réseau neuronal, vous réglez essentiellement leurs paramètres de manière à ce qu'ils ne puissent pas être entraînés. Les gradients de ces couches sont mis à zéro, ce qui empêche toute mise à jour des poids pendant la rétropropagation. Le processus de formation de YOLOv5 est mis en œuvre de la manière suivante :

# Freeze
freeze = [f"model.{x}." for x in range(freeze)]  # layers to freeze
for k, v in model.named_parameters():
    v.requires_grad = True  # train all layers
    if any(x in k for x in freeze):
        print(f"freezing {k}")
        v.requires_grad = False

Explorer l'architecture du modèle

Pour geler efficacement des parties spécifiques du modèle, il est utile de comprendre la structure des couches. Vous pouvez afficher tous les noms de modules avec :

for k, v in model.named_parameters():
    print(k)

"""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 d'un backbone (couches 0-9) et d'une tête (couches restantes) :

# YOLOv5 v6.0 backbone
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]] # 0-P1/2
    - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
    - [-1, 3, C3, [128]]
    - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
    - [-1, 6, C3, [256]]
    - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
    - [-1, 9, C3, [512]]
    - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
    - [-1, 3, C3, [1024]]
    - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv5 v6.0 head
head:
    - [-1, 1, Conv, [512, 1, 1]]
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
    - [[-1, 6], 1, Concat, [1]] # cat backbone P4
    - [-1, 3, C3, [512, False]] # 13
    # ... remaining head layers

Options de congélation

Gel de l'épine dorsale uniquement

Geler uniquement l'épine dorsale (couches 0 à 9), ce qui est utile pour adapter le modèle à de nouvelles classes tout en conservant les capacités d'extraction des caractéristiques apprises :

python train.py --freeze 10

Cette approche est particulièrement efficace lorsque votre nouvel ensemble de données présente des caractéristiques de bas niveau similaires à celles des données de formation d'origine, mais qu'il comporte des classes ou des objets différents.

Geler tout sauf les couches de détection

Pour geler l'ensemble du modèle à l'exception des couches de convolution de sortie finale dans le module de détection :

python train.py --freeze 24

Cette approche est idéale lorsque vous souhaitez conserver la plupart des caractéristiques apprises du modèle, mais que vous devez l'adapter pour détecter un nombre différent de classes.

Comparaison des performances

Nous avons entraîné YOLOv5m sur l'ensemble de données VOC en utilisant différentes stratégies de gel, en commençant par les poids pré-entraînés officiels de COCO :

python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml

Résultats en matière de précision

Les résultats montrent que le gel des couches accélère la formation mais réduit légèrement la précision finale :

Congélation des résultats de l'entraînement mAP50

Congélation des résultats de l'entraînement mAP50-95

Résultats du tableau

Utilisation des ressources

Le gel d'un plus grand nombre de couches réduit les besoins en mémoire et l'utilisation du GPU , ce qui rend cette technique intéressante pour l'apprentissage de modèles plus importants ou l'utilisation d'images de plus haute résolution :

Formation GPU mémoire allouée pourcentage

Formation GPU pourcentage d'utilisation de la mémoire

Quand utiliser la congélation en couche

Le gel des couches dans l'apprentissage par transfert est particulièrement bénéfique dans des scénarios tels que les suivants :

  1. Ressources informatiques limitées: Lorsque la mémoire ou la puissance de traitement du GPU est limitée
  2. Petits ensembles de données: Lorsque votre nouvel ensemble de données est trop petit pour entraîner un modèle complet sans surajustement.
  3. Adaptation rapide: Lorsqu'il s'agit d'adapter rapidement un modèle à un nouveau domaine.
  4. Adaptation à des tâches spécifiques: Lors de l'adaptation d'un modèle général à une application spécialisée

Pour plus d'informations sur les techniques d'apprentissage par transfert et leurs applications, voir le glossaire de l'apprentissage par transfert.

Environnements pris en charge

Ultralytics fournit une série d'environnements prêts à l'emploi, chacun étant préinstallé avec des dépendances essentielles telles que CUDACUDNN, Pythonet PyTorchpour lancer vos projets.

État d'avancement du projet

YOLOv5 CI

Ce badge indique que tous les tests d'intégration continue (CI) deYOLOv5 GitHub Actions ont été passés avec succès. Ces tests d'intégration continue vérifient rigoureusement la fonctionnalité et les performances de YOLOv5 sur différents aspects clés : formation, validation, inférence, exportation et tests de référence. Ils garantissent un fonctionnement cohérent et fiable sur macOS, Windows et Ubuntu, avec des tests effectués toutes les 24 heures et à chaque nouveau commit.

📅C réé il y a 1 an ✏️ Mis à jour il y a 9 jours

Commentaires