记忆力如何训练练Tesseract 4.0

作者电脑:Mac Mini 系统信息:OS X EI Capitan 10.11.6
Tesseract4.0github地址:
build 步骤:
参考Tesseract github上的官方文档:
安装homebrew
直接在终端中输入:ruby -e "$(curl -fsSL /Homebrew/install/master/install)"
安装过程中需要键入一次回车
& & & &2. 使用brew命令安装依赖
brew install automake autoconf
brew install autoconf-archive
brew install pkgconfig
brew install icu4c
brew install leptonica
brew install gcc
3. compile
git clone /tesseract-ocr/tesseract/
在这一步可能会有错误提示:
fatal: could not create work tree dir 'tesseract': Permission denied
此时需要我们使用sudo命令创建一个具有写权限的文件夹,然后把tesseract的源码clone至此文件中
也可能有错误提示:
Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
我们需要:
1、打开终端,输入 &sudo xcodebuild -license
2、终端提示敲回车键(enter)打开许可协议,照做
3、终端提示 按下 &“space” 键阅读许可协议,按“q” 不阅读
4、最终,终端会出现三个选项,agree 、print、cancel,不用想,能不是agree 吗!输入agree,然后enter
& & &4. 接下来:
cd tesseract
./autogen.sh
这一步可能会有错误:“
只需安装libtool即可:brew install libtool
./configure CC=gcc-6 CXX=g++-6 CPPFLAGS=-I/usr/local/opt/icu4c/include LDFLAGS=-L/usr/local/opt/icu4c/lib
sudo make install
# if desired
make training
5.试一下好不好使
首先要下载相关语言的数据文件,英语数据文件下载地址: 其他数据文件下载地址:数据文件下载完成后,需要把它move到:/tesseract/tessdata 路径下
然后如果出现错误:
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory.
就使用命令:
export TESSDATA_PREFIX=/Users/naver/code/tesseract/
接下来要提前创建一个文件来存储识别的文字结果,如:out
然后输入测试命令:
tesseract /Users/naver/Downloads/test.jpg out
test.jpg 为要识别的图片,然后识别结果会存储在out文件中。
详细参数介绍参见官方github文档:
其他参考链接:
阅读(...) 评论()VS2013编译Tesseract 3.04步骤详解 - 简书
VS2013编译Tesseract 3.04步骤详解
  最近开始学习Tesseract-ocr。Google在GitHub上提供了Tesseract的以及现成的。然而最新版本的Tesseract 4.0需要VS2015及以上版本的支持, 而提供的语言训练包只支持4.00和3.04两个版本的Tesseract。由于工作需要, 不能安装VS2015, 因此为了能直接使用官方提供的训练包,我选择在VS2013上编译Tesseract 3.04版本。  然而, 故事不可能就这么简单。 在这个安装和编译过程中我踩了很多的坑, 折腾了一整天才将它成功编译。这是我第一次在简书写文, 事实上我之前也没有任何写博文的经验, 所以此文可能会有许多的问题和不足,还请各位多多批评指正。其实这是一篇我用来练手Markdown的文章
第一步: 安装Git
这一步我就不再多说了。 最简单的办法就是打开软件管家, 搜索Git, 然后安装即可。
第二步:获取源文件依赖文件
为什么不直接下载源文件然后编译呢? 当然是因为编译不过呀喂!这是我踩的第一个坑。为了避免麻烦, 我们直接先下载好依赖文件。依赖文件的GitHub地址在 。 这里我们可以选择手动下载,但既然我们使用了Git, 所以还是用Git来下载吧。首先在你想要的位置新建一个目录用来存放文件。 我选择的位置是F:\tesseract-build。接着打开命令行, 切换到tesseract-build文件夹下, 执行下面的指令:
git clone /charlesw/tesseract-vs2012.git
clone完成后, 在tesseract-build会出现名为tesseract-vs2012的文件夹。进入文件夹, 打开tesseract.sln工程文件, 编译运行……别急,先深吸一口气。因为接下来你可能会遇到一系列的问题。 没关系, 我会一一列出并给出解决办法。首先你可能会看到这个错误:
这个问题是VS2013的兼容性造成的。 解决方法:右击解决方案资源管理器中的liblept-171, 进行如下设置:
 1. “C/C++” --& "常规” --&”调试信息格式” 设置为 “C7 兼容(/Z7)”`
 2. “C/C++” --& "代码生成” --&”启用字符串池” 设置为 “是(/GF)”`
 3. “链接器” --& "调试” --&”生成调试信息” 设置为 “是(/DEBUG)”`
然后再编译, 出现了新的错误:
这个是由于文件编码的原因造成的。
解决办法:
 1. 点击“文件” --& “高级保存选项”
 2. 将编码改为`Unicode(UTF-8 带签名) - 代码页 65001` (提示: 在选项的最开始的地方)
继续编译, 发现出现出现下面的错误:
解决办法:跳到问题所在的行, 将声明变量的类型由l_unit32改为int继续编译, 已经没有没有报错了, 但弹出了这个警告框:
不要慌。 到了这一步,你与这个工程的战斗已经结束了。 你可以选择点击确定, 关掉工程, 进入后续步骤。接下来, 找到你的VS2013安装目录, 进入下面的文件夹:
打开VS2013 开发人员命令提示,
切换到tesseract-vs2012所在的文件夹, 执行下面的指令
msbuild build.proj
然后就会开始编译过程。 经过两到三分钟的编译后, 看到这个提示:
说明你成功了。关掉命令行, 进入tesseract-build\tesseract-vs2012目录, 如果你细心的话会发现里面多出了一个release文件夹。 点进入里面有include和lib两个文件夹。 我们辛苦了这么久, 就是为了它们。接下来你需要:
进入tesseract-build\tesseract-vs2012, 将vs2013+64bit_support.patch文件复制到tesseract-build目录下
进入tesseract-build\tesseract-vs2012\release, 将include文件夹和lib文件夹复制到tesseract-build目录下 
将tesseract-build\lib\Win32里的内容全部拷贝到tesseract-build\lib下
这时你的tesseract-build目录中应该有下面这些东西:
第三步 下载源码, 打补丁, 编译源码
辛苦了这么久, 终于开始下载源码了。这一步就不要手动下载了, 因为等下需要用到git仓库。打开命令行, 切换到tesseract-build文件夹, 输入下面的指令:
git clone /tesseract-ocr/tesseract.git
克隆完毕后你的tesseract-build文件夹下会多出一个tesseract文件夹, 这正是Tesseact的源码。然而实际上, 我们克隆下来的是Tesseract 4.0的源码, 而我们需要的是3.04, 所以需要用checkout指令进行版本切换。右键点击tesseract文件夹,运行git bash。 在弹出的git命令行中输入:
git checkout -b 3.04-vs.00
之后你会发现, tesseract文件夹的内容已经与之前不一样了, 说明我们已经将版本切换到了3.04继续在命令行中输入
git am --signoff & ../vs2013+64bit_support.patch
这句话是将tesseract-build目录下的vs2013+64bit_support.patch补丁打到tesseract工程内。但这时你会发现又出错了:
git需要知道你是谁。 解决这个问题你需要进入tesseract\git文件夹(这个文件夹默认是隐藏的, 所以你可能需要先显示隐藏文件),修改config文件, 在最下面写上这些内容;
name = xxx
这里写你的GitHub邮箱跟用户名。 注意不要乱填。填完之后保存, 再执行一次之前的指令, 补丁就可以顺利打上了。到了这一步, 你离成功已经近在咫尺了。 打开tesseract文件夹, 里面会比之前多出一个vs2013文件夹。 进入文件夹, 打开tesseract.sln工程文件。进入之后不要着急, 先将tesseract设为启动项, 然后进行编译。编译过程如果出现下面的警告:
解决办法:找到tesseract中的equationdetect.cpp文件,将代码中的:
static const STRING kCharsToEx[] = {"'", "`", "\"", "\\", ",", ".",
"〈", "〉", "《", "》", "」", "「", ""};
static const STRING kCharsToEx[] = { "'", "`", "\"", "\\", ",", ".",
"&", "&", "&&", "&&", "" };
再次编译。 在编译完成后会弹出这样的提示框:
这个liblept171d.dll在哪呢?在tesseract-build\lib文件夹中。 为了让项目能找到这个文件, 我们把tesseract-build\lib添加到环境变量PATH中。再次编译,成功。然后把调试器切换到DLL_Release, 再次编译, 依然成功!现在你可以在tesseract-build\tesseract\vs2013\bin\Win32\DLL_Debug以及tesseract-build\tesseract\vs2013\bin\Win32\DLL_Release两个文件夹中分别找到对应的exe文件。 它们就是我们的Tesseract执行文件。 也就是说, 源码终于编译成功了!
至此, 整个编译过程就结束了。 一个简单的编译就花费了我这么多的功夫, 我的Tesseract的学习之路还很漫长……Tesseract-OCR安装简明教程 - CSDN博客
Tesseract-OCR安装简明教程
引言:& OCR领域大名鼎鼎的Tesseract,开源项目,可以直接将图片中的文字进行识别,转换成文本信息,本文将简介如何安装以及进行数据的训练操作。1.& Tesseract-OCR&& 目前最新的tesseract项目已经全部迁移到了github上,我们可以从中获取所有主要的信息。&& 地址: /tesseract-ocr/tesseract2.& Tesseract-OCR安装& windows下的安装非常简单,直接安装可执行程序即可。这里重点介绍centos下的安装。这里提示一下,当你选择安装各类语言之时,则需要一个稍微耗时的等待操作,比如下图中所示的信息:&& & 操作系统: centos 7, JDK 8& step1:&&&& yum search tesseract[root@flybird ~]# yum search tesseract-ocr
Loaded plugins: langpacks
========================================================================================================== Matched: tesseract-ocr ===========================================================================================================
tesseract.x86_64 : Raw OCR Engine
tesseract-devel.x86_64 : Development files for tesseract
tesseract-langpack-afr.noarch : Afrikaans language data for tesseract
tesseract-langpack-amh.noarch : Amharic language data for tesseract
tesseract-langpack-ara.noarch : Arabic language data for tesseract
tesseract-langpack-asm.noarch : Assamese language data for tesseract
tesseract-langpack-aze.noarch : Azerbaijani language data for tesseract
tesseract-langpack-aze_cyrl.noarch : &Azerbaijani language data for tesseract
tesseract-langpack-bel.noarch : Belarusian language data for tesseract
tesseract-langpack-ben.noarch : Bengali language data for tesseract
tesseract-langpack-bod.noarch : &Tibetan language data for tesseract
tesseract-langpack-bos.noarch : Bosnian language data for tesseract
tesseract-langpack-bul.noarch : Bulgarian language data for tesseract
tesseract-langpack-cat.noarch : Catalan language data for tesseract
tesseract-langpack-ceb.noarch : Cebuano language data for tesseract
............
&step2:& yum install tesseract.x86_64 [root@flybird ~]# yum install tesseract.x86_64
Loaded plugins: langpacks
Resolving Dependencies
--& Running transaction check
---& Package tesseract.x86_64 0:3.04.00-3.el7 will be installed
--& Processing Dependency: liblept.so.4()(64bit) for package: tesseract-3.04.00-3.el7.x86_64
--& Processing Dependency: libicuuc.so.50()(64bit) for package: tesseract-3.04.00-3.el7.x86_64
--& Processing Dependency: libicui18n.so.50()(64bit) for package: tesseract-3.04.00-3.el7.x86_64
--& Running transaction check
---& Package leptonica.x86_64 0:1.72-2.el7 will be installed
---& Package libicu.x86_64 0:50.1.2-15.el7 will be installed
--& Finished Dependency Resolution
Dependencies Resolved
=============================================================================================================================================================================================================================================
Repository
=============================================================================================================================================================================================================================================
Installing:
3.04.00-3.el7
Installing for dependencies:
1.72-2.el7
50.1.2-15.el7
Transaction Summary
=============================================================================================================================================================================================================================================
1 Package (+2 Dependent packages)
Total download size: 19 M
Installed size: 67 M
Is this ok [y/d/N]: y
Downloading packages:
(1/3): leptonica-1.72-2.el7.x86_64.rpm
(2/3): libicu-50.1.2-15.el7.x86_64.rpm
(3/3): tesseract-3.04.00-3.el7.x86_64.rpm
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.7 MB/s |
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : leptonica-1.72-2.el7.x86_64
Installing : libicu-50.1.2-15.el7.x86_64
Installing : tesseract-3.04.00-3.el7.x86_64
: tesseract-3.04.00-3.el7.x86_64
: libicu-50.1.2-15.el7.x86_64
: leptonica-1.72-2.el7.x86_64
Installed:
tesseract.x86_64 0:3.04.00-3.el7
Dependency Installed:
leptonica.x86_64 0:1.72-2.el7
libicu.x86_64 0:50.1.2-15.el7
Complete!&step 3: 安装devel& [root@flybird ~]# yum install tesseract-devel.x86_64 tesseract-osd.x86_64
Loaded plugins: langpacks
Resolving Dependencies
--& Running transaction check
---& Package tesseract-devel.x86_64 0:3.04.00-3.el7 will be installed
--& Processing Dependency: pkgconfig(lept) for package: tesseract-devel-3.04.00-3.el7.x86_64
--& Running transaction check
---& Package leptonica-devel.x86_64 0:1.72-2.el7 will be installed
--& Finished Dependency Resolution
Dependencies Resolved
=============================================================================================================================================================================================================================================
Repository
=============================================================================================================================================================================================================================================
Installing:
tesseract-devel
3.04.00-3.el7
Installing for dependencies:
leptonica-devel
1.72-2.el7
Transaction Summary
=============================================================================================================================================================================================================================================
1 Package (+1 Dependent package)
Total download size: 188 k
Installed size: 1.1 M
Is this ok [y/d/N]: y
Downloading packages:
(1/2): tesseract-devel-3.04.00-3.el7.x86_64.rpm
(2/2): leptonica-devel-1.72-2.el7.x86_64.rpm
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
738 kB/s | 188 kB
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : leptonica-devel-1.72-2.el7.x86_64
Installing : tesseract-devel-3.04.00-3.el7.x86_64
: leptonica-devel-1.72-2.el7.x86_64
: tesseract-devel-3.04.00-3.el7.x86_64
Installed:
tesseract-devel.x86_64 0:3.04.00-3.el7
Dependency Installed:
leptonica-devel.x86_64 0:1.72-2.el7
Complete!&step 4:& 安装lang package tesseract-langpack-chi_sim.noarch, tesseract-langpack-chi_tra.noarch[root@flybird ~]# yum install tesseract-langpack-chi_sim.noarch
Loaded plugins: langpacks
Resolving Dependencies
--& Running transaction check
---& Package tesseract-langpack-chi_sim.noarch 0:3.04.00-3.el7 will be installed
--& Finished Dependency Resolution
Dependencies Resolved
=============================================================================================================================================================================================================================================
Repository
=============================================================================================================================================================================================================================================
Installing:
tesseract-langpack-chi_sim
3.04.00-3.el7
Transaction Summary
=============================================================================================================================================================================================================================================
Total download size: 15 M
Installed size: 40 M
Is this ok [y/d/N]: y
Downloading packages:
tesseract-langpack-chi_sim-3.04.00-3.el7.noarch.rpm
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : tesseract-langpack-chi_sim-3.04.00-3.el7.noarch
: tesseract-langpack-chi_sim-3.04.00-3.el7.noarch
Installed:
tesseract-langpack-chi_sim.noarch 0:3.04.00-3.el7
Complete!3.& Tesseract-OCR的使用&a.& 识别图片中的文字信息& && 命令格式: tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile...]&&& 操作: tesseract ttest.png out -l lang-type&& 这里我们选取了两种图片,中文和英文图片;然后我们来看看OCR的效果如何。&b. 检查tesseract支持的语言[root@flybird practice]# tesseract --list-langs
List of available languages (4):
chi_sim&基于上述的信息可知,支持四种类型,三种语言, osd是开发的脚本&c.& 进行基于中文的OCR&&& 原图信息:&&&&&& &&&& 进行OCR操作,操作命令: tesseract chin-ocr.png chin-out -l chi_sim&&&& 运行结果:[root@flybird practice]# tesseract chin-ocr.png chin-out -l chi_sim
Tesseract Open Source OCR Engine v3.04.00 with Leptonica
[root@flybird practice]# cat chin-out.txt
11月17日痿言 ′ 文童发文透露租妻子马伊蜊合作的新剧 (剃刀边缘) 快要刮作完
成) 感慨良多′他自称 ″过街者冒″ 租 ″笨人″ ′直言自己虽然忍不任茌片场发脾气′
但 ″i人亘″ 二字是心安理才寻她受了′& 大家可以看到,识别率还是有待提高的,很多的信息并未准确识别出来。这里注意背景中有水印信息,造成了一定干扰。&d. 基于英文的OCR识别&&& 原图信息:&&& &&&& 进行OCR操作, tesseract english-ocr.png eng-ocr -l eng&&&&& 运行的结果信息:[root@flybird practice]# tesseract english-ocr.png eng-ocr -l eng
Tesseract Open Source OCR Engine v3.04.00 with Leptonica
[root@flybird practice]# cat eng-ocr.txt
I have lived in China for a long time and we all like it very much. We do have it done.
It is very funny in a good lucky state.
&& 基于本次的OCR结果还是非常理想的,当然这里是基于干扰非常少的情况下进行的。4. 总结&&& 这里只是简要介绍了其安装信息与过程,更多的信息还是需要大家自行到tesseract上去获取信息,并自行实践的。
本文已收录于以下专栏:
相关文章推荐
主要是三个步骤:
1. Download Leptonica and Teseract sources:
$ wget /p/lepton...
centos下安装tessrect-ocr及训练工具问题分析及解决办法
最近要在服务器上搭建tessrect-ocr和训练工具,搭建一个训练网页:
http://115.159.205.168/oc...
OpenCV代码提取:cvtColor函数的实现
Tesseract-OCR 3.04在Windows7 vs2013上编译过程
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)下次自动登录
现在的位置:
& 综合 & 正文
tesseract-ocr 提高验证码识别率手段之—识别码库训练方法
常用的两种ORC 验证码 识别方法及实践感言
关于ORC验证码识别可以看本博客的另一篇文章
本文是对tesseract-ocr 使用的进一步技术升级说明,使用默认的识别库识别率比较低怎么办?
不用着急,tesseract-ocr本身的工具中提供了使用你提供的素材进行人工修正以提高识别率的方法。下面我们就来看一下。
下载并安装版本的
如果你的训练素材是很多张非格式的图片,首先要做的事情就是将这么图片合并(个人觉得素材越多,基本每个字母和数字都覆盖了训练出来的识别率比较好)
下载这个工具:
首先进行到的转换,这个用自带的画图就可以。然后使用进行多张的。
。在所在的目录下打开一个命令行,输入
使用打开文件,需要记住的是第步生成的要和这个文件同在一个目录下。逐个校正文字,后保存。
下载工具进行每个自的纠正(注意有逐页进行纠正)
。输入命令:
补充关于命名格式解释:
Make Box Files
For the next step below, Tesseract needs a 'box' file to go with each training image. The box file is a text file that lists the characters in the training image, in order, one per line, with the coordinates of the bounding box around the image.
Tesseract 3.0 has a mode in which it will output a text file of the required format, but if the character set is different to its current training, it will naturally have the text incorrect. So the key process here is to manually edit the file to put the correct
characters in it.
Run Tesseract on each of your training images using this command line:
tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox
。输入命令:
新建文件。如果是版本,那么需要在目录下新建一个名字为的文件,并且输入文本(这里的就是的中间字段)
。输入命令:
此时,在目录下应该生成若干个文件了,把这几个文件加上前缀。然后输入命令:
必须确定的是1、3、4、5、13行的数据不是-1,那么一个新的字典就算生成了。
此时目录下“selfverify.traineddata”的文件拷贝到tesseract程序目录下的“tessdata”目录。
以后就可以使用该该字典来识别了,例如:
通过训练出来的新语言,识别率提高了不少。
&&&&推荐文章:
【上篇】【下篇】如何训练Tesseract 4.0 - CSDN博客
如何训练Tesseract 4.0
原文:/tesseract-ocr/tesseract/wiki/TrainingTesseract-4.00
tesseract 4.0之后开始使用机器学习来进行字符识别,其训练模型的方法与以前的版本有所不同,现将其官网的手册翻译如下
(未完成)
Tesseract 4.0中包含了一个新的基于神经元网络的识别引擎,使得识别的精度比以前的版本大大提高了,相应的,对机器的计算能力要求也有了一个显著的提高。当然对于复杂的语言,它实际上比基本Tesseract要运行得更快
和基本的Tesseract相比,神经元网络要求大量的训练数据,训练速度也慢了很多。对于拉丁语系的语言,版本中提供的训练好的模型是在400000个文本行,4500种字体上训练得到的。对于 其他语言,可能没有这么多 的字体,但它们训练的文本行数是差不多的。Tesseract的训练将需要几天到2周的时间,而不是几分钟到几个小时。即使使用了这么多的训练数据,你可能还是发现,它并不适合你特定的问题,因此你还需要重新训练模型
训练有几个可选项:
上面几个选项看上去很不一样,实际上训练步骤几乎是一样的,除了命令行有一些不同。所以几种选项都试一下是相当容易的,考虑到时间或硬件的话,可以让它们并行执行
对于4.00版本,老的识别引擎仍然保留,也可以被训练,但它是过时了的,除非有正当的理由,以后发布的版本中可能会删除它
二、开始之前
为了训练tesseract4.0,你不需要任何神经元网络的背景知识,但这些知识可以帮助理解不同训练选项之间的差异。在深陷训练过程之前 ,请先阅读“实现简介”和tesseract3.04版本训练过程中的一些注意事项
重要提示:在你花时间和精力去训练tesseract之前,强烈推荐你阅读“质量改进”页
三、训练要求的额外库
从3.03版本开始,训练工具需要以下一些额外的库:
sudo apt-get install libicu-dev
sudo apt-get install libpango1.0-dev
sudo apt-get install libcairo2-dev
四、构建训练工具
从3.03开始,如果你从源代码编译Tesseract,那你需要使用单独的命令来创建和安装训练工具。安装好上面的额外库后,就可以在Tessercat源代码目录下运行下面的命令来生成训练 工具:
make make training sudo make training-install
下面两条命令是用来生成ScrollView.jar的,这个不是必须的(用来查看训练过程中的结果)
make ScrollView.jar export SCROLLVIEW_PATH=$PWD/java
五、软/硬件要求
在写这篇文章的时候,训练只能在小端字节序(little-endian)机器(如intel)的linux上运行。为了训练tesseract 4.0,最好是使用多核的机器(最好是4核),支持OpenMP和intel的SSE/AVX指令扩展。基本上只要有足够的内存它就可以运行,但是你的处理器越高端,它运行得更快。GPU目前还不支持。内存的使用可以使用--max_image_MB命令行参数来控制,除操作系统占用部分,你可能至少还需要1GB内存
六、训练文本要求:
对于拉丁语系的语言而言,现在版本中提供的训练好的模型数据,是经过了400000个文本行,在4500种字体训练而来,对于 其它的语言,可能没有这么多的字体,但他们也已经训练了同样多的文本行
拥有更多的训练文本、生成更多的页将是有益的,虽然神经元网络并不总是能很好的泛化,并且需要和他们运行时遇到的东西相类似的东西来进行训练。如果目标领域是一个非常限制的领域,那么所有需要大量数据的告警都可以忽略,但神经元网络配置可能需要调整
七、训练过程概述
整体的训练过程和3.04是一样的,都包括以下几步:
1. 准备训练数据
2. 渲染文本成图像+box文件(或者为已经存在的图像文件手工创建box文件)
3. 创建unicharset文件
4. (可选)创建字典数据
5. 运行tesseract来处理图像+box文件来创建训练数据集
6. 在训练集上训练
7. 合并数据文件
主要的不同是:
1. box只在文本行这一级需要,因此当从已经存在的图片数据进行训练时,它更加容易
2. .tr文件已经被.lstmf文件代替
3. 字体可以,也应该被自由地混合,而不需要分开
4. 原来的多步(mf训练,cn训练,形状簇),现在改成一个单一的lstm训练
训练还不能像3.04版本那样自动化,原因如下:
1. 慢速训练过程如果停止,它很难从中间重新开始,很难自动地告诉他什么时候停止训练
2. 在如何训练一个网络时,有很多的选项(参见下文)
3. 训练模型和unicharset可以是不同的,来自基本的tesseract,但并不是必须如此
4. 理论上,对于同一种语言来说,神经元网络版的tesseract并不需要一个基本的tesseract,但是当前如果没有基本版本的tesseract,神经元网络版的tesseract不能被加载
创建训练数据的过程已经写在下面了,后面是lstm训练的指南,介绍了训练主体过程。在Linux上,你可以拷贝-粘贴这些命令到你的终端上。为了让tesstrain.sh脚本能工作,你必须 设置你的PATH到你本地的training和api路径,或者使用make install
八、创建训练数据
和基本tesseract一样,你可以从字体中渲染合成训练数据,也可以对已有的图片(如古人的手稿)进行标注。两种情况下都要求tiff/box文件对
有两种可能的方法来格式化一个box文件
1. box文件格式——选项一
在这种格式中,box文件的每一行匹配tiff图片中的一个字符
在行的结尾处,需要插入一个特殊的行来标识一行的结束
2. box文件格式——选项二(还没有实现)
在这种格式下box只需要覆盖一行文件,而不是覆盖一个单独的字符
WordStr &left& &bottom& &right& &top& &page& #&text for line including spaces&
WordStr是一个标识字符串,它指示box文件分析器从这一行的后部,#之后获取实际的文本字符串
如,文件行”What a nice sunny day!“,应该被写成
#W h a t a n i c e s u n n y d a y !
原来的单词之间的空格被省略
需要注意的是,在任何情况下,即使是像阿拉伯语这种从右向左的语言,文本的抄写(代表着box序列或者一个WordStr字符串)也应该是从左到右的顺序。换句话说,网络将从左到右来进行学习,无论哪种语言,从右到左/双向 处理将在tesseract的更高层进行
这些说明仅仅覆盖了从字体文件中渲染的情况,所以需要安装必须的字体
运行tesstrain.sh的设置和基本tesseract一样,使用--linedata_only选项来进行LSTM训练
运行如下的tesstrain.sh命令将创建训练数据,注意你的字体路径可能需要调整:
training/tesstrain.sh --fonts_dir /usr/share/fonts --lang eng --linedata_only \
--noextract_font_properties --langdata_dir ../langdata \
--tessdata_dir ./tessdata --output_dir ~/tesstutorial/engtrain
上面的命令创建LSTM训练数据,相当于训练基本tesseract时英语数据。为了创建通用目的的基于LSTM的OCR引擎,它还远远不够,但是这是一个很好的演示教程
现在试着为Impack字体创建验证数据:
training/tesstrain.sh --fonts_dir /usr/share/fonts --lang eng --linedata_only \
--noextract_font_properties --langdata_dir ../langdata \
--tessdata_dir ./tessdata \
--fontlist &Impact Condensed& --output_dir ~/tesstutorial/engeval
我们将在在后面的优化演示时使用这些数据
九、lstmtraining使用指南
1. lstmtraining命令行
lstmtraining是一个多任务的训练神经元网络工具,下面列出了它的命令行参数:
默认值
指向到unicharset的路径
script_dir
指向langdata路径,用来获取unicharset和基本笔画表
指定网络拓扑结构
model_output
输出文件/检查点的输出的基本路径
max_image_MB
缓冲图像时使用的最大内存
learning_rate
SGD算法的初始学习率
train_mode
训练模型,64为压缩的unicharset,16用于循环训练
perfect_sample_delay
当网络变好,仅仅反向传播一个好的样本在很多不好的样本被看到之后,从上一个好的样本允许通过
debug_interval
如果不为0,则每过这么多轮后显示调试信息
weight_range
初始权重的随机数取值范围
alpha平滑梯度时的动量值
max_iterations
经过这么多轮训练后停止
target_error_rate
如果平均错误率低于此值,则停止训练
continue_from
指向之前的检查点以便继续训练或fine tune
stop_training
转换训练中的检查点到一个识别模型
append_index
去掉网络的上面几层,追加上--net_spec指定的网张来代替
train_listfile
训练数据文件的列表文件
eval_listfile
验证数据文件的列表文件,用来独立于训练数据对模型进行评估
多数flags使用默认值就可以工作,有几个是在特殊操作时要求的,但是有几个选项需要特别说明一下:
1.1 unicode字符集压缩和train_mode
LSTM在学习序列时非常好,但是当状态数变得太大时会大幅减慢。有一个经验性建议是:让LSTM学习一个长序列,要比学习许多类的短序列要好,所以对于复杂的语言(如汉语,韩语,印度语),对每个符号重新编码成一个短的序列码,比一个少数的类大类集的效果要好。--train_mode 使用64将打开这个功能开关,它也包含在默认值中。它将每一个汉字字符编码成一个3code的序列,韩文使用Jamo编码,印度文使用syllables作为他们的unicode序列。对于字符集更小的语言(如拉丁文),这些被折叠进不同的单引号形状到一个类,而双引号到一个不同的类
1.2 随机化训练数据和train_mode
为了让随机梯度下降算法能顺利工作,训练数据要求所有的样本文件可以随机打乱组合,所以训练器可以轮流读取每个文件,当到到尾时可以返回到从头开始 。这和基本tesseract训练是完全不同的
如果使用渲染代码(通过tesstrain.sh),它将打乱每个样本文件中的文本行,但你可以得到一组文件,每个包含了单一字体的训练样本。为了增加一个更多混合,你应该使用train_mode 16,即使你不想uncicharset压缩
1.3 模型输出
训练器周期性保存checkpoints文件,使用--model_output作为一个基本名字。因此它可以在任何点上停止训练,并且重新开始,使用相同的命令行,它将继续。为了强制重新开始,使用一个不同的--model_output,或者删除这个目录下的所有文件
1.4 网络模型及优化
128打开Adam优化,这似乎比平坦动量优化会更好一点。代码称它为Adagrad,但并不是说Adagrad就不用动量优化,动量优化还在。没有动量优化的平坦Adagrad完全不能工作
使用64将自动化每层的学习率,当处理过程中,训练器独立地检查每一层是否应该减少学习率,可能更小或更大的学习率来继续学习
1.5 完善采样延迟(?)
在容易的样本上训练并不是一个好主意,它只是在浪费时间,但网络并不能因此不能处理他们,所以可能会丢弃一些训练样本如果样本出现过于频繁。--perfect_sample_delay参数丢弃完好的样本,如果没有发现许多不完好的样本
1.6 调试间隔(?)
--debug_interval,默认值为0,训练器输出每100轮输出一个进展报告
如果--debug_interval -1,训练器将每轮都会输出详细的调试信息
如果--debug_interval 大于0,训练器显示几个窗口的,显示这一层的调试信息。特别的,当--debug_interval 1时,它每进入下一轮之前需要LSTMForward窗口点击一次,但在其它情况下,它将继续并且按要求的频率显示信息
注意:--debug_interval大于0时,你必须构建了ScrollView.jar,还有其它训练工具,详细参见”Building the Training Tools“
2. 从零开始训练
下面的例子是从头开始训练的命令,使用上面的命令行创建的数据
mkdir -p ~/tesstutorial/engoutput
training/lstmtraining -U ~/tesstutorial/engtrain/eng.unicharset \
--script_dir ../langdata --debug_interval 100 \
--net_spec '[1,36,0,1 Ct5,5,16 Mp3,3 Lfys64 Lfx128 Lrx128 Lfx256 O1c105]' \
--model_output ~/tesstutorial/engoutput/base \
--train_listfile ~/tesstutorial/engtrain/eng.training_files.txt \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt \
--max_iterations 5000 &&~/tesstutorial/engoutput/basetrain.log
可以打开另外一个窗口监控日志输出:
tail -f ~/tesstutorial/engoutput/basetrain.log
你应该可以观察 到,每500轮,空白将开始在CTC输出窗口,而800轮绿线将出现在LSTMForward窗口中,那有空格在图片上
到600轮时,有一个的非空格的碰撞在CTC输出中。注意这个CTC目标,它开始以同样 的高度现在高度发生变化,因为空白的输出。同时,字符和绿线的位置在LSTMTraining窗口也不精确像他们普通的那样,因为从这个网络的特殊输出,弄乱了CTC算法(CTC假定在不同的x-坐标统计独立 ,但们们很清楚不是独立 的)
到2000轮,它应该是很清楚在输出窗口中:一些微弱的黄色标志将出现,表示有一些正在成长的输出对非空和非空格,并且字符正在开始出现 在LSTMForward窗口中
到3200轮,字符错误率跌入50以下到5000轮到18%
注意,这个引擎训练部分数据与基础Tesseract使用的训练数据是相同的,但是它们的精度在其它字体上是很差的。它在训练5000轮之后停止(目前高端的机器上大约需要半个小时),此时它的字符错误率大约是25%。使用下面的命令可以运行一个单独的测试
training/lstmeval --model ~/tesstutorial/engoutput/base_checkpoint \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt
76%的字符错误率?不太好
现在基础Tesseract在Impact字体上做的并不太好,但是它包含了4500多种字体,所以如果你从eng.traineddata中抽取出eng.lstm文件的话,你可以比较一下:
mkdir -p ~/tesstutorial/impact_from_full
training/combine_tessdata -e tessdata/eng.traineddata \
~/tesstutorial/impact_from_full/eng.lstm
training/lstmeval --model ~/tesstutorial/impact_from_full/eng.lstm \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt
1.7%的字符错误率?非常好
为了下一节引用,我们在训练集上也运行了一个全模型集的测试
training/lstmeval --model ~/tesstutorial/impact_from_full/eng.lstm \
--eval_listfile ~/tesstutorial/engtrain/eng.training_files.txt
字符错误率是0.,单词错误率是0.
你可以再训练5000轮,可以得到一个更低的错误率,但这对Impact字体并没有多少帮助
mkdir -p ~/tesstutorial/engoutput
training/lstmtraining -U ~/tesstutorial/engtrain/eng.unicharset \
--script_dir ../langdata \
--net_spec '[1,36,0,1 Ct5,5,16 Mp3,3 Lfys64 Lfx128 Lrx128 Lfx256 O1c105]' \
--model_output ~/tesstutorial/engoutput/base \
--train_listfile ~/tesstutorial/engtrain/eng.training_files.txt \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt \
--max_iterations 10000 &&&~/tesstutorial/engoutput/basetrain.log
Impact字体的字符错误率还是75%,即使当训练集的错误率已经达到字符错误率为0.86%/单词错误率为3.1%
training/lstmeval --model ~/tesstutorial/engoutput/base_checkpoint \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt
training/lstmeval --model ~/tesstutorial/engoutput/base_checkpoint \
--eval_listfile ~/tesstutorial/engtrain/eng.training_files.txt
总的来说,从头开始训练需要一个非常限制的问题,大量的训练数据,或你需要减小网络的结构使用--net_spec。否则你应该用微调方式
3. Fine Tuning
Fine Tuning就是在不改变任何网络结构、字符集的情况下,使用新的数据训练一个已有模型的过程。不需要一个unicharset,script_dir或net_spec,因为它们都可以从已有的模型中得到
training/lstmtraining --model_output /path/to/output [--max_image_MB 6000] \
--continue_from /path/to/existing/model \
[--perfect_sample_delay 4] [--debug_interval 0] \
[--max_iterations 0] [--target_error_rate 0.01] \
--train_listfile /path/to/list/of/filenames.txt
注意:--continue_from参数可以指向一个训练中的checkpoint,也可以是一个识别模型,即使文件格式不同。训练中的checkpoint文件是参model_output 开头、以checkpoint或lstm结尾的文件,像我们上面做的。让我们在上面创建的模型上开始fine tuning,来看看我们能否在Impact上工作得更好:
mkdir -p ~/tesstutorial/impact_from_small
training/lstmtraining --model_output ~/tesstutorial/impact_from_small/impact \
--continue_from ~/tesstutorial/engoutput/base_checkpoint \
--train_listfile ~/tesstutorial/engeval/eng.training_files.txt \
--max_iterations 1200
这一次训练100轮后,字符/单词的错误率达到27%/56.2%,1200轮后达到了1.4%/4.8%。现在我们做一个单独的测试:
training/lstmeval --model ~/tesstutorial/impact_from_small/impact_checkpoint \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt
数据显示出一个更低的字符/单词的错误率:0.18%/0.92%,因为训练 器平均超过1000轮了,它已经改进了。这不是Impact这种字体特有的结果,我们是在整个训练集上进行测试
这是一个很有趣的例子。fine tuning是真的可以应用到全训练模型中的一个
mkdir -p ~/tesstutorial/impact_from_full
training/lstmtraining --model_output ~/tesstutorial/impact_from_full/impact \
--continue_from ~/tesstutorial/impact_from_full/eng.lstm \
--train_listfile ~/tesstutorial/engeval/eng.training_files.txt \
--max_iterations 1200
在100轮之后 ,它已经达到 了1.26%/3.98%的字符/单词错误率,在1200轮时更是达到了0.31%/1,18%的错误率。再一次,全单独的测试给出了更好的结果
training/lstmeval --model ~/tesstutorial/impact_from_full/impact_checkpoint \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt
字符错误率0.2%,单词错误率0.7%。更有趣的是其它字体的影响,所以运行一个测试在之前我们用的基础训练 集上
training/lstmeval --model ~/tesstutorial/impact_from_full/impact_checkpoint \
--eval_listfile ~/tesstutorial/engtrain/eng.training_files.tx
字符错误率是0.,单词错误率是0.
似乎在那个数据集的结果更好。这可能是因为最初的模型已经被训练在人工降级的图片上,为了使它能学习降级的文本
总的来说,预训练好的模型可以被fine-tuned或适匹到小的数据集上,不需要做大的损害对它的一般精度
4. 只训练几层
如果你不打算修改字符集,Fine-tuning是非常好的选择。但是如果你想增加一个新的字符到一个语言中,或者你想训练克林贡语,你不太可能有大量的训练数据而且它也不太像别的东西,这时你该怎么办?你可以删除掉已有网络模型中上面的若干层,用新的随机层来代替他们,并且训练你的数据。这个命令行几乎与“从零开始训练”节中介绍的一致,只是你必须提供一个unicharset和net_spec,你也可以提供一个模型给--continue_from和--append_index参数
--append_index参数告诉训练器它将删除掉给定的索引值以上的层(从0开始,在最外层),附加的层通过--net_spec参数哪些将保存。虽然这些索引系统并不是完美地引用网络层的方式,它是一个网络规范刘品言大大简化后的结果。这个构建器将输出一个字符串代表它生成的网络,使它可以很容易地检查索引引用到想要的层
作为参考,4.0alpha版本中,chi_sim, chi_tra, guj, hin, jpn, mal, mar, pan, tel这些语言是这样训练的:
--learning_rate 10e-5
--net_spec '[1,0,0,1 Ct5,5,16 Mp3,3 Lfys64 Lfx128 Lrx128 Lfx384 O1c1]'
--net_mode 192
--perfect_sample_delay 19
其它的语言使用下面的参数训练:
--learning_rate 10e-5
--net_spec '[1,0,0,1 Ct5,5,16 Mp3,3 Lfys64 Lfx128 Lrx128 Lfx256 O1c1]'
--net_mode 192
--perfect_sample_delay 19
这两者唯一的不同是最外一个LSTM层的大小。因此在这些模型中,--append_index将保存与相关联的最外层,并且附加 上
Index layer
1 ct5,5,16
6 lfx256/384
已有模型剩下部分的权重开始并不修改,但是允许被新的训练数据修改
例如,让我们将一个已经存在的chi_sim模型转成eng。我们将删除最外一个LSTM层(它在chi_sim模型中比在eng模型中更大)和softmax,换成一个更小的LSTM层和一个新的softmax
mkdir -p ~/tesstutorial/eng_from_chi
training/combine_tessdata -e tessdata/chi_sim.traineddata \
~/tesstutorial/eng_from_chi/eng.lstm
training/lstmtraining -U ~/tesstutorial/engtrain/eng.unicharset \
--script_dir ../langdata --debug_interval 100 \
--continue_from ~/tesstutorial/eng_from_chi/eng.lstm \
--append_index 5 --net_spec '[Lfx256 O1c105]' \
--model_output ~/tesstutorial/eng_from_chi/base \
--train_listfile ~/tesstutorial/engtrain/eng.training_files.txt \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt \
--max_iterations 5000 &&~/tesstutorial/eng_from_chi/basetrain.log
因为低层已经训练过了,这个学习比从零开始 训练要快。到400轮,已经有一些空格被输出,到500轮,一些正确的字符被输出,到1000轮,已经所有的字符几乎都正确了。到这时,它就完成了,它应该是2.6%的字符错误率和8.6%的单词错误率
试着使用全训练数据进行一个独立 测试在IMpact字体:
training/lstmeval --model ~/tesstutorial/eng_from_chi/base_checkpoint \
--eval_listfile ~/tesstutorial/engtrain/eng.training_files.txt
training/lstmeval --model ~/tesstutorial/eng_from_chi/base_checkpoint \
--eval_listfile ~/tesstutorial/engeval/eng.training_files.txt
在全训练集,我们得到2.24%/7.36%,而在Impact上23.9%/59.3%,这已经比从头开始训练要好很多了,但是它还是过拟合了
总的来说,删除掉一个已有网络的上面几层是可以的,和从零开始 训练一样,但是需要大师的训练数据作准备,而剩余的是保留下来避免过拟合的
5. 训练过程中的错误信息
训练过程中会出现 几种错误消息,其中有些是比较重要的,而其它的则不太重要
Encoding of string failed! 当训练图像中的文本字符串不能用给定的字符集进行编码时,产生此错误。可能的原因是
1)文本中有一个不可表达的字符,如一个英镑的符号,而你的字符集中没有
2)对文本中的不可打印字符(如表格或控制字符)出现错误
3)文本中有一个不可表达的印度语字母
无论哪种原因,训练器都将训练图片忽略掉。如果这个错误不是很频繁,那它是无关紧要的,但可能指示,对于你正在训练的语言来说,你的字符集是不够的
unichar xxx is too long to encode!!(只在印度语时出现)。为了简化LSTM引擎,编码器对于unicode字符的长度有一个上限。它会把这个字母排除在可识别集之外然后继续,但是如果有很多这个的错误,那你就麻烦了
Bad box coordinates in boxfile string! LSTM训练器只需要一个完整文本行的边界信息,而不需要每个字符的,如果你在box字符串中间放入了空格,像下面这样:
&text for line including spaces& &left& &bottom& &right& &top& &page&
分析器将被弄糊涂,于是给出错误提示。对这个的boxfile字符串有一个不同的格式要求:
WordStr &left& &bottom& &right& &top& &page& #&text for line including spaces&
当训练输入不是以LSTM格式或文件不可读,并行化头就会失败。检查你的文件列表文件,看看它是否包含一个有效的文件名
No block overlapping textline: 对给定的训练数据进行布局分析,来进行分段,如果失败,将出现这个提示。这个文本行将被删除。如果它出现的不多那没什么问题,但是如果有很多,那应该是训练文本或渲染出了问题
&undecodable&出在在ALIGNED_TRUTH or OCR TEXT输出早期在训练中。它是字符集进行压缩和CTC训练的结果(参看上面的字符集压缩和训练模式)。这应该是无害的可以忽略。它出现 的频率应该随着训练的进行而越来越少
十、合并输出文件
lstmtraining程序输出两种类型的checkpoint文件:
&model_base&_checkpoint:是最终的模型文件
&model_base&&char_error&_&iteration&.lstm文件会定期地被输出,以最好的训练结果。这个lstm的后缀是一个误导,好像文件格式和识别模式文件格式不同。它和checkpoint文件一样是训练的输出 ,但它更小,因为它并没有一个模型备份,如果训练运行到一个分支时将需要这个备份
这些文件都可以转化为一个识别模型:
training/lstmtraining --model_output ~/tesstutorial/eng_from_chi/eng.lstm \
--continue_from ~/tesstutorial/eng_from_chi/base_checkpoint \
--stop_training
最后,将你的新模型文件和语言模型文件合并成一个数据文件:
training/combine_tessdata -o tessdata/eng.traineddata \
~/tesstutorial/eng_from_chi/eng.lstm \
~/tesstutorial/engtrain/eng.lstm-number-dawg \
~/tesstutorial/engtrain/eng.lstm-punc-dawg \
~/tesstutorial/engtrain/eng.lstm-word-dawg
dawg文件是可选的,没有它们也可以正常工作,但它们通常提供了一些精度 上的改进
注意:Tesseract 4.00将和一个包含了lang.lstm文件的traineddata文件工作得很好。lstm-*-dawgs是可选的,如果没有这些文件,则ocr引擎模式要求使用OEM_LSTM_ONLY 模式,不需要bigrams, chichar ambigs或其它的一些文件,有这些文件甚至没有任何影响
当增加到一个已经存在的Tessearcat traineddata文件中,LSTM字符集并不要求必须与Tesseract中的字符集匹配,但是在训练LSTM和构建lstm-*-dawgs文件时则要求必须使用同样的字符集
本文已收录于以下专栏:
相关文章推荐
第一部分:训练前的说明
        要训练一个新语言(自定义语言或者某种自然语言)对应的traineddata文件,需要产生下列过程文件:
lang.configlang.un...
16:40:23|  分类: 机器学习、mining|举报|字号 订阅
    
光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程。OCR技术非常专业,一般多是印刷、打印行...
最近要做文字识别,不让直接用别人的接口,所以只能尝试去用开源的类库。tesseract-ocr是惠普公司开源的一个文字识别项目,通过它可以快速搭建图文识别系统,帮助我们开发出能识别图片的ocr系统。因...
最近刚开始接触识别库引擎方面的知识,由于项目中需要使用光学识别处理模块,在老师与朋友的推荐下,我开始接触tesseract光学识别库,在最开始从GitHub上下载的源代码进行编译的时候,出现了许多意想...
在macOS上,homebrew默认给我们安装的是3.0.5(2017年6月)。
想要用4.0版还需要自己编译,官方教程:Compiling Tesseract 4.0
而官方教程中,macOS用...
Tesseract简介
OCR是什么?OCR(Optical Character Recognition):光学字符识别,简单来说就是识别图片上的文字获取,然后转换成一些我们需要的编码格式,当然...
原文:/tesseract-ocr/tesseract/wiki/TrainingTesseract-4.00
tesseract 4.0之后开始使用机器学习来进...
tesseract::DotProductAVX() at /tesseract/arch/dotproductavx.cpp
WeightMatrix::DotProduct() at /lst...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 如何训练专注力 的文章

 

随机推荐