tesseract 错误置信决策

Posted

技术标签:

【中文标题】tesseract 错误置信决策【英文标题】:tesseract false confidence decision 【发布时间】:2015-09-14 07:59:23 【问题描述】:

我正在使用 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 也没有取最高置信度字符。需要进一步调查更大的数据库,但似乎 tesseract 的字典 并没有 完全禁用。

【问题讨论】:

【参考方案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);

用参数初始化tesseractTesseract-OCR API

【讨论】:

哦,我明白了。我以为我不使用tesseract字典功能,因为它在序列号识别中没有意义。但这可能是我实际的错误较低概率问题的原因。我试试看! 如何使用 C++ 在 tesseract 中获取和设置变量,尚未找到任何相关信息。 ***.com/questions/31117382/… @Mr.Sheep 你不应该编辑这个答案。相反,您应该单击它旁边的复选标记以表明它回答了您的问题并为您工作。 好的,本来会更好,我认为代码在理论解决方案旁边。但遗憾的是tesseract也用到了字典,或者是取的不是置信度最高的字符,还用参数设置为false。编辑了我的问题。【参考方案2】:

对于我迟到的回复,我深表歉意。我尝试了不同的方法和组合来禁用 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/ 中的禁用字典

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 会中断。因此,我将首页 APIExample 原始源代码中的 if-condition 修改为

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

【讨论】:

以上是关于tesseract 错误置信决策的主要内容,如果未能解决你的问题,请参考以下文章

Tesseract的路径错误

Tesseract - 错误 net.sourceforge.tess4j.Tesseract - null

Tesseract 错误空间识别

错误!找不到命令“tesseract”。 (PHP 蒂亚戈莱西奥)

Tesseract 4.1.1 错误 eng.traineddata 在谷歌 colab 中找不到

tesseract-php 包装器在本地主机上运行时出现路径错误