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.