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 - 错误 net.sourceforge.tess4j.Tesseract - null
错误!找不到命令“tesseract”。 (PHP 蒂亚戈莱西奥)