Architecture d'Ultralytics YOLOv5#
YOLOv5 (v6.0/6.1) est un algorithme de détection d'objets puissant développé par Ultralytics. Cet article plonge en profondeur dans l'architecture de YOLOv5, les stratégies d'augmentation de données, les méthodologies d'entraînement et les techniques de calcul de perte. Cette compréhension approfondie t'aidera à améliorer ton application pratique de la détection d'objets dans divers domaines, y compris la surveillance, les véhicules autonomes et la reconnaissance d'images.
1. Structure du modèle#
L'architecture de YOLOv5 se compose de trois parties principales :
- Backbone : C'est le corps principal du réseau. Pour YOLOv5, le backbone est conçu en utilisant la structure
CSPDarknet53, une modification de l'architecture Darknet utilisée dans les versions précédentes. - Neck : Cette partie connecte le backbone et la head. Dans YOLOv5, les structures
SPPF(Spatial Pyramid Pooling - Fast) etPANet(Path Aggregation Network) sont utilisées. - Head : Cette partie est responsable de la génération de la sortie finale. YOLOv5 utilise
YOLOv3 Headà cet effet.
La structure du modèle est illustrée dans l'image ci-dessous. Les détails de la structure du modèle peuvent être trouvés dans models/yolov5l.yaml.

YOLOv5 introduit quelques améliorations notables par rapport à ses prédécesseurs :
- La structure
Focus, trouvée dans les versions antérieures, est remplacée par une structure6x6 Conv2d. Ce changement améliore l'efficacité #4825. - La structure
SPPest remplacée parSPPF. Cette modification double plus que la vitesse de traitement tout en maintenant la même sortie.
Pour tester la vitesse de SPP et SPPF, le code suivant peut être utilisé :
SPP vs SPPF speed profiling example (click to open)
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 de données#
YOLOv5 utilise diverses techniques d'augmentation de données pour améliorer la capacité du modèle à généraliser et réduire le surapprentissage. Ces techniques incluent :
-
Augmentation Mosaic : Une technique de traitement d'images qui combine quatre images d'entraînement en une seule de manière à encourager les modèles de détection d'objets à mieux gérer diverses échelles d'objets et translations.

-
Augmentation Copy-Paste : Une méthode d'augmentation de données innovante qui copie des patchs aléatoires d'une image et les colle sur une autre image choisie au hasard, générant efficacement un nouvel échantillon d'entraînement.

-
Transformations affines aléatoires : Cela inclut la rotation, la mise à l'échelle, la translation et le cisaillement aléatoires des images.

-
Augmentation MixUp : Une méthode qui crée des images composites en prenant une combinaison linéaire de deux images et de leurs étiquettes associées.

-
Albumentations : Une bibliothèque puissante d'augmentation d'images qui prend en charge une grande variété de techniques d'augmentation. En savoir plus sur l'utilisation des augmentations Albumentations.
-
Augmentation HSV : Changements aléatoires de la teinte (Hue), de la saturation (Saturation) et de la valeur (Value) 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 incluent :
- Entraînement multi-échelle : Les images d'entrée sont redimensionnées aléatoirement dans une plage de 0,5 à 1,5 fois leur taille d'origine pendant le processus d'entraînement.
- AutoAnchor : Cette stratégie optimise les boîtes d'ancrage préalables pour correspondre aux caractéristiques statistiques des boîtes de vérité terrain (ground truth) dans tes données personnalisées.
- Warmup and Cosine LR Scheduler : Une méthode pour ajuster le taux d'apprentissage afin d'améliorer les performances du modèle.
- Moyenne mobile exponentielle (EMA) : Une stratégie qui utilise la moyenne des paramètres sur les étapes passées pour stabiliser le processus d'entraînement et réduire l'erreur de généralisation.
- Entraînement en précision mixte : Une méthode pour effectuer des opérations dans un format de demi-précision, réduisant l'utilisation de la mémoire et améliorant la vitesse de calcul.
- Évolution des hyperparamètres : Une stratégie pour ajuster automatiquement les hyperparamètres afin d'obtenir des performances optimales. En savoir plus sur le réglage des hyperparamètres.
4. Fonctionnalités supplémentaires#
4.1 Calcul des pertes#
La perte dans YOLOv5 est calculée comme une combinaison de trois composantes de perte individuelles :
- Perte de classes (Perte BCE) : La perte d'entropie croisée binaire, mesure l'erreur pour la tâche de classification.
- Perte d'objectness (Perte BCE) : Une autre perte d'entropie croisée binaire, calcule l'erreur dans la détection de la présence ou non d'un objet dans une cellule de grille particulière.
- Perte de localisation (Perte CIoU) : Perte IoU complète, mesure l'erreur de localisation de l'objet dans la cellule de la grille.
La fonction de perte globale est représentée par :
4.2 Équilibrage des pertes#
Les pertes d'objectivité des trois couches de prédiction (P3, P4, P5) sont pondérées différemment. Les poids d'équilibre sont respectivement [4.0, 1.0, 0.4]. Cette approche garantit que les prédictions à différentes échelles contribuent de manière appropriée à la perte totale.
4.3 Élimination de la sensibilité à la grille#
L'architecture 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 directement prédites en utilisant l'activation de la dernière couche.
Cependant, dans YOLOv5, la formule de prédiction des coordonnées de la boîte 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 pour calculer 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 de décalage du point central est ajustée de (0, 1) à (-0,5, 1,5). Par conséquent, le décalage peut facilement atteindre 0 ou 1.
Compare le rapport de mise à l'échelle de la hauteur et de la largeur (par rapport à l'anchor) avant et après l'ajustement. Les équations de boîte originales de yolo/darknet ont un défaut grave. La largeur et la hauteur sont complètement non bornées car elles sont simplement out=exp(in), ce qui est dangereux, car cela peut entraîner des gradients explosifs, des instabilités, des pertes NaN et finalement une perte complète de l'entraînement. Consulte ce problème pour plus de détails.
4.4 Construction des cibles#
Le processus de construction de la cible dans YOLOv5 est essentiel pour l'efficacité de l'entraînement et la précision du modèle. Il implique l'attribution des boîtes de vérité terrain aux cellules de grille appropriées dans la carte de sortie et leur mise en correspondance avec les anchor boxes appropriées.
Ce processus suit ces étapes :
- Calcule le rapport entre les dimensions de la boîte de vérité terrain et les dimensions de chaque modèle d'ancrage.
- Si le rapport calculé est dans le seuil, fais correspondre la boîte de vérité terrain avec l'ancrage correspondant.
- Assignes l'ancrage correspondant aux cellules appropriées, en gardant à l'esprit qu'en raison du décalage révisé du point central, une boîte de vérité terrain peut être assignée à plus d'un ancrage car la plage de décalage du point central est ajustée de (0, 1) à (-0,5, 1,5), ce qui rend possibles des correspondances supplémentaires.
De cette façon, le processus de construction des cibles garantit que chaque objet de vérité terrain est correctement assigné et mis en correspondance pendant le processus d'entraînement, permettant à YOLOv5 d'apprendre plus efficacement la tâche de détection d'objets.
Conclusion#
YOLOv5 représente une étape significative dans l'évolution de la détection d'objets en temps réel. Ses choix architecturaux, ses stratégies d'entraînement et ses raffinements techniques offrent des performances et une efficacité solides par rapport aux versions antérieures de YOLO.
Les améliorations principales dans YOLOv5 incluent l'utilisation d'une architecture dynamique, une vaste gamme de techniques d'augmentation de données, des stratégies d'entraînement innovantes, ainsi que des ajustements importants dans le calcul des pertes et le 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 conservant un haut degré de vitesse, qui est la marque de fabrique des modèles YOLO.