注:目前僅說明windows下的情況
前言
網上已經有大量的tesseract的識別教程,但是主要有兩個缺點:
- 大多數比較老,有部分內容已經不適用。
- 大部分只是就英文的訓練進行探索,很少針對中文的訓練。
接下來盡可能詳細的介紹自己tesseract訓練中文識別的經驗。
本文中使用的tesseract版本為3.05;
為什么用3.05呢?
從官方文檔上看4.0版本(windows版本於2017年1月30號發布)顯著的提高了識別率,同時也加大了性能的消耗。理論上我是應該用4.0。但這不是重點。重點是有windows的版本有詭異的bug! 花了好久沒有解決。
不過還好,4.0支持3.05版本的所有語法。換而言之,下面的所有內容在4.0都是可以用的。
工具准備
- 下載 java(java大法好啊);
- 下載jTessBoxEditor(依賴於java)
- 下載tesseract, windows64點這里
安裝過程





可以先不勾選,因為這樣直接下載語言的包實在太慢。可以從網頁上直接下載語言包,然后等程序安裝好后,放入安裝目錄下tessdata目錄下面


安裝完畢。
字體訓練
我准備了一份含漢語7000字和大小寫英文字母和數字的文檔.如果你需要訓練所有中文的話,請將所有docx文件內所有字改成你要訓練的字體。然后轉化成tif格式的圖片。
步驟(轉自tesseract的github)
- Prepare training text.
准備你的訓練文本 - Render text to image + box file. (Or create hand-made box files for existing image data.)
將文本轉為image+box文件.(如果你已經有image文件的話,只需要手動生成box文件) - Make unicharset file.
生成unicharset文件 - Optionally make dictionary data.
有選擇性的生成字典數據 - Run tesseract to process image + box file to make training data set.
運行tesseract來處理之前的image+box文件生成一個訓練數據集合 - Run training on training data set.
在訓練數據集合的基礎上進行訓練 - Combine data files.
合並數據文件
下面所列的步驟其實稍有不同。
如果有多張圖片[可選]
如果是其他圖片格式,將其轉為tif格式。附上一個在線地址
使用之前安裝jTessBoxEditor工具將多張圖片合並為一張(菜單欄 Tools → Merge TIFF)。並按照格式 [lang].[fontname].exp[num] 重命名合並后的文件,這里我命名為 chi.fangzheng.exp0.tif。
為了方便下文中輸入路徑,在本文中將改好的tif圖拷貝至tesseract安裝之后的目錄下。
步驟二:生成box文件
貼一張官網命令:

輸入路徑和輸出路徑文件名(除了后綴)應該保持一致。
因為我們是要訓練中文所以還需要加上-l chi_sim(l代表language chi_sim是放在tessdata目錄下中文簡體字體名的前綴),實際命令如下所示
tesseract.exe chi.fangzheng.exp0.tif chi.fangzheng.exp0 -l chi_sim batch.nochop makebox
步驟二:校正box文件
打開之前安裝的jTessBoxEditor,


校正完之后點擊保存
步驟三:生成unicharset文件
生成tr文件
使用剛才修改正確后的 box 文件,對 Tesseract 進行訓練,生成 .tr 文件:
//tesseract.exe [tif圖片文件名] [生成的tr文件名] nobatch box.train
tesseract.exe chi.fangzheng.exp0.tif chi.fangzheng.exp0 nobatch box.train
生成Character集合
//unicharset_extractor.exe [box文件名]
unicharset_extractor.exe chi.fangzheng.exp0.box
如果有多個圖片的話,則需要合並生成1個Character集合,命令如下
//unicharset_extractor.exe [1個box文件名] [1個box文件名] .....
unicharset_extractor.exe chi.fangzheng.exp0.box chi.fangzheng.exp1.box
創建字體特征文件
定義字體特征文件,Tesseract-OCR 3.01 以上的版本在訓練之前需要創建一個名稱為 font_properties 的字體特征文件。font_properties 不含有 BOM 頭,文件內容格式如下:
<fontname> <italic> <bold> <fixed> <serif> <fraktur>
//其中 fontname 為字體名稱,必須與 [lang].[fontname].exp[num].box 中的名稱保持一致。<italic> 、<bold> 、<fixed> 、<serif>、<fraktur> 的取值為 1 或 0,表示字體是否具有這些屬性。
//本次示例
fangzheng 0 0 0 0 0
步驟五:生成字典數據
如果是單個依次輸入下面兩條命令,多個文件則輸入多個tr
mftraining.exe -F font_properties -U unicharset -O chi.unicharset chi.fangzheng.exp0.tr
//mftraining.exe -F font_properties -U unicharset -O chi.unicharset [第一個tr] [第二個]...
cntraining.exe chi.fangzheng.exp0.tr
//cntraining.exe [第一個tr] [第二個]...
接下來手工修改 Clustering 過程生成的 4 個文件(inttemp、pffmtable、normproto、shapetable)的名稱為 [lang].xxx。例如我這里改為 chi.inttemp、chi.pffmtable、chi.normproto、chi.shapetable。
步驟七:合並數據文件
生成語言文件:
combine_tessdata chi.

需確認打印結果中的 Offset 1、3、4、5、13 這些項不是 -1。這樣,一個新的語言文件就生成了。
chi.traineddata 便是最終生成的語言文件,將生成的 chi.traineddata 文件拷貝到 tessdata 目錄下,就可以用它來進行字符識別了。
我們可以用剛剛的tif文件來測試一下識別能力:
//tesseract [圖片文件名] [需要輸出的文本文檔的文件名] -l [識別的語言]
tesseract chi.fangzheng.exp0.tif out -l chi
作者:aliyu
鏈接:https://www.jianshu.com/p/31afd7fc5813
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。