Tesseract5 fine tune Chinese character

Tesseract5 fine tune Chinese character如何实现?

Train Tesseract LSTM with tesstrain.sh on Windows中,有网友提到在Github/Tesseract中下载的chi_sim.traineddata无法识别”垤,箐,勐”等较为生僻的文字,我们是否能自行对chi_sim.traineddata进行Fine Tune呢?网友提出这个问题时,我用自己编译的Tesseract4版本尝试Fine tune失败,最近用Tesseract5和tesstrain的makefile训练上述文字成功,本文记录训练过程以及训练过程中的疑问。

环境说明

1.win10+x64+python3.10

2.tesseract-ocr-w64-setup-v5.0.1.20220118.exe(安装时需勾选training tools)

3.tesstrain

Fine Tune Chinese character

先假定我们的新字库的名称为chi_simFT,tesstrain下载后约定其解压路径为tesstrain-main

tessdata

find tune的基础字库需要从tessdata_best中下载,下载相应的chi_sim.traineddata,其存放路径为tesstrain-main\tessdata\chi_sim.traineddata

ground-truth

先用我们下载的chi_sim.traineddata进行验证测试图片,下图红色矩形划出的字是原字库无法正常识别的。

test tesseract5 chi_sim

在进行LSTM的Fine Tune时,我们应该让该文字多次出现在不同的词组或文本中进行训练。在准备训练文件时,针对上述无法正确识别的文字分别准备两个词语或两行文本图片,如下图所示。本文主要为测试,故准备的图片比较少,个人认为正式训练时应该需要更多的数据样本。

fine tune Chinese character

同时每张图片都有其对应的.gt.txt文件,该文件中存储的时图片中的文字,以UTF-8的格式存储,例如yongmeng.gt.txt对应的内容为:

所有的.png和gt.txt文件的路径均为tesstrain-main\data\chi_simFT-ground-truth,本文准备的.png和.gt.txt如下图所示。

fine tune Ground truth

.numbers/.punc/.wordlist/radical-stroke/Latin.unicharset

根据Train Tesseract LSTM with make的说明准备相应的.numbers/.punc/.wordlist/radical-stroke/Latin.unicharset,这些文件存放的路径为:tesstrain-main\data\。我们的基础字库是简体中文,因此我们从langdata_lstm/chi_sim/下载相应的文件放在相应的路径中。

Han.unicharset

训练中文时,我们还需要Han.unicharset这个文件,下载路径为https://github.com/tesseract-ocr/langdata_lstm
Tesseract将不同的语言分为Han,Arabic, Latin, Common, Greek, Cyrillic等等类别,不同类别的语言在langdata_lstm中分别对应一个unicharset文件。例如中文,日文,韩文共用Han.unicharset(韩文同时还需要依赖另一个Hangul.unicharset文件)。 unicharset 文件包含有关 Tesseract OCR 引擎被训练识别的每个符号 (unichar) 的信息,例如当前字符的UTF-8编码,isalpha、islower、isupper、isdigit、ispunctuation等字符属性,以及基线归一化坐标系下该字符的高度宽度等等信息。

MakeFile

Train traindata to OCR fraction with tesseract4.1一文中,我们提到过将tesstrain(20220420版本)在训练ocrd-testset时,虽然可以完成,但错误率非常高,但在实际测试中Fine-tune可以正常完成,本文暂不讨论训练ocrd-testset错误率高这个问题。我们先看要在win10下使用tesstrain的Makefile进行训练需要做的修改。
1. 将tesstrain(20220420版本)中makefile中的python3更改为python.
2.修改TESSDATA路径


修改为


3. 设置MODEL_NAME


4. 修改shell find

cygwin中无法执行shell find,有两种方式处理该问题点。

处理方式1: 将makefile中的两处shell find进行如下修改:

处理方式2: 参考tesstrain-win中makefile的代码进行修改,也是有两处:

在makefile中搜索 $(GROUND_TRUTH_DIR) -name ‘*.gt.txt’ , 找到如下代码:

将其修改为:

在makefile中再次搜索 $(GROUND_TRUTH_DIR) -name ‘*.gt.txt’ , 找到如下代码:

将其修改为:

做完上述修改后,打开命令提示符,进入tesstrain-main所在路径,运行如下命令:

在以上两种处理方式中,处理方式1在执行到lstmtraining命令时,会出现如下错误:

此时需要手动将tesstrain-main/data/foo/list.train, tesstrain-main/data/foo/all-lstmf,tesstrain-main/data/foo/list.eval换行符转换为LF,再次运行make training,即可顺利完成。

而处理方式2则可以顺利完成训练,不需要手动修改换行符。

正常训练完成的信息如下:

测试训练结果

训练得到的traineddata文件位于路径tesstrain-main\data下,将其拷贝至tesseract5的安装路径的tessdata文件夹中,我电脑的安装路径为D:\Program Files\Tesseract-OCR\tessdata,对同一张图片的测试结果如下:

对比chi_sim.traineddata和chi_simFT.traineddata的测试结果,我们会发现有以下几点差异:

1. chi_sim无法识别的“岔,垤,箐,勐”等文字,通过fine tune之后,chi_simFT可以正确识别这些文字。

2. 但在chi_simFT中,原本可以识别的“漫沙田”被识别为“漫阔田”,“伊萨河”被识别为“伊河”。

3. chi_sim识别的结果中格式与空格基本与图片一致,但经过fine tune之后,chi_simFT的识别格式则与图片的格式相去甚远。

由以上对比结果可知,fine tune之后的字库虽然可以识别针对性训练的文字,但又很多缺陷,可能是训练过程中有一些细节问题未处理好,还需要继续学习。

感谢阅读,欢迎交流。


发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub