ubuntu下使用Tesseract-ocr(编译、安装、使用、训练新的语言库)_frequent_words_list-程序员宅基地

技术标签: Unix  CV  识别  ubuntu  训练  语言库  tesseract-ocr  

本文前半部分是来自http://www.qisanfen.com/?p=185的一篇文章,主要讲了安装、训练的大致流程,注意如果需要训练语言库需要把所需要的库安装完整

后半部分大致是官方wiki的翻译版本

如果只安装,不训练,可以看我的另一篇比较简洁的文章http://blog.csdn.net/yimingsilence/article/details/51276138

关于训练的具体细节可以查看官方wiki : https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract

或者wiki的翻译版本http://qianjiye.de/2015/08/tesseract-ocr 和 http://yanghespace.com/2015/11/01/Tesseract3训练新语言/


安装、训练的大致流程

OCR的全称是Optical Character Recognition,是指识别计算机图片中的文字内容的过程。

Google Project下有一个C++开源项目叫做tesseract-ocr,这是一个命令行工具,运行时指定需要进行识别的图片,识别出来的文字存储在指定的文本文件中。它能识别包括中文在内的大多数语言,虽然初始安装时只能正确识别比较规范的字体,但可以通过训练提高其识别精确度。所谓训练,实际上就是通过一系列tesseract-ocr提供的工具,根据需要识别的语言及其字体的特点,生成一个以traineddata为扩展名的文件,文件名可随意,不过一般以语言缩写命名,比如训练英文生成的文件就是eng.traineddata,训练简体中文生成的文件就命名为chi_sim.traineddata。使用tesseract对某一图片进行文字识别时,需要指定识别成哪一种语言,然后tesseract就会读取对应该语言的traineddata进行识别。在我安装的ubuntu系统下,安装tesseract-ocr后,其使用的traineddata存放在/usr/local/share/tessdata/目录下。因此只要将你的训练结果复制/替换到这个目录下,tesseract就会根据你的训练结果来识别对应的语言了。由于安装和训练是独立的,你的训练结果可以在多个安装环境下使用;并且,如果有人共享了识别率较高的训练结果,你也不需要自己进行繁琐(是的,安装tesseract-ocr很简单,训练很麻烦)的训练了。

本文记录如何在ubuntu下安装,使用,训练tesseract-ocr。

词汇说明:

  • tesseract-ocr是项目名称,tesseract是安装tesseract-ocr后用于文字识别的命令行工具名称,本文不对两者进行严格的区分。

安装

用aptitude安装

如果你不打算自己训练tesseract(训练工具得通过源代码编译安装),或者想先体验一下tesseract的功能,那么最快速简单的方法就是使用aptitude了。关于aptitude的用法请参考官方User Manual

从源代码安装安装

在安装tesseract-ocr之前,如同官方wiki文档指出的那样,需要先安装一些Dependencies,包括:autotools-dev, libleptonica-dev, autoconf, automake, libtool, libpng12-dev, libtiff4-dev, zlib1g-dev, libicu-dev。这些可以用apt-get安装,也可以用aptitude,我使用的是aptitude。wiki中还提到了libjepg62-dev,但aptitude提示其与libtiff4-dev有冲突,因此我没有安装,但这并不影响本文提到的tesseract的使用及基础训练。

接下来下载代码,可以选择从svn下载,也可以直接下载代码压缩包。svn中包含了很多语言的traineddata,总共有600多M,而单纯的代码包只有几M。由于svn代码较新,相对代码压缩包来说,多了一些本文要用到的训练工具,因此我这里选择从svn下载安装。

代码checkout之后,在terminal下进入这个源代码文件夹,然后按顺序执行以下命令开始编译安装。

./autogen.sh
./configure
make
sudo make install
sudo ldconfig

到了这一步,你就可以看到 tesseract 已经被成功安装了

安装语言文件(Language Data)

在你用tesseract识别某一种语言之前,必须要确保你安装了对应的语言文件(Language Data,这是tesseract-ocr训练生成的文件,不是操作系统的语言包)。要查看是否安装了某种语言,只需要查看 /usr/local/share/tessdata/ 目录下是否有以该语言命名的traineddata就可以了,如果有eng.traineddata,那说名tesseract可以识别英文了,同样,chi_sim.traineddata对应于简体中文。

如果某种语言没有安装,安装方法也很简单,首先到官方下载列表里面找到并下载对应语言包。比如我要识别英文,而我安装的tesseract-ocr是3.02版本的,就下载对应版本的英文语言包 tesseract-ocr-3.02.eng.tar.gz。下载后解压,然后将解压出来的tesseract-ocr/tessdata/目录下的所有文件剪切到 /usr/local/share/tessdata/ 目录下即可。

如果你是通过build 从svn下载的代码 来安装的话,源代码目录下的tessdata子文件夹下就有tesseract能识别的各种语言的语言文件,直接将这里的语言文件复制到 /usr/local/share/tessdata/ 目录下就行了。或者你也可以用安装命令来安装语言文件,在源代码根目录执行以下命令进行安装:

  • 安装部分语言文件
    sudo make install LANGS="eng chi_sim"
  • 安装tesseract支持的所有语言文件
     sudo make install-langs

如何卸载通过编译源代码安装的tesseract-ocr

在接下来的使用、训练过程中,如果你想要试一下不同安装方法,你就需要知道如何卸载从源代码安装的tesseract-ocr。方法是在源代码根目录下执行以下代码以便卸载tesseract:

sudo make uninstall

卸载过程会删除包括 /usr/local/include/tesseract 目录下的头文件,/usr/local/bin 下的可执行文件,/usr/local/lib 下的库文件,以及 /usr/local/share/tessdata 下的训练文件在内的 tesseract 相关文件。

在源代码的training子目录下执行同样的代码即可卸载training tools。

使用

语言文件安装完成后,就可以开始识别了。比如我有下面这张图片 tesseract-line.png

要识别这张图片里面的英文,只需执行以下命令:

$ tesseract tesseract-line.png tesseract-line -l eng

这条命令里面,第一个参数指定需要进行文字识别的图片地址,第二个参数指定存放识别出文字的不包括扩展名的文件名,最后一个参数-l eng指定用什么语言库进行识别。比如这里指定了eng,tesseract就会根据eng.traineddata进行识别。实际上traineddata文件名可以随便取,只要使用tesseract进行文字识别的时候也用相同的名字就行了。

这里识别的结果存在一个名为tesseract-line.txt的文件中,可以看到tesseract识别这种字体清晰的图片还是很准确的:

 

训练 ,这才是硬骨头

前面试着用tesseract识别了一张字体清晰的图片,接下来试一下一个比较简单的验证码图片。

这几个字母经tesseract识别就成了MWLS,可见直接使用官方提供的语言文件时 tesseract 的识别精度是不足以实际应用的。所幸的是,tesseract-ocr提供了一系列工具用于生成自定义的语言文件,这一过程就叫做训练。

安装训练工具

在进行训练之前,首先需要安装tesseract-ocr提供的训练工具。

在编译安装训练工具之前,还得先安装这些包 : libicu-dev, ligpango1.0-dev, libcairo2-dev

另外,确保在源代码根目录下执行过以下几条命令

./autogen.sh
./configure
make

前面提到过,这些命令也是通过源代码安装tesseract前必须执行的。如果前面执行过,这里就不必再执行一遍了。这几条命令,前两条用于生成Makefile文件,包括根目录及各子目录(如training, ccutil),第三条命令是进行编译tesseract及其依赖的一些项目。由于训练工具也会依赖这些项目,因此在编译训练工具之前需要先编译这些依赖的项目。

接下来就可以进入到源代码的training子目录,然后执行以下命令编译并安装训练工具

$ sudo make install

训练过程初探,前面都是准备工作,这才是重点与难点。由于训练过程涉及到很多知识,这里只介绍完成训练所需要的最基本的操作方法,不细讲原理,也要求训练结果能否提高识别率。通过这一教程对训练过程有了初步的认识后,我会在另一篇文章里面进行更加详细的介绍。

  1. 生成训练图片
    首先用你要训练的语言创建一个文本文件,比如我要训练英文,就创建了一个名为training_text.txt的文本文件

    这个文本文件必须包含你希望tesseract识别的所有字符,并且为了提高识别精度,将来在要识别的图片中出现频率高的字符也应该在这个文本文件里出现更多次。接下来,需要用到一个叫做text2image的训练工具对这个文本文件进行分析,生成一张包含这些文字的图片,以及个字符在这张图片上的位置信息。text2image的用法为:

    $ text2image –text=training_text.txt –outputbase=[lang].[fontname].exp0 –font='Font Name' –fonts_dir=/path/to/your/fonts

    可以看到,这里需要指定一个truetype字体(字体文件以ttf为扩展名),这个字体就是你希望tesseract能够识别的字体。在ubuntu系统的/usr/share/fonts/truetype/freefont/目录下有一个FreeMono.ttf,这里就以这个字体为例进行训练

    $ text2image –text=training_text.txt –outputbase=eng.freemono.exp0 –font=FreeMono –fonts_dir=/usr/share/fonts/truetype/freefont/

    如果这一步执行成功,你会看到类系下面截图的信息,并且text2image会生成两个文件:eng.freemono.exp0.tifeng.freemono.exp0.box,前者是包含training_text.txt文字的图片文件,后者是一个文本文件,记录各字符在这个图片文件中的位置信息。如果执行成功,跳到第2步。

    如果你执行text2image时碰到类似于"text2image: error while loading shared libraries: libtesseract.so.3: cannot open shared object file: No such file or directory."的报错,那就先执行以下命令再重试,具体原因参考stackoverflow

    export LD_LIBRARY_PATH=/usr/local/lib

    如果执行text2image的时候命令行输出了几十行的dump信息,那很可能你的tesseract-ocr不是通过源代码编译安装的,我碰到个过这种情况,最后改成从源代码编译安装解决。
     

  2. 开始训练
    用tesseract进行训练的命令用法为:

    tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] box.train.stderr

    用于我们前面生成的tif及box文件,就是:

    tesseract eng.freemono.exp0.tif eng.freemono.exp0 box.train.stderr

    正确执行的结果如下图:

    这一步会生成两个文本文件:eng.freemono.exp0.treng.freemono.exp0.txt,后者只有一些换行符,前者对应于box文件中各字符在tif图片文件中的形状信息,记录的方式实际上是将一个字符看成是一个多边形,而tr文件记录的就是多边形每条边的位置、方向、长度等信息。
     

  3. 生成字符集信息,这需要用到一个叫unicharset_extractor的训练工具
    具体用法为:

    unicharset_extractor lang.fontname.exp0.box lang.fontname.exp1.box …

    我们前面只生成了一个box文件,因此执行以下命令收集字符集信息:

    unicharset_extractor eng.freemono.exp0.box

    成功执行的结果如下图:

    这一步会生成一个名为unicharset的文本文件,正如其名字表明的,这个文件记录的是一个字符集,它存有box文件里面不重复的字符信息,每个单独字符占一行。
     

  4. 创建字体信息文件font_properties
    由于我们可以训练tesseract识别同一种语言的不同字体(这里只训练一种字体),我们需要提供字体相关的特性,这是通过一个叫做font_properties的文本文件标明的。这个文件的每一行以如下格式记录了一个字体的信息:

    <fontname> <italic> <bold> <fixed> <serif> <fraktur>

    本文的训练中使用了名为FreeMono的字体,因此font_properties里面需要有一行以FreeMono开头的字体信息。
    除了手动创建这个文件外,tesseract-ocr源码中也提供了一个这样的font_properties文件(training/langdata/font_properties),并且里面已经有了很多字体的信息,因此这里就不许要手动创建了,后面的步骤要用的这个文件的时候,直接指定使用这个文件就行了。源代码中的font_properties文件关于FreeMono字体的信息是:
    FreeMono 0 0 1 1 0
     

  5. 聚合
    shapeclustering, mftraining及cntraining的用法

    shapeclustering -F font_properties -U unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr …
    mftraining -F font_properties -U unicharset -O lang.unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr …
    cntraining lang.fontname.exp0.tr lang.fontname.exp1.tr …

    首先使用shapeclustering

    shapeclustering -F source/training/langdata/font_properties -U unicharset eng.freemono.exp0.tr

    成功执行结果如下图,这一步会输出一个名为shapetable的文件,下一步的mftraining会自动在当前目录加载这个文件。

    接下来执行mftraining

    mftraining -F source/training/langdata/font_properties -U unicharset -O eng.unicharset eng.freemono.exp0.tr

    成功执行结果如下图(输出结果有警告,但不影响),执行完成后会生成三个文件:eng.unicharsetinttemppffmtable

    最后执行cntraining

    cntraining eng.freemono.exp0.tr

    成功执行的结果如下图,这一步生成一个名为normproto的文件

     

  6. 合并生成traineddata文件
    首先将前面生成的几个文件(包括shapetable, normproto, inttemp, pffmtable)更名为以lang.开头(在这里,就是以eng.开头,比如eng.shapetable, eng.normproto等等),然后执行以下命令将它们合并成一个traineddata文件(eng.traineddata

     
  7. 至此,训练完毕,只需按照前述的安装语言文件的方法安装训练得到的eng.traineddata就可以开始使用你的训练成果了。需要注意的是,根据本文的训练生成的traineddata只能识别本文最初创建的training_data.txt中存在的字符,并且只能识别字体与FreeMono接近的文字。我试着用这个traineddata识别“使用”一节中提到过的tesseract-line.png文件,会得到如下结果:
    Pummg Bt a" mgemer
    可见这种简单的训练识别率是很低的。本文只是简单的介绍一下训练的过程,我之后会写一篇旨在提高识别精度的更具体的训练过程,敬请期待。



这是关于如何使用Tesseract3训练新的语言的文档,该文档是tesseract-ocr官方wiki上翻译过来的。

1.介绍

Tesseract3.0x是支持训练的。这篇文章描述如何训练的过程,提供适用于各种语言的一些指导方针,以及训练会得到的结果。对于Tesseract2.0x的训练参考:TrainingTesseract.

2.背景及局限性

Tesseract原来仅仅为了识别英文而设计的。我们做了许多努力来使得识别引擎及训练系统能够应对不同语言及UTF-8字符。Tesseract3.0能够处理任意的UTF-8字符,但是还是只能对部分的语言成功处理,因此在期望Tesseract能够对你的特定语言处理前,你要注意下这个细节。

Tesseract3.01添加了从上到下排列的语言,Tesseract3.02添加了希伯来语(Hebrew)(从右到左排列)。现在Tesseract可以使用一个辅助引擎(称为cube)来应对类似阿拉伯语(Arabic)的文本。

Tesseract对于大量字符集的语言(如中文)训练/识别缓慢(译者注:由于字符集非常大,增加了训练/匹配时间),但是也能够正常工作。

Tesseract需要了解一个字符的形状,通过将不同字体明确分开。之前对字体数量限制在32个,现在增加到了64个。这个可以通过intproto.h中常量MAX_NUM_CONFIGS 进行设置。注意运行时间很大程度上依赖于字体数量,如果训练字体数量大于32将会非常缓慢。

如果训练的语有不一样的标点及数字,会不利于一些硬编码的算法,在这些算法中,都假设是ASCII字符集中的标点及数字。这个局限在3.0x(x>=2)版本中已经修改。

你需要在你的输入文件路径下运行所有的命令行。

3.所需的附加库

从3.03版本开始,需要一些附加库用来建立你的训练工具:

sudo apt-get install libicu-dev
sudo apt-get install libpango1.0-dev
sudo apt-get install libcairo2-dev

4.建立训练工具

从3.03版本开始,如果你从源码编译Tesseract,你需要另外使用make命令来安装训练工具:

make training
sudo make training-install

5.所需的数据文件

为了训练另一种语言,需要在tessdata子目录下创建一些数据文件,然后在使用combine_tessdata把这些文件合并成单个文件。命名约定为:languagecode.file_name,Language codes最好按照ISO639-3标准。English对应的训练依赖文件(3.00)为:

  • tessdata/eng.config
  • tessdata/eng.unicharset
  • tessdata/eng.unicharambigs
  • tessdata/eng.inttemp
  • tessdata/eng.pffmtable
  • tessdata/eng.normproto
  • tessdata/eng.punc-dawg
  • tessdata/eng.word-dawg
  • tessdata/eng.number-dawg
  • tessdata/eng.freq-dawg

最后合并的文件为:

  • tessdata/eng.traineddata

并且文件

  • tessdata/eng.user-words

仍然可以单独提供。合并的traineddata只是简单的将输入文件串联,通过一个列表目录记录已知的文件类型的偏移量。可以查看源码ccutil/tessdatamanager.h中当前接受的文件名。注意traindata中包含的文件和3.00版本之前的已经不同。并且可能在今后的修订中大幅修改。

5.1 文本输入文件的要求

文本输入文件(如lang.config, lang.unicharambigs, font_properties, box files, wordlists for dictionaries…)需要满足以下条件:

  • 没有BOM的ASCII或者UTF-8字符
  • Unix下的行结束符(‘\n’)
  • 文件结束符为行结束符(‘\n’).否则会提示错误信息“ast_char == ‘\n’:Error:Assert failed…”
5.2 你可以忽略哪些?

unicharset, inttemp, normproto, pfftable这些文件是一定要创建的。如果你只要识别相似或一个字体,那么一个简单的训练也就够了。其他的文件不太需要,但是可以帮助提高精度,这要看你的需求了。老版的DangAmbigs已经被unicharambigs替代。

6.训练过程

尽管已经有很多自动化的过程,但是有些步骤还是得手动。以后可能会有更多的自动化工具,但是需要一些复杂的安装过程。下面这些工具都是在训练子目录下自带的。

6.1 生成训练图片

首先确定需要的字符集,然后准备一个保护这些字符的文本。在创建训练文件时需要牢记以下几点:
+确保每个字符有最低的样本数,10个的话很好,对于稀少的字符5个也OK。

  • 对于常用的字符需要更多的样本——至少20个。
  • 对于标点和字符要打散。比如“The quick brown fox jumps over the lazy dog. 0123456789 !@#$%^&(),.{}<>/?”这样就很差。最好是类似这样排列:“The (quick) brown {fox} jumps! over the $3,456.78 #90 dog & duck/goose, as 12.5% of E-mail from [email protected] is spam?”这样可以让textline finding代码对于特殊字符更好的找到baseline.
6.2 自动方式-创建tif/box文件

准备UTF-8的字符文本(training_text.txt)包含你所需要的字符。获取你想要识别的字符字体(trueType(微软和Apple公司共同研制的字型标准)或者是其他字体)。对于每一种字体运行下面的命令行,创建对应的tif/box文件:

training/text2image —text=training_text.txt —outputbase=[lang].[fontname].exp0 —font=’Font Name’ —fonts_dir=/path/to/your/fonts

注意参数—font可以包含空格,因此必须加上引号,例如:

training/text2image —text=training_text.txt —outputbase=eng.TimesNewRomanBold.exp0 —font=’Times New Roman Bold’ —fonts_dir=/usr/share/fonts


text2image还有许多其他命令行参数,可以查看traning/text2image.cpp获取更多信息。

如果你的应用可以使用text2image,非常好!你可以直接跳到6.4运行tesseract进行训练

6.3 手动方式-创建tif/box文件
6.3.1 获取tif图像
  • 在打印文本时需要凸出空格,因此在文本编辑器中就需要增大字符间距及行间距。不充足的空格距离可能导致生成*.tr文件时弹出“FAILURE! box overlaps no blobs or blobs in multiple rows”错误信息,而这又会导致另一个错误————某个字符”x”没有样本,然后弹出“”Error: X classes in inttemp while unicharset contains Y unichars”,这样的训练数据就不能用了。以后我们会解决这种问题,但是3.00的版本还是会出现这种情况。
  • 训练文件应该要以字体区分。理想的情况是单一字符的所有样本都在同一个tiff图像中,但这样可能需要多页tiff(如果你安装了libtiff或者是leptonica),这样单一的字体中包含的训练数据可能有很多页并且包含成千上万的字符,同时允许对大字符集语言进行训练。
  • 不要再一个图像文件中混淆字体这会导致聚类时特征的丢失,从而导致识别错误。

下一步就是打印并扫描图像,用来创建你的训练页。最多支持64个训练页。最好创建包含斜体及黑体的混合的字体及样式(但是要在不同的文件中)。

注意对真实图像进行训练有点困难,这是由于间隔宽度的要求。这在今后的版本中会得到改善。

同时你需要保存一份包含训练文本的UTF-8的文件,在后面的步骤中将会用到。

对于大量的训练数据说明.64个图片是对字体个数的限制。每个字体应该放在单一的多页tiff文件中,并且box文件可以对指定页码的字符坐标修改。因此对于给定字体可以创建任意数量的训练数据,也运行对大字符集语言进行训练。对于一个字体,也可以用多个单页tiff文件来代替多页tiff文件, and then you must cat together the tr files for each font into several single-font tr files.不管如何,输入给mftraining的tr文件,必须各自包含单个字体。

6.3.2生成box文件

下一步,Tesseract对每个训练图像需要一个’box’文件。box文件是一个文本文件,按序排列了训练图片的字符及字符的外包矩形框坐标。Tesseract3.0有一个模式可以生成所需格式的box文件,然后你需要手动编辑这个box文件,使得正确的字符和位置能够对应。

对每个训练图片运行如下命令行:

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox


例如:

tesseract eng.timesitalic.exp0.tif eng.timesitalic.exp0 batch.nochop makebox

现在是最困难的地方。你需要对[lang].[fontname].exp[num].box文件进行编辑,你需要在每一行开始的位置输入正确的UTF-8格式字符,来代替Tesseract自动生成的错误的字符。例如,下面是例子图片eurotext.tif的输出box文件(第141-154行):

s 734 494 751 519 0
p 753 486 776 518 0
r 779 494 796 518 0
i 799 494 810 527 0
n 814 494 837 518 0
g 839 485 862 518 0
t 865 492 878 521 0
u 101 453 122 484 0
b 126 453 146 486 0
e 149 452 168 477 0
r 172 453 187 476 0
d 211 451 232 484 0
e 236 451 255 475 0
n 259 452 281 475 0

由于Tesseract是在英文模式下运行的,它不能正确的识别变音符号。这个需要一个合适的编辑器来输入。一个支持UTF-8的编辑器就够了,HTML编辑器是个不错的选择(linux下的Mozilla可以直接编辑UTF-8文本,Firefox和IE浏览器则不支持)。MS的Word支持不同的字符编码,Notepad++也支持。Linux和Windows都有一个字符列表用来拷贝不能手打的字符。如用ü代替u。

理论上,每一行都只有一个字符。但是在水平方向上分离的一个字符,可能被单成两个,例如下双引号“„”,你需要合并这两个box:例如,第116-229行:

D 101 504 131 535 0
e 135 502 154 528 0
r 158 503 173 526 0
, 197 498 206 510 0
, 206 497 214 509 0
s 220 501 236 526 0
c 239 501 258 525 0
h 262 502 284 534 0
n 288 501 310 525 0
e 313 500 332 524 0
l 336 501 347 534 0
l 352 500 363 532 0
e 367 499 386 524 0
” 389 520 407 532 0

注意2,3列表示左上角坐标lefttop,4,5列表示右下角坐标rightbottom,最后一列是对应的多页tiff图像中的页码。坐标系以图上左上角为原点。合并后的结果:

D 101 504 131 535 0
e 135 502 154 528 0
r 158 503 173 526 0
„ 197 497 214 510 0
s 220 501 236 526 0
c 239 501 258 525 0
h 262 502 284 534 0
n 288 501 310 525 0
e 313 500 332 524 0
l 336 501 347 534 0
l 352 500 363 532 0
e 367 499 386 524 0
” 389 520 407 532 0

已经有许多个可视化Box编辑器,请点击AddOns wiki.

6.3.3引导新的字符集

如果你训练的是全新的字符集,你可以先使用一种字体来获取box文件,再运行下面的训练步骤生成一个traindata,然后再使用Tesseract处理其他的字体的box文件:

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] -l yournewlanguage batch.nochop makebox


这样能提高你的box文件中的字符正确率,减少编辑。你可以用这种方法来增加新的字体,但是要注意没有一种训练模式可以在已有的traindata中添加新的训练数据。这意味着每一次你运行mfTraining和cnTraining都是从你提供的tr文件创建一个新的数据文件,并不可以直接在现有的intproto/pffmtable/normproto中直接添加。

6.3.4 tif/box文件要一一对应

一些tif/box文件可以在下载页面下载。(注意tif文件经过G4压缩,要使用libtiff进行解压缩)。你可以按照下面操作获取更好的训练数据:

    1. 过滤box文件,保留你想要的字符行。
    1. 运行tesseract进行训练(后面介绍)。
    1. 在多种语言中获取你想要字符的每种字体的tr文件,并且添加你自己的字体或者字符。
    1. 以相同的方式获取已过滤的box文件到.tr文件中,以便在unicharset_extractor中处理。
    1. 进行剩余的训练过程。

注意!这没有想象的那么简单!(cntraining and mftraining can only take up to 64 .tr files, so you must cat all the files from multiple languages for the same font together to make 64 language-combined, but font-individual files. The characters found in the tr files must match the sequence of characters found in the box files when given to unicharset_extractor, so you have to cat the box files together in the same order as the tr files. The command lines for cn/mftraining and unicharset_extractor must be given the .tr and .box files (respectively) in the same order just in case you have different filtering for the different fonts. There may be a program available to do all this and pick out the characters in the style of character map. This might make the whole thing easier)

跳转到的地方

6.4 运行tesseract进行训练

对每一对训练图片和box文件,运行下面命令行:

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] box.train


或者

tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] box.train.stderr


第一个命令行会把所有错误信息记录在tesseract.log中。第二个命令行会在stderr中输出。

注意box文件名和tif文件名要相同,并且在相同路径下,否则Tesseract会找不到。输出文件为fontfile.tr,这个文件保护训练页中每个字符的特征。[lang].[fontname].exp[num].txt will also be written with a single newline and no text.

重要的是检查apply_box输出中是否有错误。如果存在FATALITIES报告,那么没有必要继续训练过程指导你修复了box文件。新的box.train.stderr配置文件让输出的定位变得更简单。一个FATALITY通常提示当前步骤在你的box文件中寻找某个字符的训练样本时失败。不是坐标错了,就是图片中对应字符图片出错了。如果一个字符不存在可以操作的样本,它就不能被识别,生产的inttemp文件也不会匹配unicharset文件,Tesseract将中止。

另一个可能出现的错误也是致命的——“Box file format error on line n”。If preceded by “Bad utf-8 char…” then the utf-8 codes are incorrect and need to be fixed. The error “utf-8 string too long…” indicates that you have exceeded the 24 byte limit on a character description. If you need a description longer than 24 bytes, please file an issue.

没有必要对[lang].[fontname].exp[num].tr文件的内容进行编辑。下面是tr文件的一些格式:

Every character in the box file has a corresponding set of entries in
the .tr file (in order) like this
UnknownFont 2
mf
x y length dir 0 0
… (there are a set of these determined by
above)
cn 1
ypos length x2ndmoment y2ndmoment

The mf features are polygon segments of the outline normalized to the
1st and 2nd moments.
x= x position [-0.5.0.5]
y = y position [-0.25, 0.75]
length is the length of the polygon segment [0,1.0]
dir is the direction of the segment [0,1.0]

The cn feature is to correct for the moment normalization to
distinguish position and size (eg c vs C and , vs ‘)

6.5 计算字符集

Tesseract需要知道它tractor可以输出的字符集。为了生成unicharset数据文件,使用unicharset_ex程序处理box文件:

unicharset_extractor lang.fontname.exp0.box lang.fontname.exp1.box …


Tesseract访问字符的属性:isalpha, isdigit, isupper, islower, ispunctuation。该数据而可以以unicharset的数据形式被编码。每一行对应一个字符。UTF-8的后面是表示二进制掩码编码性质的十六进制数。每个bit表示一个属性。如果bit设置为1,表示该属性为真。这些为按顺序排列(从最低位到最高位): isalpha, islower, isupper, isdigit, ispunctuation。

例子:

  • “;”是标点,它的属性表示为10000(0x10)。
  • “b”是字母表中的小写字符,它的属性表示为00011(0x3)。
  • “W”属性为00101(0x5)。
  • “7”属性为01000(0x8)。
  • “=”既不是标点也不是字母,属性为00000(0x0)。

    ; 10 Common 46
    b 3 Latin 59
    W 5 Latin 40
    7 8 Common 66
    = 0 Common 93

中文和日文的字符也在最低位表示,如00001(0x1)。

如果你的系统支持宽字符处理函数,这些值都将通过unicharset_extractor自动设置,没有必要自己编辑。老的系统(如Windows95)可能要手动编辑。

注意unicharset文件必须在inttemp, normproto和pffmtable生成时重新生成(换言之,这些文件在box文件改变时必须重新创建)。

最后两列表示脚本类型(Latin, Common, Greek, Cyrillic, Han, null)和给定语言的字符编码。

6.5.1 set_unicharset_properties(3.03版本新增)

在3.03中新的工具和数据文件可以用来添加额外的属性,大部分是字符的大小:

training/set_unicharset_properties -U input_unicharset -O output_unicharset —script_dir=training/langdata

6.6 font_properties(3.01版本新增)

在3.01中训练过程需要font_properties文件。这个文件的目的是提供字体信息,以便在识别出来的结果中给出字体信息。font_properties是通过mftraining的-F filename选项处理的文本文件。

font_properties每一行的格式为:

<fontname> <italic> <bold> <fixed> <serif> <fraktur>

其中<fontname>是一个字符串(不能有空格),其他<italic> <bold> <fixed> <serif> <fraktur>都是以0,1标记,表示该字体是否有该属性。

当运行mftraining时,每个.tr文件名必须对应一个font_properties文件,否则将中止。

例子:
font_properties文件:

timesitalic 1 0 0 1 0

shapeclustering -F font_properties -U unicharset eng.timesitalic.exp0.tr
mftraining -F font_properties -U unicharset -O eng.unicharset eng.timesitalic.exp0.tr

注意在3.03中,training/langdata/font_properties是默认的font_properties文件,包含3000个字体(不一定需要)。

6.7 聚类

当所有的训练页中的字符特征已将被提取,我们需要对它们进行聚类。字符形状可以通过 shapeclustering (3.02版本后允许), mftraining and cntraining programs程序进行聚类:

shapeclustering -F font_properties -U unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr …

shapeclustering通过形状聚类创建一个主字形表,并且写入文件-shapetable。

注意:如果你没有运行shapeclustering,mftraining也会产生一个shapetable.你必须在你的traindata中包含这个shapetable,不管shapeclustering是否运行过。

mftraining -F font_properties -U unicharset -O lang.unicharset lang.fontname.exp0.tr lang.fontname.exp1.tr …

-U 文件表示由上面的unicharset_extractor生成的unicharset,lang.unicharset是输出文件,提供给combine_tessdata处理。mftraining会输出另外两个数据文件:inttemp(字符形状原型the shape prototypes)和pffmtable(每个字符期望的特征个数the number of expected features for each character)。(另外一个文件Microfeat也会生成,但是没有用。)

cntraining lang.fontname.exp0.tr lang.fontname.exp1.tr …


这个生成normproto数据文件(字符归一化敏感度原型the character normalization sensitivity prototypes)。

6.8 字典数据(可选)

Tesseract为每个语言最多使用8个字典文件。它们都是可选的,用来帮助Tesseract不同字符组合的可能性。

有7个文件编码为Directed Acyclic Word Graph(DAWG),另一个是简单的UTF-8文本:

为了生成DAWG字典文件,你首先需要你所训练语言的单词表。你可以从拼写检查中发现一个合适的字典(如ispell, aspell和hunspell)————注意license。单词表用UTF-8的格式表示的话一个单词一行。把单词量拆成需要的集合,如:频繁出现的单词,剩余的单词,然后使用wordlist2dawg用来生成DAWG文件:

Name Type Description
word-dawg dawg A dawg made from dictionary words from the language.
freq-dawg dawg A dawg made from the most frequent words which would have gone into word-dawg.
punc-dawg dawg A dawg made from punctuation patterns found around words. The “word” part is replaced by a single space.
number-dawg dawg A dawg made from tokens which originally contained digits. Each digit is replaced by a space character.
fixed-length-dawgs dawg Several dawgs of different fixed lengths —— useful for languages like Chinese.
bigram-dawg dawg A dawg of word bigrams where the words are separated by a space and each digit is replaced by a ?.
unambig-dawg dawg TODO: Describe.
user-words dawg A list of extra words to add to the dictionary. Usually left empty to be added by users if they require it; see tesseract(1).

wordlist2dawg frequent_words_list lang.freq-dawg lang.unicharset
wordlist2dawg words_list lang.word-dawg lang.unicharset

注意如果合并的traindata中包含字典,字典不能为空。

如果你需要字典的例子文件,解压(通过combine_tessdata)已有的语言文件(如eng.traineddata)并且使用dawg2wordlist提取单词表。

6.9 最后一个文件(unicharambigs)

这个文件描述了字符之间的模糊集。通常都是手动生成。为了理解格式,查看以下示例:

v1
2 ‘ ‘ 1 “ 1
1 m 2 r n 0
3 i i i 1 m 0


第一行是一个版本标识符。下面的行以tab制表符分割,使用下面的格式:


type indicator可以有下面的值:

Value Type
0 A non-mandatory substitution. This informs tesseract to consider the ambiguity as a hint to the segmentation search that it should continue working if replacement of ‘source’ with ‘target’ creates a dictionary word from a non-dictionary word. Dictionary words that can be turned to another dictionary word via the ambiguity will not be used to train the adaptive classifier.
1 A mandatory substitution. This informs tesseract to always replace the matched ‘source’ with the ‘target’ strings.
Example line Explanation
2 ‘ ‘ 1 “ 1 A double quote (“) should be substituted whenever 2 consecutive single quotes (‘) are seen.
1 m 2 r n 0 The characters ‘rn’ may sometimes be recognized incorrectly as ‘m’.
3 i i i 1 m 0 The character ‘m’ may sometimes be recognized incorrectly as the sequence ‘iii’.

每个字符都必须在unicharset中有包含。就是说,这些字符都应该是训练语言的一部分。

3.03版本支持新的更简单的格式:

v2
‘’ “ 1
m rn 0
iii m 0


其中1表示强制,0表示可选。

unicharambigs文件也是可选的。

6.10 合并所有文件

全部情况就这样!现在你只需要合并所有的文件(shapetable, normproto, inttemp, pffmtable),用相同的前缀重命名它们,如lang.,这里的lang是3个字符码,对于你要训练的语言名字,可以在http://en.wikipedia.org/wiki/List_of_ISO_639-2_codes中找到对应的。然后运行combine_tessdata:

combine_tessdata lang.

注意:不要忘记最后一个点!
结果的lang.traineddata在你的tessdata目录中。然后你就可以用你训练的语言识别文本了:

tesseract image.tif output -l lang

更多的选项请请参考combine_tessdata的手册或者源码。






版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yimingsilence/article/details/51353772

智能推荐

Spring Boot 获取 bean 的 3 种方式!还有谁不会?,Java面试官_springboot2.7获取bean-程序员宅基地

文章浏览阅读1.2k次,点赞35次,收藏18次。AutowiredPostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用 PostConstruct 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。_springboot2.7获取bean

Logistic Regression Java程序_logisticregression java-程序员宅基地

文章浏览阅读2.1k次。理论介绍 节点定义package logistic;public class Instance { public int label; public double[] x; public Instance(){} public Instance(int label,double[] x){ this.label = label; th_logisticregression java

linux文件误删除该如何恢复?,2024年最新Linux运维开发知识点-程序员宅基地

文章浏览阅读981次,点赞21次,收藏18次。本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。下面我们来进行文件的恢复,执行下文中的lsof命令,在其返回结果中我们可以看到test-recovery.txt (deleted)被删除了,但是其存在一个进程tail使用它,tail进程的进程编号是1535。我们看到文件名为3的文件,就是我们刚刚“误删除”的文件,所以我们使用下面的cp命令把它恢复回去。命令进入该进程的文件目录下,1535是tail进程的进程id,这个文件目录里包含了若干该进程正在打开使用的文件。

流媒体协议之RTMP详解-程序员宅基地

文章浏览阅读10w+次,点赞12次,收藏72次。RTMP(Real Time Messaging Protocol)实时消息传输协议是Adobe公司提出得一种媒体流传输协议,其提供了一个双向得通道消息服务,意图在通信端之间传递带有时间信息得视频、音频和数据消息流,其通过对不同类型得消息分配不同得优先级,进而在网传能力限制下确定各种消息得传输次序。_rtmp

微型计算机2017年12月下,2017年12月计算机一级MSOffice考试习题(二)-程序员宅基地

文章浏览阅读64次。2017年12月的计算机等级考试将要来临!出国留学网为考生们整理了2017年12月计算机一级MSOffice考试习题,希望能帮到大家,想了解更多计算机等级考试消息,请关注我们,我们会第一时间更新。2017年12月计算机一级MSOffice考试习题(二)一、单选题1). 计算机最主要的工作特点是( )。A.存储程序与自动控制B.高速度与高精度C.可靠性与可用性D.有记忆能力正确答案:A答案解析:计算...

20210415web渗透学习之Mysqludf提权(二)(胃肠炎住院期间转)_the provided input file '/usr/share/metasploit-fra-程序员宅基地

文章浏览阅读356次。在学MYSQL的时候刚刚好看到了这个提权,很久之前用过别人现成的,但是一直时间没去细想, 这次就自己复现学习下。 0x00 UDF 什么是UDF? UDF (user defined function),即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,就像使..._the provided input file '/usr/share/metasploit-framework/data/exploits/mysql

随便推点

webService详细-程序员宅基地

文章浏览阅读3.1w次,点赞71次,收藏485次。webService一 WebService概述1.1 WebService是什么WebService是一种跨编程语言和跨操作系统平台的远程调用技术。Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准...

Retrofit(2.0)入门小错误 -- Could not locate ResponseBody xxx Tried: * retrofit.BuiltInConverters_已添加addconverterfactory 但是 could not locate respons-程序员宅基地

文章浏览阅读1w次。前言照例给出官网:Retrofit官网其实大家学习的时候,完全可以按照官网Introduction,自己写一个例子来运行。但是百密一疏,官网可能忘记添加了一句非常重要的话,导致你可能出现如下错误:Could not locate ResponseBody converter错误信息:Caused by: java.lang.IllegalArgumentException: Could not l_已添加addconverterfactory 但是 could not locate responsebody converter

一套键鼠控制Windows+Linux——Synergy在Windows10和Ubuntu18.04共控的实践_linux 18.04 synergy-程序员宅基地

文章浏览阅读1k次。一套键鼠控制Windows+Linux——Synergy在Windows10和Ubuntu18.04共控的实践Synergy简介准备工作(重要)Windows服务端配置Ubuntu客户端配置配置开机启动Synergy简介Synergy能够通过IP地址实现一套键鼠对多系统、多终端进行控制,免去了对不同终端操作时频繁切换键鼠的麻烦,可跨平台使用,拥有Linux、MacOS、Windows多个版本。Synergy应用分服务端和客户端,服务端即主控端,Synergy会共享连接服务端的键鼠给客户端终端使用。本文_linux 18.04 synergy

nacos集成seata1.4.0注意事项_seata1.4.0 +nacos 集成-程序员宅基地

文章浏览阅读374次。写demo的时候遇到了很多问题,记录一下。安装nacos1.4.0配置mysql数据库,新建nacos_config数据库,并根据初始化脚本新建表,使配置从数据库读取,可单机模式启动也可以集群模式启动,启动时 ./start.sh -m standaloneapplication.properties 主要是db部分配置## Copyright 1999-2018 Alibaba Group Holding Ltd.## Licensed under the Apache License,_seata1.4.0 +nacos 集成

iperf3常用_iperf客户端指定ip地址-程序员宅基地

文章浏览阅读833次。iperf使用方法详解 iperf3是一款带宽测试工具,它支持调节各种参数,比如通信协议,数据包个数,发送持续时间,测试完会报告网络带宽,丢包率和其他参数。 安装 sudo apt-get install iperf3 iPerf3常用的参数: -c :指定客户端模式。例如:iperf3 -c 192.168.1.100。这将使用客户端模式连接到IP地址为192.16..._iperf客户端指定ip地址

浮点性(float)转化为字符串类型 自定义实现和深入探讨C++内部实现方法_c++浮点数 转 字符串 精度损失最小-程序员宅基地

文章浏览阅读7.4k次。 写这个函数目的不是为了和C/C++库中的函数在性能和安全性上一比高低,只是为了给那些喜欢探讨函数内部实现的网友,提供一种从浮点性到字符串转换的一种途径。 浮点数是有精度限制的,所以即使我们在使用C/C++中的sprintf或者cout 限制,当然这个精度限制是可以修改的。比方在C++中,我们可以cout.precision(10),不过这样设置的整个输出字符长度为10,而不是特定的小数点后1_c++浮点数 转 字符串 精度损失最小

推荐文章

热门文章

相关标签