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