Tesseract-OCR 字元識別---樣本訓練

鴨脖發表於2015-06-26

轉自:http://blog.csdn.net/feihu521a/article/details/8433077


        Tesseract是一個開源的OCR(Optical Character Recognition,光學字元識別)引擎,可以識別多種格式的影象檔案並將其轉換成文字,目前已支援60多種語言(包括中文)。 Tesseract最初由HP公司開發,後來由Google維護,目前釋出在Googel Project上。地址為http://code.google.com/p/tesseract-ocr/


使用預設的語言庫識別


1.安裝Tesseract

        從http://code.google.com/p/tesseract-ocr/downloads/list下載Tesseract,目前版本為Tesseract3.02。因為只是測試使用,這裡直接下載winodws下的安裝檔案tesseract-ocr-setup-3.02.02.exe。安裝成功後會在相應磁碟上生成一個Tesseract-OCR目錄。通過目錄下的tesseract.exe程式就可以對影象字元進行識別了。
2.準備一副待識別的影象,這裡用畫圖工具隨便寫了一串數字,儲存為number.jpg,如下圖所示:
        

3.  開啟命令列,定位到Tesseract-OCR目錄,輸入命令:

[plain] view plaincopy
  1. tesseract.exe number.jpg result -l eng  

     其中result表示輸出結果檔案txt名稱,eng表示用以識別的語言檔案為英文。

3.  開啟Tesseract-OCR目錄下的result.txt檔案,看到識別的結果為7542315857,有3個字元識別錯誤,識別率還不是很高,那有沒有什麼方法來提供識別率呢?Tesseract提供了一套訓練樣本的方法,用以生成自己所需的識別語言庫。下面介紹一下具體訓練樣本的方法。


     


訓練樣本


關於如何訓練樣本,Tesseract-OCR官網有詳細的介紹http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3。這裡通過一個簡單的例子來介紹一下如何進行樣本訓練。

1.下載工具jTessBoxEditor. http://sourceforge.net/projects/vietocr/files/jTessBoxEditor/,這個工具是用來訓練樣本用的,由於該工具是用JAVA開發的,需要安裝JAVA虛擬機器才能執行。

2. 獲取樣本影象。用畫圖工具繪製了5張0-9的文樣本影象(當然樣本越多越好),如下圖所示:

  

  


3.合併樣本影象。執行jTessBoxEditor工具,在點選選單欄中Tools--->Merge TIFF。在彈出的對話方塊中選擇樣本影象(按Shift選擇多張),合併成num.font.exp0.tif檔案。

4.生成Box File檔案。開啟命令列,執行命令:

[plain] view plaincopy
  1. tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox  

  生成的BOX檔案為num.font.exp0.box,BOX檔案為Tessercat識別出的文字和其座標。

注:Make Box File 檔名有一定的格式,不能隨便亂取名字,命令格式為:

[plain] view plaincopy
  1. tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox  

其中lang為語言名稱,fontname為字型名稱,num為序號,可以隨便定義。

【Yasi】:先前自己定義了tessdata的環境變數 TESSDATA_PREFIX 值為 E:\tesseract\tessdata,但沒有從tesseract原始檔目錄中將tessdata子目錄中的內容copy到 E:\tesseract\tessdata 中,造成上面的命令報錯,說找不到batch.nochop 和 makebox。解決辦法:將 tesseract 原始檔目錄中所有檔案和子資料夾(可能充分但非必要,先不管這些啦)copy到 E:\tesseract\tessdata 中

5.文字校正。執行jTessBoxEditor工具,開啟num.font.exp0.tif檔案(必須將上一步生成的.box和.tif樣本檔案放在同一目錄),如下圖所示。可以看出有些字元識別的不正確,可以通過該工具手動對每張圖片中識別錯誤的字元進行校正。校正完成後儲存即可。

【Yasi】這裡必須修改識別錯誤的字元,否則做出來的traineddata檔案也是錯的。可以在下面的介面中修改並儲存,也可以直接在traineddata檔案中修改。



6.定義字型特徵檔案。Tesseract-OCR3.01以上的版本在訓練之前需要建立一個名稱為font_properties的字型特徵檔案。

font_properties不含有BOM頭,檔案內容格式如下:

[plain] view plaincopy
  1. <fontname> <italic> <bold> <fixed> <serif> <fraktur>  

其中fontname為字型名稱,必須與[lang].[fontname].exp[num].box中的名稱保持一致。<italic> 、<bold> 、<fixed> 、<serif>、 <fraktur>的取值為1或0,表示字型是否具有這些屬性。

這裡在樣本圖片所在目錄下建立一個名稱為font_properties的檔案,用記事本開啟,輸入以下下內容:

[plain] view plaincopy
  1. font 0 0 0 0 0  
這裡全取值為0,表示字型不是粗體、斜體等等。

7.生成語言檔案。在樣本圖片所在目錄下建立一個批處理檔案,輸入如下內容。

[plain] view plaincopy
  1. rem 執行改批處理前先要目錄下建立font_properties檔案  
  2.   
  3. echo Run Tesseract for Training..  
  4. tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train  
  5.   
  6. echo Compute the Character Set..  
  7. unicharset_extractor.exe num.font.exp0.box  
  8. mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr  
  9.   
  10. echo Clustering..  
  11. cntraining.exe num.font.exp0.tr  
  12.   
  13. echo Rename Files..  
  14. rename normproto num.normproto  
  15. rename inttemp num.inttemp  
  16. rename pffmtable num.pffmtable  
  17. rename shapetable num.shapetable   
  18.   
  19. echo Create Tessdata..  
  20. combine_tessdata.exe num.  

將批處理通過命令列執行。執行後的結果如下:


需確認列印結果中的Offset 1、3、4、5、13這些項不是-1。這樣,一個新的語言檔案就生成了。

num.traineddata便是最終生成的語言檔案,將生成的num.traineddata拷貝到Tesseract-OCR-->tessdata目錄下。可以用它來進行字元識別了。


使用訓練後的語言庫識別


用訓練後的語言庫識別number.jpg檔案, 開啟命令列,定位到Tesseract-OCR目錄,輸入命令:

[plain] view plaincopy
  1. tesseract.exe number.jpg result -l eng  

識別結果如如圖所示,可以看到識別率提高了不少。通過自定義訓練樣本,可以進行圖形驗證碼、車牌號碼識別等。感興趣的朋友可以研究研究。

【Yasi】試驗結果如下:

下面是num-yasi.png

將生成的num.traineddata拷貝到E:\tesseract\tessdata,即環境變數TESSDATA_PREFIX 設定的路徑下,執行下面的命令(注意第二條命令結尾是num,即新加的traineddata,而不是eng

[plain] view plaincopy
  1. E:\tesseract\tesseract-svn\vs2008\LIB_Debug\tesseractd.exe num-yasi.png result-eng -l eng  
  2. E:\tesseract\tesseract-svn\vs2008\LIB_Debug\tesseractd.exe num-yasi.png result-num -l num  

下圖是兩次識別結果對比


使用eng traineddata的結果完全不靠譜;使用了自己的traineddata,識別出來的當然都是數字,但正確率實在糟糕。可能是我自己手寫的字型和用來做traineddata的手寫數字的字型差別太大了吧。

相關文章