Eprint 10344
Eprint 10344
MÉMOIRE PRÉSENTÉ À
PAR :
AVRIL 2022
Université du Québec à Trois‐Rivières
Service de la bibliothèque
Avertissement
Résumé
De nos jours, la reconnaissance faciale et le Big Data sont deux facettes qui n’avaient
pratiquement rien en commun, mais les progrès récents dans plusieurs domaines et prin-
cipalement la vision par ordinateur les a conduits à converger pour effectuer des tâches à
l’aide de l’apprentissage automatique profond telles que la détection, la reconnaissance
et la classification.
Dans ce rapport, nous avons développé un système de reconnaissance faciale basé sur
la technique Local Binary Pattern Histogram (LBPH) et la technique de Haar Cascade
Classifier pour traiter la reconnaissance en temps réel du visage humain à partir de la
caméra de l’ordinateur. Ce système prépare dans un premier temps, les données à partir
desquelles on veut extraire de l’information et faire la reconnaissance, il s’agit de photos
et de vidéos contenant de l’information sur le visage humain, ensuite il utilise l’algo-
rithme Haar Cascade Classifier pour effectuer la détection de l’objet visage humain. Par
la suite, le système procède à l’extraction des caractéristique des points de visage pour
encoder la forme de celui-ci en binaire à l’aide de la technique LBP. Finalement la classifi-
cation des histogrammes générés qui nous permet de voir s’il s’agit de la bonne personne
qu’on veut identifier ou non.
Abstract
Nowadays, facial recognition and Big Data are two facets that had practically nothing in
common, but recent advances in several fields and mainly computer vision has led them
to converge to perform tasks using deep machine learning such as detection, recognition
and classification.
In this report, we developed a facial recognition system based on Local Binary Pattern
Histogram (LBPH) technique and Haar Cascade Classifier technique to process real-time
recognition of human face from computer camera. This system first prepares the data
from which we want to extract information and perform recognition, these are photos
and videos containing information on the human face, then it uses the algorithm Haar
Cascade Classifier to perform human face object detection. Thereafter, the system pro-
ceeds to the extraction of the characteristics of the face points to encode the shape of
the latter in binary using the LBP technique. Finally the classification of the generated
histograms which allows us to see if it is the right person that we want to identify or
not.
Remerciements
Je tiens à remercier, au terme de ce travail, toutes les personnes dont l’intervention, de près
ou de loin, a contribué à l’aboutissement de ce mémoire. Tout d’abord, j’adresse mes sin-
cères remerciements à Mr Fathallah Nouboud qui m’a fait l’honneur de m’encadrer et qui
n’a épargné aucun effort pour le bon déroulement de ce travail, avec ses remarques et ses
consignes qui m’ont été d’un grand apport. Je tiens à lui témoigner ma reconnaissance et
ma gratitude pour la qualité de son encadrement, son soutien et ses précieux conseils, pour
le temps précieux qu’il m’a consacré, pour son suivi, sa disponibilité et ses conseils qui m’ont
été d’une grande aide pour mener à bien ce projet. Je tiens à témoigner toute ma reconnais-
sance envers lui pour l’expérience enrichissante et pleine d’intérêt qu’il m’a fait vivre durant
cette maîtrise. Mes vifs remerciements s’adressent également à ma petite famille, mon mari
et mes enfants, qui m’ont comblé de leur soutien et m’ont voué un amour inconditionnel.
Vous êtes pour moi un exemple de courage et de sacrifice continu, je vous remercie pour
votre compréhension, votre soutien et votre tendresse.... Je m’acquitte, enfin, volontiers d’un
devoir de gratitude et de remerciements à tous mes enseignants pour la qualité de l’ensei-
gnement : François Meunier, Ismaili Biskri, William Flageol, Louis Houde et Usef Faghihi,
qu’ils ont bien voulu me prodiguer durant mon cursus à l’université afin de me fournir une
formation efficiente et ciblée.
2 Etat de l’art 24
2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5
TABLE DES MATIÈRES UQTR
2.3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5.2 Fuzzification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5.4 Défuzzification . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.2.1 Le boosting . . . . . . . . . . . . . . . . . . . . . . . . 39
3.3.1.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.4 Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.5 Identification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.2 Implémentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.3 Expérimentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
8
3.7 Random forest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Sommaire
1.1 La vision par ordinateur . . . . . . . . . . . . . . . . . . . . . . . 13
1.2 le Big Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.3 La reconnaissance faciale . . . . . . . . . . . . . . . . . . . . . . . 16
1.4 Le Big Data et la reconnaissance de visage . . . . . . . . . . . . . 17
1.5 Architecture d’un système de reconnaissance faciale . . . . . . . 18
1.5.1 Préparation des données . . . . . . . . . . . . . . . . . . . . . 19
1.5.2 Détection de visage . . . . . . . . . . . . . . . . . . . . . . . . 20
1.5.3 Extraction des caractéristiques . . . . . . . . . . . . . . . . . 21
1.5.4 Classification des visages . . . . . . . . . . . . . . . . . . . . 22
1.5.5 Identification et vérification . . . . . . . . . . . . . . . . . . . 23
12
CHAPITRE 1. PROBLÉMATIQUE ET CONTEXTE GÉNÉRAL UQTR
Ainsi, on peut dire que le but de la vision par ordinateur est de développer des
algorithmes qui permettent à l’ordinateur de «voir».
La vision par
ordinateur
La vision par ordinateur est donc un domaine complet qui traite un haut niveau de
programmation en alimentant les images/vidéos d’entrée pour effectuer automatique-
ment, et à l’aide de l’apprentissage automatique en profondeur, des tâches telles que la
détection, la reconnaissance et la classification.
Le rôle principal de la vision par ordinateur est de déterminer si une image contient
un certain objet. Les algorithmes analysent automatiquement les images et extraient des
informations.
La vision par ordinateur automatisée n’est pas encore suffisamment fiable pour
détecter des anomalies ou suivre des objets. Par conséquent, dans de tels cas, les humains
sont toujours dans la boucle d’analyse pour évaluer la situation. La vision par ordinateur
essaie d’apprendre une fonction vraiment complexe,t on a souvent l’impression que nous
n’avons pas assez de données pour la vision par ordinateur et cela même si les ensembles
de données sont de plus en plus volumineux. Souvent, nous n’avons simplement pas
autant de données que ce dont nous avons besoin [14].
La vision par ordinateur peut améliorer les résultats des moteurs de recherche in-
ternet. La technologie peut contextualiser les images dans les recherches. Ce qui signifie
qu’il peut étiqueter et identifier les objets, et même les paramètres de vos photos télé-
chargées.
Au cours de ces dernières années, plus de données sont produites à des taux plus
rapides que jamais et en différents formats, textes, email, photos, vidéos, musique, do-
cuments et autres, cela a conduit à l’apparition d’un certain nombre de technologies qui
corrigent des aspects spécifiques de ces problèmes d’où le Big Data.
L’analyse du Big Data se fonde sur les trois dimensions aussi appelées les trois V :
— la vérocité concerne la grande rapidité à laquelle les données sont créées, sto-
ckées et analysées ;
— Le volume se rapporte au coté illimité du Big Data avec un nombre de données
qui ne cesse de croître ;
— la variété représente les différentes sources de provenance des données.
Variété
Big Data
Volume Vérocité
Quand on parle du Big Data on évoque directement les données, nous distinguons alors
de deux types de données, les données structurées et les données non structurées.
Le terme Big Data fait référence au volume conséquent de données à leurs types
et aux outils permettant leurs traitement.
Le visage de chaque individu est unique, tout comme ses empreintes digitales. La
reconnaissance faciale consiste à reconnaître automatiquement une personne grâce à
son visage et cela, via une caméra, un ordinateur ou un téléphone intelligent, et grâce à
un logiciel avec ses algorithmes d’identification.
le visage de la personne connectée soit déjà enregistré dans l’immense base de données
de SenseTime.
La reconnaissance faciale et le Big Data sont deux facettes qui n’avaient pratique-
ment rien en commun, mais les progrès récents dans plusieurs domaines connexes tels
que les réseaux sociaux ainsi que les progrès dans la nationalisation des bases de don-
nées faciales des forces de l’ordre les ont conduits à converger. Les applications à venir
telles que le marquage de visage dans les hubs de réseautage social tels que Facebook,
en plus d’être un élément crucial dans des applications critiques telles que l’appréhen-
sion criminelle par le biais de la correspondance de mug shot, la recherche de personnes
disparues, etc.
Les technologies BDA populaires incluent : Apache Hive, Apache Giraph et les
œuvres déjà importantes de Horton, Hadoop, etc.
Yahoo a développé Apache Giraph en 2010, sur la base d’un important article de
Pregel publié par Google. La technologie Apache Giraph est basée sur les stratégies du
calcul distribué et du système de traitement itératif de graphes et repose de manière
décisive sur les trois composants critiques du calcul et du traitement parallèles : le calcul
simultané, la communication et la synchronisation des barrières. Ces propriétés font
d’Apache Giraph un candidat idéal pour aider à proposer des systèmes de reconnaissance
faciale efficaces. Facebook continue également d’élargir sa présence dans le domaine de
la BDA en optant pour la méthodologie Apache Giraph afin de proposer une nouvelle
recherche de graphe social qui peut effectivement évoluer jusqu’à un billion d’arêtes[34].
Collete des
Récupération Extraction
Collecte images po- Reconnaissance
des valeurs des fea-
des images sitives et du visage
de pixels tures
négatives
Construire Identification
Calcul des Création
une base Entrainement de la per-
opérateurs des bag-of-
de données sonne
features
Extraction
Nettoyage Détection
des carac-
des images de l’objet Classification
téristiques
Entrainement
Un système de reconnaissance faciale doit dans un premier temps préparer les données
à partir desquelles on veut extraire de l’information et faire la reconnaissance. Ces don-
nées sont sous forme de photos et de vidéos contenant de l’information qui est le visage
humain. Ensuite il utilise des algorithmes appropriés de l’apprentissage profond pour
faire la détection de l’objet visage humain, par la suite le système procède à l’extraction
des caractéristique des points de visage pour encoder la forme du visage en binaire ou
numérique, ça peut être le nez, les yeux, la bouche. Finalement la classification du visage
qui permet d’identifier et vérifier le visage dans une scène.
Les données peuvent être des simples images ou des séquences d’images dites vi-
déos chargées à partir d’une base de données, d’une caméra de surveillance ou autres.
Les données doivent êtres nettoyées et converties en niveau de gris afin d’être utilisées
efficacement et sans bruit.
La détection de visage est la pierre angulaire de tous les algorithmes d’analyse faciale,
y compris l’alignement du visage, la modélisation du visage, le ré-éclairage du visage,
la reconnaissance du visage, la vérification ou l’authentification du visage, le suivi de la
pose de la tête, le suivi ou la reconnaissance de l’expression faciale, la reconnaissance
du sexe ou de l’âge, et bien d’autres. Ainsi, les ordinateurs peuvent identifier clairement
le visage, après ils commencent à vraiment comprendre les pensées et les intentions des
gens à l’aide de l’apprentissage automatique [20].
La détection de visage peut se faire à l’aide des algorithmes de deep learning. Cette
étape se base sur l’entrainement du modèle afin de reconnaitre et de détecter l’objet re-
cherché dans les données. Avant de coller un nom à un visage, le logiciel doit comprendre
d’abords qu’il est en présence d’un être humain. La détection de visage est la première
étape de la reconnaissance faciale, pour cela, il faut éduquer la machine en lui disant qu’il
s’agit d’un visage dans des millions d’images contenant le visage et qu’il s’agit d’autre
chose que le visage dans des millions d’image ne contenant pas le visage. Le système
comprend alors les caractéristiques du visage que ça soit de face ou de profile.
Cette étape consiste à isoler les éléments du visage qu’on va mesurer et à détecter les
points caractéristiques basiques comme les yeux, le contour de la bouche et le contour
du nez pour reconstruire la forme 3D d’un visage afin de différencier les personnes. Pour
cela, on calcule la distance entre les éléments du visage et ainsi que tous les éléments qui
peuvent illustrer que deux visages ne sont pas identiques.
L’importance des traits du visage pour la reconnaissance faciale ne peut être sur-
estimée. De nombreux systèmes de reconnaissance faciale ont besoin de traits faciaux
en plus du visage holistique, comme le suggèrent des études en psychologie. Il est
bien connu que même les méthodes d’appariement holistiques, par exemple, les visages
propres proposés par Turk et Pentland [33] et les Fisherfaces, proposés par Belhumeur
et al [27], nécessitent des emplacements précis des principales caractéristiques faciales
telles que les yeux, le nez et la bouche pour normaliser le visage détecté. Les traits du
visage peuvent être de différents types : région [25], [5], point clé (repère) ou Landmarks
[21], [16] et contour [32], [17].
En règle générale, les entités ponctuelles clés fournissent une représentation plus
précise et cohérente à des fins d’alignement que les entités basées sur la région, avec une
complexité et une charge de calcul inférieures à celles de l’extraction d’entités de contour.
Trois types de méthodes d’extraction de caractéristiques peuvent être distingués [10] :
— (1) méthodes génériques basées sur les arêtes, les lignes et les courbes ;
— (2) méthodes basées sur des modèles qui sont utilisées pour détecter les traits
du visage tels que les yeux ;
— (3) méthodes d’appariement structurel qui tiennent compte des contraintes géo-
métriques sur les caractéristiques.
Etat de l’art
Sommaire
2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2 Approche Eigen Face . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.2 Technique ACP . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.2.3 Technique SVD . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2.4 Technique SVM . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.3 Approche classification avec descripteur par bloc . . . . . . . . . 29
2.3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.3.2 L’histogramme de LBP . . . . . . . . . . . . . . . . . . . . . . 30
2.4 L’approche de Deep Learning avec les réseaux de neurone . . . 30
2.5 Approche pa la logique floue . . . . . . . . . . . . . . . . . . . . . 31
2.5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5.2 Fuzzification . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5.3 Inférence floue . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5.4 Défuzzification . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.5.5 Détection de visage utilisant la logique floue . . . . . . . . . . 32
24
CHAPITRE 2. ETAT DE L’ART UQTR
2.1 Introduction
2.2.1 Introduction
SVD / ACP ont été appliquées à une grande variété de problèmes en science et en
ingénierie.
Y = A.X
Basée sur une analyse en composantes principales (ACP), la méthode des Eigen
Faces repose sur une utilisation des premiers vecteurs propres comme visages propres,
d’où le terme Eigen Faces [4].
et Kirby (1987) et utilisé par Matthew Turk et Alex Pentland pour la classification de
visages. Cette méthode est considérée comme le premier exemple réussi de technologie
de reconnaissance faciale. Ces vecteurs propres sont dérivés de la matrice de covariance
de la distribution de probabilité de l’espace vectoriel de grande dimension des possibles
visages d’êtres humains [30].
D VT
words
words
X = U
Matrice originale
SVD
La SVD est utile dans de nombreuses tâches. Ici, nous mentionnons quelques exemples.
Tout d’abord, dans de nombreuses applications, la matrice de données A est proche d’une
matrice de faible rang et il est utile de trouver une matrice de faible rang qui soit une
bonne approximation de la matrice de données. Nous allons montrer qu’à partir de la
décomposition en valeurs singulières de A, on peut obtenir la matrice B de rang k qui
se rapproche le mieux de A ; en fait, nous pouvons le faire pour chaque k.
De plus, la décomposition en valeurs singulières est définie pour toutes les ma-
trices (rectangulaires ou carrées) contrairement à la décomposition spectrale plus cou-
ramment utilisée en algèbre linéaire. Le lecteur familier avec les vecteurs propres et les
valeurs propres (nous ne supposons pas la familiarité ici) se rendra également compte
que nous avons besoin de conditions sur la matrice pour assurer l’orthogonalité des vec-
teurs propres. En revanche, les colonnes de V dans la décomposition en valeurs singu-
lières, appelées vecteurs singuliers droits de A, forment toujours un ensemble orthogonal
sans hypothèses sur A. Les colonnes de U sont appelées les vecteurs singuliers à gauche
et forment également un ensemble orthogonal. Une conséquence simple de l’orthogona-
lité est que pour une matrice A carrée et inversible, l’inverse de A est V D−1 U T .
A = U ΣV T
u1 ur ur+1 um
vT
σ1 1
..
.
row(A)
v T
σr r
= ··· ···
v T
0 r+1
... null(A)
T
0 vn
col(A) null(A)
grande fléxibilité ainsi que sa simple utilisation même pour les débutants en apprentis-
sage automatique.
Classe 2
Classification SVM
Classe 1
Le but principale du SVM est de former deux groupes de données distincts sépa-
rés entre eux à l’aide d’une frontière de telle sorte que la distance entre les groupes de
données soit maximale.
2.3.1 Introduction
Cette approche divise l’image en des blocs formant une grille. Un descripteur est
appliqué pour chaque bloc, et ainsi l’image est constituée en concaténant les différents
descripteurs.
L’opérateur des motifs binaires locaux (LBP) a été proposé à la fin des années 90
par Ojala [26].
L’idée de cet opérateur de texture est d’assigner à chaque pixel un code dépendant
des niveaux de gris de son voisinage. Le niveau de gris du pixel central (ic) de coordon-
nées (xc,yc) est comparé à celui de ses voisins (in) selon l’équation :
m=0
LBP (xc , yc ) = p−1 s(in − ic )2n ,
s(in − ic ) = 1siin ic ≥ 0,
0siin − ic < 0,
avec p est le nombre de pixels voisins. Dans notre travail, nous considérons un
voisinage de 3*3 d’où p=8 voisins. Nous obtenons donc, comme pour une image en ni-
veaux de gris, une matrice contenant des valeurs des LBP comprises entre 0 et 255 pour
chaque pixel . Un histogramme est calculé en se basant sur ces valeurs pour former le
descripteur LBP-B [36].
2.5.1 Introduction
La logique floue est une extension de la logique booléenne créée par Lotfi Zadeh
en 1965 en se basant sur sa théorie mathématique des ensembles flous, qui est une gé-
néralisation de la théorie des ensembles classiques. En introduisant la notion de degré
dans la vérification d’une condition, permettant ainsi à une condition d’être dans un
autre état que vrai ou faux, la logique floue confère une flexibilité très appréciable aux
raisonnements qui l’utilisent, ce qui rend possible la prise en compte des imprécisions
et des incertitudes.
En logique floue, un ensemble flou contient plusieurs valeurs. L’ensemble flou est
connu par un degré d’appartenance (ou degré de vérité). On utilise un continuum de
valeurs logiques entre 0 (completement faux) et 1 (complétement vrai). Une fonction
d’appartenance est utilisée pour mapper un item X dans le domaine des nombres reels à
un intervalle de 0 a 1, ce qui permet un degré de vérité [6].
2.5.2 Fuzzification
Des valeurs d’entrée sont traduites en concept linguistique comme des ensembles
flous. Les fonctions d’appartenance sont appliquées aux mesures et des degrés de vérité
sont établis pour chaque proposition.
La fuzzification des variables est une phase délicate du processus mis en œuvre par
la logique floue. Elle est souvent réalisée de manière itérative et requiert de l’expérience.
Dans un système à la logique floue, toutes les règles sont déclenchées en parallèle.
Des règles peuvent être déclenchées partiellement.
Toutes les parties sont affectées également par les antécédents. On doit obtenir un
seul chiffre net qui représente la sortie du système expert. On combine les ensembles
flous en un seul ensemble flou et la « défuzzification » de l’ensemble résulte en un seul
chiffre.
2.5.4 Défuzzification
Sommaire
3.1 Préparation des données . . . . . . . . . . . . . . . . . . . . . . . 35
3.2 Détection de visage . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2.1 Le classificateur Haar Cascade . . . . . . . . . . . . . . . . . 37
3.2.2 Entrainement du classificateur pour détecter le visage . . . . 39
3.2.2.1 Le boosting . . . . . . . . . . . . . . . . . . . . . . 39
3.2.2.2 L’algorithme Adaboost . . . . . . . . . . . . . . . . 40
3.3 Extraction des caractéristiques . . . . . . . . . . . . . . . . . . . 48
3.3.1 L’histogramme LBP . . . . . . . . . . . . . . . . . . . . . . . 48
3.3.1.1 Définition . . . . . . . . . . . . . . . . . . . . . . . 48
3.3.1.2 Calcul de l’opérateur LBPH : . . . . . . . . . . . . . 49
3.3.1.3 Réalisation de l’histogramme . . . . . . . . . . . . 52
3.4 Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.5 Identification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
34
CHAPITRE 3. APPROCHE POUR LA RECONNAISSANCE DES VISAGES EN UTILISANT
LE BIG DATA UQTR
Il existe des bases de données publiques dont la fonctionnalité principale est l’uti-
lisation pour les tests de recherche en reconnaissance faciale. On note :
— la base de données CMU Pose qui a été construite entre octobre et décembre
2000, des chercheurs ont collecté une base de données de 41 368 images de
68 personnes. En étendant la salle 3D CMU, ils ont pu photographier chaque
personne sous 13 poses différentes, 43 conditions d’éclairage différentes et avec
Ces images doivent être sauvegardées dans des dossiers annotés afin de pouvoir
nous aider à identifier chaque visage dans l’image et indiquer à qui il appartient.
Nous avons plusieurs images pour chaque personne que nous voulons reconnaître.
Ces images serviront de données d’entraînement afin que notre reconnaissance faciale
LBP puisse apprendre les caractéristiques de chaque individu.
Une image est une projection optique bidimensionnelle, mais le monde dans lequel
nous souhaitons donner un sens visuellement est tridimensionnel. A cet égard, la vision
est de l’« optique inverse » : il faut inverser la projection 3D 2D pour retrouver les
propriétés de l’objet dans l’espace de l’image ; notons que l’inversion 2D 3D d’une
telle projection est, strictement impossible mathématiquement.
A ce stade, le jeu de données est pré-traité pour le processus d’extraction des ca-
ractéristiques. Les images du jeu de données ont été converties en images en niveaux
de gris, puis normalisées ces images pour de bons résultats de reconnaissance. Pour la
détection de caractéristiques, des modules Haar ont été utilisés pour détecter ces carac-
téristiques locales dans une image d’entrée donnée. Ici, l’image d’entrée fait référence à
l’image numérique capturée par la caméra.
Viola et Jones [35] ont conçu un algorithme, appelé Haar Classifiers, pour détecter
rapidement tout objet, y compris les visages humains, à l’aide de cascades de classifi-
cateurs AdaBoost basées sur des caractéristiques de type Haar et non sur des pixels. La
base de la détection d’objets du classificateur Haar réside dans les Haar-like features.
Ces caractéristiques, plutôt que d’utiliser les valeurs d’intensité d’un pixel, utilisent
le changement des valeurs de contraste entre les groupes rectangulaires adjacents de
pixels. Les écarts de contraste entre les groupes de pixels sont utilisés pour déterminer
les zones relativement claires et sombres.
Deux ou trois groupes adjacents avec une variance de contraste relative forment
une caractéristique de type Haar.
La détection des caractéristiques faciales humaines, telles que la bouche, les yeux
et le nez, nécessite que les cascades du classificateur Haar soient d’abord entraînées. Afin
de former les classificateurs, l’algorithme AdaBoost et les algorithmes de fonctionnalité
Haar doivent être implémentés.
3.2.2.1 Le boosting
Un apprenant faible est un modèle très simple, bien qu’il ait une certaine com-
pétence sur l’ensemble de données. Le boosting était un concept théorique bien avant
qu’un algorithme pratique ne puisse être développé, et l’algorithme AdaBoost (amplifi-
cation adaptative) a été la première approche réussie de l’idée.
Le schéma de pondération (comment α est défini dans Algorithm peut être va-
rié pour modifier les algorithmes de boosting globaux. Dans cette section, nous allons
implémenter AdaBoost qui choisit α comme :
1 1 + γt
αt = ln
2 1 − γt
,
N
γt = Dt (i)yi ht (xi )
i=1
,
Adaboost se base sur les arbres à une seule profondeur avec l’attribution des poids
différents pour chaque noeud, contrairement à Random Forest qu’on représente avec un
arbre ayant une profondeur longue.
Noeud
Feuille 1 Feuille 2
Noeud
Feuille 1 Feuille 2
Noeud
Feuille 1 Feuille 2
Chaque modèle suivant tente de corriger les prédictions faites par le modèle avant
lui dans la séquence. Ceci est réalisé en pesant l’ensemble de données d’entraînement
pour mettre davantage l’accent sur les exemples d’entraînement sur lesquels les modèles
antérieurs ont fait des erreurs de prédiction.
Les forêts aléatoires sont une combinaison de prédicteurs d’arbres tels que chaque
arbre dépend des valeurs d’un vecteur aléatoire échantillonné indépendamment et avec
la même distribution pour tous les arbres de la forêt contrairement à Adaboost qui affecte
des poids différents aux noeuds. L’erreur de généralisation pour les forêts converge petit
à petit à une limite à mesure que le nombre d’arbres dans la forêt devient grand. L’erreur
de généralisation d’une forêt de classificateurs d’arbres dépend de la force des arbres
individuels dans la forêt et de la corrélation entre ceux-ci.
Training Data
moins pour les statisticiens, il continuera à itérer un algorithme déjà parfaitement ajusté
qui réduit l’erreur de généralisation.
Il est largement admis qu’AdaBoost est efficace parce qu’il s’agit d’une optimisa-
tion, tandis que les forêts aléatoires ou Random Forest fonctionnent bien parce qu’elles
fonctionnent. Les auteurs de cet article [3] mettent en lumière cette conjecture en four-
nissant une nouvelle intuition étayée par des exemples pour montrer comment AdaBoost
et la forêt aléatoire réussissent pour la même raison.
Intuitivement, pour qu’un classificateur apprenant soit efficace et précis dans ses
prédictions, il doit remplir trois conditions :
Fenêtre de détection
NON
Visgage ? Rejet
Oui, probable
NON
Visgage ? Rejet
Oui, probable
NON
Visgage ? Rejet
Oui, probable
NON
Visgage ? Rejet
Oui, probable
Visage détecté
1
D1 (i) = (3.1)
n
fort = 1toT (3.2)
trainht usingDt (3.3)
et = PDt [ht (x) = y] (3.4)
1 − et
αt = 1/2 log (3.5)
et
Dt (i) exp(−αt yt ht (xi ))
Dt+1 (i) = (3.6)
Zt
(3.7)
1/n [f (xi ) = yi ] ≤ 1/n exp(−yi f (xi )) = Zt (3.11)
i i t
≤ Dt (i) exp(−αt yi ht (xi )) (3.12)
t i
≤ 1/n exp(−yi αt ht (xi )) (3.13)
i t
2
Zt = 2 et (1 − et ) = 1 − 4γt2 ≤ e−2 t γt (3.14)
t t t
γt = 1/2 − et , (3.15)
2
si γt ≥ γ > 0, donc e−2T γ . L’erreur d’entraînement chute de façon exponentielle,
ainsi on obtient le meilleur classificateur possible.
Pour créer les différents seuils pour chaque caractéristique fi , nous devons :
Nous devons également ajouter deux seuils pour chaque fonctionnalité : un en des-
sous de toutes les valeurs observées pour cette fonctionnalité et un au-dessus de toutes
les valeurs pour cette fonctionnalité. En supprimant les valeurs en double, nous rédui-
sons le nombre de seuils à vérifier.
(Remarque : La procédure de recherche est la même que celle utilisée pour sélec-
tionner un seuil pour définir une division binaire sur une caractéristique continue dans
les arbres de décision, sauf que nous maximisons l’erreur d’apprentissage au lieu du gain
d’information ou de l’indice de Gini.)
1
τ ∗ = argmax | − error(τ )|
τ 2
,
où error(.) est calculé comme la somme des poids (Dt (i)) des instances mal clas-
sées. Dans ce cas, puisque nous avons affaire à des valeurs absolues, si un seuil a une
erreur de 0,2 et qu’un autre seuil produit une erreur de 0,9 , nous préférerons ce dernier
car il a une différence plus élevée par rapport à 0, 5 (pour de telles souches de déci-
sion, nous devons inverser la prédiction de sorte que pour les instances dont la valeur
de caractéristique est supérieure à τ , nous prédisons −1 et +1 sinon. Nous devons nous
en souvenir lorsque nous combinons de telles souches de décision avec d’autres pour
évaluer H(x)).
3.3.1.1 Définition
L’histogramme à motifs binaires locaux est une technique très utilisée dans le do-
maine de la reconnaissance faciale. Cette technique utilise un bloc de 3*3 pixels extrait à
partir d’une image, et elle est particulièrement intéressée par le pixel central pour pou-
voir calculer l’opérateur LBP.
0 0 0 1 1 0 0 1 1 0
0 0 1 12 10 17 15 18 1 0
0 2 5 15 14 18 12 20 25 0
0 1 17 20 15 20 14 16 56 60
0 8 22 18 20 35 28 40 43 46
0 10 25 27 32 38 40 41 39 46
0 12 20 30 40 38 30 38 46 40
0 5 15 36 38 40 30 89 77 76
5 12 11 10 42 55 45 56 60 72
20 15 13 20 18 60 63 90 98 74
Table 3.1 – Représentation d’une image en pixels
L’opérateur LBP se repose sur les valeurs du 9 pixels qui constituent ce bloc, à
savoir, le pixel central et les 8 pixels voisins ou encore les 26 voisins si on a une grille
XY.
Dans cette section, l’algorithme de détection de visage basé sur LBPH est présenté.
L’algorithme LBPH est la combinaison des descripteurs Local Binary Patterns (LBP) et
Histograme des Gradient Orientés (HOG). LBP est un moyen simple mais puissant d’ex-
traire et d’étiqueter les pixels d’une image. En utilisant le LBPH, nous pouvons facilement
représenter des images de visage avec un simple vecteur.
Dans cette section, nous allons voir comment on peut se servir des valeurs de
pixels pour calculer l’opérateur LBP, ou encore, comment l’algorithme calcule les valeurs
de chaque pixel de l’image pour créer notre modèle à l’aide de l’histogramme à motifs
binaires locaux.
m=0
LBP (xc , yc ) = p−1 s(in − ic )2n
s(in − ic ) = 1siin ic ≥ 0
0siin − ic < 0.
7
LBP = n s(in − ic )2n
s(in − ic ) = 1siin ic ≥ 0
0siin − ic < 0
avec ic la valeur du pixel central, et in la valeur des pixels voisins qui sont les pixels
autour du pixel central sachant que n allant de 0 jusqu’à 7. Si la différence des valeurs ic
et in est négative on pose s(in − ic ) = 1 sinon on aura s(in − ic ) = 0.
Ces valeurs de pixels peuvent être les valeurs de l’intensité ou de luminosité, c’est
ce type de caractéristiques de pixels que nous examinons lorsque nous procédons à faire
le calcul de l’opérateur LBP afin de pouvoir maximiser la variation ou les fonctionnalités
qui sont pertinentes pour l’identité, nous ne regardons pas la couleur dans ce cas. La
plupart des gens examinent l’image en niveau de gris, mais cela n’empêche pas de faire
cette procédure en couleur, mais dans ce cas nous allons avoir trois dimensions, donc
nous allons nous intéresser à 27 pixels et non seulement à 9.
Pour détecter les visages dans une photo RBG (couleur), nous devons d’abord
convertir l’image en une image en niveaux de gris. Pour chaque pixel Pi,j , c’est un vec-
teur qui contient trois valeurs qui doivent représenter le degré de rouge, de bleu et de
vert. Nous convertissons l’image RBG en image à l’échelle y en :
Dans ce qui suit nous allons faire la démonstration de l’opérateur LBP pour un
pixel, notons que les valeurs des pixels sont ordonnées comme suit :
i0 i1 i2
i7 ic i3
i6 i5 i4
Considérons un exemple simple d’un bloc de 3*3 pixels extrait à partir d’une image
et calculons l’opérateur LBP qui va transformer ces valeurs en des valeurs binaires for-
mant une seule valeur du pixel central.
5 9 1
4 4 6
7 2 3
1 1 0
1 1
1 0 0
On peut aussi obtenir ces valeurs binaires en comparant la valeur de chaque pixel
voisin avec celle du pixel central, si la valeur du pixel voisin est supérieure à la valeur du
pixel central alors on met 1 sinon on met 0, cette méthode et aussi appelée le seuillage
du pixel central par rapport aux autres pixels voisins.
Ces valeurs binaires signifient essentiellement que si nous avons une transition de
0 à 1 ou de 1 à 0, alors il s’agit des bords ou du contour qui vont nous permettre par
la suite de définir et détecter l’objet recherché, ce sont les transitions des zones claires
du visages à des zones sombres du visage. Nous aurons donc un descripteur invariant
d’illumination des bords.
Ensuite, nous récupérons les valeurs binaires ou dites bits calculées successive-
ment de i0 jusqu’à i7 , c’est-à-dire, qu’ont fait une rotation dans le sens de l’aiguille d’une
montre, pour les transformer en un octet afin de former le nombre LBP binaire comme
suit :
1 1 0 1 0 0 1 1
Cette séquence de 8 bits que nous avons obtenue forme un nombre binaire généré
à partir des valeurs de pixels va être convertie en nombre décimal pour obtenir la valeur
du pixel central afin de former notre système :
7 6 5 4 3 2 1 0
1 1 0 1 0 0 1 1
On obtient alors :
1∗20 +1∗21 +0∗22 +0∗23 +1∗24 +0∗25 +1∗26 +1∗27 = 1+2+16+64+128 = 211
Ce calcul doit être fait pour chaque pixel de l’image en implémentant les mêmes
instructions afin d’obtenir les codes LBP correspondant et en le remplaçant dans le pixel
de l’image concerné. Nous transformons ces valeurs obtenues en un histogramme en
fonction du nombre d’apparitions ou de fréquence de chaque nombre, donc fondamenta-
lement en regardant les statistiques, nous obtenons les caractéristiques de la distribution
de ces nombres décimaux, notons qu’il y a que 256 valeurs différentes.
Ensuite, nous concaténons tous les histogrammes de tous les morceaux d’image
pour former un histogramme plus significatif.
Par la suite, nous utilisons ce qu’on appelle des modèles binaires locaux uniformes
et ils n’ont que 59 valeurs différentes possibles au lieu de 256, nous obtenons donc des
statistiques vraiment robustes.
Et ensuite nous réalisons des histogrammes que nous obtenons pour chaque image
afin de trouver la similarité entre elles, et sur la base de cela nous pouvons prédire qu’il
s’agit de la même personne, si la similarité est élevée avec une image d’entrainement
connue.
6.4
LBP2
4.7
4
2.8
LBP1
0.9
L’avantage de cette technique c’est qu’elle est invariante par rapport à l’éclairage,
autrement dit, si nous changeons l’éclairage de l’image ou de la scène, toutes les valeurs
de pixels augmenteront et la différence relative entre elles restera la même, donc notre
modèle binaire restera le même indépendamment de la valeur d’éclairage en général.
3.4 Classification
Cette étape consiste à faire la classification qui est effectuée en calculant les simila-
rités entre des histogrammes directs. Cependant, une perte de données spatiales conduit
à considérer la même méthodologie pour l’illustration de l’image faciale [9].
Données numériques
Prétraitement
décision et classement
sortie de classification
évaluation de la précision
de visage entre dans le système, il reconnaît le visage à partir des informations de la base
de données [2].
Le classificateur formé vise à faire correspondre l’image avec les images du modèle
formé qui est calculé par l’une des méthodes suivantes :
L’intersection d’histogrammes :
D(S, M ) = (min(Si , M i))
i
;
Statistique de log-vraisemblance :
L(S, M ) = − Si logM i
i
;
(Si − Mi )2
X 2 (S, M ) =
i
S i + Mi
;
La recherche des deux histogramme qui se ressemblent le mieux peut se faire aussi
à l’aide du calcul de la distance euclidienne comme suit :
n
d(p, q) = (pi − qi )2
i=1
.
3.5 Identification
Après avoir fait la correspondance entre les histogrammes afin de classifier les
visages et les reconnaitre, on procède à l’identification qui est l’étape finale du processus
de reconnaissance faciale.
On parcoure tout le répertoire des images qui est sous forme d’une arborescence
dans la base de données des visages. Ensuite on construit deux tableaux, le premier
contient l’ensemble de photos et le deuxième contient l’identité de chaque personne qui
est le nom du répertoire. S’il y a des images dans le répertoire, on va récupérer le nom du
dossier contenant l’image et on le stocke dans le premier tableau qui identifie les visages
et on enregistre toutes les images correspondantes dans le deuxième tableau des images.
On répète ce processus d’identification pour tous les dossiers des images de notre
base de données et, à l’aide des classificateur entrainés, on pourra facilement faire l’iden-
tification du visage en faisant la correspondance entre les données stockés et le visage
détecté.
Détection de visage
Vérification Identification
Implémentation et résultats
Sommaire
4.1 Environnement de travail . . . . . . . . . . . . . . . . . . . . . . 58
4.2 Implémentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.2.1 Détection de visage . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2.1.1 Etape 1 : Les images positives et les images négatives 59
4.2.1.2 Etape 2 : Préparation des images . . . . . . . . . . . 60
4.2.1.3 Etape 3 : création du fichier Vector des images positives 62
4.2.1.4 Etape 4 : Le Haar-Trainning . . . . . . . . . . . . . 62
4.2.1.5 Etape 5 : création du fameux fichier haarCascade-
Classifier personnalisé . . . . . . . . . . . . . . . . 64
4.2.2 Reconnaissance de visage . . . . . . . . . . . . . . . . . . . . 68
4.3 Expérimentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
4.4 Résultats et perspectives . . . . . . . . . . . . . . . . . . . . . . . 74
4.5 Conclusion générale . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.6 Annexe 1 : Détection de visage . . . . . . . . . . . . . . . . . . . . 78
4.7 Annexe 2 : Reconnaissance et identification . . . . . . . . . . . . 80
4.8 Annexe 3 : Interface graphique . . . . . . . . . . . . . . . . . . . . 82
57
CHAPITRE 4. IMPLÉMENTATION ET RÉSULTATS UQTR
Pour réaliser et mettre en œuvre les travaux ci-dessus, du matériel et des logiciels
ultérieurs sont nécessaires pour développer l’approche proposée. J’ai utilisé les outils
et environnements suivants : système d’exploitation Windows10, Python 2.7/3.10, bi-
bliothèque OpenCV, bibliothèque Numpy, et bibliothèque Pillow principalement et un
ordinateur intel CORE i3.
4.2 Implémentation
l’humain. Dans cette partie, on va faire correspondre ces caractéristiques avec les images
testées afin d’identifier une personne et la reconnaitre. Il existe plusieurs paramètres dif-
ficiles et variables dans la détection et l’identification des visages, tels que l’éclairage, les
différentes poses, les expressions de changement, les images d’entrée de mauvaise qua-
lité, etc.
Pour réussir à faire la détection du visage, on doit posséder d’un fichier de clas-
sificateur HaarCascade, dans ce qui suit nous allons découvrir ensemble les principales
étapes afin de créer ce fichier.
Les étapes nécessaires pour créer un fichier Haar cascade classifier sont :
• Création d’un fichier .vec (vecteur) basé sur des images marquées positives à
l’aide de createsamples.exe
Donc, comment cela fonctionne ? Ce sont d’énormes fichiers xml individuels avec
beaucoup d’ensembles de fonctionnalités et chaque xml correspond à un type très spé-
cifique de cas d’utilisation.
Les images positives sont celles qui contiennent l’objet que nous souhaitons détec-
ter et les images négatives sont les images qui ne contiennent pas l’objet et contiennent
toute sorte d’objets différents que celui que nous voulons détecter.
Pour entrainer le classificateur, nous avons besoin d’un fichier texte contenant les
noms des images négatives, pour le créer nous devons exécuter le fichier batch bg.bat
Ensuite, nous préparons les images positives afin de créer le fichier vector qui
contient les noms des images positives ainsi que l’emplacement des objets dans chaque
image. Pour cela il faut avoir des images de type .bmp dans le dossier rowdata, par la
suite il faut exécuter l’application ObjectMarker afin de marquer notre objet dans chaque
image. ObjectMarker ouvre deux fenetres, une pour afficher l’image positive, dont je
souhaite marquer l’objet, et la deuxieme pour afficher les informations nécessaires sur
l’image, à savoir le nom, les coordonnées de la position de l’objet après l’avoir marqué.
Un fichier Infor.txt a été créé contenant toutes les informations des images comme
suit :
rawdata/a8.bmp 1 37 35 90 124
-w 24 -h 24 Taille de l’échantillon
En exécutant le fichier batch, nous avons des informations définissant l’étape ac-
tuelle du processus de formation, le nombre de features utilisés à ce stade, Erreur expo-
nentielle du classificateur fort. . .
Après avoir fini l’étape de l’entrainement de notre fichier, on obtient les cata-
logues numérotés définissant les stages d’entrainnement réalisés. Maintenant, nous de-
vons combiner et regrouper les différents entrainements effectués pour obtenir notre
fichier entrainé en exécutant le fichier batch convert.bat
Le fichier myhaar.xml a été créé avec succès, nous pouvons l’utiliser dans notre
programme pour détecter l’objet que nous cherchons dans l’image qui est le visage.
Dans ce projet, on va utiliser notre fichier haarcascade pour détecter les visages.
Importons cv2 et utilisons également la fonction CascadeClassifier d’OpenCV pour poin-
ter vers l’emplacement où nous avons stocké le fichier XML.
Généralement, les images que nous voyons se présentent sous la forme d’un canal
RVB (Rouge, Vert, Bleu). Ainsi, lorsque OpenCV lit l’image RVB, il stocke généralement
l’image dans le canal BGR (bleu, vert, rouge). Aux fins de la reconnaissance d’image,
nous devons convertir ce canal BGR en canal gris. La raison pour laquelle le canal gris
est facile à traiter et nécessite moins de calcul est qu’il il ne contient qu’un seul canal de
noir-blanc.
Maintenant, après avoir converti l’image de RVB en gris, nous allons maintenant
localiser les caractéristiques exactes de notre visage. Voyons comment nous pourrions
implémenter cela dans le code.
Dans ce morceau de code, nous utilisons une fonction intégrée qui s’appelle de-
tectMultiScale et on lui donne en paramètre l’objet dans lequel on a chargé notre image
après avoir été convertie en niveau de gris.
Pour stopper l’exécution du code, nous allons appuyer sur ’q’, et enfin nous libérons
la source avec la cap.relase() et ou.release().
Nous avons la sortie du programme ci-dessus sous forme de vidéo afin de détecter
le visage devant la caméra :
Bien que le classificateur haarcascade soit assez utile, cette approche présente peu
d’inconvénients.
La partie la plus difficile étant de spécifier avec précision la valeur des paramètres
de scaleFactor et minNeighbors de la fonction detectMultiScale. Il est assez courant de
se heurter à des scénarios dans lesquels nous devons régler les deux paramètres image
par image, ce qui est un gros problème lorsqu’il s’agit d’un cas d’utilisation de détection
d’image.
D’abords on utilise le fichier Haar Cascade Classifier créé pour détecter tous les
visages dans les images de la base de données à l’aide de la fonction os.walk() qui parcoure
tout le répertoire des images qui est sous forme d’une arborescence.
Par la suite, on va parcourir tout le tableau files contenant les fichiers afin de récu-
pérer ceux qui se terminent par .png ou .jpg et les stocker dans le tableau des X, si le label
qu’on est en train de traiter est déjà présent dans le tableau, on passe, si ce n’est pas le cas
on l’ajoute tout simplement et enfin on récupère l’ID en fonction du label du nom de la
personne dans mon tableau d’ID et on l’ajoute cette fois-ci au tableau Y qui contient donc
les identités des différents visages, et la boucle nous aide à former deux grands tableaux,
le premier pour stocker l’ID de chacune des photos et le deuxième stocke l’ensemble des
identités des images.
Cette technique LBP nous permet de faire l’extraction des caractéristiques des dif-
férentes parties de l’image sélectionnées afin de calculer son histogramme et le comparer
avec les histogrammes des autres images pour pouvoir mesurer la similarité entre elles
et sortir avec un fichier bien entrainé qui peut comparer l’image reçue avec celles dans
la base de données afin de faire l’identification.
4.3 Expérimentation
D’abord, nous allons prendre un exemple simple qui est de faire la classification
entre deux visages, une méthode très simple est de calculer leurs motifs binaires locaux
ensuite les histogrammes normalisés de ces derniers.
Pour cela, nous prenons deux images de la même personne et la troisième image
sera d’une personne différente. Pour classifier ces images, nous devons mesurer la si-
milarité entre les deux images qui représente la même classe et l’image différente, et
ce à l’aide de la différence euclidienne entre leurs histogrammes normalisés des motifs
binaires locaux. La figure suivante montre l’expérimentation de cette technique.
Comme nous pouvons voir les histogrammes des images de Soukaina se res-
semblent avec une distance euclidienne proche de 0, par contre l’histogramme de Justin
est clairement différent et la mesure de dissimilitude est élevée, donc nous pouvons dire
que le calcul de la distance euclidienne entre les histogrammes des images nous aide à dé-
terminer si les visages se ressemblent et s’il s’agit de la même personne, cette technique
est efficace et nous donne des résultats précis avec un coût optimal.
Cette partie indique que les expériences exécutées correspondent aux perfor-
mances de l’algorithme de motifs binaires locaux de reconnaissance faciale appliqué
dans ce système. Il est nécessaire de décrire les conditions expérimentales qui doivent
être acceptables pour le système proposé. Ainsi, les expériences proposées doivent être
exécutées en changeant certains facteurs qui sont significatifs dans la méthode d’appren-
tissage et de reconnaissance du système, comme la position du visage, l’éclairage...
Pour tester cette approche de reconnaissance faciale en utilisant les motifs binaires
locaux et voir sa précision, l’auteur de ce mémoire s’est placée devant la caméra avec des
photo de plusieurs personnes publiques et nous avons été reconnus par le système, et en
temps réel, comme le montre la figure 4.10 suivante :
Pour réaliser une interface graphique avec python afin de présenter l’application à
l’écran pour l’utilisateur, il faut utiliser la bibliothèque tkinter [3]. La bibliothèque tkinter
permet de construire une interface graphique contenant des boutons, des zones de texte
et plusieurs outils graphiques pour permettre aux utilisateurs la possibilité d’avoir une
application facile à manipuler et d’utiliser les fonctionnalités offertes sans avoir à saisir
ou comprendre les lignes de code.
sauvegarde d’une photo du visage identifié, et du texte explicatif, elle peut être présentée
comme suit :
D’après ce qui précède, nous observons que cette méthode est assez simple en
terme d’extraction des motifs binaires locaux et donne des résultats satisfaisants en terme
de temps et de précision. Les résultats produits par le prototype développé montrent
qu’une personne peut être détectée et reconnue en quelques fractions de secondes et en
temps réel.
On peut donc croire, que nous avons obtenu de bons résultats à partir de diverses
analyses expérimentales de cette technique, ils fournissent également des résultats ac-
ceptables pour l’occlusion, la variation de pose et l’illumination.
Comme illustré ci-dessus, le test a été fait avec trois variations angulaires diffé-
rentes, une à environ 30° à gauche, la deuxième c’est une position frontale face et la
troisième à environ 30° à droite et on obtient toujours le même résultat, qui est l’identi-
fication de la personne en temps réel.
La précision de cette approche est d’une valeur plus que 80% avec une résolution
faible de l’image. Les auteurs de [19] ont eu une précision de 78.4%, on peut obtenir de
meilleurs résultats avec une haute résolution d’image et une base de données volumi-
neuse.
Le système développé pourrait identifier les visages humains en temps réel et être
intégré à Google Maps comme exemple d’application, pour suivre n’importe quel sujet
d’intérêt. En outre, les systèmes de reconnaissance faciale peuvent également être utilisés
dans le développement de systèmes de présence automatisés et pour enquêter sur des
activités criminelles.
1 i m p o r t numpy a s np
2 import cv2
3 import p i c k l e
4
6 cap = c v 2 . V i d e o C a p t u r e ( 0 )
7 f _ c = c v 2 . C a s c a d e C l a s s i f i e r ( "D : / c a n a d a / MAITRISE / p r o j e t E i g e n F a c e /
d a s a r _ h a a r t r a i n / d a s a r _ h a a r t r a i n / myhaar . xml " )
8 r e c o g n i z e r = cv2 . f a c e . LBPHFaceRecognizer_create ( )
9 r e c o g n i z e r . r e a d ( " t r a i n e r . yml " )
10 labels ={}
11 w i t h open ( " l a b e l s . p i c k l e " , ’ r b ’ ) a s f :
12 og_labels = pickle . load ( f )
13 l a b e l s = { v : k for k , v in og_labels . items ( ) }
14
15 d e f manup ( ) :
16 f o u r c c = c v 2 . V i d e o W r i t e r _ f o u r c c ( ∗ ’ MJPG ’ )
17 w i d t h = i n t ( cap . g e t ( c v 2 . CAP_PROP_FRAME_WIDTH ) + 0 . 5 )
18 h e i g h t = i n t ( cap . g e t ( c v 2 . CAP_PROP_FRAME_HEIGHT ) + 0 . 5 )
19 s i z e = ( width , h e i g h t )
20 o u t = c v 2 . V i d e o W r i t e r ( ’D : / c a n a d a / MAITRISE / p r o j e t E i g e n F a c e /
c a p t u r e D e t e c t i o n . a v i ’ , f o u r c c , 2 0 . 0 , ( i n t ( cap . g e t ( 3 ) ) , i n t ( cap . g e t
(4) ) ) )
21 b= True
22 w h i l e b== True :
23 b , image = cap . r e a d ( )
24 i f b== True :
25 i m a g e _ g r a y = c v 2 . c v t C o l o r ( image , c v 2 . COLOR_BGR2GRAY )
26 f a c e s = f _ c . d e t e c t M u l t i S c a l e ( i m a ge _ g r a y , 1 . 3 , 2 )
27 f o r ( x , y , h , w) i n f a c e s :
28 c v 2 . r e c t a n g l e ( image , ( x , y ) , ( x+w, y+h ) , ( 2 5 5 , 0 , 0 ) , 2 )
29 v i s a g e D e t e c t e d = i m a g e _ g r a y [ y : y+h , x : x+w]
30 id_ , conf = r e c o g n i z e r . p r e d i c t ( v i s a g e D e t e c t e d )
31 i f c o n f >=45 and c o n f < = 8 5 :
32 f o n t = c v 2 . FONT_HERSHEY_SIMPLEX
33 name= l a b e l s [ i d _ ]
34 color= (255 ,255 ,255)
35 p r e c i s i o n = f l o a t ( " { 0 : . 2 f } " . format ( ( 1 0 0 ∗ ( 1 − (
conf ) / 3 0 0 ) ) ) )
36 a c c . append ( p r e c i s i o n )
37 print ( precision )
38 stroke= 2
39 c v 2 . p u t T e x t ( image , name , ( x , y ) , f o n t , 1 ,
c o l o r , s t r o k e , c v 2 . LINE_AA )
40 i m g _ e l e m e n t = " m o n _ v i s a g e . png "
41 c v 2 . i m w r i t e ( i m g _ e l e m e nt , v i s a g e D e t e c t e d )
42 c v 2 . imshow ( " s o u k a i n a f a c e r e c o g n i t i o n " , image )
43 o u t . w r i t e ( c v 2 . c v t C o l o r ( i m a g e _ gr a y , c v 2 .
COLOR_GRAY2BGR ) )
44 p a t h = ’D : / c a n a d a / MAITRISE / p r o j e t E i g e n F a c e /
capturePhoto . jpg ’
45 c v 2 . i m w r i t e ( path , i m a g e _ g r a y )
46 i f c v 2 . w a i t K e y ( 1 0 ) == o r d ( ’ q ’ ) :
47 break
48 cap . r e l e a s e ( )
49 out . r e l e a s e ( )
50 cv2 . destroyAllWindows ( )
51 return 0
52
53 manup ( )
1 import os
2
3 import cv2
4 i m p o r t numpy a s np
5 from P I L i m p o r t Image
6 import p i c k l e
7
8 BASE_DIR= o s . p a t h . d i r n a m e ( o s . p a t h . a b s p a t h ( _ _ f i l e _ _ ) )
9 i m a g e _ d i r = o s . p a t h . j o i n ( BASE_DIR , " i m a g e s " )
10 f a c e s _ c a s c a d e = c v 2 . C a s c a d e C l a s s i f i e r ( "D : / c a n a d a / MAITRISE /
p r o j e t E i g e n F a c e / d a s a r _ h a a r t r a i n / d a s a r _ h a a r t r a i n / myhaar . xml " )
11 r e c o g n i z e r = cv2 . f a c e . LBPHFaceRecognizer_create ( )
12
13 c u r r e n t _ i d =0
14 label_ids ={}
15 y_labels = []
16 x_train = []
17
18 f o r r o o t , d i r s , f i l e s i n o s . walk ( i m a g e _ d i r ) :
19 for f i l e in f i l e s :
20 i f f i l e . e n d s w i t h ( " png " ) o r f i l e . e n d s w i t h ( " j p g " ) o r f i l e .
e n d s w i t h ( " j p e g " ) o r f i l e . e n d s w i t h ( " PNG " ) :
21 path =os . path . j o i n ( root , f i l e )
22 l a b e l = o s . p a t h . basename ( r o o t ) . r e p l a c e ( " " , " − " ) . l o w e r ( )
23 i f not l a b e l in l a b e l _ i d s :
24 l a b e l _ i d s [ l a b e l ]= c u r r e n t _ i d
25 c u r r e n t _ i d +=1
26 id_ = l a b e l _ i d s [ l a b e l ]
27 p i l _ i m a g e = Image . open ( p a t h ) . c o n v e r t ( " L " )
28 size= (550 ,550)
29 f i n a l _ i m a g e = p i l _ i m a g e . r e s i z e ( s i z e , Image . ANTIALIAS )
30 i m a g e _ a r r a y = np . a r r a y ( f i n a l _ i m a g e , " u i n t 8 " )
31 f a c e s = f a c e s _ c a s c a d e . d e t e c t M u l t i S c a l e ( image_array ,
s c a l e F a c t o r = 1 . 5 , minNeighbors =5)
32
33 f o r ( x , y , w, h ) i n f a c e s :
34 r o i = i m a g e _ a r r a y [ y : y+h , x : x+w]
35 x _ t r a i n . append ( r o i )
36 y _ l a b e l s . append ( i d _ )
37
40
41 r e c o g n i z e r . t r a i n ( x _ t r a i n , np . a r r a y ( y _ l a b e l s ) )
42 r e c o g n i z e r . s a v e ( " t r a i n e r . yml " )
1 import t k i n t e r
2 from t k i n t e r i m p o r t ∗
3 import cv2
4 from P I L i m p o r t Image , ImageTk
5 from t k i n t e r i m p o r t f i l e d i a l o g
6 i m p o r t numpy a s np
7 from t k i n t e r i m p o r t mess age box
8 import t k i n t e r as tk
9 import s h u t i l , os
10 import subprocess
11 import customtkinter
12 import t k i n t e r
13 import sys
14 import os
15 from t k i n t e r i m p o r t t t k
16
20
21 c l a s s App ( c u s t o m t k i n t e r . CTk ) :
22
27 d e f _ _ i n i t _ _ ( s e l f , ∗ a r g s , ∗ ∗ kwargs ) :
28 s u p e r ( ) . _ _ i n i t _ _ ( ∗ a r g s , ∗ ∗ kwargs )
29
30
31 s e l f . t i t l e ( App . APP_NAME )
32 s e l f . g e o m e t r y ( s t r ( App . WIDTH ) + " x " + s t r ( App . HEIGHT ) )
33 s e l f . m i n s i z e ( App . WIDTH , App . HEIGHT )
34
35 s e l f . p r o t o c o l ( "WM_DELETE_WINDOW" , s e l f . o n _ c l o s i n g ( ) )
36 i f s y s . p l a t f o r m == " d a r w i n " :
37 s e l f . b i n d ( " <Command−q> " , s e l f . o n _ c l o s i n g ( ) )
38 s e l f . b i n d ( " <Command−w> " , s e l f . o n _ c l o s i n g ( ) )
39 s e l f . createcommand ( ’ t k : : mac : : Q u i t ’ , s e l f . o n _ c l o s i n g ( ) )
40
54 s e l f . f r a m e _ r i g h t = c u s t o m t k i n t e r . CTkLabel ( m a s t e r = s e l f ,
borderwidth=" 2 " , r e l i e f =" ra ise d " , h i g h l i g h t c o l o r =" black " ,
h i g h l i g h t t h i c k n e s s =1 ,
55 width =420 ,
56 h e i g h t =App . HEIGHT
−40 , bg_color = ’ black ’
57 )
58 s e l f . f r a m e _ r i g h t . p l a c e ( r e l x = 0 . 3 6 5 , r e l y = 0 . 5 , anchor= t k i n t e r .
W)
59
60 # ============ f r a m e _ l e f t ============
61
62 s e l f . b u t t o n _ 1 = c u s t o m t k i n t e r . CTkButton ( m a s t e r = s e l f .
frame_left ,
63 text =" Detection " ,
64 command= s e l f .
detection ,
65 border_width =0 ,
f g _ c o l o r = ’ # B6B7B6 ’ , b g _ c o l o r = ’ b l a c k ’ ,
66 corner_radius =8)
67 s e l f . b u t t o n _ 1 . p l a c e ( r e l x = 0 . 5 , y = 1 8 0 , a n c h o r = t k i n t e r . CENTER )
68
69 s e l f . b u t t o n _ 2 = c u s t o m t k i n t e r . CTkButton ( m a s t e r = s e l f .
frame_left ,
70 t e x t = " Ouvrir photo " ,
71 command= s e l f . o u v r i r ,
72 border_width =0 ,
f g _ c o l o r = ’ # B6B7B6 ’ , b g _ c o l o r = ’ b l a c k ’ ,
73 corner_radius =8)
74 s e l f . b u t t o n _ 2 . p l a c e ( r e l x = 0 . 5 , y = 2 3 0 , a n c h o r = t k i n t e r . CENTER )
75
76 s e l f . b u t t o n _ 3 = c u s t o m t k i n t e r . CTkButton ( m a s t e r = s e l f .
f r a m e _ l e f t , f g _ c o l o r = ’ # B6B7B6 ’ , b g _ c o l o r = ’ b l a c k ’ ,
77 t e x t = " Ouvrir Video " ,
78 command= s e l f . v i d e o ,
79 border_width =0 ,
80 corner_radius =8)
81 s e l f . b u t t o n _ 3 . p l a c e ( r e l x = 0 . 5 , y = 2 8 0 , a n c h o r = t k i n t e r . CENTER )
82
83
84 # ============ f r a m e _ r i g h t ============
85
86
87 # ============ f r a m e _ r i g h t ============
88
89 s e l f . l a b e l _ i n f o _ 1 = c u s t o m t k i n t e r . CTkLabel ( m a s t e r = s e l f .
frame_right ,
90 text = " Detection
de v i s a g e \ n " +
91 " utilisant
le fichier \n" +
92 " Haar
Cascade p e r s o n a l i s e " ,
93 width =250 ,
94 height =100 ,
95 corner_radius =20 ,
bg_color= ’ black ’ ,
96 f g _ c o l o r =( " #
B6B7B6 " ) , # <− custom t u p l e − c o l o r
97 justify=tkinter .
CENTER )
98
99 s e l f . l a b e l _ i n f o _ 1 . p l a c e ( r e l x = 0 . 5 , r e l y = 0 . 0 5 , anchor= t k i n t e r .
N)
100 s e l f . l a b e l _ i n f o _ 2 = c u s t o m t k i n t e r . CTkLabel ( m a s t e r = s e l f .
frame_right ,
101 t e x t = " Charger l ’
image " ,
102 width =250 ,
103 height =250 ,
104 corner_radius
=110 , bg_color = ’ black ’ ,
105 f g _ c o l o r =( " #
B6B7B6 " ) ,
106
111
112
115
116 s e l f . b u t t o n _ 5 = c u s t o m t k i n t e r . CTkButton ( m a s t e r = s e l f .
frame_right ,
117 height =25 ,
118 text=" Quitter " ,
119 command= s e l f .
terminer_click ,
120 border_width =0 ,
bg_color= ’ black ’ ,
121 c o r n e r _ r a d i u s =8 ,
f g _ c o l o r = ’ # B6B7B6 ’ )
122 s e l f . button_5 . p l a c e ( r e l x = 0 . 5 0 , r e l y = 0 . 9 5 , anchor= t k i n t e r .
CENTER )
123
124
125
126
130
c a n a d a / MAITRISE / p r o j e t E i g e n F a c e / " ,
134 filetypes =[( ’
Picture F i l e s ’ , ’ ∗ . jpg ’ ) ] )
135 my_image = ImageTk . P h o t o I m a g e ( Image . open ( s e l f . f i l e n a m e ) .
r e s i z e ( ( ( s e l f . l a b e l _ i n f o _ 2 ) . width , s e l f . l a b e l _ i n f o _ 2 . h e i g h t ) ) )
136
137 m y _ i m a g e _ l a b e l = c u s t o m t k i n t e r . CTkLabel ( m a s t e r = s e l f .
l a b e l _ i n f o _ 2 , c o r n e r _ r a d i u s = 1 0 0 , w i d t h = ( s e l f . l a b e l _ i n f o _ 2 ) . width
, h e i g h t = s e l f . l a b e l _ i n f o _ 2 . h e i g h t , image =my_image )
138 my_image_label . p l a c e ( r e l x = 0 . 5 , r e l y = 0 . 5 , anchor= t k i n t e r .
CENTER )
139 def t e r m i n e r _ c l i c k ( s e l f , event =0) :
140 " " " A f f i c h e un message popup p u i s t e r m i n e l e programme . " " "
141
144 # a s k q u e s t i o n r e t o u r n e ’ y e s ’ ou ’ no ’
145
146 i f r e p o n s e == ’ y e s ’ :
147 self . quit ()
148
163 cap . r e l e a s e ( )
164 cv2 . destroyAllWindows ( )
165
169 s e l f . mainloop ( )
170 i f __name__ == " __main__ " :
171 app = App ( )
172 app . s t a r t ( )
89
BIBLIOGRAPHIE UQTR
[16] V. Kruger Jim Gemmell, Kentaro ToyamaK. Hierarchical wavelet networks for facial
feature localization.
[17] Takeo Kanade Jing XiaoS. BakerIain Matthews. Real-time combined 2d+3d active
appearance models.
[18] J. Kittler K. Jonsson, J. Matas and Y.P. Li. Learning support vectors for face verifi-
cation and recognition (2000).
[19] Semih Aslan2 Kamal Chandra Paul1. An improved real-time face recognition sys-
tem at low resolution based on local binary pattern histogram algorithm and clahe.
[20] Ashu Kumar · Amandeep Kaur · Munish Kumar. Face detection techniques : a
review.
[21] Norbert Krüger Christoph von der Malsburg Laurenz Wiskott, Jean-Marc Fellous.
Face recognition by elastic bunch graph matching.
[22] Gary B. Huang Erik Learned-Miller. Labeled faces in the wild : Updates and new
reporting procedures. Technical Report UM-CS-2014-003, University of Massachu-
setts, Amherst, May 2014.
[23] S. Marcel. A symmetric transformation for lda-based face verification.
[24] Dhia Alzubaydi Mohamed Husein*. Mobile face recognition application using eigen
face approaches. (4).
[25] Yeon-Sik Ryu Se-Young Oh. Automatic extraction of eye and mouth fields from a
face image using eigenfeatures and multilayer perceptrons.
[26] MÂENPÂÂ T. OJALA T., PIETIKÂINEN M. Multiresolution gray-scale and rotation
invariant texture classification with local binary patterns. 24(7) :971–987.
[27] David Kriegman Peter N. Belhumeur Joao P. Hespanha. Face recognition : Eigen-
faces vs. fish-erfaces : Recognition using class specific projection.
[28] Dr. John Fernandez Phillip Ian Wilson. Facial feature detection using haar classi-
fiers.
[29] H. A. Rowley and T. Kanade. Neural network - based face detection.
[30] Marc SILANUS. Reconnaissance faciale par eigenfaces. (7).
[31] Simon Baker Terence Sim and Maan Bsat. The cmu pose, illumination, and expres-
sion (pie) database of human faces.
[32] Christopher J Taylor Timothy F. CootesGareth J. Edwards. Active appearance mo-
dels.
[33] M. Turk and A. Pentland. Eigenfaces for recognition,.