Reconnaissance Faciale en Java & Android
Reconnaissance Faciale en Java & Android
Rédigé par
Sous la direction de :
M. Guy Christian AYISSI
Mars 2016
A LA FAMILLE NZIWOUE
i
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
REMERCIEMENTS
La rédaction de ce mémoire n’étant en fait que la partie émergée de l’iceberg, je tiens ici à
remercier toutes ces personnes qui de près ou de loin ont été pour moi d’un grand soutien
durant toute ma formation. Etant dans l’incapacité de toutes les citer, je tiens à rendre un
grand hommage à :
• à tous les enseignants du département TTIC pour toutes les connaissances qu’ils
m’ont transmises. Je tiens à dire un merci particulier à Monsieur ABANG Thierry pour
sa disponibilité et ses conseils ;
• à mon papa, qui n’a jamais cessé d’oeuvré de sa personne afin que je devienne
l’homme que je suis aujourd’hui ;
• à la famille WANDJI pour les aides de différentes natures qu’ils m’ont apporté ;
• à l’école " Les Petits Champions du Campus 2" pour avoir toujours accepté que j’y
travaille de jour comme de nuit ;
• à NKOT YOGO, étudiant à la FGI pour son aide précieuse dans le développement
en JAVA ;
1
Télécommunication et Technologie de l’Information et de la Communication
Rédigé par Wilfried NZIWOUE iii Telecoms & IT Student Engineer - FGI
Résumé
This work presents a new vision of security , where it would be possible to identify an
individual by the mere acquisition and knowledge of his face. In view of the security prob-
lems that plague the world, particularly Africa and Cameroon , we thought it will be very
important to provide a system for automatically identifying an individual with his face.
Dédicaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i
Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii
Abstract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i
Introduction Générale 1
Chapitre 1 La biométrie 4
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Généralité de la biométrie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Les technologies biométriques . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.1 Biométrie par empreintes digitales . . . . . . . . . . . . . . . . . . . . . 5
Avantages : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Inconvénients : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Applications : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3.2 Biométrie par la forme de la main . . . . . . . . . . . . . . . . . . . . . 6
Avantages : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Inconvénients : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Applications : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.3 Biométrie par le visage . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Avantages : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Inconvénients : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Applications : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3.4 Biométrie par la voix . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
i
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
Avantages : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Inconvénients : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Applications : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3.5 Biométrie par l’iris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Avantages : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Inconvénients : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Applications : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3.6 Biométrie par la dynamique de la frappe au clavier . . . . . . . . . . . 9
Avantages : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Inconvénients : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Applications : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3.7 Biométrie par la signature dynamique . . . . . . . . . . . . . . . . . . . 9
Avantages : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Inconvénients : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Applications : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4 Raison du choix de la reconnaissance par visage . . . . . . . . . . . . . . . . . 10
1.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
II Implémentation de la solution 36
Rédigé par Wilfried NZIWOUE iii Telecoms & IT Student Engineer - FGI
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
4.3.5 Contrainte N˚ 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Chapitre 5 Conception 40
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.2 Principaux diagrammes de conception . . . . . . . . . . . . . . . . . . . . . . . 40
5.2.1 Diagramme N˚1 : Diagramme de déploiement . . . . . . . . . . . . . . 40
5.2.2 Diagramme N˚2 : Diagramme de cas d’utilisation . . . . . . . . . . . . 41
5.2.3 Diagramme N˚3 : Diagramme de classes . . . . . . . . . . . . . . . . . . 45
5.2.4 Le Modèle Conceptuel de Données (MCD) et le Modèle Logique de
Données (MLD) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.3 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Conclusion Générale 86
III Annexes 90
Fonction N˚ 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Fonction N˚ 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
2.4 Contraintes d’exécution des différentes fonctions . . . . . . . . . . . . . 95
Contrainte N˚ 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Contrainte N˚ 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Contrainte N˚ 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Contrainte N˚ 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Contrainte N˚ 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
2.5 Fonctions secondaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Fonction N˚ 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Fonction N˚ 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Fonction N˚ 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
3 Solutions proposées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.1 Application Serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.2 Application Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Rédigé par Wilfried NZIWOUE vii Telecoms & IT Student Engineer - FGI
Liste des abréviations
DD Dique Dur. 65
GO GigaOctets. 58
IP Internet Protocol. 54
viii
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
MO MegaOctets. 58
MP MégaPixels. 37, 92
PC Personal Computer. 57
x
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
Rédigé par Wilfried NZIWOUE xii Telecoms & IT Student Engineer - FGI
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
Rédigé par Wilfried NZIWOUE xiii Telecoms & IT Student Engineer - FGI
Introduction Générale
La reconnaissance de visage par ordinateur a depuis des années été un sujet de recherche
dans le domaine de la vision par ordinateur. En fait, comment peut on de manière auto-
matique reconnaître un individu par la seule prise en compte de l’image de son visage ? La
réponse à cette seule question sera le fil directeur de notre travail.
Afin de répondre à la question posée plus haut, nous avons subdivisé notre travail en deux
grandes parties. La première intitulée " La reconnaissance faciale en théorie ", nous
permet de présenter la biométrie dans son ensemble, de ressortir les différentes avancés dans
1
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
LA RECONNAISSANCE FACIALE EN
THEORIE
3
Chapitre 1
La biométrie
1.1 Introduction
La sécurité d’accès à une information et à des systèmes est un élément important dans la
sécurité informatique. Au préalable plusieurs méthodes ont été mises sur pied, à l’instar de
l’accès par carte magnétique, par mot de passe, par phrase sécrète ou phrase de passe 1 , par
schéma, par mot de passe image, etc... Cependant le véritable problème de ces méthodes est
le fait qu’il n’assure en rien que la personne qui fournit le passe est bel et bien la
personne qui devrait être autorisée. Afin de palier à ce problème, des chercheurs ont
conçus d’autres méthodes dites biométriques car elles utilisent les caractéristiques propres à
un individu pour l’identifier.
Dans cette partie, nous allons tout d’abord présenter la biométrie, ensuite les différentes
technologies biométriques utilisables de nos jours et enfin ressortir les raisons nous ayant
amenées au choix de la technologie utilisée pour la réalisation de notre projet.
La biométrie peut être définie comme étant " la reconnaissance d’une personne en utilisant
les traits distinctifs ". Et d’après [BOU] elle est définie comme " toutes caractéristiques phy-
siques ou traits personnels automatiquement mesurables, robustes et distinctives qui peuvent
1
mot de passe contenant un nombre fort de caractères (20 - 30 caractères )
4
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
être utilisées pour identifier un individu ou pour vérifier l’identité prétendue d’un individu ".
• la difficulté de contre-façon .
Cependant, son utilisation entraîne un principal inconvénient qui est le coût lié à son
implémentation
Dans cette section, nous allons lister les différentes technologies de biométrie en précisant
leurs avantages, inconvénients et possibles applications.
Les informations apportées dans cette partie sont principalement tirées de [GAE15].
Avantages :
• Petite taille du lecteur facilitant son intégration dans la majorité des applications (té-
léphones portables, PC) ;
• Traitement rapide ;
Inconvénients :
• Certains systèmes peuvent accepter un moulage de doigt ou un doigt coupé (la détection
du doigt vivant permet d’éviter ce type d’usurpation).
Applications :
Avantages :
• Traitement rapide ;
Inconvénients :
• Trop encombrant pour un usage sur le bureau, dans une voiture ou un téléphone ;
• Risque de fausse acceptation pour des jumeaux ou des membres d’une même famille.
Applications :
• Parloirs de prison.
Avantages :
Inconvénients :
Applications :
• Technologie pouvant être associée avec une autre technologie pour la compléter.
Avantages :
• Il est plus facile de protéger le lecteur que dans les autres technologies ;
Inconvénients :
Applications :
• Conversion téléphonique .
Avantages :
Inconvénients :
• L’iris est aisément visible et peut être photographié. Le problème de sécurité est alors
lié aux vérifications effectuées lors de la prise de vue.
Applications :
• En théorie, toutes les applications d’authentification car la caméra est plus exposée
qu’un micro (voix) mais moins qu’un capteur tactile (empreintes digitales).
Avantages :
Inconvénients :
Applications :
Avantages :
• La signature écrite sur un document peut être conservée dans certains documents ;
• Action qui implique la responsabilité de l’individu car la signature est utilisée comme
élément juridique ou administratif.
Inconvénients :
Applications :
Nous avons choisi d’utiliser la reconnaissance par le visage à cause de sa facilité d’implémen-
tation, et qu’elle était la seule à pouvoir, à des coûts réduits, palier au problème de sécurité
qui sévit dans notre pays en ces jours. Et de plus, du fait qu’elle est pratiquement pas intru-
sive, elle est facilement utilisable dans des lieux publics (aéroports, marchés, super-marchés,
etc...) sans que personne ne s’en rende compte. Et mieux encore avec cette technologie, des
grands magasins peuvent effectuer des présentations personnalisées à leurs clients.
1.5 Conclusion
du test comme intrusif, l’effort requis par l’utilisateur, l’efficacité de la méthode (capacité à
identifier quelqu’un).
2.1 Introduction
Depuis des années, des recherches visant à identifier et/ou à reconnaître un visage humain,
ont été menées. De celles-ci ont découlé différentes méthodes plus ou moins efficaces. Le but
de ce chapitre est de présenter les méthodes utilisées dans le cadre de la détection et de la
reconnaissance d’un visage.
La détection de visage est le domaine de la vision par ordinateur qui consiste à détecter
un ou plusieurs visages humains dans une image numérique. Elle fait partie de la grande
famille de la détection des objets en traitement d’image.
Les méthodes de la détection du visage ont été classifiées par [MHYDN41] en quatre caté-
gories :
Selon [ABA08] cette approche s’intéresse aux parties caractéristiques du visage comme
le nez, la bouche et les yeux. Elle se base sur la définition de règles strictes à partir des
rapports entre les caractéristiques du visage. Ces méthodes sont principalement conçues pour
la localisation du visage dans une image. Tout d’abord, les caractéristiques du visage sont
12
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
n
X
HI(x) = I(x, y)
y=1
et
n
X
V I(x) = I(x, y)
x=1
Le profil horizontal de l’image originale est calculé en premier. Les deux minima locaux sont
déterminés, ils correspondent aux bords gauche et droit du visage. Ensuite, le profil vertical
est à son tour calculé. Les minima locaux de ce profil vertical correspondent aux positions
de la bouche, du nez et des yeux. L’inconvénient de cette méthode est qu’elle n’arrive pas à
détecter le visage lorsque ce dernier se trouve sur un arrière plan complexe.
Toutefois, Yang and Huang [HY71] quant à eux, ont étudié les évolutions des caractéris-
tiques du visage en fonction de la résolution. Quand la résolution de l’image d’un visage est
réduite progressivement, par sous-échantillonnage ou par moyenne, les traits macroscopiques
du visage disparaissent. Ainsi, pour une résolution faible, la région du visage devient uniforme.
Au travers de cette observation, Yang et Huang ont proposé une méthode hiérarchique de
détection de visages. En commençant par les images à faible résolution, un ensemble de vi-
sages de candidat est déterminé à l’aide d’un ensemble de règles permettant de rechercher les
régions uniformes dans une image. Les candidats de visage sont ensuite vérifiés en cherchant
l’existence de traits faciaux proéminents grâce au calcul des minima locaux à des résolutions
supérieures. Une caractéristique intéressante de cette technique « descendante » de recherche
de zone d’intérêt (informations globales vers des informations plus détaillées) est de réduire le
temps de calcul nécessaire par l’utilisation d’images sous-échantillonnées. Malheureusement,
cette technique occasionne de nombreuses fausses détections et un taux faible de détection.
Comme mentionné dans [ABA08], les templates peuvent être définis soit " manuellement
", soit paramétrés à l’aide de fonctions. L’idée est de calculer la corrélation entre l’image can-
didate et le template. Ces méthodes rencontrent encore quelques problèmes de robustesse liés
aux variations de lumière, d’échelle, etc. Sinha [Sin54] [Sin95] utilise un ensemble d’invariants
décrivant le modèle du visage. Afin de déterminer, les invariants aux changements de lumino-
sité permettant de caractériser les différentes parties du visage (telles que les yeux, les joues,
et le front) ; cet algorithme calcule ainsi les rapports de luminance entre les régions du visage
et retient les directions de ces rapports (par exemple, la région 1 est elle plus claire ou plus
sombre que la région 2). La figure 2.2.2 est un exemple de modèle prédéfini correspondant à
23 relations pouvant être utilisées pour former un template.
calcule la perte d’information entre l’image et sa projection. Si cette perte d’information est
grande (évaluée à partir de la distance, que l’on compare à un seuil fixé à priori), l’image n’est
pas correctement représentée dans l’espace : elle ne contient pas de visage. Cette méthode
donne des résultats assez encourageants, mais le temps de calcul est très important.
Dans Rowley et al. [RBK98], les auteurs proposent un système de détection de visage se
basant sur la classification par des réseaux de neurones. Leur technique est divisée en deux
étapes : la localisation des visages en utilisant un réseau de neurones et la vérification des
résultats obtenus. Les auteurs ont construit un réseau de neurones qui, à partir d’une image
prétraitée de 20x20 pixels, indique s’il s’agit d’un visage ou non. Le pré-traitement consiste
à égaliser l’histogramme, l’image étant balayée avec des fenêtres de 20x20. Pour détecter les
visages de différentes tailles, une analyse multi-résolutions est alors effectuée.
D’après [ABA08], ces approches sont utilisées principalement pour la localisation de visage.
Les algorithmes ainsi développés visent à trouver les caractéristiques structurales existantes
même si la pose, le point de vue, ou la condition d’éclairage peuvent varier. Puis ils emploient
ces caractéristiques invariables pour localiser les visages. L’implémentation de cette approche
se fait soit par la la couleur de la peau ou par les caractéristiques de visage (les deux yeux,
les deux narines et la jonction nez/lèvre).
L’algorithme développé par De Silva et al. [LCDSH95] est un exemple typique des méthodes
basées sur les caractéristiques. Leur algorithme utilise tout d’abord une hypothèse sur la
position du haut du visage ensuite l’algorithme de recherche parcourt le visage de haut en
bas afin de trouver l’axe des yeux « eye-plane » caractérisé par une augmentation soudaine
de la densité de contours (mesurée par le rapport noir/blanc le long des plans horizontaux).
La longueur entre le haut du visage et le plan de l’oeil est alors utilisée comme une longueur
de référence pour construire un « template » facial flexible.
La reconnaissance de visage définie par [Wik15b] comme étant " un domaine de la vision
par ordinateur consistant à reconnaître automatiquement une personne à partir d’une image
de son visage " peut s’effectuer aussi bien sur une vidéo et sur une photo. Cependant dans
le cadre de ce travail, nous l’effectuerons uniquement sur des images. On peut facilement
répartir l’ensemble des techniques de reconnaissance de visage, en trois grandes catégories :
les méthodes globales, les méthodes locales et les méthodes hybrides.
Ces méthodes dites globales ou encore holistiques sont des méthodes qui utilisent toute la
région du visage comme information d’entrée. Son principal inconvénient peut résider dans la
taille des données à stocker lors de la phase d’apprentissage. Cependant avec l’actuel capacité
de stockage de nos ordinateurs, nous pouvons relativement palier à ce problème.
• l’ACP Analyse des Composantes Principales(encore appelée EigenFace) qui sera mieux
détaillé dans le chapitre 3 débuttant à la page 21, car c’est la technique utilisée dans
notre travail ;
une image de test et une image prototype appartenant aux classes intra-personne et
inter-personne. Notons que la distribution intra-personne ne peut pas être évaluée dans
le cas d’un exemple par personne, et la méthode se ramène aussi à la méthode eigenface.
Remarque : Les méthodes basées sur une approche holistique (globale) ont toute en com-
mun le fait que chaque image de dimension (n ∗ m) pixels est représentée par un vecteur
simple de dimension n ∗ m appélé vecteur image, en concaténant les valeurs du niveau de gris
de tous les pixels de l’image du visage. Et la concaténation de tous ces vecteurs images au
sein d’une matrice forme l’espace image.
Les méthodes locales prennent pour données de calcul les caractéristiques locales du visage
pour sa reconnaissance . Elles sont relativement matures comparées aux méthodes holis-
tiques (globales) . Dans ces méthodes, le visage est représenté par un ensemble de vecteurs
caractéristiques de dimensions faibles, plutôt que par un seul vecteur de grande dimension.
Les méthodes locales peuvent être classifiées en deux catégories : les méthodes basées
sur les caractéristiques locales : extractions et localisation des points caractéristiques,
et les méthodes basées sur les apparences locales : partitions des images de visage en
régions caractéristiques.
Les approches basées sur l’extraction de points caractéristiques sont composées de deux
catégories : les approches géométriques et les approches basées sur les graphes.
techniques géométriques est très bas comparé à celui des autres techniques. Cependant, ces
approches présentent des inconvénients, notamment :
Approches basées sur les graphes : à défaut d’utiliser les caractéristiques géométriques
du visage, des chercheurs ont opté de représenter les caractéristiques locales du visage sous
forme de graphes. Ils ont donc mis sur pied une méthode de détection de caractéristiques
locales du visage, basée sur la décomposition en ondelettes de Gabor. La reconnaissance
de visages est alors formulée comme un problème de mise en correspondance de graphes.
L’efficacité de cette méthode a été validée sur un ensemble de données de visage de 86
sujets, contenant des variations d’expression et de pose, un taux de reconnaissance de 90%
en moyenne a été rapporté démontrant la robustesse de cette approche. Mais hélas après
construction, le graphe topologique ne peut pas être modifié. Cependant, les images de visage
sont toujours sujettes à des changements (illumination, expression, pose, etc.), et du coup un
schéma de graphe topologique fixe n’est plus adéquat.
Ces techniques s’utilisent de manière modulaire pour les différentes régions faciales. Le
modèle global est alors défini à partir de la combinaison des différents modèles locaux. De
ce fait, les différentes régions du visages ne seront plus affectées de la même manière par
variations possibles lors de la prise de l’image( le port de lunettes de soleil change considé-
rablement l’aspect des yeux, tandis qu’un sourire affecte plus la région de la bouche ). Dans
cette approche, le visage est caractérisé par sa forme (rectangle, ellipse) et sa taille. Les
caractéristiques des régions locales s’obtiennent à partir d’une analyse des valeurs de niveau
gris. Des techniques comme les Ondelettes de Gabor et l’analyse fractale sont aussi utilisées
pour l’extraction de caractéristiques. En général, les caractéristiques à base de valeurs de
gris préservent l’information de texture, tandis que les caractéristiques de Gabor sont plus
robustes face aux changements d’illumination et aux transformations géométriques .
ACP et ADL modulaire : des chercheurs ont introduit l’approche des « Modular
Eigenspase ». Les régions faciales ainsi prises en compte sont : la totalité du visage, les yeux
et le nez. Une ACP est appliquée sur chacune de ces régions et les résultats de classifications
obtenus sont agrégés. La prise en compte de la bouche dans cette approche engendre radica-
lement la baisse du taux de reconnaissance, car elle est la partie du coprs humain peu sensible
aux changements d’expressions. Cette approche peut être ainsi qualifiée d’hybride, puisque
utilisant des caractéristiques globales et locales dans son implémentation. Les auteurs ont
montré qu’elle est plus efficace que les techniques globales ou strictement locales appliquées
séparément.
Les approches probabilistes locales modulaires : des chercheurs font montre d’une
approche probabiliste locale pour la reconnaissance de visages avec des occultations par-
tielles et des variations d’expression. Ils utilisent un seul exemple d’apprentissage par classe.
Chaque visage est divisé en six régions locales sous forme d’ellipses. Les régions ayant les
mêmes positions pour chaque visage sont groupées séparément dans un sous-espace. Pour
une représentation plus compacte et efficace, chaque sous-espace de visage est à nouveau
transformé dans un eigenspace, où la distribution est évaluée par la moyenne d’un modèle de
mélange de Gaussiennes en utilisant des algorithmes précis. Dans l’étape d’identification, les
images de test sont aussi divisées en six régions locales et sont projetées respectivement dans
l’eigenspace calculé. Une approche probabiliste plutôt qu’une approche de vote est utilisée
pour mesurer la similitude d’un appariement donné. Les tests sur un jeu de 2600 images ont
montré que l’approche probabiliste locale ne réduit pas la précision même pour 16 des visages
partiellement occultés.
Les méthodes hybrides sont des approches qui combinent les caractéristiques holistiques et
locales afin d’améliorer les performances de la reconnaissance de visage. En effet, les caracté-
ristiques locales et les caractéristiques globales ont des propriétés tout à fait différentes. On
2.4 Conclusion
L’état de l’art de la détection et de la reconnaissance d’un visage est très dense, nous
y trouvons une multitude d’algorithmes que nous ne pouvons malheureusement tous citer.
Cependant il est important de retenir que la détection d’un visage dans une image peut
se faire selon une approche basée sur les connaissances acquises, une approche basée sur le
template matching, une approche basée sur l’apparence ou alors selon une approche basée
des caractéristiques invariantes. Et concernant la reconnaissance de visage, elle s’effectue en
utilisant soit une méthode globale , une méthode locale ou une méthode hybride.
3.1 Introduction
A travers ce chapitre, nous allons présenter l’utilisation de la technique des eigenFaces pour
la reconnaissance faciale. Cette technique, commme bien d’autres, a besoin pour son implé-
mentation que le système de reconnaissance soit divisé en deux principaux sous-systèmes,
le sous-système d’apprentissage de l’individu et le sous-système de reconnaissance de l’indi-
vidu. Cependant, il est très souvent judicieux de placer avant ces deux blocs un module de
pré-traitement de l’image acquise.
Du fait que les images avec lesquelles nous travaillons dans le système proviennent généra-
lement de différentes sources, elles possèdent généralement des fonds différents, des variations
de contrastes , des résolutions différentes et sont de tailles différentes. Il nous a ainsi paru
nécessaire de mettre à l’entrée du système un module de pré-traitement de ces images dont
le rôle principal est la normalisation de l’image à son entrée dans le système.
Afin d’illustrer les différents traitements effectués, nous les avons appliqués sur cette image
source.
21
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
Cette transformation permet, dans le cas et rien que dans le cas où l’image source est en
couleur, de la transformer en une image Noir/Blanc afin de réduire la taille en mémoire de
l’image. Car celle-ci est désormais représentée uniquement sur une seule couche et la valeur
d’un pixel est comprise entre 0 et 255 car codée sur 8 bits. La figure ci-dessous présente le
résultat de ce traitement sur l’image de la figure 3.1 .
L’application du filtre médian nous permet d’éliminer un type particulier de bruit, dit «Salt
and Pepper noise» qui consiste en des tâches dispersées d’intensité très forte ou très faible.
L’utilisation de ce filtre est très importante car malgré la réduction du bruit dans l’image,
elle conserve également les contours ; ce qui est très utile pour la détection d’un visage et
sa réconnaissance. La figure ci-après illustre l’application du filtre médian sur l’image de la
figure 3.2
Il s’agit en fait ici de respectivement réduire ou augmenter la taille de l’image pour qu’elle
soit de 112 ∗ 92 pixels. La figure ci-dessous montre un exemple de redimensionnement d’une
image ; L’image ci-après illustre le redimensionnement de l’image de la figure 3.4
genFaces
De prime abord , nous avons choisi cette technique car elle est une méthode très utilisée
pour la reconnaissance de visage, relativement simple, et possédant un bon fondement ma-
thématique. Toutefois, comme toute méthode de reconnaissance faciale, à caractère globale,
elle nécessite pour son bon fonctionnement un nombre considérable de photos de visage par
individu, et de plus la précision de cette méthode va croissant avec le nombre de photo de
visage d’un individu. Le diagramme ci-dessous tiré de [ABA08] à la page 40 illustre au mieux
ce qui est dit.
De ce fait, nous avons choisi prendre 10 photos par individu pour notre base d’apprentis-
sage.
1. Pour chaque image normalisée d’un individu I(x, y), de dimension N ∗ P (dans
notre cas ; N=112, P=92 ). Transformer sa matrice d’image en un un vecteur colonne
x de dimension L ∗ 1 avec L = N ∗ P ;
2. Former la matrice
avec M = I * Nombre de photo par individu (10 dans notre cas) ; où I = Nombre
d’individus de la base d’apprentissage ;
M
1 X
ψ= xn (3.2)
M n=1
Le vecteur visage moyen obtenu est un vecteur de taille L ∗ 1. Il servira par la suite
à l’analyse d’image.
φi = xi − ψ 1≤i≤M (3.3)
D = QQT (3.4)
avec
Pour le faire, nous devrons appliquer l’ACP sur la matrice D. Toutefois, étant de
dimensions L ∗ L , nous allons à la place utiliser une matrice de dimension inférieure
mais dont il existe une relation entre ses vecteurs propres et les vecteurs propres de la
matrice D.
Considérons la matrice
E = QT Q (3.6)
Ainsi,
DQei = λi Qi ei (3.9)
Par analogie avec l’équation 3.7, nous pouvons déduire l’équation suivante :
di = Qei (3.10)
Pour que les vecteurs di soient véritablement utilisables, il faut les "normer ".
di
di = (3.11)
||di ||
Ici, il faut choisir les N vecteurs propres de plus grandes valeurs propres. Dans notre
cas, ce sont les N = 40 premiers vecteurs propres possédant les plus grandes valeurs
propres.
Nous pouvons nous rendre compte que l’utilisation de l’ACP a permis une réduction
des données de travail car l’on est passé de l’utilisation de 10 ∗ Iavec (I ≥ 40)1 à l’uti-
lisation de N = 40 vecteurs uniquement. Cependant, la quasi-totalité des informations
utiles a été conservée.
1
I ≥ 40 car la base de données d’images (ORL face database) que nous avons utilisée possède 40 individus
avec 10 images chacun.
Les faces propres obtenues à l’étape précédente forment désormais un espace vectoriel
euclidien 2
V, possédant une base orthonormée B, formée par nos 40 visages propres,
dans laquelle nous pouvons représenter tous nos visages normalisé.
N
X
φi = ωji dj (3.12)
j=1
Avec
Ainsi, on a :
i
ω1
ωi
2
i
ω3
φi =
i
avec 1 ≤ i ≤ M (3.14)
ω4
.
..
i
ωN
Le bloc détection du visage, comme son nom l’indique a pour principal objectif de détec-
ter un ou plusieurs visage(s) sur une image. Et, pour le faire, il utilise une API (Application
Programming Interface) dénommée OpenCV. Une présentation plus complète de OpenCV
est faite à l’annexe 1.3.
Pour effectuer cette cruciale tâche, de détection de visage, nous avons utilisé le classificateur
"haarcascade_frontalface_alt.xml" disponible dans OpenCV. Toutefois, elle ne détecte dans
la majeur partie des cas que les visages frontaux, c’est pour cette raison, que l’angle de prise
de vue de l’image doit être le meilleur possible (prise de vue frontale).
vidu»
Après avoir normalisé et détecté le ou les visage(s), sur l’image d’entrée, le système peut
déjà identifier le ou les individu(s). Identifier un individu consiste à déterminer son identité
à partir de l’image de son visage. Pour le faire, le système procède comme suit :
ΓA = A − ψ (3.15)
Avec
ωjA = dTj .ΓA ; 1≤j≤N (3.17)
N
X
a2i = (ωji − ωjA )2 1≤i≤N (3.18)
j=1
Ainsi, v
q u N
uX
2
ai = ai = t (ωji − ωjA )2 (3.19)
j=1
dividu»
Authentifier un individu est le fait de déterminer si un individu X est bel et bien celui qui
prétend être. D’après cette définition, on se rend bien compte que authentifier un individu
revient à faire une comparaison entre l’image du visage de l’individu proclamé
(se retrouvant dans la BD 3 ) et l’image du visage de l’individu à authentifier.
En définitive, les différentes actions que le système effectue sont les suivantes : l’apprentis-
sage d’un individu, l’identification d’un individu et l’authentification d’un individu. La figure
ci-après illustre schéma fonctionnel de notre système.
3
Base de Données
3.5 Conclusion
IMPLEMENTATION DE LA
SOLUTION
36
Chapitre 4
4.1 Introduction
Dans ce chapitre, nous allons présenter les différentes fonctions principales que notre sys-
tème devra posséder et les contraintes d’implémentations de ces fonctions. La présentation
d’une fonction passe par la mise en exergue de son nom et du critère permettant d’évaluer si
oui ou non cette fonction a été remplie lors du fonctionnement du système. Cependant, dans
un soucis de mieux expliciter les attentes de notre système, nous avons fourni en annexe 3.2
un cahier de charge comportant toutes les informations pratiques du système.
tème
4.2.1 Fonction N˚ 1
4.2.2 Fonction N˚ 2
37
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
4.2.3 Fonction N˚ 3
4.2.4 Fonction N˚ 4
4.3.1 Contrainte N˚ 1
4.3.2 Contrainte N˚ 2
4.3.3 Contrainte N˚ 3
1
extensions de fichier image employant la compression JPEG Joint Photographic Experts Group
4.3.4 Contrainte N˚ 4
4.3.5 Contrainte N˚ 5
4.4 Conclusion
Dans ce chapitre, il a été question pour nous de réaliser une analyse des besoins du système
à concevoir. Afin de mieux documenter cette analyse, un cahier de charge mieux établi se
trouve en annexe 3.2.
Conception
5.1 Introduction
Dans ce chapitre, nous allons présenter les principaux diagrammes de conception et à partir
de ceux-ci ressortir le MCD (Modèle Conceptuel de Donnée) et le MLD (Modèle Logique de
Données) de notre système.
Grâce à l’analyse des besoins effectuée au chapitre 4, nous avons pu ressortir les diagrammes
ci-dessous. Ces diagrammes ont été effectués à l’aide du langage UML (Unified Modeling
Language).
40
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
Notre système est ainsi basé sur une architecture client - serveur centralisée, avec un
client léger et un serveur lourd.
Comme présenté dans le diagramme de déploiement, notre système possède une architec-
ture client-serveur. De ce fait, nous avons un diagramme de cas d’utilisation pour l’appli-
cation cliente et un autre pour l’application serveur.
Afin d’avoir une facile réalisation des cas d’utilisation du système, à travers une bonne
conception de la base de donnée, nous avons défini les règles de gestions suivantes :
5.3 Conclusion
Dans ce chapitre, nous avons présenté les principaux diagrammes nécessaires à la compré-
hension du fonctionnement de notre système, et nous avons également mis sur pied le MCD et
MLD du système. Cependant les diagrammes d’interactions client-serveur et quelques autres
diagrammes sont présentés à l’annexe ??. Nous allons à présent passer à la réalisation de
ce système, en nous fixant pour objectifs la réalisation des fonctions principales de notre
système, et ce, en respectant les contraintes fixées.
6.1 Introduction
Dans ce chapitre, nous allons présenter les différents logiciels que nous avons utilisés dans
notre projet. La présentation de ces logiciels se fera en deux phases, en premier, les logiciels
utilisés dans la phase de l’analyse et de la conception et en second les logiciels utilisés dans
la phase de la réalisation..
Durant la phase de l’analyse et la conception, nous avons utilisés les logiciels ci-après :
49
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
Remarques : Il possède une version d’essaie d’un mois téléchargeable gratuitement sur
leur site web.
6.2.2 JMerise
6.3.1 Notepad++
Remarques : Pour son installation, il faudrait que le JDK (Java Development Kit) soit
préalablement installé.
Remarques : Pour son installation, il faudrait que la JDK (Java Development Kit) le soit
au préalable.
6.3.4 WampServer
1
WAMP pour Windows, Apache, MySQL, PHP est une architecture comportant ces quatres composants
dont le rôle respectifs est d’assurer l’attributions des ressources aux trois autres, repondre aux requêtes web
des clients, stocker les données des applications et exécuter les scripts PHP
Présentation générale : Inno Setup est un logiciel libre permettant de créer des instal-
lateurs pour Windows. Ceux-ci peuvent comporter des scripts programmés en Pascal.
6.4 Conclusion
Dans ce chapitre, nous avons présenté les différents logiciels que nous avons utilisés durant
la conception et la réalisation de notre projet. Toutefois, cette liste n’est pas complète car il
y’a plein de petits outils que nous ont été nécessaire.
Résultats et commentaires
7.1 Introduction
A travers ce chapitre, nous allons tout d’abord parler du fonctionnement général du système
et par la suite présenter successivement les différents résultats obtenus et enfin les observations
que nous avons effectuées. Pour un soucis de compréhension et de facilité de lecture, le serveur
fait référence à l’application serveur, le client fait référence aux applications clientes mobile
(développée pour le système Android pour téléphone et tablette) et PC.
Notre système de reconnaissance faciale est en fait un système central possédant une ar-
chitecture client - serveur avec un serveur lourd et le client étant léger.
De ce fait, le serveur offre les services ci-dessous aux clients à travers les ports suivant :
56
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
Remarque : Ces ports ont été choisis de manière arbitraire car les tests ont juste été faits
dans un environnement contrôlé.
Cependant pour un soucis de sécurité, avant l’utilisation d’un service l’application cliente
doit d’abord s’authentifier au près du serveur. Cette phase d’authentification étant très
cruciale, elle se déroule suivant le protocole CHAP (Challenge Handshake Protocol).
1. Après que le client s’est connecté au port du serveur désiré, le serveur génère un message
aléatoire (challenge message) qu’il envoie au client.
2. Après réception du challenge message, le client calcule à l’aide du MD5 (Message Di-
gest 5) le hash de ce message en passant en paramètre la clé sécrète et le pseudo de
l’utilisateur. Et il envoie le hash et le pseudo au serveur.
3. A la reception de ces valeurs, le serveur calcule à son tour le hash à l’aide du MD5 en
passant en paramètre le pseudo reçu et le challenge message préalablement généré.
4. Si le hash calculé par le serveur est le même que celui envoyé par le client, alors le client
est considéré comme étant un client valide et la communication peut alors continuer.
Dans le cas contraire, le serveur ferme l’interface de connexion avec ce client considéré
comme non légitime.
Sur la figure 7.2.1, nous avons une illustration de l’authentification CHAP à travers le
réseau. Cette capture a été réalisé avec le logiciel Wireshark1
1
Wireshark est un analyseur de paquets libre utilisé dans le dépannage et l’analyse de réseaux informa-
tiques, le développement de protocoles, l’éducation et la rétro-ingénierie.
Dans cette partie de ce chapitre, nous allons présenter les différentes applications que nous
avons conçu. En prélude, nous allons présenter l’application Android, ensuite l’application
cliente pour PC (Personal Computer) et enfin l’application serveur. La présentation d’une
application se fera de la manière suivante :
• Nous ferons ressortir les caractéristiques matérielles de l’équipement qui pourra l’exé-
cuter ;
Pour son bon fonctionnement, l’application Android devra être installée sur un Smart-
phone2 possédant les caractéristiques suivantes :
2
Un smartphone ou téléphone intelligent, est un téléphone mobile évolué disposant des fonctions d’un
assistant numérique personnel, d’un appareil photo numérique et d’un ordinateur portable.
Figure 7.4 – Message d’erreur en cas de combinaison mot de passe et pseudo incorrecte
Pour son bon fonctionnement, l’application cliente devra être installée sur un ordinateur
possédant les caractéristiques suivantes :
• RAM : 512 MO
Remarque : Concernant l’installation de la JRE, nous avons deux "setup.exe" l’un com-
prenant en son sein la JRE que l’utilisateur devra installer manuellement par la suite et
l’autre ne contenant pas la JRE dans l’éventualité où l’utilisateur en possède déjà une.
Figure 7.18 – Installation de l’application dont le setup contient la JRE en son sein
Figure 7.19 – Installation de l’application dont le setup ne contient pas la JRE en son sein
Figure 7.29 – Message d’erreur lors de la modification des informations d’un individu
Figure 7.35 – Interface de recherche d’un individu suivant son nom et son prénom
Figure 7.36 – Interface de recherche d’un individu suivant son numéro d’identifiant
Pour son bon fonctionnement, l’application serveur devra être installée sur un ordinateur
possédant les caractéristiques suivantes :
• RAM : 16 GO
Pendant les différentes phases de test réalisées sur notre système, nous avons pu ressortir
les observations suivantes :
• Pour améliorer la fiabilité du système, il faut que les photos d’apprentissage soient
prises avec des éclairages différents, des expressions différentes mais pas trop varié et
plus encore ces photos doivent être différentes. La prise des photos lors de la phase
d’apprentissage d’un individu étant très importante, nous y avons placé dans l’aide de
l’application cliente PC, une procédure à suivre afin de mieux la réaliser. Et à l’annexe
C, nous pouvons trouver cette même procédure.
• La détection de visage automatique génère très souvent des erreurs d’espace libre dans
la RAM (Random Access Memory) sur la machine de test. Par conséquent, il faudrait
limiter le plus souvent son utilisation.
7.5 Conclusion
Dans ce chapitre , il a été question pour nous de présenter les différentes applications que
nous avons conçus. Cependant, du au manque de temps, certaines fonctionnalités prévues
dans le diagramme de cas d’utilisation de l’application serveur présenté dans les figures 5.3
et 5.4 n’ont pas été réalisées.
En somme, tout au long de notre travail il a été question pour nous dans un premier temps
de présenter la biométrie en générale et la reconnaissance faciale en particulier. Et dans un
second temps de proposer une implémentation de solution de reconnaissance faciale à l’aide
des EigenFaces.
Le système étant encore à sa première version, le taux d’identification avec les variations
de pose n’est pas encore très satisfaisant.
Toutefois, nous espérons avoir apporté une contribution dans ce domaine très innovateur
de la biométrie. Et nous nous donnons pour objectif d’améliorer ce taux à la prochaine
version.
87
Bibliographie
[GAE15] NOTORIO GAETANO. Les étapes du cahier des charges pour une appli-
cation mobile : le cas fini l’ennui, Septembre 2015. http ://www.gaetano-
notorio.com/portfolio/cahier-des-charges-pour-une-application-mobile.
[HY71] T.S. Huang and G. Yang. Human face detection in complex background. Pat-
tern Recognition, pages 53–63, Volume 27(1).
[MA 1] TURK Matthew and PENTLAND Alex. Eigenfaces for recognition. Vision and
Modeling Group, The Media Laboratory, Massachusetts Institute of Technology,
pages 72– 76, Volume 3, Number 1.
88
Implémentation d’un système de reconnaissance faciale par la technique des
EigenFaces sous Java et Android
[MHYDN41] Ming-Hsuan, Yang, Kriegman David, J, and Ahuja Narenda. Detecting faces in
images : A survey. Dans IEEE Transactions on Pattern Analysis and Machine
Intelligence, pages 34–58, Volume 24(1).
[RBK98] H. A. Rowley, S. Baluja, and T. Kanade. Neural network based face detection.
IEEE Trans, Pattern Anal. Mach, Intell, pages 23–38, January 1998.
[Sin54] P. Sinha. Object recognition via image invariants : A case study. Investigative
Ophthalmology and Visual Science, pages 1735–1740, Volume 35(4).
ANNEXES
90
Annexe A
Cahier de charge
Email : [email protected]
Version 2.0
91
Annexe A : Cahier de charge de FaceRecognition
Résumé
Ce travail présente une vision sécuritaire où il serait possible d’identifier un individu rien que
par la connaissance de son visage. En effet, au regard des problèmes sécuritaires qui minent
notre société actuelle (La secte islamique, les bandits de grands chemins, les fraudes au exa-
mens nationaux, etc...) , il nous a paru très intéressant de proposer un système qui permettra
d’identifier de manière automatique un individu grâce à l’acquisition et la connaissance de
son visage.
1 Nature du document
Ce cahier des charges vise à définir les « spécification de base » de notre projet FaceRecog-
nition.
En interne, ce cahier de charge permettra d’établir de manière certaine les différentes tâches
à effectuer et leur délai de réalisation.
• les modalités d’exécution sans toutefois entrer en profondeur dans les solutions utilisées ;
Une observation assez orientée permet de se rendre compte du fait que : une personne peut
très facilement se présenter dans un service administratif, à l’entrée d’un examen national,
dans une entreprise et affirmer s’appeler telle ou telle sans que personne ne soit capable
d’infirmer ou affirmer son assertion. De plus, il est possible et facile pour un individu recherché
de passer incognito à travers un point de contrôle et même de se faire interpeller par la police
sans être inquiéter ; ceci étant dû au fait que les forces de l’ordre et les agents de sécurité
n’ont pas de moyens d’obtenir de manière rapide et efficace les informations sur un individu.
C’est dans cette optique que nous avons décidé de concevoir un système qui permettra
d’identifier ou d’authentifier un individu sur une photo ou/et une vidéo. Ce système devra
être terminé avant Janvier 2016.
Fonction N˚ 1
Fonction N˚ 2
Fonction N˚ 3
Fonction N˚ 4
Contrainte N˚ 1
Contrainte N˚ 2
Contrainte N˚ 3
Contrainte N˚ 4
Contrainte N˚ 5
Fonction N˚ 1
Fonction N˚ 2
Fonction N˚ 3
Nom Posséder des fonctions d’administration du système avec différents groupes d’utilisa-
teurs.
Critère Le système doit pouvoir posséder des groupes d’utilisateurs distincts avec leurs
permissions.
3 Solutions proposées
Afin de résoudre les problèmes énoncés plus haut, nous proposons de développer les solu-
tions ci-après :
• Deux applications clientes dont l’une dédiée pour les PC développée en JAVA qui fonc-
tionnera sur les systèmes Windows et Linux systèmes Linux et l’autre pour SmartPhone
développée en Android ;
• une application serveur fonctionnant sous Linux et développée à l’aide du langage JAVA
.
L’application serveur devra être développée en JAVA et devra tourner sur un système
Linux. Elle permettra la communication entre le sytème et la Base de donnée et tout autre
système externe. Elle éffectuera également les fonctions de détection de visage et de recherche
de l’individu dans la base et renverra les différents résultats au client ayant initier la démande
.
OpenCV pour Open Computer Vision est une bibliothèque graphique développée sous
licence BSD. BSD pour "Berkeley Software Distribution License" est une licence libre utilisée
pour la distribution de logiciels. Elle permet de réutiliser tout ou une partie du logiciel sans
restriction, qu’il soit intégré dans un logiciel libre ou propriétaire. OpenCV est initialement
développée par Intel et est spécialisée dans le traitement d’images en temps réel. Elle est
développé en C, C++, Java, Android, Python et implémentable sur toutes ces plate-formes.
1 Les fonctionnalités
OpenCV propose diverses fonctionnalités dans les domaines du calculs matriciels, du trai-
tement d’images, traitement vidéos, des algorithmes d’apprentissage, et bien d’autres encore.
98
Annexe B : Présentation de OpenCV
• etc...
• etc ...
• Estimateur (statistique) ;
• etc...
La prise des photos d’un individu lors de la phase apprentissage, étant une étape très im-
portante, nous avons mis à votre disposition ce petit guide vous fournissant la procédure à
suivre. Le respect scrupuleux de cette procédure améliore grandement la précision du système
dans les opérations futures.
Tout d’abord, il est important de préciser que ces photos doivent être au nombre de 10 et
différentes chacune des autres.
Il est intéressant de préciser que les différentes photos devront être prises dans de meilleures
conditions d’éclairage possible. Et, elles devront juste comporter la face de l’individu prises
en vue de face et avec des expressions faciales différentes des unes des autres.
100
Annexe C : Procédure de prise de photo lors de l’apprentissage d’un individu
La photo N˚1 est très importante car c’est elle qui sera utilisée comme photo de profil de
l’individu. L’individu devra être dans la meilleure de ces postures.
Rédigé par Wilfried NZIWOUE 101 Telecoms & IT Student Engineer - FGI
Annexe C : Procédure de prise de photo lors de l’apprentissage d’un individu
Rédigé par Wilfried NZIWOUE 102 Telecoms & IT Student Engineer - FGI
Annexe C : Procédure de prise de photo lors de l’apprentissage d’un individu
Rédigé par Wilfried NZIWOUE 103 Telecoms & IT Student Engineer - FGI
Annexe C : Procédure de prise de photo lors de l’apprentissage d’un individu
Sur cette photo, l’individu peut porter des lunettes s’il généralement il en met.
Rédigé par Wilfried NZIWOUE 104 Telecoms & IT Student Engineer - FGI
Annexe D
Ici, nous présentons les codes sources permettant de réaliser l’identification d’un indi-
vidu au niveau du serveur et de l’échange des résultats avec le client.
2 function n o r m a l i z e d P i c t u r e = NormalizeOnePicture ( p i c t u r e P a t h )
%by W i l f r i e d NZIWOUE : w i l n z i @ y a h o o . f r
4 n o r m a l i z e d P i c t u r e = imread ( p i c t u r e P a t h ) ;
8 size ( normalizedPicture , 3 ) ;
i f ( s i z e ( n o r m a l i z e d P i c t u r e ,3)==3)
10 normalizedPicture = rgb2gray ( normalizedPicture ) ;
end
12 normalizedPicture = histeq ( normalizedPicture ) ;
normalizedPicture = medfilt2 ( normalizedPicture ) ;
14 imwrite ( normalizedPicture , picturePath ) ;
105
Annexe D : Code source du service Identification
16 end
nbreWeight = s i z e ( usedEigenFace , 2 ) ;
8 we ig ht = s i n g l e ( zeros ( nbreWeight , 1 ) ) ;
for i =1: nbreWeight
10 we ig ht ( i ) = usedEigenFace ( : , i ) ’ ∗ s i n g l e ( photo_normalise ) ;
end
12
end
Listing D.2 – Fonction permettant de calculer les différents poids d’une image
2 function i n d i x = R e c o g n i t i o n ( weight , p o i d s )
matrix = s i n g l e ( zeros ( s i z e ( weight , 2 ) , 1 ) ) ;
4 for i =1: s i z e ( weight , 2 )
% m a t r i x ( i , 1 ) = norm ( p o i d s −w e i g h t ( : , i ) ) ;
6 matrix ( i , 1 ) = norm( mahal ( p oids , weight ( : , i ) ) ) ;
% m a t r i x ( i , 1 ) = mean ( mahal ( p o i d s , w e i g h t ( : , i ) ) ) ;
8 end
[ s o r t e d M a t r i x , i n d i x ] = sort ( matrix , ’ ascend ’ ) ;
10 end
12 end
Rédigé par Wilfried NZIWOUE 106 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
Listing D.3 – Fonction permettant de calculer la distance entre l’image d’entrée et les images
de la base
2 function t a k e n V a l i d P e r s o n = TakenValidPerson ( p e r s o n I d )
%by W i l f r i e d NZIWOUE : w i l n z i @ y a h o o . f r
4 table1 = 0;
for i = 1 : s i z e ( p e r s o n I d , 1 )
6 i f p e r s o n I d ( i , 1 ) > 40
table1 = [ table1 ; personId ( i , 1 ) ] ;
8 end
end
10 table1 = table1 ( 2 : size ( table1 , 1 ) , 1 ) ;
number = 0 ;
12 t a b l e 2 = unique ( t a b l e 1 ) ;
table2 = [ table2 , table2 ] ;
14 for i =1: s i z e ( t a b l e 2 , 1 )
for j =1: s i z e ( t a b l e 1 , 1 )
16 i f t a b l e 1 ( j , 1 ) == t a b l e 2 ( i , 1 )
number = number +1;
18 end
end
20 t a b l e 2 ( i , 2 ) = number ;
number = 0 ;
22 end
table3 = table2 ( : , 2 ) ;
24 t a b l e 3 = sort ( unique ( t a b l e 3 ) , ’ descend ’ ) ;
offset = 1;
26 t a k e n V a l i d P e r s o n = s i n g l e ( zeros ( s i z e ( t a b l e 2 , 1 ) , 1 ) ) ;
for i =1: s i z e ( t a b l e 3 , 1 )
Rédigé par Wilfried NZIWOUE 107 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
28 for j =1: s i z e ( t a b l e 2 , 1 )
i f t a b l e 3 ( i , 1 ) == t a b l e 2 ( j , 2 )
30 takenValidPerson ( o f f s e t , 1 ) = table2 ( j , 1 ) ;
offset = offset + 1;
32 end
end
34 end
end
2 function p e r s o n I d = P e r s o n D e t e r m i n a t i o n ( v e c t o r I d )
4 p e r s o n I d = s i n g l e ( zeros ( s i z e ( v e c t o r I d , 1 ) , 1 ) ) ;
for i =1: s i z e ( v e c t o r I d , 1 )
6 id = vectorId ( i , 1 ) ;
r e s t = mod( id , 1 0 ) ;
8
i f ( r e s t ==0)
10 personId ( i , 1 ) = id /10;
else
12 p e r s o n I d ( i , 1 ) = ( ( id−r e s t ) / 1 0 ) + 1 ;
end
14
end
16 personId = personId ( 1 : 1 0 0 , 1 ) ;
p e r s o n I d = TakenValidPerson ( p e r s o n I d ) ;
18
20 end
Rédigé par Wilfried NZIWOUE 108 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
Listing D.5 – Fonction permettant de déterminer les individus les plus proches de l’individu
d’entrée
2 function p e r s o n I d = I d e n t i f i c a t i o n ( p i c t u r e P a t h )
filename = ’ VariableFile \ identificationVariable ’ ;
4 S = load ( f i l e n a m e ) ;
usedEigenFace = S . usedEigenFace ;
6 meanImage = S . meanImage ;
we ig ht = S . weight ;
8
picture = NormalizeOnePicture ( p i c t u r e P a t h ) ;
10 p o i d s = W e i g h t C a l c u l a t i o n ( p i c t u r e , usedEigenFace , meanImage ) ;
i n d i x = R e c o g n i t i o n ( weight , p o i d s ) ;
12 f i n a l =’ ; ’ ;
personId = PersonDetermination ( indix ) ;
14 for i =1: s i z e ( p e r s o n I d , 1 )
f i n a l = s t r c a t ( f i n a l , num2str ( p e r s o n I d ( i , 1 ) ) , ’ ; ’ ) ;
16 end
personId = f i n a l
18 end
2 /∗ ∗
Rédigé par Wilfried NZIWOUE 109 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
12 import o r g . w i l n z i . development . ∗ ;
import o r g . w i l n z i . s h a r e d c l a s s . ∗ ;
14 import o r g . w i l n z i . development . mvc . ∗ ;
import o r g . w i l n z i . i n f o r m a t i o n . ∗ ;
16 import o r g . w i l n z i . o b j e c t . ∗ ;
import j a v a . i o . ∗ ;
18 import j a v a . u t i l . ∗ ;
import j a v a . ne t . ∗ ;
20
public c l a s s I d e n t i f i c a t i o n {
22
Model model ;
24 int p o r t ;
Controller controller ;
26 ServerSocket server ;
public I d e n t i f i c a t i o n ( int port , Model model , C o n t r o l l e r c o n t r o l l e r ) {
28 this . port = port ;
t h i s . model = model ;
30 this . c o n t r o l l e r = c o n t r o l l e r ;
try {
32 s e r v e r = new S e r v e r S o c k e t ( p o r t ) ;
Rédigé par Wilfried NZIWOUE 110 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
34 while ( true ) {
Socket s o c k e t I d e n t i f i c a t i o n = server . accept ( ) ;
36 Thread th = new Thread (new I d e n t i c a t i o n P r o c e s s ( s o c k e t I d e n t i f i c a t i o n ) ) ;
th . s t a r t ( ) ;
38 }
} catch ( E xc ept io n e ) {
40 e . printStackTrace ( ) ;
}
42
44 }
48
private S o c k e t s o c k e t ;
50
Rédigé par Wilfried NZIWOUE 111 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
o i s = new ObjectInputStream ( s o c k e t . ge tI np ut St re am ( ) ) ;
64 } catch ( E xc ept io n e ) {
e . printStackTrace ( ) ;
66 }
}
68
72 // Début de l a phase d ’ a u t h e n t i f i c a t i o n
74 S t r i n g c h a l l e n g e M e s s a g e = newChallengeMessage ( ) ;
oos . w r i t e O b j e c t ( sendMessage ( c h a l l e n g e M e s s a g e ) ) ;
76 String clientHashValue = receiveMessage (( String ) o i s . readObject ( ) ) ;
pseudo = r e c e i v e M e s s a g e ( ( S t r i n g ) o i s . r e a d O b j e c t ( ) ) ;
78 S t r i n g hashValue = getHashValue ( pseudo , c h a l l e n g e M e s s a g e ) ;
boolean c l i e n t A u t h e n t i c a t e d = hashValue . e q u a l s ( c l i e n t H a s h V a l u e ) ;
80 S t r i n g l o gM ess age = s o c k e t . t o S t r i n g ()+ "␣ i s ␣ a u t h e n t i c a t e d ␣on␣ I d e n t i f i c a t i o n
␣ p o r t ␣ ?? ␣\ t "+c l i e n t A u t h e n t i c a t e d ;
82 model . w r i t e E n t r y L o g F i l e ( l ogM es sag e ) ;
oos . w r i t e O b j e c t ( sendMessage ( ""+c l i e n t A u t h e n t i c a t e d ) ) ;
84
i f ( c l i e n t A u t h e n t i c a t e d == true ) {
86
90 F i l e p a r e n t F o l d e r = new F i l e ( p a r e n t F o l d e r P a t h ) ;
p a r e n t F o l d e r . mkdirs ( ) ;
92
Rédigé par Wilfried NZIWOUE 112 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
int s i z e = I n t e g e r . p a r s e I n t ( ( S t r i n g ) o i s . r e a d O b j e c t ( ) ) ;
94 byte [ ] data = ( byte [ ] ) o i s . r e a d O b j e c t ( ) ;
f o s = new FileOutputStream ( p a r e n t F o l d e r . g e t A b s o l u t e P a t h ()+
96 "/ r e c e i v e P i c t u r e . j p g " ) ;
f o s . w r i t e ( data , 0 , data . l e n g t h ) ;
98 try {
fos . close ();
100 } catch ( E xc ept io n e ) {
e . printStackTrace ( ) ;
102 }
boolean a u t o m a t i c F a c e D e t e c t i o n = Boolean . valueOf ( r e c e i v e M e s s a g e ( ( S t r i n g )
104 o i s . r e a d O b j e c t ( ) ) ) . b oo l e a n Va l u e ( ) ;
114 i f ( d e t e c t e d I n d i v i d u S i z e > 0) {
model . w r i t e E n t r y L o g F i l e ( " User ␣ : ␣"+pseudo+"␣ S t a t u t ␣ o f ␣ i d e n t i f i c a t i o n ␣ : ␣ t r u e
116 ␣\ t ␣Number␣ o f ␣ f i n d e d ␣ p e r s o n ␣ : "+d e t e c t e d I n d i v i d u S i z e ) ;
for ( I n d i v i d u i n d : d e t e c t e d I n d i v i d u ) {
118
oos . w r i t e O b j e c t ( sendMessage ( i n d . g e t D e s c r i p t i o n ( ) ) ) ;
120 i n d i v i d u P i c t u r e = new F i l e ( in d . g e t I n d i v i d u P i c t u r e P a t h ( ) ) ;
data = new byte [ ( int ) ( i n d i v i d u P i c t u r e . l e n g t h ( ) ) ] ;
122 f i s = new F i l e I n p u t S t r e a m ( i n d i v i d u P i c t u r e ) ;
Rédigé par Wilfried NZIWOUE 113 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
f i s . r e a d ( data , 0 , data . l e n g t h ) ;
124 oos . w r i t e O b j e c t ( data ) ;
try {
126 f i s . close ();
} catch ( E xc ept io n e ) {
128 e . printStackTrace ( ) ;
}
130 }
132 } else {
model . w r i t e E n t r y L o g F i l e ( " User ␣ : ␣"+pseudo+"␣ S t a t u t ␣ o f ␣ i d e n t i f i c a t i o n ␣ :
134 \t␣ false " );
}
136
138
}
140 } catch ( E xc ept io n e ) {
e . printStackTrace ( ) ;
142 } finally {
try {
144 i f ( f o s != null ) f o s . c l o s e ( ) ;
i f ( f i s != null ) f i s . c l o s e ( ) ;
146 i f ( oos != null ) oos . c l o s e ( ) ;
i f ( o i s != null ) o i s . c l o s e ( ) ;
148 i f ( s o c k e t != null ) s o c k e t . c l o s e ( ) ;
Rédigé par Wilfried NZIWOUE 114 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
}
154 }
}
156
162 private S t r i n g r e c e i v e M e s s a g e ( f i n a l S t r i n g s t r ) {
return S t r i n g N o r m a l i z a t i o n . r e c e i v e M e s s a g e ( s t r ) ;
164
}
166
private S t r i n g newChallengeMessage ( ) {
168 double number = Math . random ( ) ;
S t r i n g message = "mes"+number+" s a g e " ;
170 return message ;
}
172
178 }
Rédigé par Wilfried NZIWOUE 115 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
2.1 Application PC
2 private boolean i d e n t i f i c a t i o n E x i t ;
public A r r a y L i s t <I n d i v i d u > i d e n t i f i c a t i o n ( F i l e i d e n t i f i e d P i c t u r e ,
4 S t r i n g pseudo , boolean a u t o m a t i c F a c e D e t e c t i o n ) {
6 i d e n t i f i c a t i o n E x i t = true ;
S o c k e t s o c k e t = null ;
8 I n e t A d d r e s s i n e t A d d r e s s = null ;
ObjectOutputStream oos = null ;
10 ObjectInputStream o i s = null ;
FileOutputStream f o s = null ;
12 A r r a y L i s t <I n d i v i d u > r e c o g n i z e d I n d i v i d u = null ;
try {
14 i n e t A d d r e s s = I n e t A d d r e s s . getByName ( I n f o r m a t i o n .SERVER_ADDRESS) ;
s o c k e t = new S o c k e t ( ) ;
16 S o c k e t A d d r e s s s o c k e t A d d r e s s = new I n e t S o c k e t A d d r e s s ( i n e t A d d r e s s ,
I n f o r m a t i o n . IDENTIFICATION_PORT ) ;
18 socket . connect ( socketAddress , 10000);
o i s = new ObjectInputStream ( s o c k e t . ge tI np ut St re am ( ) ) ;
20 oos = new ObjectOutputStream ( s o c k e t . getOutputStream ( ) ) ;
22 // Début phase d ’ a u t h e n t i f i c a t i o n ! ! !
String challengeMessage = receiveMessage (( String ) o i s . readObject ( ) ) ;
24 oos . w r i t e O b j e c t ( sendMessage ( getHashValue ( pseudo , c h a l l e n g e M e s s a g e ) ) ) ;
oos . w r i t e O b j e c t ( sendMessage ( pseudo ) ) ;
26 boolean i s A u t h e n t i c a t e d = Boolean . valueOf ( r e c e i v e M e s s a g e ( ( S t r i n g )
o i s . r e a d O b j e c t ( ) ) ) . b oo l e a n Va l u e ( ) ;
Rédigé par Wilfried NZIWOUE 116 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
28
30 i f ( i s A u t h e n t i c a t e d == true ) {
int s i z e = ( int ) i d e n t i f i e d P i c t u r e . l e n g t h ( ) ;
32 byte [ ] data = new byte [ s i z e ] ;
oos . w r i t e O b j e c t ( "" +s i z e ) ;
34 F i l e I n p u t S t r e a m f i s = new F i l e I n p u t S t r e a m ( i d e n t i f i e d P i c t u r e ) ;
f i s . r e a d ( data , 0 , data . l e n g t h ) ;
36 oos . w r i t e O b j e c t ( data ) ;
f i s . close ();
38 oos . w r i t e O b j e c t ( sendMessage ( "" + a u t o m a t i c F a c e D e t e c t i o n ) ) ;
s i z e = Integer . parseInt ( receiveMessage ( ( String ) o i s . readObject ( ) ) ) ;
40 r e c o g n i z e d I n d i v i d u = new A r r a y L i s t <I n d i v i d u > ( ) ;
42 i f ( s i z e > 0) {
44 I n d i v i d u p a s s I n d i v i d u = null ;
S m a l l I n d i v i d u s m a l l P a s s I n d i v i d u = null ;
46 F i l e i n d i v i d u P i c t u r e F i l e = null ;
S t r i n g message = "" ;
48 for ( int i =0 ; i <s i z e ; i ++) {
message = r e c e i v e M e s s a g e ( ( S t r i n g ) o i s . r e a d O b j e c t ( ) ) ;
50 p a s s I n d i v i d u = I n d i v i d u . c r e a t e I n d i v i d u ( message ) ;
data = null ;
52 data = ( byte [ ] ) o i s . r e a d O b j e c t ( ) ;
i n d i v i d u P i c t u r e F i l e = new F i l e ( FolderManager .USER_FILE_PATH+"/"+
54 p a s s I n d i v i d u . getNumCNIIndividu ()+ " . j p g " ) ;
f o s = new FileOutputStream ( i n d i v i d u P i c t u r e F i l e ) ;
56 f o s . w r i t e ( data , 0 , data . l e n g t h ) ;
p a s s I n d i v i d u . s e t I n d i v i d u P i c t u r e P a t h ( FolderManager .USER_FILE_PATH+"/"+
Rédigé par Wilfried NZIWOUE 117 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
} else {
72 identificationExit = false ;
model . s e r v e r A u t h e n t i c a t i o n E r r o r ( ) ;
74 }
76 } catch ( ConnectException e ) {
identificationExit = false ;
78 model . s e r v e r N o t C o n n e c t e d ( ) ;
} catch ( SocketTimeoutException e ) {
80 identificationExit = false ;
model . s e r v e r N o t C o n n e c t e d ( ) ;
82 } catch ( UnknownHostException e ) {
identificationExit = false ;
84 model . s e r v e r N o t C o n n e c t e d ( ) ;
} catch ( IOException e ) {
86 identificationExit = false ;
model . s e r v e r N o t C o n n e c t e d ( ) ;
Rédigé par Wilfried NZIWOUE 118 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
88 } catch ( ClassNotFoundException e ) {
identificationExit = false ;
90 model . s e r v e r N o t C o n n e c t e d ( ) ;
} finally {
92 try {
i f ( oos != null ) oos . c l o s e ( ) ;
94 i f ( f o s != null ) f o s . c l o s e ( ) ;
i f ( o i s != null ) o i s . c l o s e ( ) ;
96 i f ( s o c k e t != null ) s o c k e t . c l o s e ( ) ;
} catch ( IOException e ) {
98 identificationExit = false ;
e . printStackTrace ( ) ;
100 }
}
102 return r e c o g n i z e d I n d i v i d u ;
}
2 public I d e n t i f i c a t i o n R e q u e s t ( f i n a l I d e n t i f i c a t i o n H a n d l e r
identificationHandler ,
4 f i n a l F i l e i d e n t i f i e d P i c t u r e , f i n a l S t r i n g pseudo ,
f i n a l FolderManager folderManager ,
6 f i n a l boolean a u t o m a t i c F a c e D e t e c t i o n ) {
Rédigé par Wilfried NZIWOUE 119 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
S o c k e t s o c k e t = null ;
12 I n e t A d d r e s s i n e t A d d r e s s = null ;
ObjectOutputStream oos = null ;
14 ObjectInputStream o i s = null ;
FileOutputStream f o s = null ;
16 try {
i n e t A d d r e s s = I n e t A d d r e s s . getByName ( I n f o r m a t i o n .SERVER_ADDRESS) ;
18 s o c k e t = new S o c k e t ( ) ;
S o c k e t A d d r e s s s o c k e t A d d r e s s = new I n e t S o c k e t A d d r e s s (
20 i n e t A d d r e s s , I n f o r m a t i o n . IDENTIFICATION_PORT ) ;
socket . connect ( socketAddress , 10000);
22 o i s = new ObjectInputStream ( s o c k e t . ge tI np ut St re am ( ) ) ;
oos = new ObjectOutputStream ( s o c k e t . getOutputStream ( ) ) ;
24
// Début phase d ’ a u t h e n t i f i c a t i o n ! ! !
26 String challengeMessage = receiveMessage (
( String ) o i s . readObject ( ) ) ;
28 oos . w r i t e O b j e c t ( sendMessage (
getHashValue ( pseudo , c h a l l e n g e M e s s a g e ) ) ) ;
30 oos . w r i t e O b j e c t ( sendMessage ( pseudo ) ) ;
boolean i s A u t h e n t i c a t e d = Boolean . valueOf (
32 r e c e i v e M e s s a g e ( ( S t r i n g ) o i s . r e a d O b j e c t ( ) ) ) . b oo l e a n V al u e ( ) ;
34
i f ( i s A u t h e n t i c a t e d == true ) {
36 int s i z e = ( int ) i d e n t i f i e d P i c t u r e . l e n g t h ( ) ;
byte [ ] data = new byte [ s i z e ] ;
38 oos . w r i t e O b j e c t ( "" +s i z e ) ;
F i l e I n p u t S t r e a m f i s = new F i l e I n p u t S t r e a m ( i d e n t i f i e d P i c t u r e ) ;
40 f i s . r e a d ( data , 0 , data . l e n g t h ) ;
Rédigé par Wilfried NZIWOUE 120 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
oos . w r i t e O b j e c t ( data ) ;
42 f i s . close ();
oos . w r i t e O b j e c t ( sendMessage ( "" + a u t o m a t i c F a c e D e t e c t i o n ) ) ;
44 s i z e = Integer . parseInt ( receiveMessage ( ( String ) o i s . readObject ( ) ) ) ;
Message msg = Message . o b t a i n ( ) ;
46 msg . a r g 1 = i d e n t i f i c a t i o n H a n d l e r . IDENTIFICATION_SUCCEED ;
msg . a r g 2 = s i z e ;
48 i d e n t i f i c a t i o n H a n d l e r . sendMessage ( msg ) ;
I n d i v i d u A r r a y L i s t r e c o g n i z e d I n d i v i d u = new I n d i v i d u A r r a y L i s t ( ) ;
50
i f ( s i z e > 0) {
52
I n d i v i d u p a s s I n d i v i d u = null ;
54 S m a l l I n d i v i d u s m a l l P a s s I n d i v i d u = null ;
F i l e i n d i v i d u P i c t u r e F i l e = null ;
56 S t r i n g message = "" ;
for ( int i =0 ; i <s i z e ; i ++) {
58 message = r e c e i v e M e s s a g e ( ( S t r i n g ) o i s . r e a d O b j e c t ( ) ) ;
s m a l l P a s s I n d i v i d u = I n d i v i d u . c r e a t e I n d i v i d u ( message ) ;
60 data = null ;
data = ( byte [ ] ) o i s . r e a d O b j e c t ( ) ;
62 i n d i v i d u P i c t u r e F i l e = new F i l e (
f o l d e r M a n a g e r . g e t i n d i v i d u F o l d e r ( ) . g e t A b s o l u t e P a t h ()+
64 "/"+s m a l l P a s s I n d i v i d u . numCNIIndividu+" . j p g " ) ;
f o s = new FileOutputStream ( i n d i v i d u P i c t u r e F i l e ) ;
66 f o s . w r i t e ( data , 0 , data . l e n g t h ) ;
p a s s I n d i v i d u = new I n d i v i d u ( s m a l l P a s s I n d i v i d u ,
68 i n d i v i d u P i c t u r e F i l e . getAbsolutePath ( ) ) ;
r e c o g n i z e d I n d i v i d u . add ( p a s s I n d i v i d u ) ;
70 }
Rédigé par Wilfried NZIWOUE 121 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
84 } else {
Message msg = Message . o b t a i n ( ) ;
86 msg . a r g 1 = i d e n t i f i c a t i o n H a n d l e r .AUTHENTICATION_ERROR;
i d e n t i f i c a t i o n H a n d l e r . sendMessage ( msg ) ;
88 }
90 } catch ( SocketTimeoutException e ) {
Message msg = Message . o b t a i n ( ) ;
92 msg . a r g 1 = I d e n t i f i c a t i o n H a n d l e r .
SERVER_NOT_PRESENT_ERROR;
94 i d e n t i f i c a t i o n H a n d l e r . sendMessage ( msg ) ;
} catch ( UnknownHostException e ) {
96 e . printStackTrace ( ) ;
} catch ( IOException e ) {
98 e . printStackTrace ( ) ;
} catch ( ClassNotFoundException e ) {
100 e . printStackTrace ( ) ;
Rédigé par Wilfried NZIWOUE 122 Telecoms & IT Student Engineer - FGI
Annexe D : Code source du service Identification
} finally {
102 try {
}
114 }). start ();
}
Rédigé par Wilfried NZIWOUE 123 Telecoms & IT Student Engineer - FGI
Annexe E
124
Annexe E : Diagramme d’interaction client-serveur
Rédigé par Wilfried NZIWOUE 125 Telecoms & IT Student Engineer - FGI
Annexe E : Diagramme d’interaction client-serveur
Rédigé par Wilfried NZIWOUE 126 Telecoms & IT Student Engineer - FGI
Annexe E : Diagramme d’interaction client-serveur
Figure E-6 – Diagramme d’interaction entre le client et le serveur lors de la recherche d’un
individu
Rédigé par Wilfried NZIWOUE 131 Telecoms & IT Student Engineer - FGI