Objectif 100%
Journal de bord du projet informatique EPITA 96-97
de Boris Hajduk & Maxime Granatini
OCR
(Optical Character Recognition)
Choix du langage et de la plateforme de développement
Nous avons choisi de programmer en Borland C++ 5.0 sous Windows NT.
Format d'image
3 besoins :
- besoin d'un format d'image acceptant un mode monochrome (1 bit / pixel)
pour la bonne raison qu'on n'a a priori pas besoin d'informations sur la couleur du
texte a reconnaitre.
- le format choisi devra inclure une compression à cause de la taille des fichiers scannés
pour une feuille au format A4 :
300 dpi -> 3507 * 2481 -> 1.17Mo
400 dpi -> 4676 * 3308 -> 2Mo
600 dpi -> 7014 * 4962 -> 4.35Mo
(dpi = dot per inch)
- une intégration facile
Choix du format d'image monochrome
- Le format TIFF-B se prête bien aux 2 premiers impératifs, mais la variété de ses sous-
formats impose une lourdeur d'intégration qui n'a pas vraiment d'objet dans ce projet si
on voulait inclure toutes les variantes de ce format.
Mais c'est un format très utilisé dans le domaine de l'OCR, et de la PAO donc...
(Note : On n'arrive pas à trouver un algorithme de décompression de la compression 4, donc
si vous savez comment faire, ou bien si vous avez l'adresse d'un bon site sur la question,
alors mailez moi)
Avant de reconnaitre les caractères, il faut
- Faire une rotation à 90, 180, ou 270 degres de l'image du document si ce dernier a été
numérisé en format paysage, ou a l'envers.
- Réorienter l'image du document si il est légèrement incliné.
- Reconnaitre ou sont les lignes de texte -> 2 solutions :
- une scanline horizontale qui descend jusqu'en bas de la page
- une projection de tous les pixels de l'image sur une ligne verticale.
- Faire un cadre autour de chaque caractère pour délimiter son étude.
Méthodes de caractérisation des caractères
- On découpe chaque caractère en parties égales en superficie, puis on évalue
le pourcentage de noir/blanc pour chaque partie.
- On compte le nombre d'intersections du caractère etudié avec une scanline horizontale
puis avec une scanline verticale (et meme éventuellement oblique).
- On fait 4 projections :
1- projection de la moitié gauche du caractère sur une ligne verticale
2- projection de la moitié droite du caractère sur une ligne verticale
3- projection de la moitié superieure du caractère sur une ligne horizontale
4- projection de la moitié inferieure du caractère sur une ligne horizontale
- Superposition avec un masque de reference
- Déterminer si le caractère etudié est 'haut' (l,h,f,h,k,b), 'fin' (i,l), 'petit' (a,e,i,o,u)
- Déterminer le rapport hauteur / largeur du caractère
- Déterminer l'éventuelle symétrie du caractère (horizontale ou verticale)
- Extraction des proprietés locales : croisements, jonctions... -> necessite de faire le squelette du caractère
- Méthode structurelle : le contour du caractère est une chaine de symboles
- Masque binaire : le % de correspondance minimale doit être fixé pour chaque lettre pour être plus precis,
et on doit avoir une différence minimale entre chaque caractère.
On peut éventuellement pondérer ce masque : poids fort sur le squelette du caractère, poids faible sur son contour
- Masque stochastique : on remplace le 0/1 du masque binaire par une probabilité pour chaque pixel
- Masque ternaire : on utilise 2 masques : un pour le squelette, un pour le contour
- Pour les problemes de h->l, on pourait introduire le concept d'un masque quarternaire :
- les pixels obligatoires
- les pixels qu'on accepte
- les pixels qui ne devraent pas être présents
- les pixels qui excluent totalement un caractère
Les Masques
Pour faire coller les lettres aux masques, il faut faire un rescaling 'propre' pour perdre le moins de qualité possible.
Ensuite il faut se servir de 2 fonctions : amincir et epaissir.
L'apprentissage
L'apprentissage est nécessaire si un type de fonte est trop différent pour être reconnu (ex : lettres gothiques)
-> ce sera à l'utilisateur de le faire donc il faut prevoir un menu apprentissage
Les réseaux de neurones
3 couches de neurones :
- les neurones d'entrée : un pour chaque pixel du caractère a reconnaître
- les neurones cachés : ils sont tous reliés a tous les neurones d'entrée, mais ne sont pas reliés entre eux
- les neurones de sortie : probablement autour de 100 : un pour chaque type de caracatere
A part ca, niveau algorithmique, c'est assez sympa : apprentissage par retro-propagation du gradient...
Le dictionnaire
On pourrait envisager de chercher chaque mot reconnu dans une liste de mots :
il faudrait au moins une liste anglaise et une liste francaise, avec un choix entre les deux pour l'utilisateur
La non-reconnaissance
Il en existe 2 sortes :
- l'erreur : le programme s'est trompé en identifiant un caractère
- le rejet : le programme ne trouve pas d'équivalent au caractère rencontré et envoie un message a l'utilisateur
Le rejet est bien sur moins grave que l'erreur
Les résultats
- inférieur a 95% de taux de reconnaissance : trop faible, pas assez productif
- 95% -> 4 fautes par ligne
- 99.9% -> 3 fautes par page
Algorithme de principe
1. Entrée de l'image
2. Traitement de l'image
3. Sortie du fichier texte
1: . choix entrée fichier ou à scanner
. option rotation 90 degres et symétries
. selection de la zone à traiter
2: . rotation de l'image
. détermination des lignes
. détourage des caractères
. détection des mots
. reconnaissance des caractères
. test des mots dans un dico francais/anglais
. prompt pour les mots non-contenus dans le dico
3: . sortie fichier texte
Réferences
Bibliographie :
- Structures de documents et lecture optique : une nouvelle approche
Rolf Ingold Presses Polytechniques Romandes
nb : le chapitre 3.3.4 (rotation) n'existe pas. (voir p. 62)
- Reconnaissance des formes - Methodes et applications
Abdel Belaid InterEditions
- Le Format TIFF et ses modes de compression EYROLLES
Web'ographie :
http://www.inria.fr/safir/WHOSWHO/slavirot/bookmarks.html.