Documente Academic
Documente Profesional
Documente Cultură
Réalisé Par :
Al Falou Wassim
Sous la Direction de :
Dr. El-Eter Bassam
Décembre 1998
Page 1
Remerciements
Je tiens à remercier Dr. Bassam El-Eter pour son support et ses conseils
rédaction de ce rapport.
Mon merci va aussi à Dr. Dennis Hamad, Dr. Noël Bonnet, et à tous les
Enfin, je tiens à remercier M. Mouhamad Obeid qui m'a permis d’utiliser son
scanner.
Page 2
Introduction
Les ordinateurs séquentiels sont très performants pour les calculs, ils peuvent
exécuter des opérations complexes plus vite que le cerveau humain. En
reconnaissance de forme, ce dernier est capable d’analyser une scène très complexe
instantanément, alors que le meilleur des algorithmes de reconnaissance de forme ne
pourrait reconnaître que des formes relativement simples.
Les caractéristiques des problèmes qui se prêtent bien à une résolution par les
réseaux de neurones sont des problèmes pour lesquels les règles qui permettent de les
résoudre sont inconnues ou très difficiles à expliciter ou à formaliser. Il faut alors
disposer d’un ensemble de données représentatives du problème étudié (dans notre cas
ces exemples sont constitués de plusieurs caractères écrits par des personnes
différentes).
Elnagar et al. [2] utilisent un réseau de neurones dont les entrées sont définies
par des attributs structurels pour la reconnaissance des chiffres arabes. Le taux de
réussite est de 94 %.
Page 3
Young-Sup et al. [3] mettent en œuvre un réseau de neurone RBF (Radial
Basis Function) pour la reconnaissance de chiffres arabes manuscrits. Le taux de
réussite atteint par cette méthode est de 97% avec une base d’apprentissage de 4000
exemples (400 exemples de chaque chiffre).
Page 4
Chapitre 1
2 Les applications
La reconnaissance de l’écriture est mieux connue sous le nom d’OCR (Optical
Character Recognition), du fait de l’emploi de procédés d’acquisition optiques.
L’OCR connaît plusieurs applications pratiques dans plusieurs domaines d’activité
parmi lesquels on peut citer :
Page 5
3 Les différents aspects de l’OCR
Il n’existe pas de système universel d’OCR mais plutôt des voies d’approches
dépendant du type de données traitées et bien sûr de l’application visée. Nous allons
donner, dans la suite, quelques caractéristiques des systèmes d’OCR.
Page 6
reconnaissance de ne pas empiéter sur la saisie. La réponse en continue du système
permet à l’usager de corriger et de modifier son écriture de manière directe et
instantanée. La reconnaissance hors ligne ou en différé démarre après l’acquisition du
document en entier. Ce type de reconnaissance convient pour les documents imprimés
et les manuscrits déjà rédigés. Ce mode permet l’acquisition instantanée d’un nombre
important de caractères, mais impose d’effectuer des prétraitements coûteux pour
retrouver l’ordre de la lecture.
4 Saisie de l’écriture
La première étape d’un système OCR consiste à digitaliser l’écriture et à la
présenter au système sous une forme lisible avec un minimum de dégradation
possible. Cette tâche est relativement difficile à cause de la diversité des formats et de
la qualité de l’écriture et du papier. Le capteur utilisé peut ne pas être sensible aux
variations des tons et à l’épaisseur des traits, ce qui occasionne des dégradations très
perceptibles du dessin des caractères. Deux modes de saisie sont utilisés : le mode
statique pour les caractères déjà écrits et le mode dynamique pour les caractères
manuscrits à reconnaître en cours d’écriture.
Page 7
5 Reconnaissance de caractères
Il s’agit ici de caractères isolés. Le schéma de reconnaissance de caractères
passe par les étapes classiques de traitement, à savoir le prétraitement, l’analyse,
l’apprentissage et la reconnaissance.
5.1.1 Lissage
La taille d’un caractère peut varier d’une écriture à l’autre, ce qui peut causer
une instabilité des paramètres. Une technique naturelle de prétraitement consiste à
ramener les caractères à la même taille. L’algorithme de normalisation que nous avons
utilisé est très simple et il est présenté dans le chapitre 3 de ce rapport.
5.1.3 Amincissement
Page 8
Le principe de base de cette méthode est fondé sur l’examen d’un certain
nombre de pixels dans l’image du caractère et l’étude de leur appartenance à la forme.
Une forme est reconnue si l’ensemble de ses pixels sont présents. Plusieurs méthodes
de reconnaissance se sont inspirées de cette idée pour construire des modèles de
caractères à partir d’emplacements géométriquement caractéristiques de pixels. La
reconnaissance se fait par calcul de corrélation. Cependant, à cause de la rigidité et de
manque de robustesse de ces modèles (conçus à partir d’emplacements fixes de
pixels), ce procédé a connu quelques limites pour le manuscrit.
5.3 L’apprentissage
Il s’agit, lors de cette étape, d’apprendre au système les propriétés pertinentes
des caractères du vocabulaire utilisé. L’idéal serait de lui apprendre autant
d’échantillons que de formes d’écriture différentes, mais cela est impossible à cause
de la trop grande variabilité de l’écriture qui conduirait à une combinatoire explosive
des modèles de représentation. La tendance consiste alors à remplacer le nombre par
une meilleure qualité des traits caractéristiques et de bonnes séparatrices des classes
d’apprentissage.
Page 9
5.3.2 L’apprentissage automatique
6 Conclusion
Nous avons présenté dans ce chapitre les différents problèmes à résoudre dans
un système de reconnaissance de l’écriture, ainsi que les techniques pouvant être
utilisées. Il s’agit premièrement d’obtenir une base de données comportant des
exemples de chaque caractère, puis de passer par une phase de prétraitement qui
comporte une normalisation de chaques caractère, puis une extraction des attributs. La
troisième phase est celle de la classification. Dans notre projet, nous avons utilisé les
réseaux de neurones pour classifier les caractères. Dans les chapitres suivants nous
présentons les réseaux des neurones et nous détaillons encore plus les différents
algorithmes de prétraitement que nous avons utilisés.
Page 10
Chapitre 2
Les réseaux des neurones
1 Introduction
Pour tout promeneur quelque peu attentif à son environnement, la nature est
source d’inspiration. Le tissage d’une toile d’araignée, la construction d’une
fourmilière, le chant d’un rossignol, sont autant de comportements naturels auxquels
nous ne prêtons qu’une modeste attention. Or, les capacités de traitement de
l’information manifestées par les êtres vivants, même les plus simples, sont
actuellement hors de portée des systèmes informatiques traditionnels : un ordinateur
ne sait pas ″voir″, ″entendre″ ou ″reconnaître des odeurs″. Contrôler le vol d’un avion
par ordinateur requiert des développements de programmes très complexes et très
coûteux. Une mouche en fait autant, et contrôle son vol grâce à un volume cérébral
microscopique.
Les systèmes experts dont les premières applications sont apparues au début
des années 80, ont tenté de résoudre ce genre de problèmes dans lesquels l’expertise
humaine est très importante et où des connaissances incertaines peuvent être
manipulées. Ces systèmes ont très vite trouvé leurs limitations à cause de leur forte
dépendance du domaine étudié et de leur inadaptation aux applications dans lesquelles
il est très difficile d’exprimer l’expertise humaine sous forme de règles de production.
Allez par exemple savoir comment fait un humain pour distinguer la lettre A de la
lettre B oubien encore savoir comment l’oreille distingue les différentes tonalités lors
de la reconnaissance de la parole !
Une approche par réseaux de neurones permet d’esquisser des réponses à ces
problèmes, en réduisant beaucoup le temps consacré par des ingénieurs à leur analyse.
Page 11
Nous aborderons dans ce chapitre un résumé sur les réseaux de neurones et
surtout les modèles des réseaux que nous utilisons dans notre application.
2 Notion de base
2.1 Le neurone biologique
Corps cellulaire
Axone
Dendrites Synapse
Le neurone est une cellule vivante, qui peut prendre des formes variables. Il contient :
• Un corps cellulaire, qui joue le rôle d’un sommateur à seuil. Il effectue une
sommation des influx nerveux par ses dendrites ; si la somme est supérieure
à un seuil donné, le neurone répond par un flux nerveux ou potentiel
d’action qui se propage le long de son axone ; si la somme est inférieure au
seuil, il reste inactif.
Page 12
Le type d’assemblage des neurones définit ce qu’on appelle l’architecture du
réseau de neurones.
2.3 L’apprentissage
L’apprentissage est le phénomène la plus intéressante d’un système nerveux
biologique. On appelle apprentissage le processus d’acquisition de connaissances sur
l’environnement. Le psychologue Hebb décrit un mécanisme «physique » de
l’apprentissage des synapses. La règle qu’il a donnée peut être énoncée de la manière
suivante : lorsqu’un axone d’une cellule A est suffisamment proche pour exciter une
cellule B et prend alors au déclenchement de B d’une manière répétée et persistante,
alors un processus de changement métabolique prend place de telle sorte que
l’efficacité de A sur le déclenchement de B est renforcée.
Une modélisation d’un système nerveux biologique passe donc par trois étapes :
x1
w1
wd Y
xd
Σ f
wD θ
xD
D
v = ∑ wi × xi +θ
i =1
Le neurone reçoit les entrées x1, x2, …, xD et calcule le potentiel v en sommant les
entrées pondérées:
Une décision est ensuite prise pour calculer la sortie s en fonction du seuil θ :
si v > θ, alors Y = +1
Sinon Y = -1.
Page 14
et Y = f(v).
ω0 = θ
wd Y
xd
Σ f
T
V=W X
wD
xD
1 si v ≥ 0 D
• Fonction seuil : f(v) = avec v = ∑ w i × x i .
0 sin on i =0
1
• Fonction sigmoïde : f ( v) = .
1 + e −v
Page 15
La figure suivante illustre trois classes d’objets où chacune d’elle est linéairement
séparable des deux autres.
Classe 1
1
2
Classe 2
Classe
3
• Réseaux multicouches
Page 16
Notons que le nombre de couches et le nombre de neurones par couche dépend
principalement du problème étudié et des résultats de l’expérimentation sur
différentes combinaisons des valeurs de ces paramètres..
Les réseaux de neurones à une seule couche sont limités par le fait qu’il ne peut
pas séparer des classes non linéairement séparables.
La figure suivante illustre deux classes d’objets non linéairement séparables qui
peuvent être séparées par l’association de trois hyperplans.
Classe 1
2
Foction de
Classe 2
séparation
3
Avant le traitement des données nous avons donc à effectuer le choix des objets, la
définition des attributs caractérisant les objets et la construction de la base
d’apprentissage. A la fin de cette phase on obtient un tableau de nombres à deux
entrées : les données et les attributs les caractérisant.
L’apprentissage consiste à présenter séquentiellement les exemples et à modifier
les poids synaptiques selon une équation dite équation d’apprentissage.
Page 17
4 Apprentissage et généralisation
4.1 Position d’un problème de classification par réseau de neurones
La conception d’un système de classification, qu’il soit un système de
reconnaissance de formes conventionnel ou un réseau de neurones artificiels,
nécessite les étapes suivantes :
Acquisition des données
Le choix des données initiales est très délicat car il conditionne en grande
partie l’efficacité des performances du réseau de neurones. L’acquisition des données
permet de convertir les données de leurs formes physiques (son, image, etc.) en une
forme acceptable par l’ordinateur.
Prétraitement
Il consiste à localiser, segmenter et normaliser les représentations. Par
exemple pour une image (en occurrence l’image d’un caractère), on cherchera à
supprimer le bruit et à augmenter le contraste.
Le choix des attributs
Le choix d’un vecteur d’attributs pour caractériser un objet peut se révéler
délicat. En effet, il faut faire un compromis entre la dimension du vecteur et le
contenu des informations. Un vecteur de taille trop petite conduirait à de mauvaises
performances du réseau de neurones.
Avant le traitement des données nous avons donc à effectuer le choix des
objets, la définition des attributs caractérisant les objets et la construction de la base
d’apprentissage. A la fin de cette phase on obtient un tableau de nombres à deux
entrées : les données et les attributs les caractérisant.
Les données
X1 X2 … Xd … XD
1 x11 x12 … x1d … x1D
2 x21 x22 … x2d … x2D
… … … … …
Les attributs xn1 xn2 … xnd … xnD
n
… … … … … … …
xN1 xN2 … xNd … xND
N
A la fin de ces étapes on obtient une base de connaissance qui sert comme une
base d’apprentissage.
La décision
Page 18
Ayant une nouvelle observation, il s’agit de décider à quelle classe l’affecter.
Pour que le système soit performant, il faut qu’il se comporte bien sur une base de
données autre que sa base d’apprentissage, cette base s’appelle la base de
généralisation.
4.2 Apprentissage
Comme nous l’avons précédemment dit, l’apprentissage est l’étape essentielle
dans un réseau de neurones (comme le recueil de l’expertise l’est pour un système
expert). Lors de l’apprentissage on cherche à minimiser une erreur, sur la base
d’apprentissage, entre la sortie fournie et la sortie désirée. On espère ainsi minimiser
une erreur sur un ensemble de généralisation, c’est à dire un ensemble de données
inconnues du réseau. On peut arrêter l’apprentissage :
5 Le Perceptron
5.1 Introduction
Le perceptron sert comme UN classificateur linéaire entre deux classes
exclusives C1 et C2.
Page 19
5.2 Architecture du Perceptron
x0 = 1
ω0 = θ
wd Y
xd
Σ f
T
V=W X
wD
xD
Tn = +1 si Xn appartient à la classe C1
Tn = 0 si Xn appartient à la classe C2
y = f(v)
1
f est la fonction sigmoïde définie par : f ( v) = .
1 + e −v
Page 20
La fonction de coût partiel est : En = (Tn – yn)2.
On a :
∂E n ∂E n ∂y ∂v
= . . .
∂w d ∂y ∂v ∂w d
Or :
∂E n
= −(Tn − y n )
∂y
et
′
∂y 1
= = y.(1 − y)
∂v 1 + e − v
et
∂v
= xd .
∂w d
5.5 L’algorithme
1- Prendre t=0; fixer µ (entre 0 et 1) et W(t=0) (vecteur aléatoire entre 0 et 1); n=1
2- Prendre Xn (N attributs du n-ième couple).
3- Calculer V = W T ( t ).X
n
4- Calculer y = f(V)
Page 21
5- Calculer W(t + 1) = W(t) + µ(t).(Tn - y).f ' (V).X n
6- Faire n = n+1 ; t = t+1. Si N=n aller à 7 sinon aller à 2.
7- Si critère d’arrêt est vrai Stop, sinon (n=1, aller à 2).
6 Réseaux multicouches
6.1 Introduction
Le perceptron permet de traiter des problèmes simples où les classes sont
linéairement séparables. Pour résoudre un problème de classification entre plusieurs
classes non linéairement séparables, on utilise donc des réseaux multicouches. Il
n’existe pas de forme spécifique représentative des réseaux de neurones multicouches
en dehors du fait qu’ils possèdent plusieurs couches internes. En particulier le nombre
de couches et le nombre de cellules par couche cachées dépend principalement du
problème étudié.
6.2Architecture
Page 22
tous les poids du réseau. Cette technique s’appelle la rétro-propagation du gradient de
l’erreur.
1
sh = f(uh) = −u h
.
1+ e
1
yk = f(vk) = − vk
.
1+ e
1
En = ∑
2 k
(Tnk − y nk ) 2
On a donc :
∂E n ∂E n ∂y k ∂v k
= . . = −(Tnk − y nk ).y k .(1 − y k ).s
∂Wk ∂y k ∂v k ∂Wk
∂E n ∂E ∂y ∂v ∂s ∂u
= ∑ n . k . k . h . h = ∑ − (Tnk − y k ). y k .(1 − y k ).wkh .s h .(1 − s h ). X
∂Wh k ∂y k ∂v k ∂s h ∂u h ∂Wh k
∂E n
Wk ( t + 1) = Wk ( t ) − µ( t ).( ).
∂Wk
Page 23
∂E n
Wh ( t + 1) = Wh ( t ) − µ( t ).( )
∂Wh
Notons que :
6.5 Algorithme
1- Prendre t=0; fixer γ, wk0(0),wkh(0),wh0(0),whd(0).
2- Sélectionner un exemple (Xn,Tn) de la base d’apprentissage.
3- Propagation avant :
d =D
s h = f( ∑ w hd * x d )
d =0
h =H
y k = f( ∑ w kh * s h )
h =0
4- Apprentissage par Retro-propagation :
Page 24
Chapitre 3
Reconnaissance de chiffres indiens et arabes :
Travail réalisé
1 Introduction
Le présent chapitre présente les différents algorithmes et méthodes mis en
oeuvre lors de la réalisation de ce projet. Pour réaliser un système de reconnaissance
de chiffres indiens, on passe par les étapes illustrées sur la figure suivante.
Prétraitement Classification
Aquisition
- Acquisition des chiffres par un logiciel graphique (Paintbrush) sous forme d’images
binaires.
- Acquisition des chiffres à l’aide d’un Scanner (pour des applications en mode
statique ou off-line).
- Acquisition des chiffres par une caméra vidéo (pour des applications en temps réel).
Page 25
- Un algorithme de normalisation de la taille de l’image.
- Un algorithme d’extraction des attributs.
- L’algorithme de fonctionnement d’un perceptron pour reconnaître les
chiffres 0 et 1.
- Un algorithme de fonctionnement d’un réseau multicouches (pour la
reconnaissance des chiffres entre 0 et 9 en arabe et en indien).
Les fonctions en C (et en Matlab) qui réalisent ces algorithmes (voir Annexe B) sont :
Page 26
Chaque point (i, j) d’une image digitale s’appelle pixel. Les caractéristiques d’une
image digitale sont :
Une image sur l’ordinateur peut donc être représentée sur l’ordinateur par un
tableau 2-D x(i, j).
Dans le cas d’une image monochrome, chaque x(i, j) prend deux valeurs : 0 pour
blanc, 1 pour noir. L’espace mémoire nécessaire pour cette image (appelée aussi
image binaire) est donc : NC×NL bits.
Dans le cas d’une image en niveau de gris, x(i, j) prend les valeurs entre 0 (pour
blanc) et 255 (pour noir). Les autres valeurs représentent toutes les couleurs grises.
L’espace mémoire nécessaire pour cette image est donc : NC×NL octets.
On peut stocker les images digitales dans des fichiers sous différents formats,
parmi lesquels on peut citer les formats BMP, GIF, …etc.
Dans notre projet nous écrivons une fonction C imreadbmp qui lit une image
binaire dans un tableau 2-D.
Les descripteurs d’image sont des paramètres (attributs) qui caractérisent les
propriétés de l’image. Au lieu de caractériser une image par ses pixels (10000
données dans le cas d’une image 100× ×100), on peut réduire ces données en
caractérisant l’image par ces descripteurs.
Différents descripteurs d’image existent, parmi lesquels on peut citer :
Page 27
Les moments géométriques sont :
µ pq
µ 'pq =
p q
µ00 × ( + + 1)
2 2
µ pq = ∑∑ (i p - IG) × (jq - JG) × I(i, j)
i j
IG = ∑∑ i × I(i, j)
i j
JG = ∑∑ j × I(i, j)
i j
4 Acquisition de l’image
Nous faisons l’acquisition de l’image par l’une des deux méthodes suivantes :
Dans le premier cas nous écrivons pour chaque chiffre 20 exemples, donc nous
avons un total de 20×10 exemples. Chaque image d’un chiffre a une taille de 100×100
pixels.
Ces exemples se trouvent pour les chiffres hindi dans le répertoire ″aimibase ″.
Le répertoire aimibase contient les sous répertoires 0,1,2,3,4,5,6,7,8,9. Dans chacun
de ces sous répertoires, on trouve les 20 exemples d’un chiffre (par exemple 0
contient les 20 exemples 01 à 020. De même pour les chiffres arabes le répertoire est
″imbase ″.
Dans le second cas, nous écrivons les exemples sur du papier blanc, et à l’aide
d’un scanner nous obtenons des images binaires de format BMP. Les images obtenues
ont une taille de 100×100 et de résolution 500 dpi. L’Annexe A contient ces
exemples.
5 Prétraitement
Dans le prétraitement on passe par les étapes suivantes :
2- Normalisation.
4- Centrage.
Page 28
5- Extraction des attributs (c.à.d. des descripteurs de caractère).
5.1 Normalisation
La taille d’un caractère peut varier d’une écriture à l’autre, ce qui peut causer
une instabilité des paramètres (descripteurs de ce caractère). Une technique naturelle
de prétraitement consiste à ramener les caractères à la même taille.
Nous donnons dans ce paragraphe un algorithme de normalisation de la taille.
Si (i, j) est un pixel dans l’image finale (de taille N*M), le pixel correspondant
dans l’image source (de taille (N1*M1) ) est ([ (i*N1)/N ], [ (j*M1)/M ].
L’algorithme de variation de taille est donc :
Page 29
Dans notre projet on cherche la dimension d’un caractère et on la normalise à
Reso*Reso ( Reso = 100 dans le cas de la base acquise par Paintbrush, Reso = 25 dans
le cas de la base acquise par scanner).
Notons que l’image résultante de cette technique de normalisation amène à
une image trop épaisse. Il faut donc une phase d’amincissement pour obtenir une
image d’épaisseur uniforme entre toutes les images de la base d’apprentissage et pour
celles des nouvelles observations.
Voici un exemple de la normalisation (variation de la taille + amincissement)
d’un caractère.
5.2 Centrage
Puisqu’un chiffre peut être de différentes tailles, rien ne l’empêche d’être
positionné n’importe où dans la fenêtre qui lui est consacrée, comme le montre la
figure ci-après :
Pour des raisons d’homogénéité entre la base d’apprentissage et les images des
chiffres que le réseau aura à reconnaître, il est nécessaire de ramener le chiffre au
centre du carré. Les descripteurs de l’image de ce chiffre seront ainsi indépendants par
translation (c.à.d. indépendants de la position du chiffre dans la figure). Voici une
méthode de centrage d’un objet.
Page 30
Premièrement on cherche le carré dans lequel on peut mettre l’objet, c.à.d. on
trouve Imin, Imax, Jmin, Jmax. On calcul alors le centre du carré (xc, yc), et enfin on
fait une translation de l’image de manière que le centre (xc, yc) soit au centre de la
fenêtre, c.à.d. on fait translater l’objet des valeurs :
Re so − 1
Tx = ([ ] désigne la partie entière)
2 − xc
Re so − 1
Ty =
2 − yc
Jmin = Reso-1 ;
Jmax = 0 ;
Imax =Reso-1 ;
Imin = 0 ;
2- pour i = 0 à Reso-1
pour j = 1 à Reso-1
si (x(i,j) = 1) alors
si (j<Jmin) alors Jmin = j;
si (j>Jmax) alors Jmax = j;
si (i<Imin) alors Imin = i;
si (j>Imax) alors Jmax = i;
finsi
finpour
Page 31
finpour
// centre de l’objet
yc = [(Imin+Imax)/2] ;
xc = [(Jmin+Jmax)/2] ;
(pas de translation)
Tx = [(Reso-1)/(2 –xc)]
Ty = [(Reso-1)/(2 –yc)]
pour i = 0 à Reso-1
pour j = 1 à Reso-1
si (x(i,j) = 1) alors
a(i+Ty,j+Tx) = x(i,j)
finsi
finpour
finpour
Les caractères acquis sont d’une épaisseur variable, ce qui peut produire des
instabilités dans les paramètres caractérisant un objet (chiffre par exemple). Il est donc
nécessaire de rendre le caractère d’épaisseur 1 (c.à.d. un pixel) avant d’extraire ses
attributs. Cette technique constitue l’étape d’amincissement du caractère.
Les deux critères retenus pour les méthodes d’amincissement sont les
suivants :
1ère étape :
Dans la première étape, chaque point p1 de l’objet sera mis à 0 (c.à.d. effacé) si les
quatre conditions suivantes sont satisfaites :
Page 32
a- 2 ≤ N(p1) ≤ 6 ;
b- S(p1) = 1 ;
c- p2.p4.p6 = 0 ;
d- p4.p6.p8 = 0 ;
p9 p2 p3
P8 P1 p4
p7 P6 P
5
Si p1 est d’indice (i, j), alors p9 est d’indice (i-1, j-1), p8 d’indice (i-1, j), p3 d’indice (i-
1, j+1), p8 d’indice (i, j-1), p4 d’indice (i, j+1), p7 d’indice (i+1, j-1), p6 d’indice (i+1,
j),et p5 d’indice (i+1, j+1).
2ème étape :
a1- 2 ≤ N(p1) ≤ 6 ;
b1- S(p1) = 1 ;
c1- p2.p4.p8 = 0;
d1- p2.p6.p8 = 0 ;
Page 33
3- appliquer l’étape 2 à l’image obtenue suite à l’étape 1.
5- effacer tout point vérifiant les 4 conditions a1, b1, c1, d1.
Page 34
si a(i+1,j)=0 et a(i+1,j-1)=1 alors S=S+1 finsi
si a(i+1,j-1)=0 et a(i,j-1)=1 alors S=S+1 finsi
si a(i,j-1)=0 et a(i-1,j-1)=1 alors S=S+1 finsi
si a(i-1,j-1)=0 et a(i-1,j)=1 alors S=S+1 finsi
finsi
si NN ≥ 2 et NN ≤ 6 et S = 1
et a(i-1,j)*a(i,j+1)*a(i+1,j)=0 et a(i,j+1)*a(i+1,j)*a(i,j-1)=0
alors
b(i,j) = 0
finsi
finpour
fnipour
(test de changement de l’image)
cond = true ;
pour i = 1 à Reso
pour j = 1à Reso
si x(i,j) ≠ b(i,j) alors cond = false finsi
finpour
finpour
fintantque
Page 35
Soit I la matrice intensité de l’image.
µ pq
µ 'pq =
p q
µ00 × ( + + 1)
2 2
µ pq = ∑∑ (i p - IG) × (jq - JG) × I(i, j)
i j
IG = ∑∑ i × I(i, j)
i j
JG = ∑∑ j × I(i, j)
i j
La fonction C que nous avons développée pour le calcul des {n} premiers moments
est la suivante:
y est une image de type matimage (c.à.d. c’est une matrice Reso*Reso)
Il faut noter que le choix du nombre d’attributs ({n} dans notre exemple) a été fixé
après expérience.
6 Classification
Nous avons effectué la classification de caractères à l’aide d’un réseau de
neurones multicouches (voir chapitre 2). Nous présentons dans ce paragraphe les
fonctions C et Matlab que nous avons réalisé pour effectuer l’apprentissage d’un
réseau de neurones, et celles pour la classification d’un un nouvel exemple.
La fonction C que nous avons réalisé pour simuler l’apprentissage d’un réseau
de neurones multicouches en utilisant l’algorithme de retro-propagation de gradient
est la suivante :
void wmulc( vectwk0 wk0, matwkh wkh, vectwh0 wh0, matwhd whd, matbase xx,
int Iter, int K, int D, int N)
wk0 est le vecteur poids de connexion couche cachée - couche de sortie du neurone 0
de dimension K
wkh est la matrice poids de connexion couche cachée - couche de sortie du neurone h
de dimension K×H
wh0 est le vecteur poids de connexion couche d’entrée - couche cachée du neurone 0
de dimension H
whd est la matrice poids de connexion couche d’entrée - couche cachée du neurone d
de dimension H×D
xx est la matrice de la base d’apprentissage (c.à.d. de couple (Xn,Tn). Cette matrice est
de dimension N*(D+1)
Page 37
Iter est le nombre de cycles d’apprentissage
K est le nombre de classe (10 dans l’exemple des chiffres)
D est le nombre de d’entrées ({n} attributs).
N est le nombre d’exemples dans la base d’apprentissage.
6.2 L’apprentissage
La fonction manu utilise la fonction wmulc pour calculer les poids de
connexions wk0, wkh, wh0, whd. Il enregistre alors ces poids dans des fichiers, pour
être utilisés dans la decision (fonction wmulcd).
Page 38
et ainsi de suite jusqu’à rencontrer une colonne vide. On continue le balayage jusqu’à
rencontrer une colonne non vide ; alors on donne au pixel de cette colonne le label 2 ;
si la colonne suivante est aussi non vide on donne au pixel de cette colonne aussi le
label 2, et ainsi de suite jusqu’à rencontrer une colonne vide ; et on applique cette
procédure jusqu’à arriver à finir le balayage vertical de l’image. On aura ainsi donnée
un label à chaque chiffre de l’image.
Label = 0
2- pour j = 0 à xdim –1
cond1 = 0 ;
pour i = 0 à ydim –1
si aa(i,j) = 1 alors
x(i,j) = label ;
finsi
finpour
cond2 =0 ;
pour i = 0 à ydim –1
si aa(i,j+1) = 1 alors
finsi
finpour
finpour
Page 39
La fonction C correspondante est la suivante :
2- pour i = 0 à ydim -1
pour j = 0 à xdim –1
Page 40
On utilise pour cela la fonction wpretr puis la fonction squ puis la fonction wattr.
4- Classification de chaque chiffre par la fonction wmulcd (on utilise les poids de
connexion calculés par la fonction manu).
5- On répète l’étape 3- et 4- pour finir la classification de tous les chiffres.
Ce sont les étapes utilisées donc pour réaliser la reconnaissance d’une série de
chiffres.
Nous avons aussi réalisé une version de cette fonction sous Matlab.
Page 41
Chapitre 4
Résultats et étude de l’influence des
paramètres sur la performance du système
1 Introduction
Dans ce chapitre nous présentons les résultats des différents algorithmes de
prétraitement, ainsi que les influences des paramètres sur la performance du système
de reconnaissance de chiffres (c.à.d sur l’erreur commise lors de la décision). Ces
paramètres sont :
On voit bien que cet algorithme amène le chiffre (voir figure gauche) au centre de
la figure (voir figure droite).
Page 42
Ces figures montrent l’application de l’algorithme d’amincissement sur des
exemples de la base d’apprentissage.
Page 43
Voici des exemples de résultats de prétraitement global :
Pour une base d’apprentissage de 100 exemples (10 exemples pour chaque
chiffre) nous arrivons à un taux d’erreur de 17% sur la base d’apprentissage, et de
34% sur la base de test (généralisation).
Pour une base d’apprentissage de 200 exemples (20 exemples pour chaque
chiffre) nous arrivons à un taux d’erreur de 15.5% sur la base d’apprentissage, et de
28% sur la base de test (généralisation).
Page 44
Pour une base d’apprentissage de 100 exemples (10 exemples pour chaque
chiffre) nous arrivons à un taux d’erreur de 17% sur la base d’apprentissage, et de
44% sur la base de test (généralisation).
Pour une base d’apprentissage de 300 exemples (30 exemples pour chaque
chiffre) nous arrivons à un taux d’erreur de 16% sur la base d’apprentissage, et de
36% sur la base de test (généralisation).
70
% des exemples mals classés
60
50
40 Erreur
d'apprentissage
30
Erreur de
20
généralisation
10
0
0 10000 20000 30000 40000
Nombre d'itérations
Page 45
Une itération consiste à passer par tous les exemples de la base
d’apprentissage une seule fois. On observe que le taux d’erreur sur la base
d’apprentissage diminue toujours lorsque le nombre d’itérations augmente.
Sur la base de généralisation (base de test) ce taux passe par un minimum puis
augmente à nouveau, donc il faut arrêter l’apprentissage à un certain nombre
d’itérations déterminé expérimentalement (8000 dans le tableau ci-dessus). Ce
phénomène s’appelle apprentissage par cœur, c.à.d le réseau apprend bien les
exemples de la base d’apprentissage, et ne décide pas bien sur la base de test.
1 85 86
2 25 26
3 10 12
4 9 12
5 8 9
6 8 8
8 8 8
13 6 8
4 Performances temporelles
Il nous a semblé intéressant d’évaluer les performances temporelles de notre
système. Les mesures de temps d’exécution que nous avons effectuées excluent les
temps d’accès disque qui ne se feront pas lorsque le système opérera en situation
réelle.
Page 46
Pour la phase d’apprentissage, le temps approximatif est de 10 minutes pour
une base de 300 exemples et 8000 itérations. Ce temps ne nous intéresse pas trop car
l’apprentissage du réseau se fait une seule fois en mode off-line.
Par contre, ce qui nous intéresse vraiment, c’est le temps de décision pour de
nouveaux exemples. Pour une base de test de 500 exemples (hindi), le système met
environ 2′45″ pour classifier tous les exemples de cette base. Ce qui donne un temps
de classification (y compris le temps de prétraitement de l’image) d’environ 300 milli-
secondes par caractère.
Notons que les images représentant les caractères ont été scanées en mode 500
dpi (500 points par inch), et sauvegardées en format BMP avec une taille de 100×100.
En réalité, pour un caractère de taille normale, la taille est de 12 points et une
résolution de 100 dpi suffit.. C’est-à-dire qu’il suffit de stocker le caractère dans une
image BMP 12×12 et le nombre de points non blancs sera nettement inférieure à ce
que nous avons à présent. Ce qui donnera un temps de reconnaissance total de 7 milli-
secondes par caractère. C’est-à-dire que pour une page d’un document contenant
1500 caractères, la reconnaissance de toute la page prendra environ 10 secondes,
auquel il faut ajouter le temps de séparation des lignes et des mots.
5 Conclusion
Nous trouvons que notre système donne de bonnes performances : dans le cas de
chiffres hindi acquis par un scanner, une moyenne de 72% de bonnes décisions sur
une base de test avec une petite base d’apprentissage, et 64% de bonnes décisions
dans le cas de chiffres arabes acquis par un scanner. Nous estimons que c’est une
bonne performance car notre base d’apprentissage est vraiment trop petite par rapport
à ce qu’elle devrait être (de l’ordre de 5000 exemples au lieu de 300).
Malheureusement, nous n’avons pas eu le temps de saisir par scanner suffisamment
d’exemples pour élargir la base d’apprentissage et la base de test. Ceci est causé par la
difficulté et le grand temps nécessaire pour scanner les images contenant plusieurs
chiffres et extraire les chiffres un par un pour les sauver dans des images différentes.
Ce travail se fait actuellement, mais nous ne sommes pas encore en mesure d’énoncer
les résultats pour une grande base d’apprentissage.
Page 47
Annexe A : Exemples de quelques chiffres acquis par un
scanner
Page 48
Annexe B : Code de programme
// programme réalisé par wassim al falou
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <string.h>
const NN=3000;
const DD=13;
const KK=10;
const HH=11;
const Res=100;
const xdim=500;
const ydim=100;
void squellete(matimage,int);
void squ(matimage,int);
void app(int&);
void imreadbmp(matim,int&,int&,int&);
Page 49
void extract(matimage,matim,int,int,int);
void wattr(matimage,vectattr,int);
void decider();
void centrage(matimage,matimage,int);
void imread(matimage,int);
void wpretr(matimage,matimage,int);
// fonction d'apprentissage
int n,d,k,h,t=0;
int H;
H=int((D+K)/2);
matbase Base;
double xmin[DD];
for (d=0;d<DD;d++)
xmin[d]=0;
double xmax[DD];
for (d=0;d<DD;d++)
xmax[d]=0;
for (d=0;d<D;d++)
xmin[d]=xx[0][d];
for (n=0;n<N;n++)
Page 50
if (xx[n][d]<xmin[d]) xmin[d]=xx[n][d];
};
for (d=0;d<D;d++)
xmax[d]=xx[0][d];
for (n=0;n<N;n++)
if (xx[n][d]>xmax[d]) xmax[d]=xx[n][d];
};
for (d=0;d<D;d++)
for (n=0;n<N;n++)
Base[n][d]=(xx[n][d]-xmin[d])/(xmax[d]-xmin[d]);
int Target[NN][KK];
for (n=0;n<NN;n++)
for (k=0;k<KK;k++)
Target[n][k]=0;
for (n=0;n<N;n++)
Target[n][(int)xx[n][D]]=1;
for (k=0;k<K;k++)
wk0[k]=rand()/rmax;
for (k=0;k<K;k++)
for (h=0;h<H;h++)
wkh[k][h]=(rand()/rmax)-0.5;
for (h=0;h<H;h++)
wh0[h]=rand()/rmax;
Page 51
srand( (unsigned)time( NULL ) );
for (h=0;h<H;h++)
for (d=0;d<D;d++)
whd[h][d]=(rand()/rmax)-0.5;
while (t<Iter)
double x[DD];
for (n=0;n<N;n++)
for (d=0;d<D;d++)
x[d]=Base[n][d];
//propagation avant
double s[HH];
for (h=0;h<H;h++)
s[h]=wh0[h];
for (d=0;d<D;d++)
s[h]=s[h]+whd[h][d]*x[d];
s[h]=1/(1+exp(-s[h]));
double y[KK];
for (k=0;k<K;k++)
y[k]=wk0[k];
for (h=0;h<H;h++)
y[k]=y[k]+wkh[k][h]*s[h];
y[k]=1/(1+exp(-y[k]));
Page 52
//retropropagation
for (k=0;k<K;k++)
wk0[k]=wk0[k]+0.1*(Target[n][k]-y[k])*y[k]*(1-y[k]);
for (h=0;h<H;h++)
wkh[k][h]=wkh[k][h]+0.1*(Target[n][k]-y[k])*y[k]*(1-y[k])*s[h];
for (h=0;h<H;h++)
double som=0.;
for (k=0;k<K;k++)
som=som+(Target[n][k]-y[k])*y[k]*(1-y[k])*wkh[k][h];
wh0[h]=wh0[h]+0.1*s[h]*(1-s[h])*som;
for (d=0;d<D;d++)
whd[h][d]=whd[h][d]+0.1*s[h]*(1-s[h])*som*x[d];
}//end for n
t=t+1;
int n,d,k,h;
int H;
H=int((D+K)/2);
double xmin[DD];
for (d=0;d<DD;d++)
Page 53
xmin[d]=0;
double xmax[DD];
for (d=0;d<DD;d++)
xmax[d]=0;
for (d=0;d<D;d++)
xmin[d]=xx[0][d];
for (n=0;n<N;n++)
if (xx[n][d]<xmin[d]) xmin[d]=xx[n][d];
};
for (d=0;d<D;d++)
xmax[d]=xx[0][d];
for (n=0;n<N;n++)
if (xx[n][d]>xmax[d]) xmax[d]=xx[n][d];
};
for (d=0;d<D;d++)
test[d]=(test[d]-xmin[d])/(xmax[d]-xmin[d]);
double s[HH];
for (h=0;h<H;h++)
s[h]=wh0[h];
for (d=0;d<D;d++)
s[h]=s[h]+whd[h][d]*test[d];
s[h]=1/(1+exp(-s[h]));
double y[KK];
Page 54
for (k=0;k<K;k++) y[k]=0;
for (k=0;k<K;k++)
y[k]=wk0[k];
for (h=0;h<H;h++)
y[k]=y[k]+wkh[k][h]*s[h];
y[k]=1/(1+exp(-y[k]));
for (k=0;k<K;k++)
if (y[k]>ymax)
ymax=y[k];
kmax=k;
};
return kmax;
FILE * stream,*st1,*st2,*st3,*st4;
double xx[3000][14];
stream=fopen("c:\\matlab\\bin\\dea\\scfr100","rb");
st1=fopen("c:\\matlab\\bin\\dea\\scfrwk0","w+b");
st2=fopen("c:\\matlab\\bin\\dea\\scfrwkh","w+b");
st3=fopen("c:\\matlab\\bin\\dea\\scfrwh0","w+b");
st4=fopen("c:\\matlab\\bin\\dea\\scfrwhd","w+b");
do
Page 55
{
fread(&a,sizeof(double),14,stream);
N=N+1;
while (!feof(stream));
wmulc(wk0,wkh,wh0,whd,xx,Iter,K,D,N-1);
for (k=0;k<K;k++)
fwrite(&wk0[k],sizeof(double),1,st1);
for (k=0;k<K;k++)
for (h=0;h<H;h++)
fwrite(&wkh[k][h],sizeof(double),1,st2);
for (k=0;k<K;k++)
for (h=0;h<H;h++)
cout<<wkh[k][h]<<" ";
cout<<endl;
for (h=0;h<H;h++)
fwrite(&wh0[h],sizeof(double),1,st3);
for (h=0;h<H;h++)
for (d=0;d<D;d++)
fwrite(&whd[h][d],sizeof(double),1,st4);
fclose(stream);
fclose(st1);
fclose(st2);
fclose(st3);
fclose(st4);
Page 56
{
int Jmin=Reso-1,Jmax=0,Imin=Reso-1,Imax=0;
int i,j;
for (i=0;i<Res;i++)
for (j=0;j<Res;j++)
a1[i][j]=0;
for (i=0;i<Reso;i++)
for (j=0;j<Reso;j++)
if (x[i][j]==1)
if (j<Jmin) Jmin=j;
if (j>Jmax) Jmax=j;
if (i<Imin) Imin=i;
if (i>Imax) Imax=i;
};
int N1=Imax-Imin;
int M1=Jmax-Jmin;
matimage a;
for (i=0;i<Res;i++)
for (j=0;j<Res;j++)
a[i][j]=0;
for (i=Imin;i<=Imax;i++)
for (j=Jmin;j<=Jmax;j++)
if (x[i][j]==1) a[i-Imin][j-Jmin]=1;
for (i=0;i<Res;i++)
for (j=0;j<Res;j++)
a1[i][j]=a[int((i*N1)/(Res-1))][int((j*M1)/(Res-1))];
matimage b;
for (i=0;i<Res;i++)
for (j=0;j<Res;j++)
Page 57
b[i][j]=a1[i][j];
centrage(a1,b,Reso);
};
int i,j;
int Jmin=Reso-1,Jmax=0,Imin=Reso-1,Imax=0;
for (i=0;i<Res;i++)
for (j=0;j<Res;j++)
a[i][j]=0;
for (i=0;i<Reso;i++)
for (j=0;j<Reso;j++)
if (x[i][j]==1)
if (j<Jmin) Jmin=j;
if (j>Jmax) Jmax=j;
if (i<Imin) Imin=i;
if (i>Imax) Imax=i;
};
int yc,xc,Tx,Ty;
yc=int((Imin+Imax)/2);
xc=int((Jmin+Jmax)/2);
Tx=int((Reso-1)/2-xc);
Ty=int((Reso-1)/2-yc);
int i1=0,j1=0;
for (i=0;i<Reso;i++)
for (j=0;j<Reso;j++)
if (x[i][j]==1)
i1=i+Ty;
Page 58
j1=j+Tx;
a[i1][j1]=x[i][j];
};
for (i=0;i<Res;i++)
for (j=0;j<Res;j++)
I[i][j]=double (y[i][j]);
for (i=0;i<Reso;i++)
for (j=0;j<Reso;j++)
IG=IG+i*I[i][j];
JG=JG+j*I[i][j];
};
// moments centres
double mu00=0,mu11=0,mu02=0,mu20=0,mu12=0,mu21=0,mu22=0,
mu03=0,mu30=0,mu13=0,mu31=0,mu23=0,mu32=0,mu33=0;
for (i=0;i<Reso;i++)
for (j=0;j<Reso;j++)
mu00=mu00+I[i][j];
mu11=mu11+(i-IG)*(j-JG)*I[i][j];
mu02=mu02+(pow(j-JG,2))*I[i][j];
mu20=mu20+(pow(i-IG,2))*I[i][j];
mu12=mu12+(i-IG)*(pow(j-JG,2))*I[i][j];
mu21=mu21+(pow(i-IG,2))*(j-JG)*I[i][j];
mu22=mu22+(pow(i-IG,2))*(pow(j-JG,2))*I[i][j];
Page 59
mu03=mu03+(pow(j-JG,3))*I[i][j];
mu30=mu30+(pow(i-IG,3))*I[i][j];
mu13=mu13+(pow(i-IG,1))*(pow(j-JG,3))*I[i][j];
mu31=mu31+(pow(i-IG,3))*(pow(j-JG,1))*I[i][j];
mu23=mu23+(pow(i-IG,2))*(pow(j-JG,3))*I[i][j];
mu32=mu32+(pow(i-IG,3))*(pow(j-JG,2))*I[i][j];
mu33=mu33+(pow(i-IG,3))*(pow(j-JG,3))*I[i][j];
};
double mup11=mu11/pow(mu00,2);
double mup02=mu02/pow(mu00,(1.5));
double mup20=mu20/pow(mu00,(1.5));
double mup12=mu12/pow(mu00,(2.5));
double mup21=mu21/pow(mu00,(2.5));
double mup22=mu22/pow(mu00,(3));
double mup03=mu03/pow(mu00,(2.5));
double mup30=mu30/pow(mu00,(2.5));
double mup13=mu13/pow(mu00,3);
double mup31=mu31/pow(mu00,3);
double mup23=mu23/pow(mu00,(3.5));
double mup32=mu32/pow(mu00,(3.5));
double mup33=mu33/pow(mu00,(4));
a[0]=mup11;a[1]=mup02;a[2]=mup20;a[3]=mup12;a[4]=mup21;
a[5]=mup22;a[6]=mup03;a[7]=mup30;a[8]=mup13;a[9]=mup31;
a[10]=mup23;a[11]=mup32;a[12]=mup33;
imreadbmp(aa,ydim,xdim,sor);
if (sor==0)
Page 60
{
int label=0;
int cond1,cond2;
for (j=0;j<xdim;j++)
for (i=0;i<ydim;i++)
x[i][j]=0;
for (j=0;j<xdim;j++)
cond1=0;
for (i=0;i<ydim;i++)
if (aa[i][j]==1)
cond1=1;
x[i][j]=label;
};
cond2=0;
for (i=0;i<ydim;i++)
if (aa[i][j+1]==1) cond2=1;
};
FILE * stream,*st1,*st2,*st3,*st4;
double xx[3000][14];
stream=fopen("c:\\matlab\\bin\\dea\\scfr100","rb");
st1=fopen("c:\\matlab\\bin\\dea\\scfrwk0","rb");
st2=fopen("c:\\matlab\\bin\\dea\\scfrwkh","rb");
st3=fopen("c:\\matlab\\bin\\dea\\scfrwh0","rb");
st4=fopen("c:\\matlab\\bin\\dea\\scfrwhd","rb");
Page 61
do
fread(&a,sizeof(double),14,stream);
N=N+1;
while (!feof(stream));
for (k=0;k<K;k++)
fread(&wk0[k],sizeof(double),1,st1);
for (k=0;k<K;k++)
for (h=0;h<H;h++)
fread(&wkh[k][h],sizeof(double),1,st2);
for (h=0;h<H;h++)
fread(&wh0[h],sizeof(double),1,st3);
for (h=0;h<H;h++)
for (d=0;d<D;d++)
fread(&whd[h][d],sizeof(double),1,st4);
fclose(stream);
fclose(st1);
fclose(st2);
fclose(st3);
fclose(st4);
strcpy(str,"");
for (l=1;l<=label;l++)
for (i=0;i<Res;i++)
for (j=0;j<Res;j++)
a1[i][j]=0;
Page 62
b[i][j]=0;
};
extract(b,x,xdim,ydim,l);
squ(b,Reso);
wpretr(a1,b,Reso);
squ(a1,Reso);
wattr(a1,attr,Reso);
int kmax=wmulcd(wk0,wkh,wh0,whd,xx,attr,K,D,N-1);
switch(kmax)
case 0:strcat(str,"0");break;
case 1:strcat(str,"1");break;
case 2:strcat(str,"2");break;
case 3:strcat(str,"3");break;
case 4:strcat(str,"4");break;
case 5:strcat(str,"5");break;
case 6:strcat(str,"6");break;
case 7:strcat(str,"7");break;
case 8:strcat(str,"8");break;
case 9:strcat(str,"9");break;
};
};
cout<<str<<endl;
};
int Jmin=xdim-1,Jmax=0,Imin=ydim-1,Imax=0;
int i,j;
for (i=0;i<Res;i++)
Page 63
for (j=0;j<Res;j++)
a[i][j]=0;
for (i=0;i<ydim;i++)
for (j=0;j<xdim;j++)
if (x[i][j]==label)
if (j<Jmin) Jmin=j;
if (j>Jmax) Jmax=j;
if (i<Imin) Imin=i;
if (i>Imax) Imax=i;
};
int N1=Imax-Imin;
int M1=Jmax-Jmin;
for (i=Imin;i<=Imax;i++)
for (j=Jmin;j<=Jmax;j++)
if (x[i][j]==label) a[i-Imin][j-Jmin]=1;
sor=0;
strcpy(path,"d:\\imbase\\sim100\\");
cout<<"path= ";cin>>s;
if (strcmp(s,"fin")==0) sor=1;
strcat(path,s);
strcat(path,".bmp");
if (strcmp(s,"fin")!=0)
{st=fopen(path,"rb");
matim bb;
Page 64
long i,j;
//bitmapfileheader
fread(&a,14,1,st);
//bisize
fread(&a,4,1,st);
//biwidth
fread(&Xdim,4,1,st);
//biheight
fread(&Ydim,4,1,st);
//reste
fread(&a,36,1,st);
for (i=0;i<Ydim;i++)
j=0;
do
fread(&b1,1,1,st);
fread(&b2,1,1,st);
fread(&b3,1,1,st);
fread(&b4,1,1,st);
//b1
Page 65
//b2
//b3
//b4
while(j<Xdim);
};
Page 66
for (i=0;i<Ydim;i++)
for (j=0;j<Xdim;j++)
bb[i][j]=aa[i][j];
for (i=0;i<Ydim;i++)
for (j=0;j<Xdim;j++)
aa[i][j]=bb[Ydim-i-1][j];
fclose(st);
};
int Reso;
FILE* str;
str=fopen("c:\\matlab\\bin\\dea\\scfr100","ab");
if (str==NULL)
str=fopen("c:\\matlab\\bin\\dea\\scfr100","w+b");
double T;
cout<<"entrer Target=";
cin>>T;
imreadbmp(x,Reso,Reso,sor);
if (sor==0)
for (i=0;i<Res;i++)
for (j=0;j<Res;j++)
b[i][j]=x[i][j];
squ(b,Reso);
wpretr(a1,b,Reso);
squ(a1,Reso);
wattr(a1,attr,Reso);
Page 67
fwrite(&attr,sizeof(double),13,str);
fwrite(&T,sizeof(double),1,str);
fclose(str);
};
int NN=0,S=0,i,j;Reso=Reso+2;
for (i=0;i<Reso;i++)
for (j=0;j<Reso;j++)
x[i][j]=0;
for (i=1;i<(Reso-1);i++)
for (j=1;j<(Reso-1);j++)
x[i][j]=y[i-1][j-1];
int cond=0;
while(cond==0)
//a=x
for (i=0;i<Reso;i++)
for (j=0;j<Reso;j++)
a[i][j]=x[i][j];
for (i=0;i<Reso;i++)
for (j=0;j<Reso;j++)
NN=0;S=0;
if (x[i][j]==1)
if ((i==0)&&(j==0))
NN=x[i][j+1]+x[i+1][j+1]+x[i+1][j];
Page 68
if ((i==0)&&(j==Reso-1))
NN=x[i+1][j]+x[i+1][j-1]+x[i][j-1];
if ((i==Reso-1)&&(j==0))
NN=x[i-1][j]+x[i-1][j+1]+x[i][j+1];
if ((i==Reso-1)&&(j==Reso-1))
NN=x[i-1][j]+x[i][j-1]+x[i-1][j-1];
if ((i==0)&&(j!=Reso-1)&&(j!=0))
NN=x[i][j+1]+x[i+1][j+1]+x[i+1][j]+x[i+1][j-
1]+x[i][j-1];
if ((i==Reso-1)&&(j!=Reso-1)&&(j!=0))
NN=x[i-1][j]+x[i-1][j+1]+x[i][j+1]+x[i][j-1]+x[i-
1][j-1];
if ((j==0)&&(i!=Reso-1)&&(i!=0))
NN=x[i-1][j]+x[i-
1][j+1]+x[i][j+1]+x[i+1][j+1]+x[i+1][j];
if ((j==Reso-1)&&(i!=Reso-1)&&(i!=0))
NN=x[i-1][j]+x[i+1][j]+x[i+1][j-1]+x[i][j-1]+x[i-
1][j-1];
if ((i!=0)&&(i!=Reso-1)&&(j!=0)&&(j!=Reso-1))
NN=x[i-1][j]+x[i-
1][j+1]+x[i][j+1]+x[i+1][j+1]+x[i+1][j]+x[i+1][j-1]+x[i][j-1]+x[i-1][j-1];
if ((i!=0)&&(j!=Reso-1))
if ((x[i-1][j]==0)&&(x[i-1][j+1]==1))
S=S+1;
if ((i!=0)&&(j!=Reso-1))
if ((x[i-1][j+1]==0)&&(x[i][j+1]==1))
S=S+1;
if ((i!=Reso-1)&&(j!=Reso-1))
if ((x[i][j+1]==0)&&(x[i+1][j+1]==1))
Page 69
S=S+1;
if ((i!=Reso-1)&&(j!=Reso-1))
if ((x[i+1][j+1]==0)&&(x[i+1][j]==1))
S=S+1;
if ((i!=Reso-1)&&(j!=0))
if ((x[i+1][j]==0)&&(x[i+1][j-1]==1))
S=S+1;
if ((i!=Reso-1)&&(j!=0))
if ((x[i+1][j-1]==0)&&(x[i][j-1]==1))
S=S+1;
if ((i!=0)&&(j!=0))
if ((x[i][j-1]==0)&&(x[i-1][j-1]==1))
S=S+1;
if ((i!=0)&&(j!=0))
if ((x[i-1][j-1]==0)&&(x[i-1][j]==1))
S=S+1;
}; //end if x[i][j]==1
if ((NN>=2)&&(NN<=6)&&(S==1))
if ((i==0)&&(j!=Reso-
1)&&(j!=0)&&(x[i][j+1]*x[i+1][j]==0)&&(x[i][j+1]*x[i+1][j]*x[i][j-1]==0))
a[i][j]=0;
if ((i==0)&&(j==Reso-
1)&&(x[i+1][j]==0)&&(x[i+1][j]*x[i][j-1]==0))
a[i][j]=0;
if
((i==0)&&(j==0)&&(x[i][j+1]*x[i+1][j]==0)&&(x[i][j+1]*x[i+1][j]==0))
a[i][j]=0;
if ((j==0)&&(i==Reso-1)&&(x[i-
1][j]*x[i][j+1]==0)&&(x[i][j+1]==0))
a[i][j]=0;
Page 70
if ((i==Reso-1)&&(j==Reso-1)&&(x[i-
1][j]==0)&&(x[i][j-1]==0))
a[i][j]=0;
if ((i==Reso-1)&&(j!=Reso-1)&&(j!=0)&&(x[i-
1][j]*x[i][j+1]==0)&&(x[i][j+1]*x[i][j-1]==0))
a[i][j]=0;
if ((j==0)&&(i!=Reso-1)&&(i!=0)&&(x[i-
1][j]*x[i][j+1]*x[i+1][j]==0)&&(x[i][j+1]*x[i+1][j]==0))
a[i][j]=0;
if ((j==Reso-1)&&(i!=Reso-1)&&(i!=0)&&(x[i-
1][j]*x[i+1][j]==0)&&(x[i+1][j]*x[i][j-1]==0))
a[i][j]=0;
if ((i!=0)&&(i!=Reso-1)&&(j!=0)&&(j!=Reso-1)&&(x[i-
1][j]*x[i][j+1]*x[i+1][j]==0)&&(x[i][j+1]*x[i+1][j]*x[i][j-1]==0))
a[i][j]=0;
}; //end if NN
} // end for j
//b=a
for (i=0;i<Reso;i++)
for (j=0;j<Reso;j++)
b[i][j]=a[i][j];
//step 2
for (i=0;i<Reso;i++)
for (j=0;j<Reso;j++)
NN=0;S=0;
if (a[i][j]==1)
if ((i==0)&&(j==0))
NN=a[i][j+1]+a[i+1][j+1]+a[i+1][j];
Page 71
if ((i==0)&&(j==Reso-1))
NN=a[i+1][j]+a[i+1][j-1]+a[i][j-1];
if ((i==Reso-1)&&(j==0))
NN=a[i-1][j]+a[i-1][j+1]+a[i][j+1];
if ((i==Reso-1)&&(j==Reso-1))
NN=a[i-1][j]+a[i][j-1]+a[i-1][j-1];
if ((i==0)&&(j!=Reso-1)&&(j!=0))
NN=a[i][j+1]+a[i+1][j+1]+a[i+1][j]+a[i+1][j-
1]+a[i][j-1];
if ((i==Reso-1)&&(j!=Reso-1)&&(j!=0))
NN=a[i-1][j]+a[i-1][j+1]+a[i][j+1]+a[i][j-1]+a[i-
1][j-1];
if ((j==0)&&(i!=Reso-1)&&(i!=0))
NN=a[i-1][j]+a[i-
1][j+1]+a[i][j+1]+a[i+1][j+1]+a[i+1][j];
if ((j==Reso-1)&&(i!=Reso-1)&&(i!=0))
NN=a[i-1][j]+a[i+1][j]+a[i+1][j-1]+a[i][j-1]+a[i-
1][j-1];
if ((i!=0)&&(i!=Reso-1)&&(j!=0)&&(j!=Reso-1))
NN=a[i-1][j]+a[i-
1][j+1]+a[i][j+1]+a[i+1][j+1]+a[i+1][j]+a[i+1][j-1]+a[i][j-1]+a[i-1][j-1];
if ((i!=0)&&(j!=Reso-1))
if ((a[i-1][j]==0)&&(a[i-1][j+1]==1))
S=S+1;
if ((i!=0)&&(j!=Reso-1))
if ((a[i-1][j+1]==0)&&(a[i][j+1]==1))
S=S+1;
if ((i!=Reso-1)&&(j!=Reso-1))
if ((a[i][j+1]==0)&&(a[i+1][j+1]==1))
S=S+1;
Page 72
if ((i!=Reso-1)&&(j!=Reso-1))
if ((a[i+1][j+1]==0)&&(a[i+1][j]==1))
S=S+1;
if ((i!=Reso-1)&&(j!=0))
if ((a[i+1][j]==0)&&(a[i+1][j-1]==1))
S=S+1;
if ((i!=Reso-1)&&(j!=0))
if ((a[i+1][j-1]==0)&&(a[i][j-1]==1))
S=S+1;
if ((i!=0)&&(j!=0))
if ((a[i][j-1]==0)&&(a[i-1][j-1]==1))
S=S+1;
if ((i!=0)&&(j!=0))
if ((a[i-1][j-1]==0)&&(a[i-1][j]==1))
S=S+1;
}; //end if a[i][j]==1
if ((NN>=2)&&(NN<=6)&&(S==1))
if ((i==0)&&(j!=Reso-1)&&(j!=0)&&(a[i][j+1]*a[i][j-
1]==0)&&(a[i+1][j]*a[i][j-1]==0))
b[i][j]=0;
if ((i==0)&&(j==Reso-1)&&(a[i][j-
1]==0)&&(a[i+1][j]*a[i][j-1]==0))
b[i][j]=0;
if ((i==0)&&(j==0)&&(a[i][j+1]==0)&&(a[i+1][j]==0))
b[i][j]=0;
if ((j==0)&&(i==Reso-1)&&(a[i-1][j]==0)&&(a[i-
1][j]==0))
b[i][j]=0;
if ((i==Reso-1)&&(j==Reso-1)&&(a[i-1][j]*a[i][j-
1]==0)&&(a[i-1][j]*a[i][j-1]==0))
b[i][j]=0;
Page 73
if ((i==Reso-1)&&(j!=Reso-1)&&(j!=0)&&(a[i-
1][j]*a[i][j+1]*a[i][j-1]==0)&&(a[i-1][j]*a[i][j-1]==0))
b[i][j]=0;
if ((j==0)&&(i!=Reso-1)&&(i!=0)&&(a[i-
1][j]*a[i][j+1]==0)&&(a[i-1][j]*a[i+1][j]==0))
b[i][j]=0;
if ((j==Reso-1)&&(i!=Reso-1)&&(i!=0)&&(a[i-
1][j]*a[i][j-1]==0)&&(a[i-1][j]*a[i+1][j]*a[i][j-1]==0))
b[i][j]=0;
if ((i!=0)&&(i!=Reso-1)&&(j!=0)&&(j!=Reso-1)&&(a[i-
1][j]*a[i][j+1]*a[i][j-1]==0)&&(a[i-1][j]*a[i+1][j]*a[i][j-1]==0))
b[i][j]=0;
}; //end if NN
} // end for j
//test d'egalite
cond=1;
for (i=0;i<Reso;i++)
for (j=0;j<Reso;j++)
if (x[i][j]!=b[i][j])
cond=0;
//x=b
for (i=0;i<Reso;i++)
for (j=0;j<Reso;j++)
x[i][j]=b[i][j];
};//end while
for (i=0;i<Reso-2;i++)
for (j=0;j<Reso-2;j++)
y[i][j]=x[i+1][j+1];
};
void atest()
Page 74
FILE * stream,*st1,*st2,*st3,*st4;
double xx[3000][14];
vectattr attr;
int Reso;
stream=fopen("c:\\matlab\\bin\\dea\\scfr100","rb");
st1=fopen("c:\\matlab\\bin\\dea\\scfrwk0","rb");
st2=fopen("c:\\matlab\\bin\\dea\\scfrwkh","rb");
st3=fopen("c:\\matlab\\bin\\dea\\scfrwh0","rb");
st4=fopen("c:\\matlab\\bin\\dea\\scfrwhd","rb");
for (k=0;k<K;k++)
fread(&wk0[k],sizeof(double),1,st1);
for (k=0;k<K;k++)
for (h=0;h<H;h++)
fread(&wkh[k][h],sizeof(double),1,st2);
for (h=0;h<H;h++)
fread(&wh0[h],sizeof(double),1,st3);
for (h=0;h<H;h++)
for (d=0;d<D;d++)
fread(&whd[h][d],sizeof(double),1,st4);
int count=0,kmax,n;
do
fread(&a,sizeof(double),14,stream);
for (d=0;d<=13;d++)
xx[N][d]= a[d];
N=N+1;
Page 75
while (!feof(stream));
for (n=0;n<N;n++)
for (d=0;d<13;d++)
attr[d]=xx[n][d];
kmax=wmulcd(wk0,wkh,wh0,whd,xx,attr,K,D,N-1);
if ((kmax)==(int)xx[n][13]) count=count+1;
fclose(stream);
fclose(st1);
fclose(st2);
fclose(st3);
fclose(st4);
cout<<count<<"/"<<(N-1)<<"="<<((double) count*100/(N-1))<<endl;
void gtest()
FILE * stream,*st1,*st2,*st3,*st4,*strr;
vectattr attr;
int Reso;
stream=fopen("c:\\matlab\\bin\\dea\\scfr100","rb");
strr=fopen("c:\\matlab\\bin\\dea\\gscfr100","rb");
st1=fopen("c:\\matlab\\bin\\dea\\scfrwk0","rb");
st2=fopen("c:\\matlab\\bin\\dea\\scfrwkh","rb");
st3=fopen("c:\\matlab\\bin\\dea\\scfrwh0","rb");
Page 76
st4=fopen("c:\\matlab\\bin\\dea\\scfrwhd","rb");
for (k=0;k<K;k++)
fread(&wk0[k],sizeof(double),1,st1);
for (k=0;k<K;k++)
for (h=0;h<H;h++)
fread(&wkh[k][h],sizeof(double),1,st2);
for (h=0;h<H;h++)
fread(&wh0[h],sizeof(double),1,st3);
for (h=0;h<H;h++)
for (d=0;d<D;d++)
fread(&whd[h][d],sizeof(double),1,st4);
int count=0,kmax,n;
do
fread(&a,sizeof(double),14,stream);
for (d=0;d<=13;d++)
xx[N][d]= a[d];
N=N+1;
while (!feof(stream));
do
fread(&a,sizeof(double),14,strr);
for (d=0;d<=13;d++)
y[M][d]= a[d];
M=M+1;
while (!feof(strr));
for (n=0;n<M;n++)
Page 77
for (d=0;d<13;d++)
attr[d]=y[n][d];
kmax=wmulcd(wk0,wkh,wh0,whd,xx,attr,K,D,N-1);
if ((kmax)==(int)y[n][13]) count=count+1;
fclose(stream);
fclose(strr);
fclose(st1);
fclose(st2);
fclose(st3);
fclose(st4);
cout<<count<<"/"<<(M-1)<<"="<<((double) count*100/(M-1))<<endl;
int Reso;
FILE* str;
str=fopen("c:\\matlab\\bin\\dea\\gscfr100","ab");
if (str==NULL)
str=fopen("c:\\matlab\\bin\\dea\\gscfr100","w+b");
double T;
cout<<"entrer Target=";
cin>>T;
imreadbmp(x,Reso,Reso,sor);
if (sor==0)
for (i=0;i<Res;i++)
for (j=0;j<Res;j++)
Page 78
b[i][j]=x[i][j];
squ(b,Reso);
wpretr(a1,b,Reso);
squ(a1,Reso);
wattr(a1,attr,Reso);
fwrite(&attr,sizeof(double),13,str);
fwrite(&T,sizeof(double),1,str);
fclose(str);
};
Page 79
Table de matières
Page
- Introduction 1
- Chapitre 1 : Le problème de reconnaissance de l’écriture 3
1 Introduction 3
2 Les applications 3
3 Les différents aspects de l’OCR 4
3.1 Reconnaissance de l’imprimé ou du manuscrit 4
3.2 Reconnaissance monofonte, multifonte ou omnifonte 4
3.3 Reconnaissance de caractères ou analyse de documents 4
3.4 Reconnaissance en ligne ou hors ligne 4
3.5 Système avec ou sans apprentissage 5
4 Saisie de l’écriture 5
4.1 Le mode statique 5
4.2 Le mode continu 5
5 Reconnaissance de caractères 6
5.1 Technique de prétraitement 6
5.1.1 Lissage 6
5.1.2 Normalisation de la taille 6
5.1.3 Amincissement 6
5.2 Technique d’analyse 6
5.2.1 Calcul de corrélation 6
5.2.2 Changement de l’espace de représentation 7
5.2.3 Analyse de la courbure 7
5.3 L’apprentissage 7
5.3.1 L’apprentissage manuel 8
5.3.2 L’apprentissage automatique 8
5.3.3 L’apprentissage continu 8
5.4 Techniques de reconnaissance 8
6 Conclusion 8
- Chapitre 2 : Les réseaux des neurones 9
1 Introduction 9
2 Notion de base 10
2.1 Le neurone biologique 10
2.2 Assemblage de neurones 10
2.3 L’apprentissage 11
2.4 Démarche de modélisation 11
3 Réseaux de neurones artificiels 11
3.1 Introduction 11
3.2 Le neurone formel 12
3.3 Architectures des réseaux de neurones 13
3.4 L’apprentissage 16
4 Apprentissage et généralisation 16
4.1 Position d’un problème de classification par
Page 80
5.2 Architecture du perceptron 18
5.3 Equation de propagation avant 19
5.4 Règle d’apprentissage 19
5.5 L’apprentissage 20
6 Réseaux multicouches 20
6.1 Introduction 20
6.2 Architecture 21
6.3 Equation de propagation avant 21
6.4 Erreur à minimiser 22
6.5 Algorithme 22
7 Conclusion 23
- Chapitre 3 : Reconnaissance de chiffres indiens et arabes :
Travail réalisé 24
1 Introduction 24
2 Représentation des images sur un ordinateur 25
3 Les descripteurs d’image 26
4 Acquisition de l’image 27
5 Prétraitement 27
5.1 Normalisation 28
5.2 Centrage 29
5.3 Amincissement 31
5.4 Extraction des attributs 34
5.5 Prétraitement et obtention de la base d’apprentissage 35
6 Classification 36
6.1 La fonction de simulation d’un réseau multicouche 36
6.2 L’apprentissage 37
7 Algorithme de reconnaissance d’une série de chiffre 37
- Chapitre 4 : Résultats et étude de l’influence des paramètres
sur la performance du système 41
1 Introduction 41
2 Résultats des algorithmes de prétraitement 41
2.1 Résultats de l’algorithme de centrage 41
2.2 Résultats de l’algorithme d’amincissement 41
2.3 Résultats de normalisation 42
2.4 Résultats de l’algorithme final de prétraitement 42
3 Influence de paramètres 43
3.1 Influence du nombre d’exemples dans la base
d’apprentissage 43
3.2 Influence du nombre d’itérations sur la base
d’apprentissage 44
3.3 Influence du nombre d’attributs 45
4 Performances temporelles 45
5 Conclusion 46
- Annexe A : Exemples de quelques chiffres acquis par un scanner 47
- Annexe B : Code de programme 48
- Bibliographie 79
Page 81
Bibliographie
[1] : J. Cao, M. Ahmadi and M. Shridar, A Hierarchical Neural Network Architecture
For Handwritten Numeral Recognition (Pattern Recognition. Vol. 30, 1997 ).
[2] : A. Elnagar, F. Al-Kharousi and S. Harous, Recognition of Handwritten Numerals
using Structural Descriptors (1997 IEEE).
[3] : Young-Sup Hwang, Sung-Yang Bang, Recognition of unconstrained handwritten
numerals by a radial basis function neural network classifier (1997).
[4] : Christian Firmin et Denis Hamad, Introduction aux réseaux de neurones (1997).
[5] : Abdel Belaid et Yolande Belaid, Reconnaissance des formes (InterEditions,
1992).
[6] : J. L. Blue, G. T. Candela, P. J. Grother, R. Chellappa and L. Wilson, Evaluation
Of Pattern Classifiers For Fingerprint And OCR Applications (Pattern Recognition.
Vol. 27, 1994 ).
[7] : François Blayo et Michel Verleysen, Les réseaux de neurones artificiels (Que
Sais – Je, 1996).
[8] : R. Beale and T. Jackson, Neural Computing : An Introduction (Institue of
Physics Publishing).
[9] : Laurence Fausett, Fundamentals Of Neural Networks (Prentice Hall
International, 1994).
Page 82