Haar cascade - Détection de visages et d'objets

haar-cascade

La détection d'objets dans une image ou une vidéo est une tâche non triviale en vision par ordinateur, car deux critères sont à prendre en compte lors de la construction d'une méthode de détections d'objet. Le premier est la capacité que cette méthode à détecter correctement un objet et à ne pas se tromper la seconde est le temps d'exécution que cette méthode nécessite. En ce sens, la méthode des cascades de Haar respecte ces deux critères et nous allons voir comment dans cet article.

À la fin de cet article, vous saurez comment la méthode des cascades de Haar fonctionne, mais aussi comment l'implémenter à l'aide de la librairie Opencv en python.


La méthode des cascades de Haar a été proposée en 2001 dans un article de recherche intitulé "Rapid Object Detection using a boosted cascade of simple feature" par Paul Viola et Michael Jones. Elle est rapidement devenue célèbre, car en plus d'obtenir un taux de succès relativement élevé sur un Jeu de données difficiles "MIT+CMU Dataset", elle était 15 fois plus rapide que les autres méthodes de détection de visage à l'époque. Bien que la méthode avait été spécialement conçue pour détecter des visages, la communauté s'est rapidement rendu compte que la méthode s'appliquait aux autres membres du corps, aux objets, et de manière générale à tout type d'image. 

L'algorithme proposé se décompose en 4 parties :

   -Constitution d'une base de données contenant des images avec l'objet et des images sans l'objet.

   -Extraction de caractéristiques de l'ensemble des images contenu dans la base

    -Entraînement d'un classifieur en cascade 

    -Phase de détection



Constitution du Jeu de données

Pour pouvoir utiliser les cascades de Haar, il faut dans un premier temps constituer un jeu de données composé d'images contenant uniquement et ne contenant pas l'image de l'objet que vous souhaitez détecter. Les recommandations vous construisez ce jeu reste bien entendu les mêmes que pour toute application de reconnaissance d'image : 

Les images doivent être proches visuellement de ce que vous souhaitez détecter

Il faut une certaine quantité d'exemples non négligeable 

Je vous recommande de construire ce jeu de manière automatique si vous en avez la possibilité. Cela peut se faire en utilisant un algorithme de segmentation basique. 


Extraction des caractéristiques de l'objet

Une fois la base d'images constituée la seconde étape consiste à extraire les caractéristiques définies pas Viola et Jones dans leurs articles. Les cascades de Haar créent les caractéristiques qu'il utilise en appliquant sur l'image un filtre carré de 24x24. Il s'agit des filtres présentés sur l'image ci-dessous. Les caractéristiques sont obtenues en soustrayant la somme des pixels de l'image couverts par la zone blanche du filtre à la somme des pixels couverts par la zone bleue. Ce processus génère énormément de caractéristiques étant donné que le filtre est appliqué sur toute l'image. Viola et Jones évoquent un nombre de caractéristiques supérieur à 180 000 dans leur article pour une image de 384 par 288. 








Il faudra choisir parmi celles-ci les plus pertinentes. Cela se fait grâce à l'algorithme AdaBoost qui l'on verra a comparativement une grande capacité de généralisation et permet temps d'exécution imbattable pour les applications telles que la  détection d'objets.


Entraînement du classifieur

Pour des raisons de performance, Viola et Jones ont choisi d'utiliser le classifieur AdaBoost (Adaptive Boosting) pour le détecteur de Haar. Comparativement aux autres classifieur, ce classifieur présente l'avantage d'avoir une bonne vitesse d'exécution pour l'application qui en est faite tout en conservant un taux de reconnaissance haut. Vous comprendrez pourquoi en lisant la suite. 


Le principe d'Adaboost est d'entraîner un grand nombre d'arbres de décision à un niveau. Ces arbres sont connus sous le nom de "decision stump" qui signifie moignon de décision en français. Chose plutôt drôle, car dans le dictionnaire moignon à deux significations : "Extrémité d'un membre amputé." ou Ce qui reste d'une grosse branche cassée ou coupée.". Quoi qu'il en soit, vous l'aurez compris l'idée consiste à ne garder que le haut de l'arbre, la racine et deux branches.

Ce choix semble cohérent au vu du grand nombre de feature, duquel on est en présence. 

L'idée derrière adaboost  est de combiné de faible classifieur afin d'en obtenir un fort. Les classifieurs votent à la fin, le poids de chaque classifieur dépend de sa performance lors de l'apprentissage. Chaque classifieur est entraîné en utilisant un sous-ensemble du jeu de données totales Adaboost assigne un poids à chaque exemple mal classé après chaque entraînement. Les exemples mal classifiés ont un plus gros poids. Donc ils apparaissent plus souvent dans le sous-ensemble de données du classifieur suivant.


L'algorithme AdaBoost est relativement simple, il consiste à entraîner un grand nombre d'arbres de décision à un niveau (decision stump).

Pour sélectionner les caractéristiques, l'algorithme adaboost va entraîner un ensemble d'arbre de décision à 1 niveau nommé décision stump. (Cf : l'image ci-dessous)

    



Trois idées fondamentales sont à la base des méthodes de boosting probabilistes:

1. L'utilisation d'un comité d'experts spécialistes que l'on fait voter pour atteindre une décision.

2. La pondération adaptative des votes par une technique de mise à jour.

3. La modification de la distribution des exemples disponibles pour entraîner chaque expert, en surpondérant au fur et à mesure les exemples mal classés aux étapes précédentes.


L'idée est de refuser au plus tôt une image dès les premiers niveaux plutôt que de la faire descendre dans le classifieur. 


Le classifieur en cascade est généralement stocké dans un fichier xml.


Après entraînement du classifieur sur les 180 000 caractéristiques extraites seulement 6000 ont été retenues, et le classifieur a 38 niveaux.

Entraînement  avec Adaboost

La phase de détection

Une fois entraînés, nous pouvons passer à la phase de détection. 

Seulement comme ce processus de calcule prends énormément de temps des images intégrales sont calculée afin d'accélérer le temps de calcul.


Application : 

Bien qu'a l'origine ces caractéristiques ait été créée pour le traitement d'images, elle sont utilisé pour la détection d'objet.

Sur le github d'openCV dédié au cascade de Haar https://github.com/opencv/opencv/tree/master/data/haarcascades vous pouvez trouver de nombreux détecteur préentrainé.

Détecteur de yeux : https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_eye.xml

Détecteur de sourire : https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_smile.xml

Détecteur de lunnette : https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml

Détecteur de tête de chat : https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalcatface.xml

Détecteur de visage : https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_alt.xml

Détecteur de corps humain : https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_fullbody.xml

Détecteur de corps humain (Partie haute) : https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_upperbody.xml

Détecteur de corps humain ( Partie Basse) : https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_lowerbody.xml

Détecteur de plaque d'immatriculation : https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_licence_plate_rus_16stages.xml


Source :

https://fr.wikipedia.org/wiki/Caract%C3%A9ristiques_pseudo-Haar

https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html

https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf

 

  

.