Étapes pour la numérisation de la flore DULAC par un OCR spécifique.

  • BINARISATION
  • Les documents sources sont particulièrement dégradés (voir ci contre).
    Des taches d'humidité, de nombreux caractères brisés, des traces de la page au recto. Le passage en binaire de cette image est important.
    Le meilleur résultat , après de nombreux essais, est fourni par le programme par défaut de Gamera. L'algorithme Abutaleb disponible donne de meilleurs résultats sur quelques caractères brisés.
    Il reste néammoins de nombreux 'petits points' ; j'ai éliminé tous les glyphs dont une dimension est inférieure à 5 pixels; sans cette élimination le traitement du groupement
    par Gamera prend un temps considérable...et laisse de côté de nombreuses combinaisons pertinentes.
    J'ai également utilisé le redressement des images

    rotation = onebit.rotation_angle_projections(-10,10)[0]
    autre_format=onebit.rotate(rotation,core.RGBPixel(255,255, 255), 3)

    original

  • SEGMENTATION
  • J'ai contourné cette difficulté par l'algorithme suivant.(complété par un autre plus loin)
    détection des glyphs représentant le numéro de page en haut et à gauche (ou à droite suivant que la page est paire ou impaire)
    élimination des glyphs à gauche (ou à droite) de cette zone
    élimination des glyphs au dessus de cette zone

    réalisation d'un découpage par .runlength_smearing()
    pour chaque élément de ce découpage,comptage des alternances de noir et de blanc en horizontal pour chaque ligne et somme sur l'ensemble des lignes .
    si le nombre d'alternances divisé par demi périmètre est >3
    vérification que le pourcentage de glyphs contenus dans le découpage et représentant surement un caractère (confiance>50%)
    est faible
    si oui , découpe de la zone image et stockage pour la restitution HTML, banchiment de la zone
    J'ai adapté le toolkit ocr disponible dans Gamera.(class MyPage(Page):) pour détecter les zones colonnes avec accolades; il n'est pas suffisant de faire confiance au classifier car beaucoup d'accolades sont rompues sur de grandes dimensions.
    Dans le plugin pagesegmentation, modification de class bbox_merging pour faire varier la hauteur de bounding_box en fonction de la nature des glyphs fusionnés.La typographie fait en effet se chevaucher les lignes dans de nombreux cas.
    En fait, le résultat correspond soit à une ligne, soit à une zone pouvant être décomposée en colonnes. D'où une passe recherche de colonnes.
    Pour chaque pseudo-ligne, on regarde si il y a des zones blanches verticales significatives et si les zones verticales ainsi séparées sont des accolades ou des morceaux d'accolades. L'image du séparateur potentiel est enregistrée dans un fichier pour une analyse manuelle.Chaque zone ainsi constituée est à nouveau analysée pour séparer les lignes . order_lines inchangé, lines_to_chars inchangé
    Pour chaque ligne, on cherche les mots. La fin d'un mot est identifiée , soit par un caractère non alphabétique, soit par un espace entre deux glyphs successifs supérieur à une valeur limite. Cette valeur est fonction de la moyenne de la longueur en pixels des espaces sur la ligne(glyph_n+1.ur_x-glyph_n.ul_x), du nombre d'espaces sur la ligne (de 1,6 à 2*moyenne) .

  • SENS DES MOTS (processus itératif)
  • Il faut faire appel à un dictionnaire;j'ai choisi Hunspell,installé sous cygwin; (http://www.dicollecte.org/download/fr/hunspell_fr_3-4-1.zip); compte tenu de la nature du livre, j'ai construit des dictionnaires complémentaires , pour les noms de lieux, pour les abréviations et pour les mots latins; les autres mots (noms de genres, de familles...) sont ajoutés au dictionnaire français standard de Hunspell ; environ 900 mots ajoutés.
    Chaque mot est envoyé au dictionnaire et on analyse la réponse du dictionnaire.
    spell_prog ='hunspell -d/cygdrive/chemin/fr,/cygdrive/chemin/noms_latins,/cygdrive/chemin/abrev,/cygdrive/chemin/communes -a -i utf-8'
    proc = subprocess.Popen(spell_prog, shell=True, stdin = subprocess.PIPE, stdout = subprocess.PIPE,stderr=subprocess.PIPE)
    proc.stdin.write('%s' % word.encode('utf-8'))
    resultat,erreur=proc.communicate()
    Le fichier .aff de Hunspell est modifié pour que les confusions fréquentes (u,n),(l,i) issues du classifier soient prises en compte dans les suggestions.
    Si le dictionnaire propose une liste de mots , on calcule la distance de Levenshtein entre le mot envoyé au dictionnaire et chaque mot reçu. Cette distance est corrigée pour tenir compte des erreurs fréquentes du classifier (si les mots ne diffèrent que par le remplacement de "u" par "n", la distance est définie nulle) et on garde le meilleur résultat inférieur à 2.
    Les mots pour lesquels le dictionnaire ne propose pas de mot acceptable sont enregistrés dans un fichier .csv qui sera traité ensuite (dans Access) pour enrichir les dictionnaires.
    Le mot retenu est enregistré dans un attribut que j'ai ajouté à textline (class Textline:) du module classes dans le toolkit Ocr de Gamera
    Si la ligne se termine par un signe de césure ("-"), on envoie au dictionnaire la concaténation du début du mot (fin de ligne n) et de la fin du mot (début de ligne n+1); le mot retenu est découpé pour reconstituer la césure.

  • RESTITUTION format html
  • J'ai souhaité conserver une présentation aussi proche de l'original que possible.
    Les mots ou les signes sont positionnés en absolu , à la position du groupe de glyphs sur la page source.
    Des polices courantes (mais taille imposée) conviennent , sauf pour la police utilisée pour les espèces (exemple: ). aflexe
    J'ai créé pour la restituer approximativement une police spécifique , elle comporte aussi les caractères spéciaux utilisés par le typographe (exemple: ) exemple restitution
    J'ai utilisé le programme Fontforge (http://fontforge.sourceforge.net) pour créer cette police à partir des glyphs d'origine.
    Cette police est "embedded" dans les pages HTML.
    Les images repérées dans les phases précédentes et mises à l'écart pour la mise en texte sont remises à leur position exacte.

    J'ai procédé à de nombreuse corrections 'semi manuelles'; par exemple pour "c" (souvent confondu avec "e"), pour "u" (confondu avec "n"), "m" (confondu avec 'ni') etc..
    J'ai collecté et visualisé dans une fenêtre multi image les glyphs classées comme "c" (par exemple) à faible confiance (programme python), et changé leur désignation (manuel), puis remplacé le glyph d'origine dans sa page (programme Python).
    La disposition régulière des genres et espèces permet une vérification (suite cohérente de nombres pour la police considérée);Ces contrôles ont été faits en VBA Access et ont permis l'établissement de la table des matières.
    Le couplage avec la base de données BDNF a permis d'établir une correspondance probable entre les désignations de la flore et une désignation plus moderne

  • RESULTAT:
  • page 293
    Il reste encore quelques anomalies:
    Césure entre une page et la suivante
    Espaces entre deux parties d'un mot
    Restitution chevauchant deux zônes de texte contigües
    Peut être images incomplètes ou texte incomplet
    Abscence (volontaire) de l'introduction, de la table des matières d'origine (nombreux caractères grecs!!).
    Cependant le texte est accessible et des recherches de caractères sont possibles pour des exploitations automatiques.
    Avis aux amateurs!!!
    La suite page suivante....






    les randonnées page précédente page suivante flore dulac