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 :
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 :
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 :
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 :
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 :
- Ressources informatiques limitées: Lorsque la mémoire ou la puissance de traitement du GPU est limitée
- Petits ensembles de données: Lorsque votre nouvel ensemble de données est trop petit pour entraîner un modèle complet sans surajustement.
- Adaptation rapide: Lorsqu'il s'agit d'adapter rapidement un modèle à un nouveau domaine.
- 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.
- Carnets de notes gratuits GPU:
- Google Cloud: Guide de démarrage rapide GCP
- Amazon: Guide de démarrage rapide AWS
- Azure: Guide de démarrage rapide AzureML
- Docker: Guide de démarrage rapide de Docker
État d'avancement du projet
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.