Mais dis donc Jamy, c’est quoi une ancre ?

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).

Trouver les ancres

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.

K-means avec une distance particulière : l’IoU

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.

Calculer les ancres

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.

Détecter un visage

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.

De l’image à la prédiction

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 !

Exemple d’un réseau de neurones à 3 couches, avec les features maps intermédiaires: lignes et bords, puis éléments d’un visage, puis structure du visage.

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.

Le réseau détaillé (pour les plus aguerris 👩🏽‍💻)

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.

L’image

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.

La sortie du réseau

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.

Conclusion

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 !

______________________________________________________

Pour plus d’information sur les solutions Computer Vision et Data Sciences n’hésitez pas à nous contacter!