Architecture Ultralytics YOLOv5#
YOLOv5 (v6.0/6.1) est un puissant algorithme de détection d’objets développé par Ultralytics. Cet article examine en détail l’architecture YOLOv5, les stratégies d’augmentation des données, les méthodes d’entraînement et les techniques de calcul de la fonction de perte. Cette compréhension approfondie t’aidera à améliorer tes applications pratiques de la détection d’objets dans divers domaines, notamment la surveillance, les véhicules autonomes et la reconnaissance d’images.
1. Structure du modèle#
L’architecture de YOLOv5 comprend trois parties principales :
- Backbone : il s’agit du corps principal du réseau. Dans YOLOv5, le backbone repose sur la structure
CSPDarknet53, une modification de l’architecture Darknet utilisée dans les versions précédentes. - Neck : cette partie relie le backbone à la tête. YOLOv5 utilise les structures
SPPF(Spatial Pyramid Pooling - Fast) etPANet(Path Aggregation Network). - Tête : cette partie génère la sortie finale. YOLOv5 utilise
YOLOv3 Headà cette fin.
La structure du modèle est illustrée dans l’image ci-dessous. Tu trouveras les détails de la structure du modèle dans models/yolov5l.yaml.

YOLOv5 apporte plusieurs améliorations notables par rapport à ses prédécesseurs :
- La structure
Focus, présente dans les versions précédentes, est remplacée par la structure6x6 Conv2d. Cette modification améliore l’efficacité #4825. - La structure
SPPest remplacée parSPPF. Cette modification fait plus que doubler la vitesse de traitement tout en conservant la même sortie.
Pour tester la vitesse de SPP et de SPPF, tu peux utiliser le code suivant :
Exemple de profilage de la vitesse de SPP par rapport à SPPF (cliquer pour ouvrir)
import time
import torch
from torch import nn
class SPP(nn.Module):
def __init__(self):
"""Initializes an SPP module with three different sizes of max pooling layers."""
super().__init__()
self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)
def forward(self, x):
"""Applies three max pooling layers on input `x` and concatenates results along channel dimension."""
o1 = self.maxpool1(x)
o2 = self.maxpool2(x)
o3 = self.maxpool3(x)
return torch.cat([x, o1, o2, o3], dim=1)
class SPPF(nn.Module):
def __init__(self):
"""Initializes an SPPF module with a specific configuration of MaxPool2d layer."""
super().__init__()
self.maxpool = nn.MaxPool2d(5, 1, padding=2)
def forward(self, x):
"""Applies sequential max pooling and concatenates results with input tensor."""
o1 = self.maxpool(x)
o2 = self.maxpool(o1)
o3 = self.maxpool(o2)
return torch.cat([x, o1, o2, o3], dim=1)
def main():
"""Compares outputs and performance of SPP and SPPF on a random tensor (8, 32, 16, 16)."""
input_tensor = torch.rand(8, 32, 16, 16)
spp = SPP()
sppf = SPPF()
output1 = spp(input_tensor)
output2 = sppf(input_tensor)
print(torch.equal(output1, output2))
t_start = time.time()
for _ in range(100):
spp(input_tensor)
print(f"SPP time: {time.time() - t_start}")
t_start = time.time()
for _ in range(100):
sppf(input_tensor)
print(f"SPPF time: {time.time() - t_start}")
if __name__ == "__main__":
main()résultat :
True
SPP time: 0.5373051166534424
SPPF time: 0.207807064056396482. Techniques d’augmentation des données#
YOLOv5 utilise diverses techniques d’augmentation des données pour améliorer la capacité de généralisation du modèle et réduire le surapprentissage. Ces techniques comprennent :
-
Augmentation Mosaic : une technique de traitement d’image qui combine quatre images d’entraînement en une seule afin d’aider les modèles de détection d’objets à mieux gérer différentes échelles et translations des objets.

-
Augmentation Copy-Paste : une méthode innovante d’augmentation des données qui copie des zones aléatoires d’une image et les colle sur une autre image choisie au hasard, créant ainsi un nouvel échantillon d’entraînement.

-
Transformations affines aléatoires : elles comprennent la rotation, le changement d’échelle, la translation et le cisaillement aléatoires des images.

-
Augmentation MixUp : une méthode qui crée des images composites en combinant linéairement deux images et leurs étiquettes associées.

-
Albumentations : une puissante bibliothèque d’augmentation d’images qui prend en charge un large éventail de techniques d’augmentation. Pour en savoir plus, consulte l’utilisation des augmentations Albumentations.
-
Augmentation HSV : modifications aléatoires de la teinte, de la saturation et de la valeur des images.

-
Retournement horizontal aléatoire : une méthode d’augmentation qui retourne aléatoirement les images horizontalement.

3. Stratégies d’entraînement#
YOLOv5 applique plusieurs stratégies d’entraînement sophistiquées pour améliorer les performances du modèle. Elles comprennent :
- Entraînement multi-échelle : pendant l’entraînement, la taille des images d’entrée est redimensionnée aléatoirement dans une plage allant de 0,5 à 1,5 fois leur taille d’origine.
- AutoAnchor : cette stratégie optimise les boîtes d’ancrage a priori pour qu’elles correspondent aux caractéristiques statistiques des boîtes de vérité terrain de tes données personnalisées.
- Planificateur de taux d’apprentissage avec échauffement et décroissance cosinus : méthode permettant d’ajuster le taux d’apprentissage afin d’améliorer les performances du modèle.
- Moyenne mobile exponentielle (EMA) : stratégie qui utilise la moyenne des paramètres sur les étapes précédentes pour stabiliser le processus d’entraînement et réduire l’erreur de généralisation.
- Entraînement en précision mixte : méthode qui effectue les opérations au format demi-précision, réduisant l’utilisation de la mémoire et améliorant la vitesse de calcul.
- Évolution des hyperparamètres : stratégie qui ajuste automatiquement les hyperparamètres pour obtenir des performances optimales. Consulte le tutoriel sur l’évolution des hyperparamètres.
4. Fonctionnalités supplémentaires#
4.1 Calcul des pertes#
La perte de YOLOv5 est calculée comme la combinaison de trois composantes de perte distinctes :
- Perte de classification (perte BCE) : la perte d’entropie croisée binaire mesure l’erreur de la tâche de classification.
- Perte d’objectness (perte BCE) : une autre perte d’entropie croisée binaire, qui calcule l’erreur de détection de la présence ou de l’absence d’un objet dans une cellule de grille donnée.
- Perte de localisation (perte CIoU) : la perte d’IoU complet mesure l’erreur de localisation de l’objet dans la cellule de grille.
La fonction de perte globale est représentée par :
4.2 Équilibrage des pertes#
Les pertes d’objectness des trois couches de prédiction (P3, P4, P5) sont pondérées différemment. Les poids d’équilibrage sont respectivement [4.0, 1.0, 0.4]. Cette approche garantit que les prédictions à différentes échelles contribuent de façon appropriée à la perte totale.
4.3 Élimination de la sensibilité à la grille#
L’architecture de YOLOv5 apporte des changements importants à la stratégie de prédiction des boîtes par rapport aux versions précédentes de YOLO. Dans YOLOv2 et YOLOv3, les coordonnées des boîtes étaient prédites directement à l’aide de l’activation de la dernière couche.
Cependant, dans YOLOv5, la formule de prédiction des coordonnées des boîtes a été mise à jour pour réduire la sensibilité à la grille et empêcher le modèle de prédire des dimensions de boîte non bornées.
Les formules révisées de calcul de la boîte englobante prédite sont les suivantes :
Compare le décalage du point central avant et après la mise à l’échelle. La plage du décalage du point central passe de (0, 1) à (-0.5, 1.5). Le décalage peut donc facilement atteindre 0 ou 1.
Compare le rapport de mise à l’échelle de la hauteur et de la largeur (par rapport à l’ancre) avant et après ajustement. Les équations de boîte d’origine de yolo/darknet présentent un défaut majeur. La largeur et la hauteur sont totalement non bornées, car elles correspondent simplement à out=exp(in), ce qui est dangereux : cela peut entraîner une explosion des gradients, des instabilités, des pertes NaN et, au final, l’échec complet de l’entraînement. Consulte ce problème pour en savoir plus.
4.4 Construction des cibles#
Le processus de construction des cibles dans YOLOv5 est essentiel à l’efficacité de l’entraînement et à la précision du modèle. Il consiste à attribuer les boîtes de vérité terrain aux cellules de grille appropriées de la carte de sortie et à les associer aux boîtes d’ancrage adéquates.
Ce processus suit les étapes suivantes :
- Calcule le rapport entre les dimensions de la boîte de vérité terrain et celles de chaque modèle d’ancre.
- Si le rapport calculé respecte le seuil, associe la boîte de vérité terrain à l’ancre correspondante.
- Attribue l’ancre correspondante aux cellules appropriées. Note que, du fait de la révision du décalage du point central, une boîte de vérité terrain peut être attribuée à plusieurs ancres : la plage du décalage du point central passe de (0, 1) à (-0.5, 1.5), ce qui permet des correspondances supplémentaires.
Ainsi, le processus de construction des cibles garantit que chaque objet de vérité terrain est correctement attribué et associé pendant l’entraînement, ce qui permet à YOLOv5 d’apprendre plus efficacement la tâche de détection d’objets.
Conclusion#
YOLOv5 marque une étape importante dans l’évolution de la détection d’objets en temps réel. Ses choix architecturaux, ses stratégies d’entraînement et ses améliorations techniques offrent de solides performances et une grande efficacité par rapport aux versions précédentes de YOLO.
Les principales améliorations de YOLOv5 comprennent l’utilisation d’une architecture dynamique, un large éventail de techniques d’augmentation des données, des stratégies d’entraînement innovantes, ainsi que des ajustements importants du calcul des pertes et du processus de construction des cibles. Toutes ces innovations améliorent considérablement la précision et l’efficacité de la détection d’objets tout en maintenant une vitesse élevée, caractéristique des modèles YOLO.
FAQ#
Un backbone CSPDarknet53 extrait les caractéristiques, un neck SPPF et PANet les fusionne à différentes échelles, et une tête de type YOLOv3 prédit les boîtes, l’objectness et les classes aux strides 8, 16 et 32. La liste complète des couches se trouve dans
models/yolov5l.yaml.SPPF enchaîne trois opérations de pooling max 5x5 au lieu d’exécuter en parallèle des opérations de pooling 5x5, 9x9 et 13x13. Le résultat est mathématiquement identique, mais l’exécution est plus de deux fois plus rapide, comme le montre l’extrait de profilage ci-dessus.
Le décalage YOLO d’origine ne pouvait jamais atteindre exactement 0 ou 1, ce qui rendait difficiles les prédictions des objets centrés sur les limites de la grille. La mise à l’échelle de la sigmoïde sur l’intervalle (-0.5, 1.5) élimine cette sensibilité à la grille, et le carré de
2σpour la largeur et la hauteur limite les prédictions à 4x la taille de l’ancre, évitant ainsi les explosions de gradients causées par l’exponentielle non bornée.Toute ancre dont les rapports de largeur et de hauteur par rapport à la boîte respectent
anchor_t(4.0 par défaut) est considérée comme une correspondance, et la plage de décalage étendue permet aussi d’attribuer la boîte aux deux cellules de grille voisines. Un seul objet peut donc générer plusieurs cibles positives, ce qui accélère la convergence.