Tesseract: "Attention. Résolution invalide 0 dpi. Utilisation de 70 à la place." avec branche 321-Tesseract-4

Créé le 7 mars 2018  ·  13Commentaires  ·  Source: charlesw/tesseract

J'utilise la branche 321-Tesseract-4 pour la prise en charge de LSTM, je capture une section de l'écran et je crée un objet Bitmap à transmettre au TesseractEngine mais je reçois seulement le "Avertissement. Résolution non valide 0 dpi. Utilisation de 70 à la place." Erreur.

J'ai essayé de définir la résolution d'objet Bitmap avec "Bitmap.setResolution(96, 96);"
ainsi que d'essayer "engine.SetVariable("image_default_resolution", input.VerticalResolution);"

Lorsque j'ai utilisé le package nuget Tesseract 3, je n'ai pas rencontré cette erreur dans le même projet. Est-ce un problème de la nouvelle version de leptonica ? ou quelque chose que je peux contourner par programmation ?

Commentaire le plus utile

@wilfredcho après être passé à l'utilisation de Tesseract 4, j'avais conservé le même paramètre PageSegMode que j'avais utilisé pour la version précédente :
```C#
var page = moteur.Process(input, PageSegMode.LSTM)

or something of that nature. But in Tesseract 4, the options have changed to the following:

```C#
namespace Tesseract
{
    public enum PageSegMode
    {
        OsdOnly = 0,
        AutoOsd = 1,
        AutoOnly = 2,
        Auto = 3,
        SingleColumn = 4,
        SingleBlockVertText = 5,
        SingleBlock = 6,
        SingleLine = 7,
        SingleWord = 8,
        CircleWord = 9,
        SingleChar = 10,
        SparseText = 11,
        SparseTextOsd = 12,
        RawLine = 13,
        Count = 14
    }
}

Tous les 13 commentaires

Vous remarquerez que le convertisseur bitmap en Pix de l'encapsuleur a un commentaire TODO pour définir la résolution. Il ne définit pas X/Y res. et je pense que c'est ce qui pousse Tesseract à signaler l'avertissement.

Je vois ça maintenant. Cette branche n'est-elle donc pas utilisable ? Je n'arrive pas à obtenir des résultats OCR précis en l'utilisant pendant que j'obtiens les erreurs dpi.

Êtes-vous certain qu'il existe une corrélation entre l'avertissement et la précision ? Toutes les branches ont ce problème. Si j'ai bien lu le code, vous pouvez améliorer Pix.Create() pour passer la résolution, puis utiliser le pixSetResolution() du wrapper LeptonicaAPI.cs.

Lorsque j'utilise le package Tesseract Nuget hébergé dans la base de données Nuget, l'OCR fonctionne pour la plupart. Mais je voulais essayer Tesseract 4 LSTM pour une précision accrue.

Est-ce donc dû à un changement dans l'API Leptonica uniquement, je me demande?

Je vais creuser et voir ce que je peux faire en modifiant Pix.Create(). Je ne suis pas optimiste cependant, très novice ici.

Merci pour vos suggestions !

Je ne peux pas le dire avec certitude, mais je regarderais d'abord vos fichiers de données de train et serais certain que vous avez utilisé les versions LSTM en conjonction avec 4.0. Ce message d'avertissement est là depuis assez longtemps. Les versions peuvent désactiver les messages, il est donc tout à fait possible que les conditions qui les provoquent ne soient pas modifiées en changeant de version - la version 4 a évidemment été construite avec l'avertissement activé. Cela dit, il semble que le wrapper devrait passer la résolution lors de la conversion de Bitmaps en Pix.

J'ai essayé les fichiers de données entraînés des deux :
https://github.com/tesseract-ocr/tessdata
https://github.com/tesseract-ocr/tessdata_fast

J'ai également essayé d'utiliser EngineMode.Default et EngineMode.LstmOnly
Je les utilise sur de petits ensembles de données très lisibles pour tester, et rien n'est correct. Y a-t-il un autre ensemble de données entraînées que vous recommanderiez ?

Je me demande si le manque de réglage dpi rend l'image trop froissée ou étirée pour être lisible.

J'ai implémenté le Pix.Create() surchargé pour passer la résolution, puis et utilisé
pixSetResolution() de LeptonicaAPI.cs wrapper pour définir cela avant l'OCRing... Je n'obtiens plus l'erreur dpi ! Mais toujours pas de données OCR lisibles. Je me demande si je règle le DPI sur la valeur correcte en utilisant:

public Pix Convert(Bitmap img)
{
var pixDepth = GetPixDepth(img.PixelFormat);
var dpiX = (int)img.HorizontalResolution ;
var dpiY = (int)img.VerticalResolution ;
var pix = Pix.Create(img.Width, img.Height, pixDepth, dpiX, dpiY);
...
}

Ou s'il y a vraiment un problème avec les données d'entraînement.

        var handle = Interop.LeptonicaApi.Native.pixCreate(width, height, depth);
        if (handle == IntPtr.Zero) throw new InvalidOperationException("Failed to create pix, this normally occurs because the requested image size is too large, please check Standard Error Output.");
        Interop.LeptonicaApi.Native.pixSetResolution(handle, xres, yres);
        return Create(handle);

J'ai dû utiliser un extrait du constructeur Pix pour transformer la poignée (et l'objet Handle) en un objet HandleRef. Mais j'ai cette partie qui fonctionne maintenant, plus d'avertissement DPI. Mais je n'ai toujours pas de lecture OCR utilisable. Je vais essayer de télécharger à nouveau le fichier eng.trandata.

J'ai découvert que mon problème était que les options de PageSegMode sont différentes dans le wrapper 4.0.

Tout fonctionne comme prévu maintenant !

@masterisk Pouvez-vous préciser le problème que vous avez rencontré avec le PageSegMode s'il vous plaît et quelle option vous avez utilisée?

@wilfredcho après être passé à l'utilisation de Tesseract 4, j'avais conservé le même paramètre PageSegMode que j'avais utilisé pour la version précédente :
```C#
var page = moteur.Process(input, PageSegMode.LSTM)

or something of that nature. But in Tesseract 4, the options have changed to the following:

```C#
namespace Tesseract
{
    public enum PageSegMode
    {
        OsdOnly = 0,
        AutoOsd = 1,
        AutoOnly = 2,
        Auto = 3,
        SingleColumn = 4,
        SingleBlockVertText = 5,
        SingleBlock = 6,
        SingleLine = 7,
        SingleWord = 8,
        CircleWord = 9,
        SingleChar = 10,
        SparseText = 11,
        SparseTextOsd = 12,
        RawLine = 13,
        Count = 14
    }
}

Existe-t-il un moyen de détecter la résolution des images PNM ?

Cette page vous a été utile?
0 / 5 - 0 notes