Cet article présente les fondamentaux de YOLOv3, un algorithme de détection d’objets reconnu pour sa précision et sa rapidité. Il utilise des ancres (bounding boxes prédéterminées) améliorant la détection, calculées automatiquement via la méthode du clustering k-means avec l’Intersection over Union (IoU).
Dans le contexte du traitement de l’image, l’évolution des technologies a radicalement changé les approches et les possibilités permettant de mieux en mieux comprendre les informations contenues dans des photos ou vidéos et ce, de façon automatique.
La localisation d’un ou plusieurs objets dans une image est particulièrement bien traitée avec les dernières technologies disponibles et le cadrage d’un objet dans une zone rectangulaire d’une image est maintenant largement réalisable.
You Only Look Once (YOLO) est un algorithme de détection d’objets connu pour sa grande précision et sa rapidité. Cependant, il est le résultat de longues années de recherches comme le montre la frise chronologique des algorithmes de détection d’objets :
Les trois versions originelles ont été développées par la même équipe de chercheurs et sont disponibles à cette adresse.
L’engouement de la communauté a été tel que YOLO a fini par être utilisé à des fins militaires et/ou liberticides…
C’est en effet ce que déplore l’un des auteurs dans un tweet et annonce ainsi la fin de son implication dans ce projet de computer vision.
Dans cet article, nous allons nous attarder sur la troisième version de l’algorithme: YOLOv3 – An Incremental Improvement et expliciter son fonctionnement.
Pour utiliser YOLOv3 au maximum de ses capacités, il faut comprendre deux choses en parallèle : comment se fait la détection et comment les ancres sont utilisées pour améliorer les détections. Un mauvais choix des ancres peut faire échouer l’algorithme à détecter l’objet visé !
En réalisant une analyse préalable sur les délimitations des objets que l’on essaie de trouver, il s’avère que la plupart de ces boîtes de délimitation ont certains rapports entre leur hauteur et leur largeur. Donc, au lieu de prédire directement une boîte englobante (bounding box dans la suite de l’article), YOLOv2 (et v3) prédisent des ensembles de boîtes avec des rapports hauteur-largeur particuliers – ces ensembles de boîtes prédéterminés sont les boîtes d’ancrage (ancres dans la suite de l’article) (ou anchors – english word).
Il y a plusieurs façons de définir ces ancres, la plus naïve est de les définir à la main. A la place de les choisir à la main, il est préférable d’appliquer un algorithme de clustering k-means pour les trouver automatiquement.
L’IoU – ou Intersection over Union – est une façon de mesurer la qualité de la détection d’un objet en comparant, dans un dataset d’entraînement, la position connue de l’objet dans l’image avec la prédiction faite par l’algorithme. L’IoU est le rapport entre la surface de l’intersection des bounding box considérées et la surface de l’union des ensembles.
L’IoU peut valoir entre 0 (pour une détection totalement ratée) et 1 (pour une détection parfaite). De façon générale l’objet est considéré comme étant détecté à partir d’un IoU supérieur à 0.5.
Si on utilise un k-means standard, c’est-à-dire avec la distance euclidienne, les grandes bounding boxes généreront plus d’erreurs que les petites. De plus, il est souhaitable d’avoir des ancres qui conduisent à des scores d’IoU forts. Donc nous remplacerons la distance euclidienne par :
dist(box,centroïd) = 1 − IoU(box,centroïd)
Les calculs d’IoU sont faits en faisant l’hypothèse que le coin supérieur gauche des bounding boxes sont situés au même endroit. Ainsi les calculs d’IoU sont simplifiés et ne dépendent que de la hauteur et de la largeur des bounding boxes. Ainsi, chaque bounding box peut être représentée par un point dans le plan, nous appliquons donc l’algorithme à ces points.
Prenons pour exemple le cas de la détection de visages et la base de données Wider Face:
Nous prenons tous les visages de cette base de données, et pour chaque bounding box de visage, nous plaçons un point aux coordonnées (x,y) (x pour les abscisses: la largeur de la bounding box, y pour les ordonnées: sa hauteur) relativement à la taille totale de l’image:
Nous appliquons ensuite l’algorithme k-means avec 9 centroïdes, ce qui nous permettra de déterminer les dimensions des 9 ancres pour notre modèle de détection de visages. Remarquons que les frontières entre les différents clusters ne sont pas droites. Cela est dû au fait que nous utilisons une distance dérivée de l’IoU.
Ainsi pour une image de taille 416×416 pixels, les neufs ancres sont données par :
Pour illustrer l’importance des ancres, prenons l’exemple des plaques minéralogiques. En vert, un réseau de neurones a été entraîné avec les ancres basiques et en rouge, avec des ancres spécifiques. Pour chaque détection, nous pouvons voir l’impact des ancres dans les prédictions : avec des ancres basiques, les bounding boxes sont trop hautes et trop étroites alors qu’avec des ancres spécifiques, les détections sont parfaitement ajustées.
YOLOv3 est un réseau de neurones dit totalement convolutionnel, et il produit ce qu’on appelle des features maps en sortie. Ce qu’il faut retenir pour YOLO, c’est que comme il n’y a aucune contrainte sur la taille des features map, nous pouvons lui donner des images de tailles différentes !
YOLO version 1 prédit directement les coordonnées des bounding box en utilisant une couche dense. A la place de prédire directement ces boîtes, YOLOv3 utilise des a priori sur la forme des objets à détecter, cette forme est exprimée en nombre de pixels de largeur et nombre de pixels de hauteur, puisque ces boîtes sont considérées comme rectangulaires. Ces a priori sont les ancres de YOLOv3, dont le calcul a été décrit précédemment.
YOLOv3 n’a pas de couche dense, il n’est composé que de convolutions. Chaque convolution est suivie d’une couche de Batch Normalization puis de la fonction d’activation LeakyReLu. Les batch normalizations sont bénéfiques : la convergence est plus rapide et les effets de disparition et d’explosion du gradient sont limités. Avec ces batch normalizations, nous pouvons enlever les Dropouts sans problèmes d’overfitting.
De plus, les convolutions ont une foulée (stride en anglais) de deux pour sous-échantillonner les images et réduire les 2 premières dimensions des features maps. La figure suivante représente deux convolutions, la première avec une stride de 1, la deuxième avec une stride de 2.
Le réseau possède trois outputs pour pouvoir faire des détections d’objets à trois échelles différentes.
Son architecture complète est décrite par la figure suivante.
YOLOv3 réduit la taille des images d’un facteur 32, appelé la stride du réseau. La première version de YOLO prenait des images de taille 448×448, ainsi la feature map de sortie était de dimension 14×14.
Il est courant que les objets que l’on veuille détecter soient au centre de l’image. Or, une grille de taille 14×14 n’a pas de centre unique. En pratique, il est donc préférable que la sortie ait une taille impaire. Pour lever cette ambiguïté, la taille des images sera 416×416, pour fournir une feature map de taille 13×13 avec un centre unique.
Pour bien comprendre YOLO, il faut comprendre ses sorties. YOLOv3 dispose de trois couches finales, la première a une dimension divisée par 31 par rapport à l’image initiale, la deuxième par 16 et la troisième par 8. Ainsi en partant d’une image de taille 416×416 pixels, les trois features maps en sortie du réseau auront des tailles respectives de 13×13, 26×26 et 52×52 pixels. C’est en ce sens que YOLOv3 prédit trois niveaux de détails, pour détecter respectivement les gros, moyens et petits objets.
Partant d’une image de taille 416×416 pixels, un même pixel est « suivi » à travers le réseau et conduit à trois cellules. Pour chaque cellule trois bounding box sont prédites, cela en fait un total de 9 qui sont issues des 9 ancres. Pour chaque bounding box, un score d’objectness et des scores d’appartenance aux classes sont prédits. Au total, le réseau propose 52×52×3 + 26×26×3 + 13×13×3 = 10647 bounding boxes.
Maintenant que nous disposons de toutes ces prédictions, il faut sélectionner les bonnes.
Ainsi pour chaque objet détecté, l’algorithme de NMS ne retient que la meilleure proposition.
Une fois que notre algorithme est entraîné, il peut être utilisé et même couplé à d’autres algorithmes. La détection des visages peut être couplée à la vérification de port de matériel de sécurité, ici un masque:
Ainsi, pour utiliser YOLOv3, il faut d’abord de la donnée d’entraînement. Mais cela ne suffit pas, il faut aussi se préparer à “viser” correctement les objets que l’on veut détecter en utilisant les bonnes ancres !