tesseract错误的信心决定

时间:2015-06-27 12:38:04

标签: c++ ocr tesseract

我正在使用tesseract进行序列号识别。在tesseract中,有可能识别不同级别的文本,例如识别单个单词,行,段落,字符。还有可能获得每个级别的信心。 所以我看了一下我的序列号中每个角色的信心,并注意到tesseract通常不会将最高置信度的角色作为最佳选择。 有人经历过这种情况吗?我在承认时做错了吗?

此类引文的示例,正​​确的序列号应为: OC2VRHT5 查看最后一个字符。虽然" 5"有更高的信心,tesseract采取" S"作为最佳选择。

**Tesseract output:**
symbol O, conf: 88.679855   - O conf: 88.679855
                            - 0 conf: 88.592140
                            - G conf: 77.554398
                            - C conf: 76.861900
                            - U conf: 75.981255
                            - Q conf: 75.135574
---------------------------------------------
symbol C, conf: 86.341553   - C conf: 86.341553
                            - Q conf: 71.356201
---------------------------------------------
symbol Z, conf: 77.400093   - 2 conf: 88.078430
                            - Z conf: 77.400093
---------------------------------------------
symbol V, conf: 93.404572   - V conf: 93.404572
---------------------------------------------
symbol R, conf: 93.212280   - R conf: 93.212280
---------------------------------------------
symbol H, conf: 84.634628   - H conf: 84.634628
                            - N conf: 75.782585
---------------------------------------------
symbol T, conf: 92.986008   - T conf: 92.986008
---------------------------------------------
symbol S, conf: 79.127983   - 5 conf: 84.440292
                            - S conf: 79.127983
                            - B conf: 78.667168
                            - G conf: 78.661667
---------------------------------------------

我的实施:

//Initializing tesseract
tesseract::TessBaseAPI tess;
tess.Init(NULL, "eng", tesseract::OEM_TESSERACT_ONLY);
tess.SetPageSegMode(tesseract::PSM_SINGLE_BLOCK);

tess.SetImage((uchar*) cropImage.data, cropImage.cols, cropImage.rows, 1,
            cropImage.cols);
tess.SetVariable("save_blob_choices", "T");
tess.Recognize(0);

char* out = tess.GetUTF8Text();
std::cout << out << std::endl; //=> OCZVRHTS 

tesseract::ResultIterator* ri = tess.GetIterator();
    tesseract::PageIteratorLevel level = tesseract::RIL_SYMBOL;

    if (ri != 0) {
        do {
            const char* symbol = ri->GetUTF8Text(level);
            float conf = ri->Confidence(level);
            if (symbol != 0) {
                printf("symbol %s, conf: %f", symbol, conf);
                bool indent = false;
                tesseract::ChoiceIterator ci(*ri);
                do {
                    if (indent)
                        printf("\t \t \t");
                    const char* choice = ci.GetUTF8Text();
                    printf("\t- %s conf: %f\n", choice, ci.Confidence());
                    indent = true;
                } while (ci.Next());
            }
            printf("---------------------------------------------\n");
            delete[] symbol;
        } while ((ri->Next(level)));
    }

修改

虽然我第一次认为jaka-konda的答案解决了我的问题,但似乎有时结果更好,但有时候tesseract也没有采取最高的自信角色。需要进一步调查更大的数据库,但似乎的词典 完全禁用。

2 个答案:

答案 0 :(得分:1)

当您按符号迭代时,仍然会根据整个收集的词典完成文本识别。在你的例子中,一个单词将在中间包含数字的可能性非常低,因为它们被具有较高概率(字符)的选项所取代。为了解决这个问题,我建议减少字典影响值。

尝试将这些变量设置为false:

load_system_dawg 
load_freq_dawg
load_punc_dawg
load_number_dawg
load_unambig_dawg
load_bigram_dawg
load_fixed_length_dawgs

Tesseract常见问题解答:How to increase the trust in/strength of the dictionary?

代码:

GenericVector<STRING> pars_vec;
pars_vec.push_back("load_system_dawg");
pars_vec.push_back("load_freq_dawg");
pars_vec.push_back("load_punc_dawg");
pars_vec.push_back("load_number_dawg");
pars_vec.push_back("load_unambig_dawg");
pars_vec.push_back("load_bigram_dawg");
pars_vec.push_back("load_fixed_length_dawgs");

GenericVector<STRING> pars_values;
pars_values.push_back("0");
pars_values.push_back("0");
pars_values.push_back("0");
pars_values.push_back("0");
pars_values.push_back("0");
pars_values.push_back("0");

tesseract::TessBaseAPI tess; // = new tesseract::TessBaseAPI();
tess.Init(NULL, "eng", tesseract::OEM_TESSERACT_ONLY, NULL, 0, &pars_vec,
            &pars_values, false);

使用参数Tesseract-OCR API

初始化tesseract

答案 1 :(得分:0)

我为我迟到的回应道歉。我尝试了不同的方法和组合来禁用tesseract字典完成。 最后,我终于以两种不同的方式禁用了字典:

<强> 1。使用变量初始化 根据@ Jaka Konda answer的答案:

GenericVector<STRING> pars_vec;
    pars_vec.push_back("load_system_dawg");
    pars_vec.push_back("load_freq_dawg");
    pars_vec.push_back("load_punc_dawg");
    pars_vec.push_back("load_number_dawg");
    pars_vec.push_back("load_unambig_dawg");
    pars_vec.push_back("load_bigram_dawg");
    pars_vec.push_back("load_fixed_length_dawgs");

    GenericVector<STRING> pars_values;
    pars_values.push_back("F");
    pars_values.push_back("F");
    pars_values.push_back("F");
    pars_values.push_back("F");
    pars_values.push_back("F");
    pars_values.push_back("F");
    pars_values.push_back("F");


    tesseract::TessBaseAPI tess; // = new tesseract::TessBaseAPI();
    tess.Init(NULL, "eng", tesseract::OEM_TESSERACT_ONLY, NULL, 0, &pars_vec,
            &pars_values, false);

<强> 2。使用配置文件

由于我还没有找到任何信息,如何在初始化tesseract时加载tesseract配置文件,我想提供此代码。

char* a = "disableDictionary";
    char* hidden_array[1] = {a};
    char** argv = &hidden_array[0];
    tess.Init(NULL, "eng", tesseract::OEM_TESSERACT_ONLY, argv,
            1, NULL, NULL, false);
/ usr / share / tessdata / configs /

中的

disableDictionary

load_system_dawg    F
load_freq_dawg  F
load_punc_dawg  F
load_number_dawg    F
load_unambig_dawg   F
load_bigram_dawg    F
load_fixed_length_dawgs F

时间上的解决方案是迭代置信字符并选择信心最高的字符。

进一步有趣的是tesseract :: ChoiceIterator打破了,如果符号是&#34;&#34; (空)。因此,我将主页APIExample的原始源代码中的if条件调整为

if (symbol != 0 && strlen(symbol) != 0){...}