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

 Tesseract是一個開源的OCR(Optical Character Recognition,光學字符識別)引擎,能夠識別多種格式的圖像文件並將其轉換成文本,目前已支持60多種語言(包括中文)。 Tesseract最初由HP公司開發,後來由Google維護,目前發佈在Googel Project上。地址爲http://code.google.com/p/tesseract-ocr/svn

 

使用默認的語言庫識別

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

 

[plain] view plaincopyspa

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

     其中result表示輸出結果文件txt名稱,eng表示用以識別的語言文件爲英文。命令行

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

 

     

 

訓練樣本

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

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 一、三、四、五、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 plain copy

  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的手寫數字的字體差異太大了吧。

相關文章
相關標籤/搜索