Train traindata to OCR fraction with tesseract4.1

 Tesseract的equ.traineddata不能识别下图中的分数,那么我们是否能自己训练一个可以识别分数的traineddata呢?在过去的文章中,我们提到过Tesseract有Train Tesseract LSTM with make Train Tesseract LSTM with tesstrain.sh的方式来训练自定义的traineddata文件。

fraction

 在最新的Tesseract4 Train的说明文档中已明确明说,tesstrain.sh已被弃用,因此本文中将用Train Tesseract LSTM with make提及的方式来训练分数。

tesseract4 abandon tesstrain.sh

环境说明

1. win10 x64

2. 源码编译的Tesseract4.1发布版

本文使用的是源码编译的Tesseract4.1发布版,Tesseract4.1源码编译的方法与Tesseract4.0类似,可以参考这里Tesseract4.0+VS2017+win10源码编译攻略。本文在设置好Tesseract相关环境变量的前提下进行。
这里给出我编译好的包含训练工具的Tesseract4.1的链接,需要的同学自取(The down load link of the compiled version 4.1 with trainingtools):https://drive.google.com/file/d/1ALfBsy5C2l9vJkJ_treAqCvcwS7cfoLX/view?usp=sharing
3. python3.x
makefile中会用到Python的Pillow库进行图像处理,请确认相应版本成功安装。
4. Cygwin
windows下运行makefile需要借助于cygwin,安装方法请参考Install Cygwin on Win10 for makefile.

训练步骤

1. 修改Makefile文件

下载tesstrain-win,假设其解压后文件名为tesstrain-win-master,而makefile的路径为:tesstrain-win-master/makefile。
打开makefile修改训练模型名称,本训练的新模型名称为fraction。

2. 准备训练文件

我们知道,LSTM的训练用图像以及.gt.txt文件以  文本行  为单位,因此我们准备多张类似下图的图片(.png)以及相应的.gt.txt文件,所有的.png和.gt.txt文件均放在路径tesstrain-win-master\data\fraction-ground-truth中,针对同一张图片,.png文件和.gt.txt的文件名相同。在准备图片时,可以用不同的字体生成每一种可能出现的分数的图片,这样可以得到很多图片样本,有助于提高训练结果的识别率。

fraction train data

这里我们暂且用[0]来替代图中的方框,上图对应的.gt.txt对应的内容为

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

根据Train Tesseract LSTM with make的说明准备相应的.numbers/.punc/.wordlist/Latin.unicharset/radical-stroke,这些文件存放的路径为:tesstrain-win-master\data。

.numbers file: Optional file for number patterns DAWG.

不同语言该文件中的内容不同。eng.numbers文件中存放与数字相关的单位或运算符,例如年,月份,天,上午,下午,时,分,秒等等。chi_sim.numbers只有一个字符 [ . ]。因为本次训练的traineddata只需要识别分数,因此本次训练用的fraction.numbers 文件中仅有[ / ]。

.punc file Optional file for punctuation DAWG.

语境中可能会用的到标点符号。本次训练用的fraction.func仅有标点[ , ]

.wordlist file Optional file for dictionary DAWG.

待训练文件中用到的单词列表。本次训练用的fraction.wordlist文件为空。

注:这三个文件直接用eng下的相应文件改名后的文件也可以,实测并不影响训练过程,训练得到的语言文件的大小以及识别结果。
radical-stroke.txt 该文件为中文而生,【radical-stroke】译为笔画部首,请参考https://github.com/tesseract-ocr/tesseract/issues/1216,除了中文,它并不会影响绝大部分训练的结果。

Chinese radical-stroke

4. 开始训练

以管理员身份运行命令提示符,进入tesstrain-win-master所在路径,运行如下命令:

最终训练结果如下:

5. 验证训练效果

fraction

Tesseract5训练模块测试说明

目前Tesseract Github给出最新的window下的Tesseract5安装版本(tesseract v5.0.1.20220118)中已包含tesseract的相关训练文件。我也用Tesseract5的训练文件进行了相关对比和验证,但用Tesseract5的训练ocrd-testset并未成功,这里记录下Tesseract5训练模型的相关对比结论以及测试过程,供参考。

tesstrain(20220420版本)中的makefile与tesstrain-win的makefile相比,有以下两点差异:

1. PSM的默认值由6更改为13,相关说明请参考GT4HistOCR LSTMF file are not getting generated for some part of dataset

makefile PSM13

PSM6 PSM13

2. tesstrain(20220420版本)中的makefile寻找.gt.txt文件的代码为:

tesstrain-win的makefile中使用的代码为:

此处tesstrain(20220420版本)使用了[ shell find -L],因为cygwin中的find命令与windows下的find命令重名,要在cygwin中使用find命令,需要用/usr/bin/find,因此将tesstrain(20220420版本)makefile中[shell find -L]均修改为[shell /usr/bin/find -L],此语句才能正常执行。

除了上述两点差异,要正常执行tesstrain(20220420版本)中makefile,还需要做如下修改:

1. 将tesstrain(20220420版本)中makefile中的python3更改为python.

2. TESSDATA = $(LOCAL)/share/tessdata修改为TESSDATA=data/tessdata. 训练ocrd-testset属于train from scratch,并未用到初始traineddata,此处不作修改也无妨;若大家要用Fine tune,需要在data/tessdata提前准备好初始traineddata。

假定tesstrain下载并解压后在本地电脑中的名称tesstrain-main,以管理员身份运行命令提示符,进入tesstrain-main所在路径,运行如下命令:

在执行到lstmtraining命令时,会出现如下错误:

经过查证,发现该版本生成的all-lstmf, list-eval, list.train文件的换行符为CR+LF,但是cygwin需要换行符为LF。手动将上述文件换行符修正为LF后可以继续运行,但最终训练结果错误率为99.842。

tesseract5 train results

在前述两个makefile的差异点中,关于[shell find]和[wildcard]的差异部分,如果直接将[shell find]相关代码修改为tesseract4.1版本中使用的[wildcard]相应代码,则训练过程不会出现all-lstmf, list-eval, list.train换行符的问题,可以正常训练完成,但是其最后结果的错误率也在99.5%以上,且经过验证,设定PSM=6或PSM=13并不影响结果,目前原因暂不明确,Github上也未见相关说明或者issue。

感谢阅读,欢迎交流!

发表评论

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

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

Fork me on GitHub