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)表示啓動兩種引擎。