Tesseract 4 版本具有两种识别引擎:新的基于LSTM(神经网络)引擎与传统引擎。经过在初始化时设定不一样的EngineMode启动。java
OCR Engine modes: 0 Legacy engine only. 1 Neural nets LSTM engine only. 2 Legacy + LSTM engines. 3 Default, based on what is available.
当设置OcrEngineMode为2时,则表示启动双引擎进行识别,Tesseract首先会尝试LSTM引擎,若是识别失败,则会再使用传统引擎进行识别,此种模式追求高精确度,但会消耗较多的系统资源。git
Tesseract在识别时,是须要训练数据文件,也就是tessdata。两种引擎对训练数据文件的要求不一样,两种引擎训练数据也不通用。github
在GitHub上tessdata_fast (https://github.com/tesseract-ocr/tessdata_fast)和tessdata_best (https://github.com/tesseract-ocr/tessdata_best)均是基于LSTM引擎的训练数据,不能够用于传统引擎。网络
而在 GitHub上的tessdata(https://github.com/tesseract-ocr/tessdata)库中,在2016年10月以后的文件,是包含两种引擎的训练数据文件。工具
笔者计划Tesseract识别数字及英文(eng.traineddata),但愿使用双引擎提高精确度,但发现GitHub的tessdata库中eng.traineddata虽然包含了两种引擎的训练数据,但其中内置的LSTM引擎的训练数据不是最新的(相对于tessdata_best),所以产生了想法,自行构建一个训练数据文件,包含来自于tessdata库中传统引擎训练数据与tessdata_best库中LSTM引擎的训练数据。spa
使用软件版本
Tesseract:v4.0.0-beta.1.20180608 操作系统
(Windows版本:https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v4.0.0-beta.1.20180608.exe,code
默认安装路径 C:\Program Files (x86)\Tesseract-OCR)blog
操做系统:Windows 10 64bit资源
具体步骤
准备文件
从tessdata_best中下载eng.traineddata文件,从tessdata中下载eng.traineddata文件。
两个文件重名,为表示区别,将从tessdata_best文件重命名为eng.best.traineddata。以下:
解压
Tesseract提供了traineddata的打包与解压工具,名为combine_tessdata。咱们将使用这个命令完成此步骤。
建议将eng.trainneddata与eng.best.trainneddata解压到两个独立文件夹。
(combine_tessdata 默认在C:\Program Files (x86)\Tesseract-OCR中,执行命令前请确认命令已经加入操做系统PATH路径)
首先完成eng.trainneddata文件解压。
使用命令:combine_tessdata -u <要解压的trainneddata文件路径> <目标路径及解压文件名前缀>
如combine_tessdata -u ..\eng.traineddata 1\eng.
含义为:将当前路径上一级目录中的eng.trainneddata解压到当前目录中名称为1的子目录,且全部文件以eng.开头。
执行命令成功效果相似下图:
一样方法,完成eng.best.traineddata解压。
本文实践时,将eng.trainneddata解压至data文件夹,将eng.best.trainneddata解压至data.best文件夹
eng.trainneddata解压后data文件夹内容:
eng.best.trainneddata解压后data.best文件夹内容:
通过对比,可发现,eng.best.traineddata中lstm文件与eng.traineddata中不一样。
合并及从新封包
将data.best(来自eng.best.traineddata)总体覆盖到data目录。
此时data目录中是一份结合了最新的LSTM及传统引擎训练文件的文件夹。
在data目录中,执行combine_tessdata进行封包。
执行命令:combine_tessdata .\eng.
命令格式:combine_tessdata <计划打包的tessdata文件目录以及欲打包的文件前缀>
combine_tessdata .\eng. 命令则会将当前路径下以eng.开头的文件打包到eng.trainneddata,执行成功效果以下:
执行完毕后,就能够得到合并了两种引擎训练数据的文件,以下。
至此所有步骤完毕。
PS:代码中的设置(以Tess4j 4.0.2为例)
ITesseract instance = new Tesseract(); instance.setOcrEngineMode(TessOcrEngineMode.OEM_TESSERACT_LSTM_COMBINED); instance.setDatapath(tessdataFolder.getAbsolutePath()); instance.setPageSegMode(TessPageSegMode.PSM_SINGLE_LINE); instance.setLanguage("eng"); instance.setTessVariable("tessedit_char_whitelist","0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
其中setOcrEngineMode(TessOcrEngineMode.OEM_TESSERACT_LSTM_COMBINED)表示启动两种引擎。