Comment implémenter une détection d’objet personnalisée avec correspondance de modèle. Aucune donnée annotée nécessaire!
Aujourd’hui, les algorithmes de détection d’objets de pointe (algorithmes visant à détecter des objets dans des images) utilisent des réseaux de neurones tels que Yolov4.
La correspondance de modèle est une technique de traitement d’image numérique permettant de trouver de petites parties d’une image qui correspondent à une image de modèle. C’est une solution beaucoup plus simple qu’un réseau de neurones pour effectuer la détection d’objets. De plus, il présente les avantages suivants:
- pas besoin d’annoter des données (une tâche fastidieuse et obligatoire pour former des réseaux de neurones)
- les boîtes de délimitation sont plus précises
- pas besoin de GPU
Selon mon expérience, combiner un réseau de neurones comme Yolov4 et la détection d’objets avec la correspondance de modèles est un bon moyen d’améliorer considérablement les performances de votre réseau de neurones!
Qu’est-ce que la correspondance de modèles?
Lorsque vous utilisez la correspondance de modèles OpenCV, votre modèle glisse pixel par pixel sur votre image. Pour chaque position, une mesure de similarité est calculée entre votre image modèle et la partie de l’image qu’elle récupère:
Si la métrique de similarité est suffisamment élevée pour un pixel, ce pixel est probablement le coin supérieur gauche d’un objet correspondant à votre modèle!
Par conséquent, vous ne pouvez effectuer une détection d’objet avec une correspondance de modèle que si les objets que vous essayez de détecter sont suffisamment similaires — presque identiques — dans une classe. Vous pouvez toujours inclure plus de modèles pour gérer les variations d’objets (taille, couleur, orientation). Mais cela augmentera le temps de prédiction.
À première vue, cela semble très restrictif. Mais de nombreux cas d’utilisation de détection d’objets peuvent être abordés avec la correspondance de modèles:
- ID dans les documents numérisés
- espace de stationnement vide d’une caméra fixe
- composants sur une chaîne de montage…
Un exemple pratique
Un bon cas d’utilisation pour la détection d’objets utilisant la correspondance de modèles est de détecter des composants sur des circuits imprimés, tels que celui-ci:
On pourrait imaginer une chaîne de montage produisant de tels circuits. Imaginons que certains circuits fabriqués soient des composants manquants et donc, défectueux. Nous pourrions proposer d’installer une caméra en bout de piste et de filmer chaque circuit, afin de filtrer les produits défectueux. Nous pouvons y parvenir avec la détection d’objets avec la correspondance de modèles!
Par souci de simplicité, nous nous concentrerons sur la détection de quelques composants.
Un premier composant apparaissant deux fois:
Celui-ci apparaissant quatre fois:
Et ce troisième apparaissant six fois:
Enfin, nous choisissons ces trois images comme modèles. Par conséquent, la complexité de ce cas d’utilisation est réduite : nous détecterons facilement au moins les objets choisis comme modèles.
Détection d’objet de base avec correspondance de modèle
Définition de modèle
Tout d’abord, nous définissons des modèles à partir de:
- un chemin d’image,
- une étiquette,
- une couleur (pour la visualisation des résultats – délimitant les cases et la couleur des étiquettes),
- et un seuil de correspondance.
Deuxièmement, nous considérons que tous les pixels ayant une métrique de similarité au-dessus de ce seuil indiquent une détection pour ce modèle.
Voici le code définissant les modèles:
Détection d’objet avec correspondance de modèle
Ensuite, nous parcourons les modèles pour effectuer une détection d’objet avec correspondance de modèle pour chaque modèle. Comme nous utilisons un seuil, nous sélectionnons une métrique de similarité normalisée (TM_CCOEFF_NORMED) lors de l’application de la correspondance de modèle. On peut donc choisir un seuil compris entre 0 et 1:
Nous considérons que chaque pixel ayant un score de similarité supérieur au seuil de modèle est le coin supérieur gauche d’un objet (avec la hauteur, la largeur et l’étiquette du modèle).
Visualisez les objets détectés
Ensuite, nous tracons les boîtes de délimitation prédites de cette détection d’objet avec la correspondance de modèle sur l’image d’entrée:
Enfin, nous obtenons les résultats suivants:
Comme l’indique l’épaisseur des cases (en vert, jaune et rouge), chaque objet a été détecté plusieurs fois.
Supprimer les doublons
Pourquoi avons-nous obtenu des détections dupliquées? Comme expliqué ci-dessus, la correspondance de modèle OpenCV renvoie une matrice 2D ayant la dimension de l’image d’entrée (une cellule — et donc un score de similarité — pour chaque pixel d’image d’entrée).
Par conséquent, si un objet est détecté à un endroit, tous les pixels environnants auront très probablement le même score de similitude, et seront donc considérés comme d’autres coins en haut à gauche de l’objet.
Pour résoudre ce problème, nous allons trier toutes les détections en diminuant les valeurs correspondantes. Ensuite, nous choisirons de valider ou non chaque détection. Nous validons la détection si elle ne se chevauche pas trop avec l’une des détections déjà validées. Enfin, nous déterminons que deux détections se chevauchent si l’Intersection sur l’Union de leurs boîtes de délimitation est supérieure à un seuil donné. Ce processus est appelé Suppression non maximale.
Voici une explication visuelle de ce qu’est l’Intersection sur l’Union (IoU):
Voici comment je l’ai implémenté (la méthode de calcul IoU ainsi que d’autres explications peuvent être trouvées ici):
Et puis, je viens d’ajouter ces deux lignes après la boucle de détection:
En conséquence, nous obtenons:
Beaucoup plus propre! Nous voyons maintenant clairement que tous les premier et troisième composants sont détectés sans faux positif (précision et rappel de 1).
Nous voulons maintenant réduire le nombre de faux positifs pour la composante 2. Le moyen le plus simple consiste à augmenter le seuil de correspondance pour le modèle utilisé pour cette étiquette.
Choisir des hyperparamètres
Il est bien sûr préférable de calculer des métriques de détection d’objets sur différentes images pour choisir des hyperparamètres (seuil de correspondance de modèle et seuil de suppression Non maximal). Pour l’instant, nous pouvons simplement augmenter le seuil de composant 2:
Et nous obtenons:
Nous n’avons plus que deux faux positifs pour le composant 2, au lieu de dizaines (précision de 2/3, rappel de 1)! De plus, les composants 1 et 2 sont toujours parfaitement détectés (précision et rappel de 1).
Pour améliorer nos résultats, nous pourrions:
- inclure des modèles pour les composants confondus avec le composant 2.
- essayez plusieurs métriques de similarité
- annotez quelques images pour calculer les métriques de détection et effectuez une recherche par grille sur ces paramètres.
Résumé
Nous avons réussi à détecter des objets avec la correspondance de modèles par:
- définition d’au moins un modèle pour chaque objet (plus vous avez de modèles pour un objet, plus votre rappel sera élevé — et votre précision faible)
- utilisation de la méthode de correspondance de modèle OpenCV sur l’image pour chaque modèle
- considérant que chaque pixel ayant un score de similitude supérieur à un seuil de modèle est le coin supérieur gauche d’un objet (avec la hauteur, la largeur et l’étiquette de ce modèle)
- appliquer une Suppression Non maximale des détections obtenues
- choisir des seuils de modèle pour améliorer la précision de la détection !
C’est tout!
Vous recherchez des Experts en Reconnaissance d’images ? N’hésitez pas à nous contacter !