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

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签