我正在使用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也没有采取最高的自信角色。需要进一步调查更大的数据库,但似乎的词典 完全禁用。
答案 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
答案 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){...}