Tesseract訓練中文字體識別


注:目前僅說明windows下的情況

前言

網上已經有大量的tesseract的識別教程,但是主要有兩個缺點:

  • 大多數比較老,有部分內容已經不適用。
  • 大部分只是就英文的訓練進行探索,很少針對中文的訓練。
    接下來盡可能詳細的介紹自己tesseract訓練中文識別的經驗。

本文中使用的tesseract版本為3.05;
為什么用3.05呢?
從官方文檔上看4.0版本(windows版本於2017年1月30號發布)顯著的提高了識別率,同時也加大了性能的消耗。理論上我是應該用4.0。但這不是重點。重點是有windows的版本有詭異的bug! 花了好久沒有解決。
不過還好,4.0支持3.05版本的所有語法。換而言之,下面的所有內容在4.0都是可以用的。

工具准備

安裝過程

 
點擊下一步
 
勾選上同意,然后點擊下一步
 
點擊下一步
 
既然是要訓練中文,記得勾選 additional language data
 
找到中文簡體和中文繁體,按需勾選,然后點下一步

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

 
目錄。。畢竟是你的電腦,隨便選,你開心就好,然后點下一步
 
點擊install

安裝完畢。

字體訓練

我准備了一份含漢語7000字和大小寫英文字母和數字的文檔.如果你需要訓練所有中文的話,請將所有docx文件內所有字改成你要訓練的字體。然后轉化成tif格式的圖片。

步驟(轉自tesseract的github)

  1. Prepare training text.
    准備你的訓練文本
  2. Render text to image + box file. (Or create hand-made box files for existing image data.)
    將文本轉為image+box文件.(如果你已經有image文件的話,只需要手動生成box文件)
  3. Make unicharset file.
    生成unicharset文件
  4. Optionally make dictionary data.
    有選擇性的生成字典數據
  5. Run tesseract to process image + box file to make training data set.
    運行tesseract來處理之前的image+box文件生成一個訓練數據集合
  6. Run training on training data set.
    在訓練數據集合的基礎上進行訓練
  7. 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,

 
點擊open,然后找到tif圖片文件
 
通過這部分區域的按鈕對識別結果進行校正

校正完之后點擊保存

步驟三:生成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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM