1. 程式人生 > >Tesseract-OCR 字元識別---樣本訓練 圖片識別訓練

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

        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目錄,輸入命令:

  1. tesseract.exe number.jpg result -l eng  

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

3.  開啟Tesseract-OCR目錄下的result.txt檔案,看到識別的結果為7542315857,有3個字元識別錯誤,識別率還不是很高,那有沒有什麼方法來提供識別率呢?

      其實Tesseract提供了一套訓練樣本的方法,用以生成自己所需的識別語言庫。下面介紹一下具體訓練樣本的方法。

     

訓練樣本

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

  

  


3.合併樣本影象。執行jTessBoxEditor工具,在點選選單欄中Tools--->Merge TIFF。在彈出的對話方塊中選擇樣本影象(按Shift選擇多張),合併成num.font.exp0.tif檔案。4.生成Box File檔案。開啟命令列,執行命令:
  1. tesseract.exe num.font.exp0.tif num.font.exp0 batch.nochop makebox  

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

注:Make Box File的命令格式為:

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

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

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


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

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

  1. <fontname> <italic> <bold> <fixed> <serif> <fraktur>  

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

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

  1. font 0 0 0 0 0  
這裡全取值為0,表示字型不是粗體、斜體等等。 7.生成語言檔案。在樣本圖片所在目錄下建立一個批處理檔案,輸入如下內容。
  1. rem 執行改批處理前先要目錄下建立font_properties檔案  
  2. echo Run Tesseract for Training..  
  3. tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train  
  4. echo Compute the Character Set..  
  5. unicharset_extractor.exe num.font.exp0.box  
  6. mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr  
  7. echo Clustering..  
  8. cntraining.exe num.font.exp0.tr  
  9. echo Rename Files..  
  10. rename normproto num.normproto  
  11. rename inttemp num.inttemp  
  12. rename pffmtable num.pffmtable  
  13. rename shapetable num.shapetable   
  14. echo Create Tessdata..  
  15. combine_tessdata.exe num.  

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


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

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

使用訓練後的語言庫識別

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

  1. tesseract.exe number.jpg result -l eng  

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