Tesseract 4 版本具備兩種識別引擎:新的基於LSTM(神經網絡)引擎與傳統引擎。通過在初始化時設定不同的EngineMode啟動。
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引擎,如果識別失敗,則會再使用傳統引擎進行識別,此種模式追求高精確度,但會消耗較多的系統資源。
Tesseract在識別時,是需要訓練數據文件,也就是tessdata。兩種引擎對訓練數據文件的要求不同,兩種引擎訓練數據也不通用。
在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引擎的訓練數據。
使用軟件版本
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,
默認安裝路徑 C:\Program Files (x86)\Tesseract-OCR)
操作系統: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)表示啟動兩種引擎。
