traitement d'image : méthode de Viola et Jones (théorie)

opencv

a marqué ce sujet comme résolu.

Bonjour,

Je cherche à comprendre le principe des "classifiers faibles" qui vont me permettre de détecter un objet. Je me suis documentée sur la méthode Viola et Jones et j’ai quelques incompréhensions que j’aimerai éclaircir avec vous.

Je prendrai un cas "simple", la détection de visage en obtenant qu’une seule caractéristique. Avec une "tache" d’une taille de 2424px contenant deux zones rectangulaires adjacentes, la première en blanc et la deuxième en noire, je vais balayer l’image (ou il y a le visage) avec ma tache en me décalant d’un pixel à la fois. A chaque décalage je fais la différence entre la partie blanche et la partie noire. Une fois le balayage terminé, je recommence l’opération en multipliant ma tache 1.25 et je recommence l’opération jusqu’à ce que ma tache fasse la taille de l’image. Puis je recommence avec une autre image contenant un visage…

j’en fais quoi du résultat de la soustraction je met ca dans un tableau ? et en quoi tout ces resultats (soustractions) vont me permettre de détecter un visage, car faire la soustraction me permet d’avoir un gradiant mais je vois pas en quoi ca va m’aider ? Ensuite j’ai souvent lu qu’on fait la meme opération mais avec des images ou il n’ y a pas de visage, quel est l’interet car je veux justement repérer les visages?

voila, j’espere que quelqu’un aura les réponses, merci d’avance pour vos remarques

Banni

Salut,

Ensuite j’ai souvent lu qu’on fait la meme opération mais avec des images ou il n’ y a pas de visage, quel est l’interet car je veux justement repérer les visages?

Tu ne veux pas que ton algorithme dise tout le temps que c’est un visage. Tu as déjà entendu parler du taux de faux positifs et du taux de faux négatifs ? Tu veux que les deux soient petits. Le taux de faux positifs est la probabilité que ton algorithme réponde qu’il y a un visage alors qu’il n’y en a pas et le taux de faux négatifs est la probabilité qu’il réponde qu’il n’y a pas de visage alors qu’il y en a un. Si tu ne présentes que des visages, tu ne vas pouvoir mesurer que le taux de faux négatifs. Si tu veux juste minimiser ça, tu vas simplement forcer ton algorithme à répondre oui le plus souvent.

j’en fais quoi du résultat de la soustraction je met ca dans un tableau ? et en quoi tout ces resultats (soustractions) vont me permettre de détecter un visage, car faire la soustraction me permet d’avoir un gradiant mais je vois pas en quoi ca va m’aider ?

Où est-ce que tu apprends l’algorithme ? Parce que je ne vois pas comment répondre sans décrire tout l’algorithme. (Juste rapidement, il ne faut pas stocker ces résultats, tout l’intérêt de ces classificateurs est que tu peux les calculer très rapidement. En gros, il va falloir déterminer quelle importance donner à chacun.)

+0 -0

Merci blo yhg pour ta réponse. Ok je comprend mieux l’étude du cas sans visage. Mais je ne comprend toujours pas ce qu’on fait des résultats lors des calculs des gradients (soustraction) d’une caractéristique. On met ca dans un classifieur où les résultats subissent un autre traitement avant de les placer dans un classifieurs ?

Je suis un école d’ingénieur en chimie, rien a voir avec l’informatique mais ce sujet m’interesse beaucoup (et j’ai des compétences en informatique ;) )

Banni

Pour te répondre je m’étais renseigné car je ne connais pas trop le sujet et voilà ce que j’ai compris.

Premièrement, un classifieur est une fonction qui prend une image et répond par oui ou par non. L’objectif est de construire un classifieur qui répondra oui quand on a un visage et non quand il n’y a pas de visage. L’algorithme AdaBoost sert à construire un bon classifieur à partir de plusieurs classifieurs médiocres. Dans le cas de Viola et Jones, on ne s’attend pas à ce que tous les classifieurs soient utiles et donc c’est une version modifiée qui est utilisée.

edit J’ai oublié de décrire les classifieurs médiocres desquels on part pour Viola et Jones. Pour chaque rectangle noir et blanc, on a une fonction $h$ qui prend une image $x$ retourne la différence $h(x)$ entre la somme sur la partie noire et la somme sur la partie blanche. On va avoir pour chaque $\theta$ un classifieur qui dit si $h(x) > \theta$ (et un autre qui dit si $h(x) < \theta$). Plus bas, on aura besoin de choisir un « meilleur classifieur » selon certain critères. Mais on ne va pas boucler sur toutes les valeurs de $\theta$ possibles. Pour une fonction $h$ fixée, il sera possible de déterminer le meilleur $\theta$ d’un coup. Donc abstraitement, on a une infinité de classifieur (ou vraiment beaucoup) mais en pratique on n’a pas besoin de tous les considérer.

Voici en gros une explication de l’algorithme AdaBoost modifié. On dispose d’un ensemble de classifieurs et d’un ensemble d’image (plus généralement des données quelconques) avec les sorties attendues (oui ou non). Au début, on attribue la même importance (poids) à chaque image. On sélectionne ensuite le classifieur qui va donner le plus de réponses juste. On prend les images pour lesquelles il a donné une réponse fausse et on augmente leurs poids. Ensuite on recommence : on cherche un classifieur qui maximise le "nombre de réponses justes", mais avec chaque réponse coefficientée par les poids modifiés (comme pour des notes scolaires). On obtient un nouveau classifieur et on augmente de nouveau les poids des images pour lesquelles ce classifieur s’est trompé. Et ainsi de suite, jusqu’à avoir un certain nombre de classifieurs. Le classifieur final est une combinaison linéaire de ces classifieurs, mais pour avoir les coefficients de cette combinaison il faut entrer dans les calculs.

Vient ensuite une optimisation par-dessus cette idée : à la place de construire un seul classifieur qui va répondre en temps constant, il est plus intéressant de faire un classifieur qui va être rapide à répondre "non" et prendre éventuellement plus de temps à répondre "oui". La raison est que pour détecter des visages, on va appliquer ce classifieur à plein d’endroits de l’image, et il n’y aura pas de visage dans la plupart des cas. Donc on va construire un premier classifieur super simple dont le rôle sera d’éliminer une grosse partie des non-visages (il répondra donc « non visage » et « peut-être visage »). On va donc vouloir 0% de faux négatif (aucun visage ne doit être rejeté) et un taux pas trop grand de faux positifs (environ 50%). Ensuite on va construire un deuxième classifieur un peu moins simple dont le rôle sera d’éliminer encore plus de non-visages. (Ce deuxième classifieur n’est entraîné que sur les données qui passent le premier classifieur.) Et ainsi de suite, on construit des classifieurs de plus en plus fins. Pour qu’une image soit reconnue comme visage, on la soumet à chacun des classifieurs dans l’ordre et dès que l’un dit que c’est un non-visage, on stoppe tout et on retourne « non-visage ».

(Note : c’est comme la monade Maybe en Haskell, puis donc comme ça aussi.)

Ça m’a intéressé de comprendre en gros comment ça fonctionne mais ensuite je ne peux pas t’expliquer beaucoup plus.

edit Tu n’as pas répondu à ma question : quelle sont tes sources ? (un pdf ?) (Je relis ma question, je voulais demander « Où est-ce que tu apprends cet algorithme (de Viola et Jones) ? », pas « Où est-ce que tu apprends l’algorithmique ? ». C’était peut-être pas clair.)

+0 -0

L’idée de viola et jones, comme tous les algos de boosting, c’est de prendre pleins de petits classificateur qui font légèrement mieux que le hasard (ce qui sera toujours le cas a moins d’avoir un classificateur pur aléatoire), que l’on appel classifieur "faible", et de les combiner pour faire un meilleur classifieur, dit "fort", en trouvant la bonne combinaison.

Imagine que tu veuille faire un détecteur de voiture rouge. Si tu prends un détecteur de couleur rouge dans l’image, tu va être capable de détecter quand il y a une voiture rouge dans l’image mais aussi les panneaux stop, les vetements rouge, etc. Si tu as un autre cassifieur qui détecte les roues, tu va détecter toutes les voitures mais de toutes les couleurs. En combinant ces deux classifieur tu va pouvoir avoir un meilleur résultat global.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte